diff --git a/.all-contributorsrc b/.all-contributorsrc index e1e45ac3460..c496d65bc1a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3,9 +3,7 @@ "projectOwner": "skyra-project", "repoType": "github", "repoHost": "https://github.com", - "files": [ - "README.md" - ], + "files": ["README.md"], "imageSize": 100, "commit": true, "commitConvention": "angular", @@ -63,198 +61,140 @@ "name": "Jacz", "avatar_url": "https://avatars3.githubusercontent.com/u/23615291?v=4", "profile": "https://jaczaus.me/", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "vladfrangu", "name": "Vlad Frangu", "avatar_url": "https://avatars3.githubusercontent.com/u/17960496?v=4", "profile": "https://github.com/vladfrangu", - "contributions": [ - "code", - "doc", - "bug", - "review", - "userTesting" - ] + "contributions": ["code", "doc", "bug", "review", "userTesting"] }, { "login": "Skillz4Killz", "name": "Skillz4Killz", "avatar_url": "https://avatars3.githubusercontent.com/u/23035000?v=4", "profile": "https://github.com/Skillz4Killz", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "cfanoulis", "name": "Charalampos Fanoulis", "avatar_url": "https://avatars3.githubusercontent.com/u/38255093?v=4", "profile": "https://github.com/cfanoulis", - "contributions": [ - "code", - "translation", - "ideas", - "projectManagement", - "maintenance" - ] + "contributions": ["code", "translation", "ideas", "projectManagement", "maintenance"] }, { "login": "QuantumlyTangled", "name": "Nejc Drobnic", "avatar_url": "https://avatars1.githubusercontent.com/u/7919610?v=4", "profile": "https://quantumlytangled.com/", - "contributions": [ - "code", - "translation", - "ideas", - "doc", - "infra" - ] + "contributions": ["code", "translation", "ideas", "doc", "infra"] }, { "login": "tech6hutch", "name": "Hutch", "avatar_url": "https://avatars1.githubusercontent.com/u/25398066?v=4", "profile": "http://moorewebcode.com/", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "PyroTechniac", "name": "Gryffon Bellish", "avatar_url": "https://avatars2.githubusercontent.com/u/39341355?v=4", "profile": "https://github.com/PyroTechniac", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "Tylertron1998", "name": "Tyler Davis", "avatar_url": "https://avatars0.githubusercontent.com/u/34944514?v=4", "profile": "https://github.com/Tylertron1998", - "contributions": [ - "doc" - ] + "contributions": ["doc"] }, { "login": "KunoichiZ", "name": "Kaoru", "avatar_url": "https://avatars1.githubusercontent.com/u/19984244?v=4", "profile": "https://github.com/KunoichiZ", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "superusercode", "name": "Code.", "avatar_url": "https://avatars0.githubusercontent.com/u/60588434?v=4", "profile": "https://github.com/superusercode", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "YorkAARGH", "name": "York", "avatar_url": "https://avatars1.githubusercontent.com/u/20838878?v=4", "profile": "https://github.com/YorkAARGH", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "ImmortalSnake", "name": "ImmortalSnake", "avatar_url": "https://avatars0.githubusercontent.com/u/47276574?v=4", "profile": "https://github.com/ImmortalSnake", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "NM-EEA-Y", "name": "Skyra", "avatar_url": "https://avatars0.githubusercontent.com/u/61647701?v=4", "profile": "https://skyra.pw/", - "contributions": [ - "infra" - ] + "contributions": ["infra"] }, { "login": "gc", "name": "GC", "avatar_url": "https://avatars2.githubusercontent.com/u/30398469?v=4", "profile": "https://github.com/gc", - "contributions": [ - "code" - ] + "contributions": ["code"] }, { "login": "Rexogamer", "name": "Ed L", "avatar_url": "https://avatars0.githubusercontent.com/u/42586271?v=4", "profile": "https://github.com/Rexogamer", - "contributions": [ - "translation" - ] + "contributions": ["translation"] }, { "login": "Soumil07", "name": "Soumil07", "avatar_url": "https://avatars0.githubusercontent.com/u/29275227?v=4", "profile": "https://github.com/Soumil07", - "contributions": [ - "code", - "translation", - "review", - "platform", - "maintenance", - "bug" - ] + "contributions": ["code", "translation", "review", "platform", "maintenance", "bug"] }, { "login": "AdityaTD", "name": "Aditya N. Tripathi", "avatar_url": "https://avatars0.githubusercontent.com/u/9266227?v=4", "profile": "http://www.adityatd.me/", - "contributions": [ - "code", - "bug" - ] + "contributions": ["code", "bug"] }, { "login": "dependabot-preview[bot]", "name": "dependabot-preview[bot]", "avatar_url": "https://avatars3.githubusercontent.com/in/2141?v=4", "profile": "https://github.com/apps/dependabot-preview", - "contributions": [ - "maintenance" - ] + "contributions": ["maintenance"] }, { "login": "dependabot[bot]", "name": "dependabot[bot]", "avatar_url": "https://avatars0.githubusercontent.com/in/29110?v=4", "profile": "https://github.com/apps/dependabot", - "contributions": [ - "maintenance" - ] + "contributions": ["maintenance"] }, { "login": "depfu[bot]", "name": "depfu[bot]", "avatar_url": "https://avatars3.githubusercontent.com/in/715?v=4", "profile": "https://github.com/apps/depfu", - "contributions": [ - "maintenance" - ] + "contributions": ["maintenance"] } ], "contributorsPerLine": 7 diff --git a/.eslintrc.json b/.eslintrc.json index d9323387637..df50b825aaf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,7 @@ { "extends": "@sapphire", "rules": { + "@typescript-eslint/no-base-to-string": 0, "@typescript-eslint/no-throw-literal": 0, "@typescript-eslint/restrict-plus-operands": 0, "@typescript-eslint/naming-convention": 0 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index dfa240dadeb..1c9b49d1ac2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -21,18 +21,3 @@ /.yarnclean @favna /jest.config.js @favna /pm2.ecosystem.yml @favna - -# Just Quantum -/src/commands/GameIntegration/ffxiv.ts @quantumlytangled -/src/commands/Twitch/ @quantumlytangled -/src/events/analytics/ @quantumlytangled -/src/events/twitch/ @quantumlytangled -/src/lib/orm/migrations/1594757329224-V13_MigrateAnalytics.ts @quantumlytangled -/src/lib/types/definitions/Twitch.d.ts @quantumlytangled -/src/lib/util/GameIntegration/FFXIVTypings.d.ts @quantumlytangled -/src/lib/util/GameIntegration/FFXIVUtils.ts @quantumlytangled -/src/lib/util/Notifications/ @quantumlytangled -/src/lib/util/Tracking/ @quantumlytangled -/src/monitors/analytics/ @quantumlytangled -/src/routes/twitch/twitchStreamChange.ts @quantumlytangled -/src/tasks/syncResourceAnalytics.ts @quantumlytangled diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index db81552b9f2..b80a38a82a9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,8 +9,44 @@ on: - cron: '0 8 * * 1' jobs: + pre_ci: + name: Prepare CI environment + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + with: + # We need to fetch with a depth of 2 for pull_request. + fetch-depth: 2 + + # If this workflow was triggered by a push then resolve the commit message from HEAD + # It is stored in output steps, to be referenced with ${{ steps.push_get_commit_message.outputs.push_commit_message }} + - name: '[Push] Get commit message' + if: github.event_name == 'push' + id: push_get_commit_message + run: echo ::set-output name=push_commit_message::$(git log --format=%B -n 1 HEAD) + + # If this workflow was triggered by a pull request (open or synchronize!) then resolve the commit message from HEAD^2 + # It is stored in output steps, to be referenced with ${{ steps.pr_get_commit_message.outputs.pr_commit_message }} + - name: '[Pull Request] Get commit message' + if: github.event_name == 'pull_request' + id: pr_get_commit_message + run: echo ::set-output name=pr_commit_message::$(git log --format=%B -n 1 HEAD^2) + + # Finally we want to make the commit message available to other jobs. This can be done with job-level outputs + # However as we do not know whether the commit message was set in Push or Pull Request event we need to do some + # bash magic to resolve the one or the other + # + # For **Pull Request** events this will resolve to something like "$( [ -z "commit message pr" ] && echo "" || echo "commit message pr" )" which then resolves to just "commit message pr" + # + # For **Push** events this will resolve to something like "$( [ -z "" ] && echo "commit message push" || echo "" )" which then resolves to just "commit message push" + outputs: + commit_message: $( [ -z "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ] && echo "${{ steps.push_get_commit_message.outputs.push_commit_message }}" || echo "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ) + CodeQL: runs-on: ubuntu-latest + if: "!contains(needs.pre_ci.outputs.commit_message, '[skip ci]')" + needs: pre_ci steps: - name: Checkout repository diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 5e0b2d2619b..d5771d3a84e 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -7,10 +7,45 @@ on: pull_request: jobs: + pre_ci: + name: Prepare CI environment + runs-on: ubuntu-latest + steps: + - name: Checkout Project + uses: actions/checkout@v2 + with: + # We need to fetch with a depth of 2 for pull_request. + fetch-depth: 2 + + # If this workflow was triggered by a push then resolve the commit message from HEAD + # It is stored in output steps, to be referenced with ${{ steps.push_get_commit_message.outputs.push_commit_message }} + - name: '[Push] Get commit message' + if: github.event_name == 'push' + id: push_get_commit_message + run: echo ::set-output name=push_commit_message::$(git log --format=%B -n 1 HEAD) + + # If this workflow was triggered by a pull request (open or synchronize!) then resolve the commit message from HEAD^2 + # It is stored in output steps, to be referenced with ${{ steps.pr_get_commit_message.outputs.pr_commit_message }} + - name: '[Pull Request] Get commit message' + if: github.event_name == 'pull_request' + id: pr_get_commit_message + run: echo ::set-output name=pr_commit_message::$(git log --format=%B -n 1 HEAD^2) + + # Finally we want to make the commit message available to other jobs. This can be done with job-level outputs + # However as we do not know whether the commit message was set in Push or Pull Request event we need to do some + # bash magic to resolve the one or the other + # + # For **Pull Request** events this will resolve to something like "$( [ -z "commit message pr" ] && echo "" || echo "commit message pr" )" which then resolves to just "commit message pr" + # + # For **Push** events this will resolve to something like "$( [ -z "" ] && echo "commit message push" || echo "" )" which then resolves to just "commit message push" + outputs: + commit_message: $( [ -z "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ] && echo "${{ steps.push_get_commit_message.outputs.push_commit_message }}" || echo "${{ steps.pr_get_commit_message.outputs.pr_commit_message }}" ) + Linting: name: Linting runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[skip ci]')" + if: "!contains(needs.pre_ci.outputs.commit_message, '[skip ci]')" + needs: pre_ci steps: - name: Checkout Project uses: actions/checkout@v2 @@ -31,7 +66,8 @@ jobs: Testing: name: Unit Tests runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[skip ci]')" + if: "!contains(needs.pre_ci.outputs.commit_message, '[skip ci]')" + needs: pre_ci steps: - name: Checkout Project uses: actions/checkout@v2 @@ -66,7 +102,8 @@ jobs: Building: name: Compile source code runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[skip ci]')" + if: "!contains(needs.pre_ci.outputs.commit_message, '[skip ci]')" + needs: pre_ci steps: - name: Checkout Project uses: actions/checkout@v2 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..97e3a56eb28 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +src/languages/**/*.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 4cbfaef3859..00000000000 --- a/.prettierrc +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/prettierrc", - "endOfLine": "lf", - "printWidth": 150, - "quoteProps": "as-needed", - "semi": true, - "singleQuote": true, - "tabWidth": 4, - "trailingComma": "none", - "useTabs": true, - "overrides": [ - { - "files": ["*.yml"], - "options": { - "tabWidth": 2, - "useTabs": false - } - } - ] -} diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000000..a2405f19037 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,8 @@ +project_id: '434340' +api_token_env: 'CROWDIN_PERSONAL_TOKEN' +commit_message: 'chore(i18n-crowdin): new translations for %original_file_name% (%language%) [skip ci]' +append_commit_message: false + +files: + - source: /src/languages/en-US/**/*.json + translation: /src/languages/%locale%/**/%original_file_name% diff --git a/package.json b/package.json index cd3eb58c887..b53395ee7a7 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "#lib/structures/color": "./dist/lib/structures/color/index.js", "#lib/types": "./dist/lib/types/index.js", "#root/*": "./dist/*.js", - "#utils/*": "./dist/lib/util/*.js", - "#utils/debounce": "./dist/lib/util/debounce/index.js" + "#languages": "./dist/languages/index.js", + "#utils/*": "./dist/lib/util/*.js" }, "scripts": { "pm2:delete": "pm2 delete Skyra", @@ -56,23 +56,26 @@ "url": "https://github.com/skyra-project/skyra/issues" }, "dependencies": { + "@bcoe/v8-coverage": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.0.2.tgz", "@discordjs/collection": "^0.1.6", - "@influxdata/influxdb-client": "^1.8.0", - "@influxdata/influxdb-client-apis": "^1.8.0", + "@influxdata/influxdb-client": "^1.9.0", + "@influxdata/influxdb-client-apis": "^1.9.0", "@klasa/async-queue": "^0.0.1", - "@sapphire/snowflake": "^1.2.0", - "@sapphire/time-utilities": "^1.2.0", - "@sapphire/type": "^1.1.0", - "@sapphire/utilities": "^1.1.1", - "@sentry/integrations": "^5.27.6", - "@sentry/node": "^5.27.6", + "@sapphire/pieces": "^1.1.0", + "@sapphire/plugin-i18next": "^1.2.0", + "@sapphire/snowflake": "^1.2.3", + "@sapphire/time-utilities": "^1.2.3", + "@sapphire/type": "^1.1.3", + "@sapphire/utilities": "^1.3.1", + "@sentry/integrations": "^5.29.2", + "@sentry/node": "^5.29.2", "@skyra/ai": "^1.0.2", - "@skyra/audio": "^1.0.1", + "@skyra/audio": "^1.0.2", "@skyra/char": "^1.0.1", "@skyra/decorators": "^3.0.0", "async-rwlock": "^1.1.1", "binarytf": "^2.0.0", - "bufferutil": "^4.0.2", + "bufferutil": "^4.0.3", "canvas": "^2.6.1", "canvas-constructor": "^4.1.0", "colorette": "^1.2.1", @@ -82,7 +85,9 @@ "emoji-regex": "^9.2.0", "gifencoder": "^2.0.1", "he": "^1.2.0", - "ioredis": "^4.19.2", + "i18next": "^19.8.4", + "i18next-fs-backend": "^1.0.7", + "ioredis": "^4.19.4", "klasa": "skyra-project/klasa#settings", "klasa-dashboard-hooks": "skyra-project/klasa-dashboard-hooks#master", "node-fetch": "^2.6.1", @@ -91,45 +96,47 @@ "tsyringe": "^4.4.0", "typeorm": "0.2.28", "typeorm-naming-strategies": "^2.0.0", - "utf-8-validate": "^5.0.3", - "ws": "^7.4.0", + "utf-8-validate": "^5.0.4", + "ws": "^7.4.2", "zlib-sync": "^0.1.7" }, "devDependencies": { "@commitlint/cli": "^11.0.0", "@commitlint/config-conventional": "^11.0.0", - "@favware/graphql-pokemon": "^5.0.0", + "@favware/graphql-pokemon": "^5.0.1", "@playlyfe/gql": "^2.6.2", - "@sapphire/eslint-config": "^1.0.4", - "@sapphire/ts-config": "^1.0.3", - "@skyra/saelem": "^3.0.0", + "@sapphire/eslint-config": "^2.0.0", + "@sapphire/prettier-config": "^1.0.5", + "@sapphire/ts-config": "^2.0.0", + "@skyra/saelem": "^3.0.1", "@types/backoff": "^2.5.1", - "@types/diff": "^4.0.2", + "@types/diff": "^5.0.0", "@types/he": "^1.1.1", - "@types/ioredis": "^4.17.8", - "@types/jest": "^26.0.15", - "@types/node": "^14.14.10", + "@types/i18next-fs-backend": "^1.0.0", + "@types/ioredis": "^4.17.11", + "@types/jest": "^26.0.20", + "@types/node": "^14.14.20", "@types/node-fetch": "^2.5.7", "@types/pg": "^7.14.7", "@types/ws": "^7.4.0", - "@typescript-eslint/eslint-plugin": "^4.8.2", - "@typescript-eslint/parser": "^4.8.2", + "@typescript-eslint/eslint-plugin": "^4.13.0", + "@typescript-eslint/parser": "^4.13.0", "cz-conventional-changelog": "^3.3.0", - "discord-api-types": "^0.9.1", - "eslint": "^7.14.0", - "eslint-config-prettier": "^7.0.0", - "eslint-plugin-prettier": "^3.1.4", - "husky": "^4.3.0", + "discord-api-types": "^0.12.1", + "eslint": "^7.17.0", + "eslint-config-prettier": "^7.1.0", + "eslint-plugin-prettier": "^3.3.1", + "husky": "^4.3.7", "jest": "^26.6.3", "jest-circus": "^26.6.3", "jest-mock-random": "^1.1.1", - "lint-staged": "^10.5.2", + "lint-staged": "^10.5.3", "nock": "^13.0.5", "prettier": "^2.2.1", "pretty-quick": "^3.1.0", "ts-jest": "^26.4.4", - "ts-node": "^9.0.0", - "typescript": "^4.1.2" + "ts-node": "^9.1.1", + "typescript": "^4.1.3" }, "resolutions": { "@bcoe/v8-coverage": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.0.2.tgz", @@ -166,5 +173,6 @@ "commitizen": { "path": "./node_modules/cz-conventional-changelog" } - } + }, + "prettier": "@sapphire/prettier-config" } diff --git a/scripts/SetMigrations.sql b/scripts/SetMigrations.sql index b00bdd47cb3..f036684b873 100644 --- a/scripts/SetMigrations.sql +++ b/scripts/SetMigrations.sql @@ -55,6 +55,7 @@ VALUES (1606138444111, 'V29AttachmentMode1606138444111'), (1606138444111, 'V30AttachmentModeChecks1606411800922'), (1606650850324, 'V31MultiRole1606650850324'), - (1606948188150, 'V32SeparatedMemberNameUpdateLogs1606948188150'); + (1606948188150, 'V32SeparatedMemberNameUpdateLogs1606948188150'), + (1610450637243, 'V33LimitLessLanguageCodes1610450637243'); COMMIT; diff --git a/scripts/copy-lua-files.mjs b/scripts/copy-lua-files.mjs index a8b7537355a..23ddcd05a35 100644 --- a/scripts/copy-lua-files.mjs +++ b/scripts/copy-lua-files.mjs @@ -1,4 +1,5 @@ -import { existsSync, promises as fsp } from 'fs'; +import { existsSync } from 'fs'; +import { copyFile, mkdir, readdir } from 'fs/promises'; import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; @@ -10,9 +11,9 @@ const LUA_SCRIPTS_DIR = resolve(__dirname, 'audio'); const OUTPUT_FOLDER = resolve(DIST_DIR, 'lib', 'audio', 'scripts'); if (!existsSync(OUTPUT_FOLDER)) { - await fsp.mkdir(OUTPUT_FOLDER, { recursive: true }); + await mkdir(OUTPUT_FOLDER, { recursive: true }); } -for (const script of await fsp.readdir(LUA_SCRIPTS_DIR)) { - await fsp.copyFile(resolve(LUA_SCRIPTS_DIR, script), resolve(OUTPUT_FOLDER, script)); +for (const script of await readdir(LUA_SCRIPTS_DIR)) { + await copyFile(resolve(LUA_SCRIPTS_DIR, script), resolve(OUTPUT_FOLDER, script)); } diff --git a/scripts/migrations.mjs b/scripts/migrations.mjs index 19b20b90141..e30e2f21ac6 100644 --- a/scripts/migrations.mjs +++ b/scripts/migrations.mjs @@ -1,4 +1,4 @@ -import { promises as fsp } from 'fs'; +import { readFile } from 'fs/promises'; import { dirname, resolve } from 'path'; import typeorm from 'typeorm'; import { fileURLToPath } from 'url'; @@ -9,7 +9,7 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const [sqlScript, connection] = await Promise.all([ - fsp.readFile(resolve(__dirname, 'SetMigrations.sql'), { encoding: 'utf-8' }), + readFile(resolve(__dirname, 'SetMigrations.sql'), { encoding: 'utf-8' }), typeorm.createConnection(config) ]); diff --git a/scripts/tlds.mjs b/scripts/tlds.mjs index 9d9d5522bc5..27d719bb1ce 100644 --- a/scripts/tlds.mjs +++ b/scripts/tlds.mjs @@ -1,4 +1,4 @@ -import { promises as fsp } from 'fs'; +import { writeFile } from 'fs/promises'; import fetch from 'node-fetch'; import { dirname, join } from 'path'; import { toUnicode } from 'punycode'; @@ -27,4 +27,4 @@ const content = source }) .join('\n'); -await fsp.writeFile(join(__dirname, '..', 'src', 'lib', 'util', 'Links', 'TLDs.ts'), header + content + footer); +await writeFile(join(__dirname, '..', 'src', 'lib', 'util', 'Links', 'TLDs.ts'), header + content + footer); diff --git a/src/arguments/channel.ts b/src/arguments/channel.ts index f816170f1b6..23835717c03 100644 --- a/src/arguments/channel.ts +++ b/src/arguments/channel.ts @@ -7,13 +7,13 @@ const CHANNEL_REGEXP = Argument.regex.channel; export default class extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage) { - if (!message.guild) throw await message.fetchLocale(LanguageKeys.Resolvers.ChannelNotInGuild); + if (!message.guild) throw await message.resolveKey(LanguageKeys.Resolvers.ChannelNotInGuild); const channelID = CHANNEL_REGEXP.exec(arg); const channel = channelID === null ? null : message.guild.channels.cache.get(channelID[1]); if (channel) return this.validateAccess(channel, message); - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidChannel, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidChannel, { name: possible.name }); } private async validateAccess(channel: GuildChannel, message: KlasaMessage) { @@ -21,6 +21,6 @@ export default class extends Argument { return channel; } - throw await message.fetchLocale(LanguageKeys.System.CannotAccessChannel); + throw await message.resolveKey(LanguageKeys.System.CannotAccessChannel); } } diff --git a/src/arguments/channelname.ts b/src/arguments/channelname.ts index cd3caa6aba7..3b3a52a264f 100644 --- a/src/arguments/channelname.ts +++ b/src/arguments/channelname.ts @@ -17,8 +17,8 @@ export default class extends Argument { } public async run(arg: string, possible: Possible, message: KlasaMessage, filter?: (entry: GuildChannel) => boolean): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidChannelName, { name: possible.name }); - if (!message.guild) throw await message.fetchLocale(LanguageKeys.Resolvers.ChannelNotInGuild); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidChannelName, { name: possible.name }); + if (!message.guild) throw await message.resolveKey(LanguageKeys.Resolvers.ChannelNotInGuild); filter = this.getFilter(message.author, filter); const resChannel = this.resolveChannel(arg, message.guild); @@ -30,7 +30,7 @@ export default class extends Argument { possible.min || undefined ); if (result) return result[1]; - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidChannelName, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidChannelName, { name: possible.name }); } private getFilter(author: User, filter?: (entry: GuildChannel) => boolean) { diff --git a/src/arguments/commandname.ts b/src/arguments/commandname.ts index eb60cc3c4b8..a341cbe159d 100644 --- a/src/arguments/commandname.ts +++ b/src/arguments/commandname.ts @@ -13,6 +13,6 @@ export default class extends Argument { const command = await new FuzzySearch(this.client.commands, (command) => command.name, filter).run(message, arg, possible.min || undefined); if (command) return command[1]; - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidPiece, { name: possible.name, piece: 'command' }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidPiece, { name: possible.name, piece: 'command' }); } } diff --git a/src/arguments/emoji.ts b/src/arguments/emoji.ts index c8bb5222f85..5cf7bcc96f3 100644 --- a/src/arguments/emoji.ts +++ b/src/arguments/emoji.ts @@ -5,7 +5,7 @@ import { Argument, KlasaMessage, Possible } from 'klasa'; export default class extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage): Promise { const resolved = resolveEmoji(arg); - if (resolved === null) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidEmoji, { name: possible.name }); + if (resolved === null) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidEmoji, { name: possible.name }); return resolved; } } diff --git a/src/arguments/integer.ts b/src/arguments/integer.ts index fa59df5e5f5..0bee3f6d4aa 100644 --- a/src/arguments/integer.ts +++ b/src/arguments/integer.ts @@ -5,10 +5,10 @@ import { Argument, ArgumentOptions, KlasaMessage, Possible } from 'klasa'; @ApplyOptions({ aliases: ['int'] }) export default class extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage) { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); const number = Number(arg); - if (!Number.isInteger(number)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); + if (!Number.isInteger(number)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); const { min, max } = possible; diff --git a/src/arguments/membername.ts b/src/arguments/membername.ts index b152cac1161..3552cb985d2 100644 --- a/src/arguments/membername.ts +++ b/src/arguments/membername.ts @@ -8,13 +8,13 @@ const USER_REGEXP = Argument.regex.userOrMember; export default class extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); const resMember = await this.resolveMember(message, arg); if (resMember) return resMember; const result = await this.fetchMember(arg, message); if (result) return message.guild!.members.add(result); - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); } private async resolveMember(message: KlasaMessage, query: string): Promise { @@ -23,7 +23,7 @@ export default class extends Argument { const member = await message.guild!.members.fetch(result[1]); if (member) return member; - throw await message.fetchLocale(LanguageKeys.Misc.UserNotExistent); + throw await message.resolveKey(LanguageKeys.Misc.UserNotExistent); } private async fetchMember(query: string, message: KlasaMessage) { diff --git a/src/arguments/overwatchplayer.ts b/src/arguments/overwatchplayer.ts index 0db3acfbf83..f3688c49e1b 100644 --- a/src/arguments/overwatchplayer.ts +++ b/src/arguments/overwatchplayer.ts @@ -4,6 +4,6 @@ import { Argument, KlasaMessage, Possible } from 'klasa'; export default class extends Argument { public async run(arg: string, _: Possible, message: KlasaMessage) { if (/[A-Za-z0-9]+(?:[#-][0-9]{4,5})?/i.test(arg)) return encodeURIComponent(arg.replace('#', '-')); - throw await message.fetchLocale(LanguageKeys.Commands.GameIntegration.OverwatchInvalidPlayerName, { playerTag: arg }); + throw await message.resolveKey(LanguageKeys.Commands.GameIntegration.OverwatchInvalidPlayerName, { playerTag: arg }); } } diff --git a/src/arguments/range.ts b/src/arguments/range.ts index 3b8fc3dee8d..93e76872925 100644 --- a/src/arguments/range.ts +++ b/src/arguments/range.ts @@ -4,15 +4,15 @@ import { Argument, KlasaMessage, Possible } from 'klasa'; export default class extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage) { - if (!arg) throw await message.fetchLocale(LanguageKeys.Arguments.RangeInvalid, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Arguments.RangeInvalid, { name: possible.name }); const number = Number(arg); if (Number.isSafeInteger(number)) return [number]; const range = parseRange(arg); - if (range.length === 0) throw await message.fetchLocale(LanguageKeys.Arguments.RangeInvalid, { name: possible.name }); + if (range.length === 0) throw await message.resolveKey(LanguageKeys.Arguments.RangeInvalid, { name: possible.name }); if (typeof possible.max === 'number' && range.length > possible.max) - throw await message.fetchLocale(possible.max === 1 ? LanguageKeys.Arguments.RangeMax : LanguageKeys.Arguments.RangeMaxPlural, { + throw await message.resolveKey(LanguageKeys.Arguments.RangeMax, { name: possible.name, maximum: possible.max, count: possible.max diff --git a/src/arguments/restOverwatchPlayer.ts b/src/arguments/restOverwatchPlayer.ts index d54093668da..94f2b860932 100644 --- a/src/arguments/restOverwatchPlayer.ts +++ b/src/arguments/restOverwatchPlayer.ts @@ -12,7 +12,7 @@ export default class extends Argument { } public async run(arg: string, possible: Possible, message: KlasaMessage): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.GameIntegration.OverwatchInvalidPlayerName, { playerTag: arg }); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.GameIntegration.OverwatchInvalidPlayerName, { playerTag: arg }); // eslint-disable-next-line dot-notation const { args, diff --git a/src/arguments/rolename.ts b/src/arguments/rolename.ts index bbbcb83fead..56f18da2c20 100644 --- a/src/arguments/rolename.ts +++ b/src/arguments/rolename.ts @@ -11,14 +11,14 @@ export default class extends Argument { } public async run(arg: string, possible: Possible, message: KlasaMessage, filter?: (entry: Role) => boolean): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidRoleName, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidRoleName, { name: possible.name }); if (!message.guild) return this.role.run(arg, possible, message); const resRole = this.resolveRole(arg, message.guild); if (resRole) return resRole; const result = await new FuzzySearch(message.guild.roles.cache, (entry) => entry.name, filter).run(message, arg, possible.min || undefined); if (result) return result[1]; - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidRoleName, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidRoleName, { name: possible.name }); } public resolveRole(query: string, guild: Guild) { diff --git a/src/arguments/shinywager.ts b/src/arguments/shinywager.ts index 3320660c17b..5b7bfe55228 100644 --- a/src/arguments/shinywager.ts +++ b/src/arguments/shinywager.ts @@ -5,18 +5,14 @@ import { Argument, ArgumentOptions, KlasaMessage, Possible } from 'klasa'; @ApplyOptions({ aliases: ['wager'] }) export default class ShinyWager extends Argument { public async run(arg: string, possible: Possible, message: KlasaMessage): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); const number = Number(arg) as ArrayValues; - if (!Number.isInteger(number)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); + if (!Number.isInteger(number)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidInt, { name: possible.name }); if (!ShinyWager.kValidBetAmounts.includes(number)) { - const language = await message.fetchLanguage(); - throw language.get(LanguageKeys.Resolvers.InvalidWager, { + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidWager, { bet: number, - validAmounts: language.list( - ShinyWager.kValidBetAmounts.map((a) => a.toString()), - language.get(LanguageKeys.Globals.Or) - ) + validAmounts: ShinyWager.kValidBetAmounts.map((a) => a.toString()) }); } diff --git a/src/arguments/snowflake.ts b/src/arguments/snowflake.ts index ec272c68c8e..9436683174e 100644 --- a/src/arguments/snowflake.ts +++ b/src/arguments/snowflake.ts @@ -15,13 +15,13 @@ export default class extends Argument { private readonly kMinimum = new Date(2015, 1, 28).getTime(); public async run(arg: string, possible: Possible, message: KlasaMessage) { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidSnowflake, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidSnowflake, { name: possible.name }); if (this.kRegExp.test(arg)) { const snowflake = DiscordSnowflake.deconstruct(arg); const timestamp = Number(snowflake.timestamp); if (timestamp >= this.kMinimum && timestamp < Date.now()) return arg; } - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidSnowflake, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidSnowflake, { name: possible.name }); } } diff --git a/src/arguments/song.ts b/src/arguments/song.ts index 7b80e5da843..ddfa1e21c36 100644 --- a/src/arguments/song.ts +++ b/src/arguments/song.ts @@ -11,7 +11,7 @@ import { Argument, Possible } from 'klasa'; export default class extends Argument { public async run(arg: string, _: Possible, message: GuildMessage): Promise { const remaining = await this.getUserRemainingEntries(message); - if (remaining === 0) throw await message.fetchLocale(LanguageKeys.MusicManager.TooManySongs); + if (remaining === 0) throw await message.resolveKey(LanguageKeys.MusicManager.TooManySongs); const tracks = arg ? (await this.handleURL(message, remaining, arg)) ?? @@ -21,7 +21,7 @@ export default class extends Argument { await this.handleAttachments(message, remaining); if (tracks === null || tracks.length === 0) { - throw await message.fetchLocale(LanguageKeys.MusicManager.FetchNoMatches); + throw await message.resolveKey(LanguageKeys.MusicManager.FetchNoMatches); } return tracks; @@ -46,7 +46,7 @@ export default class extends Argument { */ private async handleAttachments(message: GuildMessage, remaining: number) { if (message.attachments.size === 0) { - throw await message.fetchLocale(LanguageKeys.MusicManager.FetchNoArguments); + throw await message.resolveKey(LanguageKeys.MusicManager.FetchNoArguments); } const { url } = message.attachments.first()!; @@ -65,7 +65,7 @@ export default class extends Argument { const tracks = deserialize(binary); return await message.guild.audio.player.node.decode(tracks); } catch { - throw await message.fetchLocale(LanguageKeys.MusicManager.ImportQueueError); + throw await message.resolveKey(LanguageKeys.MusicManager.ImportQueueError); } } @@ -78,7 +78,7 @@ export default class extends Argument { try { return await fetch(url, FetchResultTypes.Buffer); } catch { - throw await message.fetchLocale(LanguageKeys.MusicManager.ImportQueueNotFound); + throw await message.resolveKey(LanguageKeys.MusicManager.ImportQueueNotFound); } } @@ -151,10 +151,10 @@ export default class extends Argument { const response = await message.guild.audio.player.node.load(search); // No matches: throw. - if (response.loadType === LoadType.NoMatches) throw await message.fetchLocale(LanguageKeys.MusicManager.FetchNoMatches); + if (response.loadType === LoadType.NoMatches) throw await message.resolveKey(LanguageKeys.MusicManager.FetchNoMatches); // Load failed: throw. - if (response.loadType === LoadType.LoadFailed) throw await message.fetchLocale(LanguageKeys.MusicManager.FetchLoadFailed); + if (response.loadType === LoadType.LoadFailed) throw await message.resolveKey(LanguageKeys.MusicManager.FetchLoadFailed); // Loaded playlist: filter all tracks. if (response.loadType === LoadType.PlaylistLoaded) return this.filter(message, remainingUserEntries, response.tracks); diff --git a/src/arguments/timespan.ts b/src/arguments/timespan.ts index 0914b1fb43c..0d84b0c970c 100644 --- a/src/arguments/timespan.ts +++ b/src/arguments/timespan.ts @@ -1,6 +1,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { isNumber } from '@sapphire/utilities'; import { Duration } from '@sapphire/time-utilities'; +import { isNumber } from '@sapphire/utilities'; import { Argument, KlasaMessage, Possible } from 'klasa'; export default class extends Argument { @@ -8,7 +8,7 @@ export default class extends Argument { const duration = new Duration(arg); if (duration.offset <= 0 || !isNumber(duration.fromNow.getTime())) { - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidDuration, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidDuration, { name: possible.name }); } const { min, max } = possible; diff --git a/src/arguments/username.ts b/src/arguments/username.ts index 2f7dc457c91..704ca432648 100644 --- a/src/arguments/username.ts +++ b/src/arguments/username.ts @@ -12,14 +12,14 @@ export default class extends Argument { } public async run(arg: string, possible: Possible, message: KlasaMessage): Promise { - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); if (!message.guild) return this.user.run(arg, possible, message); const resUser = await this.resolveUser(message, arg); if (resUser) return resUser; const result = await this.fetchMember(arg, message); if (result) return message.guild.members.add(result).user; - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidUsername, { name: possible.name }); } private async resolveUser(message: KlasaMessage, query: string) { @@ -29,7 +29,7 @@ export default class extends Argument { try { return await this.client.users.fetch(result[1]); } catch { - throw await message.fetchLocale(LanguageKeys.Misc.UserNotExistent); + throw await message.resolveKey(LanguageKeys.Misc.UserNotExistent); } } diff --git a/src/commands/Admin/conf.ts b/src/commands/Admin/conf.ts index 249f213855b..3717a79c709 100644 --- a/src/commands/Admin/conf.ts +++ b/src/commands/Admin/conf.ts @@ -10,7 +10,8 @@ import { ApplyOptions, CreateResolvers, requiredPermissions } from '@skyra/decor @ApplyOptions({ aliases: ['settings', 'config', 'configs', 'configuration'], - description: (language) => language.get(LanguageKeys.Commands.Admin.ConfDescription), + description: LanguageKeys.Commands.Admin.ConfDescription, + extendedHelp: LanguageKeys.Commands.Admin.ConfExtended, guarded: true, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], @@ -23,7 +24,7 @@ import { ApplyOptions, CreateResolvers, requiredPermissions } from '@skyra/decor 'key', async (arg, _possible, message, [action]: string[]) => { if (['show', 'menu'].includes(action) || arg) return arg || ''; - throw await message.fetchLocale(LanguageKeys.Commands.Admin.ConfNoKey); + throw await message.resolveKey(LanguageKeys.Commands.Admin.ConfNoKey); } ], [ @@ -31,79 +32,79 @@ import { ApplyOptions, CreateResolvers, requiredPermissions } from '@skyra/decor async (arg, possible, message, [action]: string[]) => { if (!['set', 'remove'].includes(action)) return null; if (arg) return message.client.arguments.get('...string')!.run(arg, possible, message); - throw await message.fetchLocale(LanguageKeys.Commands.Admin.ConfNoValue); + throw await message.resolveKey(LanguageKeys.Commands.Admin.ConfNoValue); } ] ]) export default class extends SkyraCommand { @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async menu(message: GuildMessage) { - return new SettingsMenu(message, await message.fetchLanguage()).init(); + return new SettingsMenu(message, await message.fetchT()).init(); } public async show(message: GuildMessage, [key]: [string]) { const schemaValue = configurableGroups.getPathString(key); - if (schemaValue === null) throw await message.fetchLocale(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); + if (schemaValue === null) throw await message.resolveKey(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); - const [output, language] = await message.guild.readSettings((settings) => { + const [output, t] = await message.guild.readSettings((settings) => { const language = settings.getLanguage(); return [schemaValue.display(settings, language), language]; }); if (isSchemaKey(schemaValue)) { - return message.send(language.get(LanguageKeys.Commands.Admin.ConfGet, { key, value: output }), { + return message.send(t(LanguageKeys.Commands.Admin.ConfGet, { key, value: output }), { allowedMentions: { users: [], roles: [] } }); } const title = key ? `: ${key.split('.').map(toTitleCase).join('/')}` : ''; - return message.send(language.get(LanguageKeys.Commands.Admin.Conf, { key: title, list: output }), { + return message.send(t(LanguageKeys.Commands.Admin.Conf, { key: title, list: output }), { allowedMentions: { users: [], roles: [] } }); } public async set(message: GuildMessage, [key, valueToSet]: string[]) { const schemaKey = await this.fetchKey(message, key); - const [response, language] = await message.guild.writeSettings(async (settings) => { + const [response, t] = await message.guild.writeSettings(async (settings) => { const language = await set(settings, schemaKey, valueToSet); return [schemaKey.display(settings, language), language]; }); - return message.send(language.get(LanguageKeys.Commands.Admin.ConfUpdated, { key, response }), { + return message.send(t(LanguageKeys.Commands.Admin.ConfUpdated, { key, response }), { allowedMentions: { users: [], roles: [] } }); } public async remove(message: GuildMessage, [key, valueToRemove]: string[]) { const schemaKey = await this.fetchKey(message, key); - const [response, language] = await message.guild.writeSettings(async (settings) => { + const [response, t] = await message.guild.writeSettings(async (settings) => { const language = await remove(settings, schemaKey, valueToRemove); return [schemaKey.display(settings, language), language]; }); - return message.send(language.get(LanguageKeys.Commands.Admin.ConfUpdated, { key, response }), { + return message.send(t(LanguageKeys.Commands.Admin.ConfUpdated, { key, response }), { allowedMentions: { users: [], roles: [] } }); } public async reset(message: GuildMessage, [key]: string[]) { const schemaKey = await this.fetchKey(message, key); - const [response, language] = await message.guild.writeSettings(async (settings) => { + const [response, t] = await message.guild.writeSettings(async (settings) => { const language = reset(settings, schemaKey); return [schemaKey.display(settings, language), language]; }); - return message.send(language.get(LanguageKeys.Commands.Admin.ConfReset, { key, value: response }), { + return message.send(t(LanguageKeys.Commands.Admin.ConfReset, { key, value: response }), { allowedMentions: { users: [], roles: [] } }); } private async fetchKey(message: GuildMessage, key: string): Promise { const value = configurableGroups.getPathString(key); - if (value === null) throw await message.fetchLocale(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); - if (value.dashboardOnly) throw await message.fetchLocale(LanguageKeys.Commands.Admin.ConfDashboardOnlyKey, { key }); + if (value === null) throw await message.resolveKey(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); + if (value.dashboardOnly) throw await message.resolveKey(LanguageKeys.Commands.Admin.ConfDashboardOnlyKey, { key }); if (isSchemaGroup(value)) { - throw await message.fetchLocale(LanguageKeys.Settings.Gateway.ChooseKey, { + throw await message.resolveKey(LanguageKeys.Settings.Gateway.ChooseKey, { keys: [...map(value.childKeys(), (value) => `\`${value}\``)].join(', ') }); } diff --git a/src/commands/Admin/roleset.ts b/src/commands/Admin/roleset.ts index 0955121ee28..639e696635d 100644 --- a/src/commands/Admin/roleset.ts +++ b/src/commands/Admin/roleset.ts @@ -8,8 +8,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['rs'], - description: (language) => language.get(LanguageKeys.Commands.Admin.RoleSetDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Admin.RoleSetExtended), + description: LanguageKeys.Commands.Admin.RoleSetDescription, + extendedHelp: LanguageKeys.Commands.Admin.RoleSetExtended, permissionLevel: PermissionLevels.Administrator, requiredPermissions: [], runIn: ['text'], @@ -38,7 +38,7 @@ export default class extends SkyraCommand { // This subcommand will always ADD roles in to a existing set OR it will create a new set if that set does not exist public async add(message: GuildMessage, [name, roles]: [string, Role[]]) { // Get all rolesets from settings and check if there is an existing set with the name provided by the user - const [created, roleSets, language] = await message.guild.writeSettings((settings) => { + const [created, roleSets, t] = await message.guild.writeSettings((settings) => { const allRoleSets = settings[GuildSettings.Roles.UniqueRoleSets]; const roleSet = allRoleSets.some((set) => set.name === name); @@ -63,12 +63,9 @@ export default class extends SkyraCommand { }); return message.send( - language.get(created ? LanguageKeys.Commands.Admin.RoleSetCreated : LanguageKeys.Commands.Admin.RoleSetAdded, { + t(created ? LanguageKeys.Commands.Admin.RoleSetCreated : LanguageKeys.Commands.Admin.RoleSetAdded, { name, - roles: language.list( - roleSets.map((role) => role.name), - language.get(LanguageKeys.Globals.And) - ) + roles: roleSets.map((role) => role.name) }) ); } @@ -76,7 +73,7 @@ export default class extends SkyraCommand { // This subcommand will always remove roles from a provided role set. public async remove(message: GuildMessage, [name, roles]: [string, Role[]]) { // Get all rolesets from settings and check if there is an existing set with the name provided by the user - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { // The set does exist so we want to only REMOVE provided roles from it // Create a new array that we can use to overwrite the existing one in settings settings[GuildSettings.Roles.UniqueRoleSets] = settings[GuildSettings.Roles.UniqueRoleSets].map((set) => @@ -87,37 +84,34 @@ export default class extends SkyraCommand { }); return message.send( - language.get(LanguageKeys.Commands.Admin.RoleSetRemoved, { + t(LanguageKeys.Commands.Admin.RoleSetRemoved, { name, - roles: language.list( - roles.map((role) => role.name), - language.get(LanguageKeys.Globals.And) - ) + roles: roles.map((role) => role.name) }) ); } public async reset(message: GuildMessage, [name]: [string?]) { // Get all rolesets from settings and check if there is an existing set with the name provided by the user - const [allRolesets, language] = await message.guild.readSettings((settings) => [ + const [allRolesets, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Roles.UniqueRoleSets], settings.getLanguage() ]); - if (allRolesets.length === 0) throw language.get(LanguageKeys.Commands.Admin.RoleSetResetEmpty); + if (allRolesets.length === 0) throw t(LanguageKeys.Commands.Admin.RoleSetResetEmpty); if (!name) { await message.guild.writeSettings([[GuildSettings.Roles.UniqueRoleSets, []]]); - return message.send(language.get(LanguageKeys.Commands.Admin.RoleSetResetAll)); + return message.send(t(LanguageKeys.Commands.Admin.RoleSetResetAll)); } const arrayIndex = allRolesets.findIndex((roleset) => roleset.name === name); - if (arrayIndex === -1) throw language.get(LanguageKeys.Commands.Admin.RoleSetResetNotExists, { name }); + if (arrayIndex === -1) throw t(LanguageKeys.Commands.Admin.RoleSetResetNotExists, { name }); await message.guild.writeSettings((settings) => { settings[GuildSettings.Roles.UniqueRoleSets].splice(arrayIndex, 1); }); - return message.send(language.get(LanguageKeys.Commands.Admin.RoleSetResetGroup, { name })); + return message.send(t(LanguageKeys.Commands.Admin.RoleSetResetGroup, { name })); } // This subcommand will run if a user doesnt type add or remove. The bot will then add AND remove based on whether that role is in the set already. @@ -144,14 +138,14 @@ export default class extends SkyraCommand { }); await message.guild.writeSettings([[GuildSettings.Roles.UniqueRoleSets, newsets]]); - return message.sendLocale(LanguageKeys.Commands.Admin.RoleSetUpdated, [{ name }]); + return message.sendTranslated(LanguageKeys.Commands.Admin.RoleSetUpdated, [{ name }]); } // This subcommand will show the user a list of role sets and each role in that set. public async list(message: GuildMessage) { // Get all rolesets from settings const allRolesets = await message.guild.readSettings(GuildSettings.Roles.UniqueRoleSets); - if (!allRolesets.length) return message.sendLocale(LanguageKeys.Commands.Admin.RoleSetNoRolesets); + if (!allRolesets.length) throw message.resolveKey(LanguageKeys.Commands.Admin.RoleSetNoRoleSets); const list = allRolesets.map((set) => `💠 **${set.name}**: ${set.roles.map((id) => message.guild.roles.cache.get(id)!.name).join(', ')}`); return message.send(list); } diff --git a/src/commands/Animal/catfact.ts b/src/commands/Animal/catfact.ts index d236f446ce8..70a4f5eae15 100644 --- a/src/commands/Animal/catfact.ts +++ b/src/commands/Animal/catfact.ts @@ -1,31 +1,30 @@ import { DbSet } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { assetsFolder } from '#utils/constants'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; import { readFile } from 'fs/promises'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { KlasaMessage } from 'klasa'; import { join } from 'path'; +@ApplyOptions({ + aliases: ['kittenfact'], + cooldown: 10, + description: LanguageKeys.Commands.Animal.CatfactDescription, + extendedHelp: LanguageKeys.Commands.Animal.CatfactExtended, + requiredPermissions: ['EMBED_LINKS'], + spam: true +}) export default class extends SkyraCommand { private facts: readonly string[] = []; - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - aliases: ['kittenfact'], - cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Animal.CatfactDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Animal.CatfactExtended), - requiredPermissions: ['EMBED_LINKS'], - spam: true - }); - } public async run(message: KlasaMessage) { const fact = this.facts[Math.floor(Math.random() * this.facts.length)]; return message.send( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) - .setTitle(await message.fetchLocale(LanguageKeys.Commands.Animal.CatfactTitle)) + .setTitle(await message.resolveKey(LanguageKeys.Commands.Animal.CatfactTitle)) .setDescription(fact) ); } diff --git a/src/commands/Animal/dog.ts b/src/commands/Animal/dog.ts index bbe239f5d06..fcb6088fe98 100644 --- a/src/commands/Animal/dog.ts +++ b/src/commands/Animal/dog.ts @@ -9,8 +9,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['doggo', 'puppy'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Animal.DogDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Animal.DogExtended), + description: LanguageKeys.Commands.Animal.DogDescription, + extendedHelp: LanguageKeys.Commands.Animal.DogExtended, requiredPermissions: ['EMBED_LINKS'], spam: true }) diff --git a/src/commands/Animal/fox.ts b/src/commands/Animal/fox.ts index 0cd73a7fa95..ac486fd7a55 100644 --- a/src/commands/Animal/fox.ts +++ b/src/commands/Animal/fox.ts @@ -1,24 +1,22 @@ import { DbSet } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { fetch, FetchResultTypes } from '#utils/util'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { KlasaMessage } from 'klasa'; const url = new URL('https://randomfox.ca/floof'); +@ApplyOptions({ + bucket: 2, + cooldown: 10, + description: LanguageKeys.Commands.Animal.FoxDescription, + extendedHelp: LanguageKeys.Commands.Animal.FoxExtended, + requiredPermissions: ['EMBED_LINKS'], + spam: true +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - bucket: 2, - cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Animal.FoxDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Animal.FoxExtended), - requiredPermissions: ['EMBED_LINKS'], - spam: true - }); - } - public async run(message: KlasaMessage) { const { image } = await fetch(url, FetchResultTypes.JSON); return message.send( diff --git a/src/commands/Animal/kitty.ts b/src/commands/Animal/kitty.ts index bdcc0ad309d..b48c664e052 100644 --- a/src/commands/Animal/kitty.ts +++ b/src/commands/Animal/kitty.ts @@ -9,8 +9,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['kitten', 'cat'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Animal.KittyDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Animal.KittyDescription), + description: LanguageKeys.Commands.Animal.KittyDescription, + extendedHelp: LanguageKeys.Commands.Animal.KittyExtended, requiredPermissions: ['ATTACH_FILES', 'EMBED_LINKS'], spam: true }) diff --git a/src/commands/Animal/shibe.ts b/src/commands/Animal/shibe.ts index 8d5b675df85..565108345ee 100644 --- a/src/commands/Animal/shibe.ts +++ b/src/commands/Animal/shibe.ts @@ -8,8 +8,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Animal.ShibeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Animal.ShibeDescription), + description: LanguageKeys.Commands.Animal.ShibeDescription, + extendedHelp: LanguageKeys.Commands.Animal.ShibeExtended, requiredPermissions: ['EMBED_LINKS'], spam: true }) diff --git a/src/commands/Anime/anime.ts b/src/commands/Anime/anime.ts index d3bcc7c5832..8153386f4bc 100644 --- a/src/commands/Anime/anime.ts +++ b/src/commands/Anime/anime.ts @@ -8,39 +8,36 @@ import { TOKENS } from '#root/config'; import { BrandingColors, Mime } from '#utils/constants'; import { fetch, FetchMethods, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { stringify } from 'querystring'; const API_URL = `https://${TOKENS.KITSU_ID}-dsn.algolia.net/1/indexes/production_media/query`; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Anime.AnimeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Anime.AnimeExtended), + description: LanguageKeys.Commands.Anime.AnimeDescription, + extendedHelp: LanguageKeys.Commands.Anime.AnimeExtended, usage: '' }) export default class extends RichDisplayCommand { - private readonly kTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [animeName]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { hits: entries } = await this.fetchAPI(language, animeName); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const { hits: entries } = await this.fetchAPI(t, animeName); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(entries, language, message); + const display = await this.buildDisplay(entries, t, message); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, animeName: string) { + private async fetchAPI(t: TFunction, animeName: string) { try { return fetch( API_URL, @@ -62,12 +59,12 @@ export default class extends RichDisplayCommand { FetchResultTypes.JSON ); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(entries: Kitsu.KitsuHit[], language: Language, message: GuildMessage) { - const embedData = language.get(LanguageKeys.Commands.Anime.AnimeEmbedData); + private async buildDisplay(entries: Kitsu.KitsuHit[], t: TFunction, message: GuildMessage) { + const embedData = t(LanguageKeys.Commands.Anime.AnimeEmbedData); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))).setFooterSuffix(' - © kitsu.io'); for (const entry of entries) { @@ -94,27 +91,27 @@ export default class extends RichDisplayCommand { entry.titles.en || entry.titles.en_us, entry.titles.ja_jp, entry.canonicalTitle - ].map((title) => title || language.get(LanguageKeys.Globals.None)); + ].map((title) => title || t(LanguageKeys.Globals.None)); display.addPage((embed: MessageEmbed) => embed .setTitle(title) .setURL(animeURL) .setDescription( - language.get(LanguageKeys.Commands.Anime.AnimeOutputDescription, { + t(LanguageKeys.Commands.Anime.AnimeOutputDescription, { englishTitle, japaneseTitle, canonicalTitle, - synopsis: synopsis ?? language.get(LanguageKeys.Commands.Anime.AnimeNoSynopsis) + synopsis: synopsis ?? t(LanguageKeys.Commands.Anime.AnimeNoSynopsis) }) ) .setThumbnail(entry.posterImage?.original ?? '') - .addField(embedData.type, language.get(LanguageKeys.Commands.Anime.AnimeTypes)[type.toUpperCase()] || type, true) + .addField(embedData.type, t(LanguageKeys.Commands.Anime.AnimeTypes)[type.toUpperCase()] || type, true) .addField(embedData.score, score, true) .addField(embedData.episodes, entry.episodeCount ? entry.episodeCount : embedData.stillAiring, true) - .addField(embedData.episodeLength, language.duration(entry.episodeLength * 60 * 1000), true) + .addField(embedData.episodeLength, t(LanguageKeys.Globals.DurationValue, { value: entry.episodeLength * 60 * 1000 }), true) .addField(embedData.ageRating, entry.ageRating, true) - .addField(embedData.firstAirDate, this.kTimestamp.display(entry.startDate * 1000), true) + .addField(embedData.firstAirDate, t(LanguageKeys.Globals.TimeDateValue, { value: entry.startDate * 1000 }), true) .addField(embedData.watchIt, `**[${title}](${animeURL})**`) ); } diff --git a/src/commands/Anime/manga.ts b/src/commands/Anime/manga.ts index 37799b0c02e..fe6413f1adf 100644 --- a/src/commands/Anime/manga.ts +++ b/src/commands/Anime/manga.ts @@ -8,39 +8,36 @@ import { TOKENS } from '#root/config'; import { BrandingColors, Mime } from '#utils/constants'; import { fetch, FetchMethods, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { stringify } from 'querystring'; const API_URL = `https://${TOKENS.KITSU_ID}-dsn.algolia.net/1/indexes/production_media/query`; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Anime.MangaDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Anime.MangaExtended), + description: LanguageKeys.Commands.Anime.MangaDescription, + extendedHelp: LanguageKeys.Commands.Anime.MangaExtended, usage: '' }) export default class extends RichDisplayCommand { - private readonly kTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [mangaName]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { hits: entries } = await this.fetchAPI(language, mangaName); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const { hits: entries } = await this.fetchAPI(t, mangaName); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(entries, language, message); + const display = await this.buildDisplay(entries, t, message); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, mangaName: string) { + private async fetchAPI(t: TFunction, mangaName: string) { try { return fetch( API_URL, @@ -62,12 +59,12 @@ export default class extends RichDisplayCommand { FetchResultTypes.JSON ); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(entries: Kitsu.KitsuHit[], language: Language, message: GuildMessage) { - const embedData = language.get(LanguageKeys.Commands.Anime.MangaEmbedData); + private async buildDisplay(entries: Kitsu.KitsuHit[], t: TFunction, message: GuildMessage) { + const embedData = t(LanguageKeys.Commands.Anime.MangaEmbedData); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))).setFooterSuffix(' - © kitsu.io'); for (const entry of entries) { @@ -94,25 +91,25 @@ export default class extends RichDisplayCommand { entry.titles.en || entry.titles.en_us, entry.titles.ja_jp, entry.canonicalTitle - ].map((title) => title || language.get(LanguageKeys.Globals.None)); + ].map((title) => title || t(LanguageKeys.Globals.None)); display.addPage((embed: MessageEmbed) => embed .setTitle(title) .setURL(mangaURL) .setDescription( - language.get(LanguageKeys.Commands.Anime.MangaOutputDescription, { + t(LanguageKeys.Commands.Anime.MangaOutputDescription, { englishTitle, japaneseTitle, canonicalTitle, - synopsis: synopsis ?? language.get(LanguageKeys.Commands.Anime.AnimeNoSynopsis) + synopsis: synopsis ?? t(LanguageKeys.Commands.Anime.AnimeNoSynopsis) }) ) .setThumbnail(entry.posterImage?.original || '') - .addField(embedData.type, language.get(LanguageKeys.Commands.Anime.MangaTypes)[type.toUpperCase()] || type, true) + .addField(embedData.type, t(LanguageKeys.Commands.Anime.MangaTypes)[type.toUpperCase()] || type, true) .addField(embedData.score, score, true) .addField(embedData.ageRating, entry.ageRating ? entry.ageRating : embedData.none, true) - .addField(embedData.firstPublishDate, this.kTimestamp.display(entry.startDate * 1000), true) + .addField(embedData.firstPublishDate, t(LanguageKeys.Globals.TimeDateValue, { value: entry.startDate * 1000 }), true) .addField(embedData.readIt, `**[${title}](${mangaURL})**`) ); } diff --git a/src/commands/Anime/waifu.ts b/src/commands/Anime/waifu.ts index 810bd89896e..999a25f1119 100644 --- a/src/commands/Anime/waifu.ts +++ b/src/commands/Anime/waifu.ts @@ -14,8 +14,8 @@ import { KlasaMessage } from 'klasa'; const kMaximum = 100000; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Anime.WaifuDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Anime.WaifuExtended), + description: LanguageKeys.Commands.Anime.WaifuDescription, + extendedHelp: LanguageKeys.Commands.Anime.WaifuExtended, requiredPermissions: ['EMBED_LINKS'] }) export default class extends SkyraCommand { @@ -27,7 +27,7 @@ export default class extends SkyraCommand { .setURL(url) .setColor(await DbSet.fetchColor(message)) .setImage(url) - .setFooter(await message.fetchLocale(LanguageKeys.Commands.Anime.WaifuFooter)) + .setFooter(await message.resolveKey(LanguageKeys.Commands.Anime.WaifuFooter)) .setTimestamp() ); } diff --git a/src/commands/Announcement/announcement.ts b/src/commands/Announcement/announcement.ts index 58f54e980fe..b0f69aed503 100644 --- a/src/commands/Announcement/announcement.ts +++ b/src/commands/Announcement/announcement.ts @@ -8,14 +8,14 @@ import { announcementCheck, extractMentions } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { DiscordAPIError, MessageEmbed, Role, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['announce'], bucket: 6, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Announcement.AnnouncementDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Announcement.AnnouncementExtended), + description: LanguageKeys.Commands.Announcement.AnnouncementDescription, + extendedHelp: LanguageKeys.Commands.Announcement.AnnouncementExtended, permissionLevel: PermissionLevels.Administrator, requiredGuildPermissions: ['MANAGE_ROLES'], requiredPermissions: ['ADD_REACTIONS', 'MANAGE_MESSAGES', 'EMBED_LINKS'], @@ -27,32 +27,32 @@ export default class extends SkyraCommand { private readonly messages: WeakMap = new WeakMap(); public async run(message: GuildMessage, [announcement]: [string]) { - const [channelID, embedEnabled, language] = await message.guild.readSettings((settings) => [ + const [channelID, embedEnabled, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Channels.Announcements], settings[GuildSettings.Messages.AnnouncementEmbed], settings.getLanguage() ]); - if (!channelID) throw language.get(LanguageKeys.Commands.Announcement.SubscribeNoChannel); + if (!channelID) throw t(LanguageKeys.Commands.Announcement.SubscribeNoChannel); const channel = message.guild.channels.cache.get(channelID) as TextChannel; - if (!channel) throw language.get(LanguageKeys.Commands.Announcement.SubscribeNoChannel); + if (!channel) throw t(LanguageKeys.Commands.Announcement.SubscribeNoChannel); - if (!channel.postable) throw language.get(LanguageKeys.System.ChannelNotPostable); + if (!channel.postable) throw t(LanguageKeys.System.ChannelNotPostable); const role = await announcementCheck(message); - const header = language.get(LanguageKeys.Commands.Announcement.Announcement, { role: role.toString() }); + const header = t(LanguageKeys.Commands.Announcement.AnnouncementHeader, { role: role.toString() }); - if (await this.ask(message, language, header, announcement)) { - await this.send(message, language, embedEnabled, channel, role, header, announcement); - return message.send(language.get(LanguageKeys.Commands.Announcement.AnnouncementSuccess)); + if (await this.ask(message, t, header, announcement)) { + await this.send(message, t, embedEnabled, channel, role, header, announcement); + return message.send(t(LanguageKeys.Commands.Announcement.AnnouncementSuccess)); } - return message.send(language.get(LanguageKeys.Commands.Announcement.AnnouncementCancelled)); + return message.send(t(LanguageKeys.Commands.Announcement.AnnouncementCancelled)); } - private async ask(message: GuildMessage, language: Language, header: string, announcement: string) { + private async ask(message: GuildMessage, t: TFunction, header: string, announcement: string) { try { - return message.ask(language.get(LanguageKeys.Commands.Announcement.AnnouncementPrompt), { + return message.ask(t(LanguageKeys.Commands.Announcement.AnnouncementPrompt), { embed: this.buildEmbed(announcement, header) }); } catch { @@ -62,7 +62,7 @@ export default class extends SkyraCommand { private async send( message: GuildMessage, - language: Language, + t: TFunction, embedEnabled: boolean, channel: TextChannel, role: Role, @@ -82,11 +82,11 @@ export default class extends SkyraCommand { const resultMessage = embedEnabled ? await previous.edit( mentions.length - ? language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { + ? t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { header, - mentions: language.list(mentions, language.get(LanguageKeys.Globals.And)) + mentions }) - : language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { + : t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { header }), this.buildEmbed(announcement) @@ -98,11 +98,11 @@ export default class extends SkyraCommand { const resultMessage = embedEnabled ? await channel.send( mentions.length - ? language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { + ? t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { header, - mentions: language.list(mentions, language.get(LanguageKeys.Globals.And)) + mentions }) - : language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { + : t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { header }), this.buildEmbed(announcement) @@ -119,11 +119,11 @@ export default class extends SkyraCommand { const resultMessage = embedEnabled ? await channel.send( mentions.length - ? language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { + ? t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentionsWithMentions, { header, - mentions: language.list(mentions, language.get(LanguageKeys.Globals.And)) + mentions }) - : language.get(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { + : t(LanguageKeys.Commands.Announcement.AnnouncementEmbedMentions, { header }), this.buildEmbed(announcement) diff --git a/src/commands/Announcement/subscribe.ts b/src/commands/Announcement/subscribe.ts index 1b87450b91d..27e66662978 100644 --- a/src/commands/Announcement/subscribe.ts +++ b/src/commands/Announcement/subscribe.ts @@ -7,15 +7,18 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Announcement.SubscribeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Announcement.SubscribeExtended), + description: LanguageKeys.Commands.Announcement.SubscribeDescription, + extendedHelp: LanguageKeys.Commands.Announcement.SubscribeExtended, requiredGuildPermissions: ['MANAGE_ROLES'], runIn: ['text'] }) export default class extends SkyraCommand { public async run(message: GuildMessage) { const role = await announcementCheck(message); - const allRoleSets = await message.guild.readSettings(GuildSettings.Roles.UniqueRoleSets); + const [allRoleSets, t] = await message.guild.readSettings((settings) => [ + settings[GuildSettings.Roles.UniqueRoleSets], + settings.getLanguage() + ]); // Get all the role ids that the member has and remove the guild id so we don't assign the everyone role const memberRolesSet = new Set(message.member.roles.cache.keys()); @@ -33,6 +36,6 @@ export default class extends SkyraCommand { await message.member.roles.set([...memberRolesSet]); - return message.sendLocale(LanguageKeys.Commands.Announcement.SubscribeSuccess, [{ role: role.name }]); + return message.send(t(LanguageKeys.Commands.Announcement.SubscribeSuccess, [{ role: role.name }])); } } diff --git a/src/commands/Announcement/unsubscribe.ts b/src/commands/Announcement/unsubscribe.ts index fbefb61a9ea..65df7ae0696 100644 --- a/src/commands/Announcement/unsubscribe.ts +++ b/src/commands/Announcement/unsubscribe.ts @@ -6,8 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Announcement.UnsubscribeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Announcement.UnsubscribeExtended), + description: LanguageKeys.Commands.Announcement.UnsubscribeDescription, + extendedHelp: LanguageKeys.Commands.Announcement.UnsubscribeExtended, requiredGuildPermissions: ['MANAGE_ROLES'], runIn: ['text'] }) @@ -15,6 +15,6 @@ export default class extends SkyraCommand { public async run(message: GuildMessage) { const role = await announcementCheck(message); await message.member.roles.remove(role); - return message.sendLocale(LanguageKeys.Commands.Announcement.UnsubscribeSuccess, [{ role: role.name }]); + return message.sendTranslated(LanguageKeys.Commands.Announcement.UnsubscribeSuccess, [{ role: role.name }]); } } diff --git a/src/commands/Developers/yarn.ts b/src/commands/Developers/yarn.ts index 06c92e9b2cd..bb7f2b7cab2 100644 --- a/src/commands/Developers/yarn.ts +++ b/src/commands/Developers/yarn.ts @@ -5,17 +5,17 @@ import { YarnPkg } from '#lib/types/definitions/Yarnpkg'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; import { cleanMentions, fetch, FetchResultTypes, pickRandom } from '#utils/util'; -import { Timestamp } from '@sapphire/time-utilities'; import { cutText } from '@sapphire/utilities'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ - aliases: ['npm', 'npm-package', 'yarn-package'], + aliases: ['npm', 'npm-package', 'yarn-package', 'pnpm', 'pnpm-package'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Developers.YarnDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Developers.YarnExtended), + description: LanguageKeys.Commands.Developers.YarnDescription, + extendedHelp: LanguageKeys.Commands.Developers.YarnExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }) @@ -23,55 +23,55 @@ import { KlasaMessage, Language } from 'klasa'; [ 'package', async (arg, _, message) => { - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Developers.YarnNoPackage); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Developers.YarnNoPackage); return cleanMentions(message.guild!, arg.replace(/ /g, '-')).toLowerCase(); } ] ]) export default class extends SkyraCommand { - // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility - #dateTimestamp = new Timestamp('YYYY-MM-DD'); - public async run(message: KlasaMessage, [pkg]: [string]) { - const language = await message.fetchLanguage(); - // TODO(VladFrangu): Apparently make a `message.loading(language)` kind of thing, + const t = await message.fetchT(); + // TODO(VladFrangu): Apparently make a `message.loading(t)` kind of thing, // since we repeat this over and over, but was out of #1301's scope. const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const result = await this.fetchApi(language, pkg); + const result = await this.fetchApi(t, pkg); - if (result.time && Reflect.has(result.time, 'unpublished')) - throw language.get(LanguageKeys.Commands.Developers.YarnUnpublishedPackage, { pkg }); + if (result.time && Reflect.has(result.time, 'unpublished')) throw t(LanguageKeys.Commands.Developers.YarnUnpublishedPackage, { pkg }); - const dataEmbed = await this.buildEmbed(result, message, language); + const dataEmbed = await this.buildEmbed(result, message, t); return response.edit(undefined, dataEmbed); } - private async fetchApi(language: Language, pkg: string) { + private async fetchApi(t: TFunction, pkg: string) { try { return await fetch(`https://registry.yarnpkg.com/${pkg}`, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.Commands.Developers.YarnPackageNotFound, { pkg }); + throw t(LanguageKeys.Commands.Developers.YarnPackageNotFound, { pkg }); } } - private async buildEmbed(result: YarnPkg.PackageJson, message: KlasaMessage, language: Language) { + private async buildEmbed(result: YarnPkg.PackageJson, message: KlasaMessage, t: TFunction) { const maintainers = result.maintainers.map((user) => `[${user.name}](${user.url ?? `https://www.npmjs.com/~${user.name}`})`); const latestVersion = result.versions[result['dist-tags'].latest]; const dependencies = latestVersion.dependencies - ? this.trimArray(Object.keys(latestVersion.dependencies), language.get(LanguageKeys.Commands.Developers.YarnEmbedMoreText)) + ? this.trimArray(Object.keys(latestVersion.dependencies), t(LanguageKeys.Commands.Developers.YarnEmbedMoreText)) : null; const author = this.parseAuthor(result.author); - const dateCreated = result.time ? this.#dateTimestamp.displayUTC(result.time.created) : language.get(LanguageKeys.Globals.Unknown); - const dateModified = result.time ? this.#dateTimestamp.displayUTC(result.time.modified) : language.get(LanguageKeys.Globals.Unknown); + const dateCreated = result.time + ? t(LanguageKeys.Globals.TimeDateValue, { value: new Date(result.time.created).getTime() }) + : t(LanguageKeys.Globals.Unknown); + const dateModified = result.time + ? t(LanguageKeys.Globals.TimeDateValue, { value: new Date(result.time.modified).getTime() }) + : t(LanguageKeys.Globals.Unknown); const { deprecated } = latestVersion; const description = cutText(result.description ?? '', 1000); const latestVersionNumber = result['dist-tags'].latest; - const license = result.license || language.get(LanguageKeys.Globals.None); + const license = result.license || t(LanguageKeys.Globals.None); const mainFile = latestVersion.main || 'index.js'; return new MessageEmbed() @@ -88,22 +88,19 @@ export default class extends SkyraCommand { [ description, '', - author ? language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionAuthor, { author }) : undefined, - `${language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionMaintainers)}: **${cutText( - language.list(maintainers, language.get(LanguageKeys.Globals.And)), - 500 - )}**`, - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionLatestVersion, { latestVersionNumber }), - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionLicense, { license }), - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionMainFile, { mainFile }), - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDateCreated, { dateCreated }), - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDateModified, { dateModified }), - deprecated ? language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDeprecated, { deprecated }) : undefined, + author ? t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionAuthor, { author }) : undefined, + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionMaintainers, { maintainers }), + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionLatestVersion, { latestVersionNumber }), + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionLicense, { license }), + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionMainFile, { mainFile }), + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDateCreated, { dateCreated }), + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDateModified, { dateModified }), + deprecated ? t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDeprecated, { deprecated }) : undefined, '', - language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDependenciesLabel), - dependencies && dependencies.length - ? language.list(dependencies, language.get(LanguageKeys.Globals.And)) - : language.get(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDependenciesNoDeps) + t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDependenciesLabel), + dependencies?.length + ? t(LanguageKeys.Globals.AndListValue, { value: dependencies }) + : t(LanguageKeys.Commands.Developers.YarnEmbedDescriptionDependenciesNoDeps) ] .filter((part) => part !== undefined) .join('\n'), diff --git a/src/commands/Fun/8ball.ts b/src/commands/Fun/8ball.ts index 62af021e14e..5562acc6523 100644 --- a/src/commands/Fun/8ball.ts +++ b/src/commands/Fun/8ball.ts @@ -1,42 +1,43 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { cast, pickRandom } from '#utils/util'; +import { pickRandom } from '#utils/util'; import { codeBlock } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const QUESTION_KEYS: (keyof EightBallLanguage)[] = ['HowMany', 'HowMuch', 'What', 'When', 'Who', 'Why']; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.EightballDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.EightballExtended), + description: LanguageKeys.Commands.Fun.EightballDescription, + extendedHelp: LanguageKeys.Commands.Fun.EightballExtended, spam: true, usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [input]: [string]) { - return message.sendLocale( - LanguageKeys.Commands.Fun.EightballOutput, - [ - { - author: message.author.toString(), - question: input, - response: codeBlock('', this.generator(input.toLowerCase(), await message.fetchLanguage())) - } - ], + const t = await message.fetchT(); + return message.send( + t(LanguageKeys.Commands.Fun.EightballOutput, { + author: message.author.toString(), + question: input, + response: codeBlock('', this.generator(input.toLowerCase(), t)) + }), { allowedMentions: { users: [], roles: [] } } ); } - private generator(input: string, i18n: Language) { - const prefixes = cast(i18n.get(LanguageKeys.Commands.Fun.EightballQuestions)); + private generator(input: string, t: TFunction) { + const prefixes = t(LanguageKeys.Commands.Fun.EightballQuestions); for (const key of QUESTION_KEYS) { - if (this.check(prefixes[key], input)) return pickRandom(i18n.get(LanguageKeys.Commands.Fun.Resolve8BallQuestionKey(key))); + if (this.check(prefixes[key], input)) { + return pickRandom(t(LanguageKeys.Commands.Fun.Resolve8BallQuestionKey(key))); + } } - return pickRandom(i18n.get(LanguageKeys.Commands.Fun.EightballElse)); + return pickRandom(t(LanguageKeys.Commands.Fun.EightballElse)); } private check(prefix: string, input: string) { diff --git a/src/commands/Fun/changemymind.ts b/src/commands/Fun/changemymind.ts index 791f7b91d09..8c0bbe53576 100644 --- a/src/commands/Fun/changemymind.ts +++ b/src/commands/Fun/changemymind.ts @@ -13,8 +13,8 @@ import { join } from 'path'; aliases: ['cmm'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.ChangemymindDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.ChangemymindExtended), + description: LanguageKeys.Commands.Fun.ChangeMyMindDescription, + extendedHelp: LanguageKeys.Commands.Fun.ChangeMyMindExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Fun/choice.ts b/src/commands/Fun/choice.ts index 39c01b2bb01..555a2789a9f 100644 --- a/src/commands/Fun/choice.ts +++ b/src/commands/Fun/choice.ts @@ -1,32 +1,33 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; +import { TFunction } from 'i18next'; import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['choose', 'choise', 'pick'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.ChoiceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.ChoiceExtended), + description: LanguageKeys.Commands.Fun.ChoiceDescription, + extendedHelp: LanguageKeys.Commands.Fun.ChoiceExtended, usage: ' [...]', usageDelim: ',', spam: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage, options: string[]) { - const words = await this.filterWords(message, options); - return message.sendLocale(LanguageKeys.Commands.Fun.ChoiceOutput, [ - { + const t = await message.fetchT(); + const words = await this.filterWords(t, options); + return message.send( + t(LanguageKeys.Commands.Fun.ChoiceOutput, { user: message.author.toString(), word: words[Math.floor(Math.random() * words.length)] - } - ]); + }) + ); } - private async filterWords(message: KlasaMessage, words: string[]) { - const i18n = await message.fetchLanguage(); - if (words.length < 2) throw i18n.get(LanguageKeys.Commands.Fun.ChoiceMissing); + private async filterWords(t: TFunction, words: string[]) { + if (words.length < 2) throw t(LanguageKeys.Commands.Fun.ChoiceMissing); const output = new Set(); const filtered = new Set(); @@ -38,6 +39,6 @@ export default class extends SkyraCommand { } if (output.size >= 2) return [...output]; - throw i18n.get(LanguageKeys.Commands.Fun.ChoiceDuplicates, { words: [...filtered].join("', '") }); + throw t(LanguageKeys.Commands.Fun.ChoiceDuplicates, { words: [...filtered].join("', '") }); } } diff --git a/src/commands/Fun/dice.ts b/src/commands/Fun/dice.ts index 8bd5fc1cfc8..9700f5934b9 100644 --- a/src/commands/Fun/dice.ts +++ b/src/commands/Fun/dice.ts @@ -2,13 +2,14 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand' import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { isNumber } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; +import { TFunction } from 'i18next'; import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['roll'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Fun.DiceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.DiceExtended), + description: LanguageKeys.Commands.Fun.DiceDescription, + extendedHelp: LanguageKeys.Commands.Fun.DiceExtended, usage: '[amount:integer|dice:string]', spam: true }) @@ -32,30 +33,30 @@ export default class extends SkyraCommand { private readonly kDice20TrailRegExp = /([+-])\s*(\d+)/g; public async run(message: KlasaMessage, [amountOrDice = 1]: [number | string | undefined]) { - return message.sendLocale(LanguageKeys.Commands.Fun.DiceOutput, [ - { - result: await this.roll(message, amountOrDice) - } - ]); + const t = await message.fetchT(); + return message.send( + t(LanguageKeys.Commands.Fun.DiceOutput, { + result: await this.roll(t, amountOrDice) + }) + ); } - private async roll(message: KlasaMessage, pattern: string | number) { + private async roll(t: TFunction, pattern: string | number) { let amount: number | undefined = undefined; let dice: number | undefined = undefined; let modifier = 0; - const language = await message.fetchLanguage(); if (typeof pattern === 'number') { - if (!isNumber(pattern) || pattern <= 0) throw language.get(LanguageKeys.Resolvers.InvalidInt, { name: 'dice' }); + if (!isNumber(pattern) || pattern <= 0) throw t(LanguageKeys.Resolvers.InvalidInt, { name: 'dice' }); amount = pattern; dice = 6; } else { const results = this.kDice20RegExp.exec(pattern); - if (results === null) throw language.get(LanguageKeys.Commands.Fun.DiceRollsError); + if (results === null) throw t(LanguageKeys.Commands.Fun.DiceRollsError); amount = typeof results[1] === 'undefined' ? 1 : Number(results[1]); dice = Number(results[2]); - if (amount <= 0 || amount > 1024) throw language.get(LanguageKeys.Commands.Fun.DiceRollsError); - if (dice < 3 || dice > 1024) throw language.get(LanguageKeys.Commands.Fun.DiceSidesError); + if (amount <= 0 || amount > 1024) throw t(LanguageKeys.Commands.Fun.DiceRollsError); + if (dice < 3 || dice > 1024) throw t(LanguageKeys.Commands.Fun.DiceSidesError); if (results[3].length > 0) { let modifierResults: RegExpExecArray | null = null; diff --git a/src/commands/Fun/escaperope.ts b/src/commands/Fun/escaperope.ts index 6d5819941f8..0b369f31750 100644 --- a/src/commands/Fun/escaperope.ts +++ b/src/commands/Fun/escaperope.ts @@ -10,19 +10,19 @@ import { KlasaMessage } from 'klasa'; aliases: ['escape'], bucket: 2, cooldown: 60, - description: (language) => language.get(LanguageKeys.Commands.Fun.EscaperopeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.EscaperopeExtended) + description: LanguageKeys.Commands.Fun.EscapeRopeDescription, + extendedHelp: LanguageKeys.Commands.Fun.EscapeRopeExtended }) export default class extends SkyraCommand { public async run(message: KlasaMessage) { if (message.deletable) await message.nuke().catch(() => null); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); return message.send( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setImage(CdnUrls.EscapeRopeGif) - .setDescription(language.get(LanguageKeys.Commands.Fun.EscaperopeOutput, { user: message.author.toString() })) + .setDescription(t(LanguageKeys.Commands.Fun.EscapeRopeOutput, { user: message.author.toString() })) .setAuthor( message.member?.displayName ?? message.author.username, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) diff --git a/src/commands/Fun/howtoflirt.ts b/src/commands/Fun/howtoflirt.ts index f2c9ef90752..ee45f0cc88f 100644 --- a/src/commands/Fun/howtoflirt.ts +++ b/src/commands/Fun/howtoflirt.ts @@ -28,8 +28,8 @@ const imageCoordinates = [ aliases: ['pants'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Fun.HowToFlirtDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.HowToFlirtExtended), + description: LanguageKeys.Commands.Fun.HowToFlirtDescription, + extendedHelp: LanguageKeys.Commands.Fun.HowToFlirtExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Fun/love.ts b/src/commands/Fun/love.ts index fd9253a447e..4bbc1b64bbf 100644 --- a/src/commands/Fun/love.ts +++ b/src/commands/Fun/love.ts @@ -9,8 +9,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.LoveDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.LoveExtended), + description: LanguageKeys.Commands.Fun.LoveDescription, + extendedHelp: LanguageKeys.Commands.Fun.LoveExtended, requiredPermissions: ['EMBED_LINKS'], spam: true, usage: '' @@ -22,16 +22,16 @@ export default class extends SkyraCommand { const estimatedPercentage = Math.ceil(percentage * 100); let result: string | undefined = undefined; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (estimatedPercentage < 45) { - result = language.get(LanguageKeys.Commands.Fun.LoveLess45); + result = t(LanguageKeys.Commands.Fun.LoveLess45); } else if (estimatedPercentage < 75) { - result = language.get(LanguageKeys.Commands.Fun.LoveLess75); + result = t(LanguageKeys.Commands.Fun.LoveLess75); } else if (estimatedPercentage < 100) { - result = language.get(LanguageKeys.Commands.Fun.LoveLess100); + result = t(LanguageKeys.Commands.Fun.LoveLess100); } else { - result = language.get(isSelf ? LanguageKeys.Commands.Fun.LoveItself : LanguageKeys.Commands.Fun.Love100); + result = t(isSelf ? LanguageKeys.Commands.Fun.LoveItself : LanguageKeys.Commands.Fun.Love100); } return message.send( @@ -44,7 +44,7 @@ export default class extends SkyraCommand { `💗 **${user.tag}**`, `💗 **${message.author.tag}**\n`, `${estimatedPercentage}% \`[${'█'.repeat(Math.round(percentage * 40)).padEnd(40, '\u00A0')}]\`\n`, - `**${language.get(LanguageKeys.Commands.Fun.LoveResult)}**: ${result}` + `**${t(LanguageKeys.Commands.Fun.LoveResult)}**: ${result}` ].join('\n') ) ); diff --git a/src/commands/Fun/markov.ts b/src/commands/Fun/markov.ts index 60e68e61220..90ff006db8b 100644 --- a/src/commands/Fun/markov.ts +++ b/src/commands/Fun/markov.ts @@ -1,5 +1,5 @@ import { DbSet } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import type { GuildMessage } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { DEV } from '#root/config'; @@ -8,12 +8,23 @@ import { Markov, WordBank } from '#utils/External/markov'; import { getAllContent, iteratorAt, pickRandom } from '#utils/util'; import Collection from '@discordjs/collection'; import { cutText } from '@sapphire/utilities'; +import { ApplyOptions } from '@skyra/decorators'; import { Message, MessageEmbed, TextChannel, User } from 'discord.js'; -import { CommandStore, Language, Stopwatch } from 'klasa'; +import { TFunction } from 'i18next'; +import { Stopwatch } from 'klasa'; const kCodeA = 'A'.charCodeAt(0); const kCodeZ = 'Z'.charCodeAt(0); +@ApplyOptions({ + bucket: 2, + cooldown: 10, + description: LanguageKeys.Commands.Fun.MarkovDescription, + extendedHelp: LanguageKeys.Commands.Fun.MarkovExtended, + runIn: ['text'], + requiredPermissions: ['EMBED_LINKS', 'READ_MESSAGE_HISTORY'], + usage: '[channel:textchannelname{2}] [user:username]' +}) export default class extends SkyraCommand { private readonly kMessageHundredsLimit = 10; private readonly kInternalCache = new WeakMap(); @@ -21,43 +32,29 @@ export default class extends SkyraCommand { private readonly kInternalMessageCacheTTL = 120000; private readonly kInternalUserCache = new Map(); private readonly kInternalCacheTTL = 60000; - private readonly kBoundUseUpperCase: (wordBank: WordBank) => string; - private readonly kProcess: (message: GuildMessage, language: Language, markov: Markov) => Promise; - - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - bucket: 2, - cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.MarkovDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.MarkovExtended), - runIn: ['text'], - requiredPermissions: ['EMBED_LINKS', 'READ_MESSAGE_HISTORY'], - usage: '[channel:textchannelname{2}] [user:username]' - }); - - this.kBoundUseUpperCase = this.useUpperCase.bind(this); - this.kProcess = DEV ? this.processDevelopment.bind(this) : this.processRelease.bind(this); - } + private kBoundUseUpperCase!: (wordBank: WordBank) => string; + private kProcess!: (message: GuildMessage, language: TFunction, markov: Markov) => Promise; public async run(message: GuildMessage, [channnel, username]: [TextChannel?, User?]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Send loading message - await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) - ); + await message.send(new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)); // Process the chain - return message.send( - await this.kProcess(message, language, await this.retrieveMarkov(language, username, channnel ?? (message.channel as TextChannel))) - ); + return message.send(await this.kProcess(message, t, await this.retrieveMarkov(t, username, channnel ?? (message.channel as TextChannel)))); } - private async processRelease(message: GuildMessage, _: Language, markov: Markov) { + public async init() { + this.kBoundUseUpperCase = this.useUpperCase.bind(this); + this.kProcess = DEV ? this.processDevelopment.bind(this) : this.processRelease.bind(this); + } + + private async processRelease(message: GuildMessage, _: TFunction, markov: Markov) { return new MessageEmbed().setDescription(cutText(markov.process(), 2000)).setColor(await DbSet.fetchColor(message)); } - private async processDevelopment(message: GuildMessage, language: Language, markov: Markov) { + private async processDevelopment(message: GuildMessage, t: TFunction, markov: Markov) { const time = new Stopwatch(); const chain = markov.process(); time.stop(); @@ -65,15 +62,16 @@ export default class extends SkyraCommand { return new MessageEmbed() .setDescription(cutText(chain, 2000)) .setColor(await DbSet.fetchColor(message)) - .setFooter(language.get(LanguageKeys.Commands.Fun.MarkovTimer, { timer: time.toString() })); + .setFooter(t(LanguageKeys.Commands.Fun.MarkovTimer, { timer: time.toString() })); } - private async retrieveMarkov(language: Language, user: User | undefined, channel: TextChannel) { + private async retrieveMarkov(t: TFunction, user: User | undefined, channel: TextChannel) { const entry = user ? this.kInternalUserCache.get(`${channel.id}.${user.id}`) : this.kInternalCache.get(channel); if (typeof entry !== 'undefined') return entry; const messageBank = await this.fetchMessages(channel, user); - if (messageBank.size === 0) throw language.get(LanguageKeys.Commands.Fun.MarkovNoMessages); + if (messageBank.size === 0) throw t(LanguageKeys.Commands.Fun.MarkovNoMessages); + const contents = messageBank.map(getAllContent).join(' '); const markov = new Markov().parse(contents).start(this.kBoundUseUpperCase).end(60); if (user) this.kInternalUserCache.set(`${channel.id}.${user.id}`, markov); diff --git a/src/commands/Fun/norris.ts b/src/commands/Fun/norris.ts index 6534501e5c6..b90b7eac691 100644 --- a/src/commands/Fun/norris.ts +++ b/src/commands/Fun/norris.ts @@ -9,19 +9,19 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['chucknorris'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.NorrisDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.NorrisExtended), + description: LanguageKeys.Commands.Fun.NorrisDescription, + extendedHelp: LanguageKeys.Commands.Fun.NorrisExtended, requiredPermissions: ['EMBED_LINKS'], spam: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const data = await fetch('https://api.chucknorris.io/jokes/random', FetchResultTypes.JSON); return message.send( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) - .setTitle(language.get(LanguageKeys.Commands.Fun.NorrisOutput)) + .setTitle(t(LanguageKeys.Commands.Fun.NorrisOutput)) .setURL(data.url) .setThumbnail(data.icon_url) .setDescription(data.value) diff --git a/src/commands/Fun/peepolove.ts b/src/commands/Fun/peepolove.ts index f0657454dff..f50106023f6 100644 --- a/src/commands/Fun/peepolove.ts +++ b/src/commands/Fun/peepolove.ts @@ -12,8 +12,8 @@ import { join } from 'path'; aliases: ['pepelove'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.PeepoloveDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.PeepoloveExtended), + description: LanguageKeys.Commands.Fun.PeepoLoveDescription, + extendedHelp: LanguageKeys.Commands.Fun.PeepoLoveExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Fun/pun.ts b/src/commands/Fun/pun.ts index efa6acea544..7167c44d6af 100644 --- a/src/commands/Fun/pun.ts +++ b/src/commands/Fun/pun.ts @@ -7,22 +7,22 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Fun.PunDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.PunExtended), + description: LanguageKeys.Commands.Fun.PunDescription, + extendedHelp: LanguageKeys.Commands.Fun.PunExtended, spam: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage) { - const language = await message.fetchLanguage(); - - const { joke } = await fetch('https://icanhazdadjoke.com/', { - headers: { - Accept: Mime.Types.ApplicationJson - } - }).catch(() => { - throw language.get(LanguageKeys.Commands.Fun.PunError); - }); - return message.send(joke); + try { + const { joke } = await fetch('https://icanhazdadjoke.com/', { + headers: { + Accept: Mime.Types.ApplicationJson + } + }); + return message.send(joke); + } catch { + throw await message.resolveKey(LanguageKeys.Commands.Fun.PunError); + } } } diff --git a/src/commands/Fun/rate.ts b/src/commands/Fun/rate.ts index 02166950e64..1a633fcacc8 100644 --- a/src/commands/Fun/rate.ts +++ b/src/commands/Fun/rate.ts @@ -9,8 +9,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.RateDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.RateExtended), + description: LanguageKeys.Commands.Fun.RateDescription, + extendedHelp: LanguageKeys.Commands.Fun.RateExtended, spam: true, usage: '' }) @@ -21,17 +21,17 @@ export default class extends SkyraCommand { public async run(message: KlasaMessage, [user]: [string]) { // Escape all markdown user = escapeMarkdown(user); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); let ratewaifu: string | undefined = undefined; let rate: number | undefined = undefined; if (this.botRegex.test(user)) { rate = 100; - [ratewaifu, user] = language.get(LanguageKeys.Commands.Fun.RateMyself); + [ratewaifu, user] = t(LanguageKeys.Commands.Fun.RateMyself); } else if (this.devRegex.test(user)) { rate = 101; - [ratewaifu, user] = language.get(LanguageKeys.Commands.Fun.RateMyOwners); + [ratewaifu, user] = t(LanguageKeys.Commands.Fun.RateMyOwners); } else { user = /^(myself|me)$/i.test(user) ? message.author.username : user.replace(/\bmy\b/g, 'your'); @@ -39,12 +39,8 @@ export default class extends SkyraCommand { [ratewaifu, rate] = [oneToTen((rng / 10) | 0)!.emoji, rng]; } - return message.sendLocale( - LanguageKeys.Commands.Fun.RateOutput, - [{ author: message.author.username, userToRate: user, rate, emoji: ratewaifu }], - { - allowedMentions: { users: [], roles: [] } - } - ); + return message.send(t(LanguageKeys.Commands.Fun.RateOutput, { author: message.author.username, userToRate: user, rate, emoji: ratewaifu }), { + allowedMentions: { users: [], roles: [] } + }); } } diff --git a/src/commands/Fun/shindeiru.ts b/src/commands/Fun/shindeiru.ts index 19a78d72d03..c6a939cbe64 100644 --- a/src/commands/Fun/shindeiru.ts +++ b/src/commands/Fun/shindeiru.ts @@ -12,8 +12,8 @@ import { join } from 'path'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.ShindeiruDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.ShindeiruExtended), + description: LanguageKeys.Commands.Fun.ShindeiruDescription, + extendedHelp: LanguageKeys.Commands.Fun.ShindeiruExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Fun/wakanda.ts b/src/commands/Fun/wakanda.ts index a3827e5f6f8..d1b5b8f4faf 100644 --- a/src/commands/Fun/wakanda.ts +++ b/src/commands/Fun/wakanda.ts @@ -11,8 +11,8 @@ import { join } from 'path'; @ApplyOptions({ cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Fun.WakandaDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.WakandaExtended), + description: LanguageKeys.Commands.Fun.WakandaDescription, + extendedHelp: LanguageKeys.Commands.Fun.WakandaExtended, requiredPermissions: ['ATTACH_FILES'], usage: '[user:username]' }) diff --git a/src/commands/Fun/xkcd.ts b/src/commands/Fun/xkcd.ts index 8aa95176b62..edf945c867c 100644 --- a/src/commands/Fun/xkcd.ts +++ b/src/commands/Fun/xkcd.ts @@ -4,27 +4,25 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { fetch, FetchResultTypes } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; -import { Timestamp } from '@sapphire/time-utilities'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Fun.XkcdDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Fun.XkcdExtended), + description: LanguageKeys.Commands.Fun.XkcdDescription, + extendedHelp: LanguageKeys.Commands.Fun.XkcdExtended, requiredPermissions: ['EMBED_LINKS'], spam: true, usage: '[query:string]' }) export default class extends SkyraCommand { - private readonly timestamp = new Timestamp('MMMM, dddd dd YYYY'); - public async run(message: KlasaMessage, [input]: [string]) { const query = typeof input === 'undefined' ? null : /^\d+$/.test(input) ? Number(input) : input; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - const comicNumber = await this.getNumber(query, language); + const comicNumber = await this.getNumber(query, t); const comic = await fetch(`https://xkcd.com/${comicNumber}/info.0.json`, FetchResultTypes.JSON).catch(() => { - throw language.get(LanguageKeys.Commands.Fun.XkcdNotfound); + throw t(LanguageKeys.Commands.Fun.XkcdNotFound); }); return message.send( new MessageEmbed() @@ -32,22 +30,22 @@ export default class extends SkyraCommand { .setImage(comic.img) .setTitle(comic.title) .setURL(`https://xkcd.com/${comicNumber}/`) - .setFooter(`XKCD | ${comic.num} | ${this.getTime(comic.year, comic.month, comic.day)}`) + .setFooter(`XKCD | ${comic.num}`) .setDescription(comic.alt) - .setTimestamp() + .setTimestamp(this.getTime(comic.year, comic.month, comic.day)) ); } private getTime(year: string, month: string, day: string) { - return this.timestamp.display(new Date(Number(year), Number(month) - 1, Number(day))); + return new Date(Number(year), Number(month) - 1, Number(day)); } - private async getNumber(query: string | number | null, i18n: Language) { + private async getNumber(query: string | number | null, t: TFunction) { const xkcdInfo = (await fetch('https://xkcd.com/info.0.json', FetchResultTypes.JSON)) as XkcdResultOk; if (typeof query === 'number') { if (query <= xkcdInfo.num) return query; - throw i18n.get(LanguageKeys.Commands.Fun.XkcdComics, { amount: xkcdInfo.num }); + throw t(LanguageKeys.Commands.Fun.XkcdComics, { amount: xkcdInfo.num }); } if (query) { diff --git a/src/commands/GameIntegration/brawlstars.ts b/src/commands/GameIntegration/brawlstars.ts index af0cd988973..f3ff991e435 100644 --- a/src/commands/GameIntegration/brawlstars.ts +++ b/src/commands/GameIntegration/brawlstars.ts @@ -7,7 +7,8 @@ import { BrawlStars } from '#utils/GameIntegration/BrawlStars'; import { fetch, FetchResultTypes } from '#utils/util'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const kTagRegex = /#[A-Z0-9]{3,}/; @@ -49,8 +50,8 @@ export interface BrawlStarsGIData { @ApplyOptions({ aliases: ['bs'], - description: (language) => language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsExtended), + description: LanguageKeys.Commands.GameIntegration.BrawlStarsDescription, + extendedHelp: LanguageKeys.Commands.GameIntegration.BrawlStarsExtended, subcommands: true, flagSupport: true, usage: ' [tag:tag]', @@ -61,7 +62,7 @@ export interface BrawlStarsGIData { 'tag', async (arg, _possible, message) => { if (kTagRegex.test(arg)) return arg; - throw await message.fetchLocale(LanguageKeys.Commands.GameIntegration.BrawlStarsInvalidPlayerTag, { playertag: arg }); + throw await message.resolveKey(LanguageKeys.Commands.GameIntegration.BrawlStarsInvalidPlayerTag, { playertag: arg }); } ] ]) @@ -69,15 +70,15 @@ export default class extends SkyraCommand { public async player(message: KlasaMessage, [tag]: [string]) { const { users } = await DbSet.connect(); const bsData = await users.fetchIntegration(this.name, message.author); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (!tag && bsData.extraData?.playerTag) { tag = bsData.extraData.playerTag!; } else if (!tag) { - throw language.get(LanguageKeys.Resolvers.InvalidString, { name: 'tag' }); + throw t(LanguageKeys.Resolvers.InvalidString, { name: 'tag' }); } - const playerData = await this.fetchAPI(language, tag, BrawlStarsFetchCategories.PLAYERS); + const playerData = await this.fetchAPI(t, tag, BrawlStarsFetchCategories.PLAYERS); const saveFlag = Reflect.get(message.flagArgs, 'save'); if (saveFlag) { @@ -85,21 +86,21 @@ export default class extends SkyraCommand { await bsData.save(); } - return message.send(await this.buildPlayerEmbed(message, language, playerData)); + return message.send(await this.buildPlayerEmbed(message, t, playerData)); } public async club(message: KlasaMessage, [tag]: [string]) { const { users } = await DbSet.connect(); const bsData = await users.fetchIntegration(this.name, message.author); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (!tag && bsData.extraData?.clubTag) { tag = bsData.extraData.clubTag!; } else if (!tag) { - throw language.get(LanguageKeys.Resolvers.InvalidString, { name: 'tag' }); + throw t(LanguageKeys.Resolvers.InvalidString, { name: 'tag' }); } - const clubData = await this.fetchAPI(language, tag, BrawlStarsFetchCategories.CLUB); + const clubData = await this.fetchAPI(t, tag, BrawlStarsFetchCategories.CLUB); const saveFlag = Reflect.get(message.flagArgs, 'save'); if (saveFlag) { @@ -107,13 +108,13 @@ export default class extends SkyraCommand { await bsData.save(); } - return message.send(await this.buildClubEmbed(message, language, clubData)); + return message.send(await this.buildClubEmbed(message, t, clubData)); } - private async buildPlayerEmbed(message: KlasaMessage, language: Language, player: BrawlStars.Player) { - const titles = language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsPlayerEmbedTitles); - const fields = language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsPlayerEmbedFields); - const languageString = language.name; + private async buildPlayerEmbed(message: KlasaMessage, t: TFunction, player: BrawlStars.Player) { + const titles = t(LanguageKeys.Commands.GameIntegration.BrawlStarsPlayerEmbedTitles); + const fields = t(LanguageKeys.Commands.GameIntegration.BrawlStarsPlayerEmbedFields); + const digitFormat = (value: number) => t(LanguageKeys.Globals.NumberValue, { value }); return new MessageEmbed() .setColor(player.nameColor?.substr(4) ?? (await DbSet.fetchColor(message))) @@ -122,16 +123,16 @@ export default class extends SkyraCommand { .addField( titles.trophies, [ - `${BrawlStarsEmojis.Trophy} **${fields.total}**: ${player.trophies.toLocaleString(languageString)}`, - `${BrawlStarsEmojis.Trophy} **${fields.personalBest}**: ${player.highestTrophies.toLocaleString(languageString)}` + `${BrawlStarsEmojis.Trophy} **${fields.total}**: ${digitFormat(player.trophies)}`, + `${BrawlStarsEmojis.Trophy} **${fields.personalBest}**: ${digitFormat(player.highestTrophies)}` ].join('\n') ) .addField( titles.exp, [ - `${BrawlStarsEmojis.Exp} **${fields.experienceLevel}**: ${player.expLevel} (${player.expPoints.toLocaleString(languageString)})`, - `${BrawlStarsEmojis.PowerPlay} **${fields.total}**: ${player.powerPlayPoints?.toLocaleString(languageString) || 0}`, - `${BrawlStarsEmojis.PowerPlay} **${fields.personalBest}**: ${player.highestPowerPlayPoints?.toLocaleString(languageString) || 0}` + `${BrawlStarsEmojis.Exp} **${fields.experienceLevel}**: ${player.expLevel} (${digitFormat(player.expPoints)})`, + `${BrawlStarsEmojis.PowerPlay} **${fields.total}**: ${digitFormat(player.powerPlayPoints ?? 0)}`, + `${BrawlStarsEmojis.PowerPlay} **${fields.personalBest}**: ${digitFormat(player.highestPowerPlayPoints ?? 0)}` ].join('\n') ) .addField( @@ -146,9 +147,9 @@ export default class extends SkyraCommand { .addField( titles.gamesModes, [ - `${BrawlStarsEmojis.GemGrab} **${fields.victories3v3}**: ${player['3vs3Victories'].toLocaleString(languageString)}`, - `${BrawlStarsEmojis.SoloShowdown} **${fields.victoriesSolo}**: ${player.soloVictories.toLocaleString(languageString)}`, - `${BrawlStarsEmojis.DuoShowdown} **${fields.victoriesDuo}**: ${player.duoVictories.toLocaleString(languageString)}` + `${BrawlStarsEmojis.GemGrab} **${fields.victories3v3}**: ${digitFormat(player['3vs3Victories'])}`, + `${BrawlStarsEmojis.SoloShowdown} **${fields.victoriesSolo}**: ${digitFormat(player.soloVictories)}`, + `${BrawlStarsEmojis.DuoShowdown} **${fields.victoriesDuo}**: ${digitFormat(player.duoVictories)}` ].join('\n') ) .addField( @@ -164,23 +165,23 @@ export default class extends SkyraCommand { ); } - private async buildClubEmbed(message: KlasaMessage, language: Language, club: BrawlStars.Club) { - const titles = language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsClubEmbedTitles); - const fields = language.get(LanguageKeys.Commands.GameIntegration.BrawlstarsClubEmbedFields); - const languageString = language.name; + private async buildClubEmbed(message: KlasaMessage, t: TFunction, club: BrawlStars.Club) { + const titles = t(LanguageKeys.Commands.GameIntegration.BrawlStarsClubEmbedTitles); + const fields = t(LanguageKeys.Commands.GameIntegration.BrawlStarsClubEmbedFields); + const digitFormat = (value: number) => t(LanguageKeys.Globals.NumberValue, { value }); const averageTrophies = Math.round(club.trophies / club.members.length); const mapMembers = (member: BrawlStars.ClubMember, i: number) => - `${i + 1}. ${member.name} (${BrawlStarsEmojis.Trophy} ${member.trophies.toLocaleString(languageString)})`; + `${i + 1}. ${member.name} (${BrawlStarsEmojis.Trophy} ${digitFormat(member.trophies)})`; const president = club.members.find((member) => member.role === 'president'); const embed = new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setTitle(`${club.name} - ${club.tag}`) .setURL(`https://brawlstats.com/club/${club.tag.substr(1)}`) - .addField(titles.totalTrophies, `${BrawlStarsEmojis.Trophy} ${club.trophies.toLocaleString()}`) - .addField(titles.averageTrophies, `${BrawlStarsEmojis.Trophy} ${averageTrophies.toLocaleString()}`) - .addField(titles.requiredTrophies, `${BrawlStarsEmojis.Trophy} ${club.requiredTrophies.toLocaleString()}+`) + .addField(titles.totalTrophies, `${BrawlStarsEmojis.Trophy} ${digitFormat(club.trophies)}`) + .addField(titles.averageTrophies, `${BrawlStarsEmojis.Trophy} ${digitFormat(averageTrophies)}`) + .addField(titles.requiredTrophies, `${BrawlStarsEmojis.Trophy} ${digitFormat(club.requiredTrophies)}+`) .addField(titles.members, `${club.members.length} / ${kMaxMembers}`) .addField(titles.type, club.type) .addField(titles.president, president?.name || fields.noPresident) @@ -191,7 +192,7 @@ export default class extends SkyraCommand { return embed; } - private async fetchAPI(language: Language, query: string, category: BrawlStarsFetchCategories) { + private async fetchAPI(t: TFunction, query: string, category: BrawlStarsFetchCategories) { try { const url = new URL(`https://api.brawlstars.com/v1/${category}/`); url.href += encodeURIComponent(query); @@ -207,8 +208,8 @@ export default class extends SkyraCommand { ); } catch { throw category === BrawlStarsFetchCategories.CLUB - ? language.get(LanguageKeys.Commands.GameIntegration.BrawlStarsClansQueryFail, { clan: query }) - : language.get(LanguageKeys.Commands.GameIntegration.BrawlStarsPlayersQueryFail, { playertag: query }); + ? t(LanguageKeys.Commands.GameIntegration.BrawlStarsClansQueryFail, { clan: query }) + : t(LanguageKeys.Commands.GameIntegration.BrawlStarsPlayersQueryFail, { playertag: query }); } } } diff --git a/src/commands/GameIntegration/clashofclans.ts b/src/commands/GameIntegration/clashofclans.ts index 35a817c941a..62b67506af4 100644 --- a/src/commands/GameIntegration/clashofclans.ts +++ b/src/commands/GameIntegration/clashofclans.ts @@ -10,7 +10,7 @@ import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const enum ClashOfClansFetchCategories { PLAYERS = 'players', @@ -23,8 +23,8 @@ const kFilterSpecialCharacters = /[^A-Z0-9]+/gi; @ApplyOptions({ aliases: ['coc'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.GameIntegration.ClashofclansDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.GameIntegration.ClashofclansExtended), + description: LanguageKeys.Commands.GameIntegration.ClashOfClansDescription, + extendedHelp: LanguageKeys.Commands.GameIntegration.ClashOfClansExtended, subcommands: true, usage: ' ', usageDelim: ' ' @@ -39,38 +39,38 @@ const kFilterSpecialCharacters = /[^A-Z0-9]+/gi; if (action === 'player') { if (kPlayerTagRegex.test(arg)) return arg; - throw await message.fetchLocale(LanguageKeys.Commands.GameIntegration.ClashOfClansInvalidPlayerTag, { playertag: arg }); + throw await message.resolveKey(LanguageKeys.Commands.GameIntegration.ClashOfClansInvalidPlayerTag, { playertag: arg }); } - throw await message.fetchLocale(LanguageKeys.System.QueryFail); + throw await message.resolveKey(LanguageKeys.System.QueryFail); } ] ]) export default class extends RichDisplayCommand { public async clan(message: GuildMessage, [clan]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { items: clanData } = await this.fetchAPI(language, clan, ClashOfClansFetchCategories.CLANS); + const { items: clanData } = await this.fetchAPI(t, clan, ClashOfClansFetchCategories.CLANS); - if (!clanData.length) throw language.get(LanguageKeys.Commands.GameIntegration.ClashOfClansClansQueryFail, { clan }); + if (!clanData.length) throw t(LanguageKeys.Commands.GameIntegration.ClashOfClansClansQueryFail, { clan }); - const display = await this.buildClanDisplay(message, language, clanData); + const display = await this.buildClanDisplay(message, t, clanData); await display.start(response, message.author.id); return response; } public async player(message: GuildMessage, [player]: [string]) { - const language = await message.fetchLanguage(); + const language = await message.fetchT(); const playerData = await this.fetchAPI(language, player, ClashOfClansFetchCategories.PLAYERS); return message.send(await this.buildPlayerEmbed(message, language, playerData)); } - private async fetchAPI(language: Language, query: string, category: ClashOfClansFetchCategories) { + private async fetchAPI(t: TFunction, query: string, category: ClashOfClansFetchCategories) { try { const url = new URL(`https://api.clashofclans.com/v1/${category}/`); @@ -92,13 +92,13 @@ export default class extends RichDisplayCommand { ); } catch { throw category === ClashOfClansFetchCategories.CLANS - ? language.get(LanguageKeys.Commands.GameIntegration.ClashOfClansClansQueryFail, { clan: query }) - : language.get(LanguageKeys.Commands.GameIntegration.ClashOfClansPlayersQueryFail, { playertag: query }); + ? t(LanguageKeys.Commands.GameIntegration.ClashOfClansClansQueryFail, { clan: query }) + : t(LanguageKeys.Commands.GameIntegration.ClashOfClansPlayersQueryFail, { playertag: query }); } } - private async buildPlayerEmbed(message: GuildMessage, language: Language, player: ClashOfClans.Player) { - const titles = language.get(LanguageKeys.Commands.GameIntegration.ClashofclansPlayerEmbedTitles); + private async buildPlayerEmbed(message: GuildMessage, t: TFunction, player: ClashOfClans.Player) { + const titles = t(LanguageKeys.Commands.GameIntegration.ClashOfClansPlayerEmbedTitles); return new MessageEmbed() .setColor(await DbSet.fetchColor(message)) @@ -132,11 +132,11 @@ export default class extends RichDisplayCommand { ); } - private async buildClanDisplay(message: GuildMessage, language: Language, clans: ClashOfClans.Clan[]) { + private async buildClanDisplay(message: GuildMessage, t: TFunction, clans: ClashOfClans.Clan[]) { const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const clan of clans) { - const titles = language.get(LanguageKeys.Commands.GameIntegration.ClashofclansClanEmbedTitles); + const titles = t(LanguageKeys.Commands.GameIntegration.ClashOfClansClanEmbedTitles); display.addPage((embed: MessageEmbed) => embed .setThumbnail(clan.badgeUrls.large) @@ -164,7 +164,7 @@ export default class extends RichDisplayCommand { `**${titles.warWins}**: ${clan.warWins}`, `**${titles.warTies}**: ${clan.warTies ?? titles.unknown}`, `**${titles.warLosses}**: ${clan.warLosses ?? titles.unknown}`, - `**${titles.warLogPublic}**: ${language.get(clan.isWarLogPublic ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No)}` + `**${titles.warLogPublic}**: ${t(clan.isWarLogPublic ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No)}` ] .filter((val) => val !== null) .join('\n') diff --git a/src/commands/GameIntegration/ffxiv.ts b/src/commands/GameIntegration/ffxiv.ts index ca6aa60c9da..542a240f22a 100644 --- a/src/commands/GameIntegration/ffxiv.ts +++ b/src/commands/GameIntegration/ffxiv.ts @@ -9,13 +9,13 @@ import { FFXIVClasses, FFXIV_BASE_URL, getCharacterDetails, searchCharacter, sea import { pickRandom } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { EmbedField, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['finalfantasy'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.GameIntegration.FFXIVDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.GameIntegration.FFXIVExtended), + description: LanguageKeys.Commands.GameIntegration.FFXIVDescription, + extendedHelp: LanguageKeys.Commands.GameIntegration.FFXIVExtended, flagSupport: true, subcommands: true, usage: ' ', @@ -23,51 +23,51 @@ import { Language } from 'klasa'; }) export default class extends RichDisplayCommand { public async character(message: GuildMessage, [name]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const characterDetails = await this.fetchCharacter(language, name, Reflect.get(message.flagArgs, 'server')); - const display = await this.buildCharacterDisplay(message, language, characterDetails.Character); + const characterDetails = await this.fetchCharacter(t, name, Reflect.get(message.flagArgs, 'server')); + const display = await this.buildCharacterDisplay(message, t, characterDetails.Character); await display.start(response, message.author.id); return response; } public async item(message: GuildMessage, [item]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const itemDetails = await this.fetchItems(language, item); - const display = await this.buildItemDisplay(message, language, itemDetails); + const itemDetails = await this.fetchItems(t, item); + const display = await this.buildItemDisplay(message, t, itemDetails); await display.start(response, message.author.id); return response; } - private async fetchCharacter(language: Language, name: string, server?: string) { - const searchResult = await searchCharacter(language, name, server); + private async fetchCharacter(t: TFunction, name: string, server?: string) { + const searchResult = await searchCharacter(t, name, server); - if (!searchResult.Results.length) throw language.get(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); + if (!searchResult.Results.length) throw t(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); - return getCharacterDetails(language, searchResult.Results[0].ID); + return getCharacterDetails(t, searchResult.Results[0].ID); } - private async fetchItems(i18n: Language, item: string) { - const searchResult = await searchItem(i18n, item); + private async fetchItems(t: TFunction, item: string) { + const searchResult = await searchItem(t, item); - if (!searchResult.Results.length) throw i18n.get(LanguageKeys.Commands.GameIntegration.FFXIVNoItemFound); + if (!searchResult.Results.length) throw t(LanguageKeys.Commands.GameIntegration.FFXIVNoItemFound); return searchResult.Results; } - private async buildCharacterDisplay(message: GuildMessage, language: Language, character: FFXIV.Character) { + private async buildCharacterDisplay(message: GuildMessage, t: TFunction, character: FFXIV.Character) { const { discipleOfTheHandJobs, discipleOfTheLandJobs, @@ -78,7 +78,7 @@ export default class extends RichDisplayCommand { tankClassValues } = this.parseCharacterClasses(character.ClassJobs); - const titles = language.get(LanguageKeys.Commands.GameIntegration.FFXIVCharacterFields); + const titles = t(LanguageKeys.Commands.GameIntegration.FFXIVCharacterFields); const display = new UserRichDisplay( new MessageEmbed() @@ -139,8 +139,8 @@ export default class extends RichDisplayCommand { return display; } - private async buildItemDisplay(message: GuildMessage, language: Language, items: FFXIV.ItemSearchResult[]) { - const titles = language.get(LanguageKeys.Commands.GameIntegration.FFXIVItemFields); + private async buildItemDisplay(message: GuildMessage, t: TFunction, items: FFXIV.ItemSearchResult[]) { + const titles = t(LanguageKeys.Commands.GameIntegration.FFXIVItemFields); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const item of items) { diff --git a/src/commands/GameIntegration/fortnite.ts b/src/commands/GameIntegration/fortnite.ts index 2e91b60a11d..caa49bc84a9 100644 --- a/src/commands/GameIntegration/fortnite.ts +++ b/src/commands/GameIntegration/fortnite.ts @@ -9,12 +9,12 @@ import { Fortnite } from '#utils/GameIntegration/Fortnite'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.GameIntegration.FortniteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.GameIntegration.FortniteExtended), + description: LanguageKeys.Commands.GameIntegration.FortniteDescription, + extendedHelp: LanguageKeys.Commands.GameIntegration.FortniteExtended, usage: ' ', usageDelim: ' ' }) @@ -22,19 +22,19 @@ export default class extends RichDisplayCommand { private apiBaseUrl = 'https://api.fortnitetracker.com/v1/profile/'; public async run(message: GuildMessage, [platform, user]: [platform, string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const fortniteUser = await this.fetchAPI(language, user, platform); - const display = await this.buildDisplay(message, language, fortniteUser); + const fortniteUser = await this.fetchAPI(t, user, platform); + const display = await this.buildDisplay(message, t, fortniteUser); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, user: string, platform: platform) { + private async fetchAPI(t: TFunction, user: string, platform: platform) { try { const fortniteUser = await fetch( `${this.apiBaseUrl}/${platform}/${user}`, @@ -47,26 +47,26 @@ export default class extends RichDisplayCommand { } catch { // Either when no user is found (response will have an error message) // Or there was a server fault (no json will be returned) - throw language.get(LanguageKeys.Commands.GameIntegration.FortniteNoUser); + throw t(LanguageKeys.Commands.GameIntegration.FortniteNoUser); } } private async buildDisplay( message: GuildMessage, - language: Language, + t: TFunction, { lifeTimeStats, epicUserHandle, platformName, stats: { p2, p10, p9 } }: Fortnite.FortniteUser ) { const display = new UserRichDisplay( new MessageEmbed() - .setTitle(language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedTitle, { epicUserHandle })) + .setTitle(t(LanguageKeys.Commands.GameIntegration.FortniteEmbedTitle, { epicUserHandle })) .setURL(encodeURI(`https://fortnitetracker.com/profile/${platformName}/${epicUserHandle}`)) .setColor(await DbSet.fetchColor(message)) ); - const embedSectionTitles = language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedSectionTitles); + const embedSectionTitles = t(LanguageKeys.Commands.GameIntegration.FortniteEmbedSectionTitles); display.addPage((embed) => { const lts = lifeTimeStats.map((stat) => ({ ...stat, key: stat.key.toLowerCase() })); - const ltsData = language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { + const ltsData = t(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { winCount: lts.find((el) => el.key === 'wins')!.value, killCount: lts.find((el) => el.key === 'kills')!.value, kdrCount: lts.find((el) => el.key === 'k/d')!.value, @@ -98,7 +98,7 @@ export default class extends RichDisplayCommand { if (p2) { display.addPage((embed) => { - const p2Data = language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { + const p2Data = t(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { winCount: p2.top1.value, killCount: p2.kills.value, kdrCount: p2.kd.value, @@ -132,7 +132,7 @@ export default class extends RichDisplayCommand { if (p10) { display.addPage((embed) => { - const p10Data = language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { + const p10Data = t(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { winCount: p10.top1.value, killCount: p10.kills.value, kdrCount: p10.kd.value, @@ -166,7 +166,7 @@ export default class extends RichDisplayCommand { if (p9) { display.addPage((embed) => { - const p9Data = language.get(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { + const p9Data = t(LanguageKeys.Commands.GameIntegration.FortniteEmbedStats, { winCount: p9.top1.value, killCount: p9.kills.value, kdrCount: p9.kd.value, diff --git a/src/commands/GameIntegration/overwatch.ts b/src/commands/GameIntegration/overwatch.ts index 36393911049..31c02543137 100644 --- a/src/commands/GameIntegration/overwatch.ts +++ b/src/commands/GameIntegration/overwatch.ts @@ -8,48 +8,45 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { OverwatchEmbedDataReturn } from '#lib/types/namespaces/languages/commands/GameIntegration'; import { BrandingColors, Time } from '#utils/constants'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; -import { Timestamp } from '@sapphire/time-utilities'; import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { Collection, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['ow'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.GameIntegration.OverwatchDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.GameIntegration.OverwatchExtended), + description: LanguageKeys.Commands.GameIntegration.OverwatchDescription, + extendedHelp: LanguageKeys.Commands.GameIntegration.OverwatchExtended, usage: ' ', usageDelim: ' ' }) export default class extends RichDisplayCommand { - private readonly kPlayTimestamp = new Timestamp('H [hours] - m [minutes]'); - public async run(message: GuildMessage, [platform = 'pc', player]: [PlatformUnion, string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const overwatchData = await this.fetchAPI(language, player, platform); + const overwatchData = await this.fetchAPI(t, player, platform); - if (overwatchData.error) throw language.get(LanguageKeys.System.QueryFail); + if (overwatchData.error) throw t(LanguageKeys.System.QueryFail); if (!overwatchData.competitiveStats.topHeroes || !overwatchData.quickPlayStats.topHeroes) { - throw language.get(LanguageKeys.Commands.GameIntegration.OverwatchNoStats, { player: this.decodePlayerName(player) }); + throw t(LanguageKeys.Commands.GameIntegration.OverwatchNoStats, { player: this.decodePlayerName(player) }); } - const display = await this.buildDisplay(message, language, overwatchData, player, platform); + const display = await this.buildDisplay(message, t, overwatchData, player, platform); await display.start(response, message.author.id); return response; } /** Queries the Overwatch API for data on a player with platform */ - private async fetchAPI(language: Language, player: string, platform: PlatformUnion) { + private async fetchAPI(t: TFunction, player: string, platform: PlatformUnion) { try { return await fetch(`https://ow-api.com/v1/stats/${platform}/global/${player}/complete`, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.Commands.GameIntegration.OverwatchQueryFail, { + throw t(LanguageKeys.Commands.GameIntegration.OverwatchQueryFail, { player: this.decodePlayerName(player), platform }); @@ -57,7 +54,7 @@ export default class extends RichDisplayCommand { } /** Builds a UserRichDisplay for presenting Overwatch data */ - private async buildDisplay(message: GuildMessage, language: Language, overwatchData: OverwatchDataSet, player: string, platform: PlatformUnion) { + private async buildDisplay(message: GuildMessage, t: TFunction, overwatchData: OverwatchDataSet, player: string, platform: PlatformUnion) { const ratings = Array.from( this.ratingsToCollection( overwatchData.ratings ?? [], @@ -65,12 +62,14 @@ export default class extends RichDisplayCommand { (r) => r ) .mapValues((rating) => { - return `**${toTitleCase(rating.role)}:** ${typeof rating.level === 'number' ? language.groupDigits(rating.level) : rating.level}`; + return `**${toTitleCase(rating.role)}:** ${ + typeof rating.level === 'number' ? t(LanguageKeys.Globals.NumberValue, { value: rating.level }) : rating.level + }`; }) .values() ).join('\n'); - const embedData = language.get(LanguageKeys.Commands.GameIntegration.OverwatchEmbedData, { + const embedData = t(LanguageKeys.Commands.GameIntegration.OverwatchEmbedData, { authorName: overwatchData.name, playerLevel: overwatchData.level, prestigeLevel: overwatchData.level + overwatchData.prestige * 100, @@ -95,12 +94,12 @@ export default class extends RichDisplayCommand { overwatchData.gamesWon ? embedData.totalGamesWon : embedData.noGamesWon ].join('\n') ) - .addField(embedData.ratingsTitle, ratings || language.get(LanguageKeys.Globals.None)) + .addField(embedData.ratingsTitle, ratings || t(LanguageKeys.Globals.None)) ) - .addPage((embed) => embed.setDescription(this.extractStats(language, overwatchData, 'quickPlayStats', embedData))) - .addPage((embed) => embed.setDescription(this.extractStats(language, overwatchData, 'competitiveStats', embedData))) - .addPage((embed) => embed.setDescription(this.extractTopHeroes(language, overwatchData, 'quickPlayStats', embedData))) - .addPage((embed) => embed.setDescription(this.extractTopHeroes(language, overwatchData, 'competitiveStats', embedData))); + .addPage((embed) => embed.setDescription(this.extractStats(t, overwatchData, 'quickPlayStats', embedData))) + .addPage((embed) => embed.setDescription(this.extractStats(t, overwatchData, 'competitiveStats', embedData))) + .addPage((embed) => embed.setDescription(this.extractTopHeroes(t, overwatchData, 'quickPlayStats', embedData))) + .addPage((embed) => embed.setDescription(this.extractTopHeroes(t, overwatchData, 'competitiveStats', embedData))); } /** @@ -138,7 +137,7 @@ export default class extends RichDisplayCommand { } /** Extracts statistics from overwatchData for either competitive play or quickplay and returns it in a format valid for `MessageEmbed` description */ - private extractStats(language: Language, overwatchData: OverwatchDataSet, type: OverwatchStatsTypeUnion, embedData: OverwatchEmbedDataReturn) { + private extractStats(t: TFunction, overwatchData: OverwatchDataSet, type: OverwatchStatsTypeUnion, embedData: OverwatchEmbedDataReturn) { const { careerStats: { allHeroes: { @@ -151,8 +150,9 @@ export default class extends RichDisplayCommand { awards: { medalsBronze, medalsSilver, medalsGold } } = overwatchData[type]; - const timePlayedMilliseconds = Number(timePlayed.split(':')[0]) * Time.Hour + Number(timePlayed.split(':')[1]) * Time.Minute; - const statsData = language.get(LanguageKeys.Commands.GameIntegration.OverwatchEmbedDataStats, { + const [hours, minutes] = timePlayed.split(':'); + const timePlayedMilliseconds = Number(hours) * Time.Hour + Number(minutes) * Time.Minute; + const statsData = t(LanguageKeys.Commands.GameIntegration.OverwatchEmbedDataStats, { finalBlows, deaths, damageDone, @@ -183,20 +183,15 @@ export default class extends RichDisplayCommand { } /** Extracts top heroes from overwatchData for either competitive play or quickplay and returns it in a format valid for `MessageEmbed` description */ - private extractTopHeroes( - language: Language, - overwatchData: OverwatchDataSet, - type: OverwatchStatsTypeUnion, - embedData: OverwatchEmbedDataReturn - ) { + private extractTopHeroes(t: TFunction, overwatchData: OverwatchDataSet, type: OverwatchStatsTypeUnion, embedData: OverwatchEmbedDataReturn) { const topHeroes = this.getTopHeroes(overwatchData, type); return [ embedData.headers[type === 'competitiveStats' ? 'topHeroesCompetitive' : 'topHeroesQuickplay'], ...topHeroes.map((topHero) => - language.get(LanguageKeys.Commands.GameIntegration.OverwatchEmbedDataTopHero, { + t(LanguageKeys.Commands.GameIntegration.OverwatchEmbedDataTopHero, { name: topHero.hero, - playTime: this.kPlayTimestamp.display(topHero.time) + playTime: topHero.time }) ) ].join('\n'); diff --git a/src/commands/Games/c4.ts b/src/commands/Games/c4.ts index 84eae1cf113..f4b91c14252 100644 --- a/src/commands/Games/c4.ts +++ b/src/commands/Games/c4.ts @@ -9,8 +9,8 @@ import { User } from 'discord.js'; @ApplyOptions({ aliases: ['connect-four'], cooldown: 0, - description: (language) => language.get(LanguageKeys.Commands.Games.C4Description), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.C4Extended), + description: LanguageKeys.Commands.Games.C4Description, + extendedHelp: LanguageKeys.Commands.Games.C4Extended, requiredPermissions: ['USE_EXTERNAL_EMOJIS', 'ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '' @@ -19,26 +19,26 @@ export default class extends SkyraCommand { private prompt = this.definePrompt(''); public async run(message: GuildMessage, [user]: [User]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - if (user.id === CLIENT_ID) throw language.get(LanguageKeys.Commands.Games.GamesSkyra); - if (user.bot) throw language.get(LanguageKeys.Commands.Games.GamesBot); - if (user.id === message.author.id) throw language.get(LanguageKeys.Commands.Games.GamesSelf); - if (this.client.connectFour.has(message.channel.id)) throw language.get(LanguageKeys.Commands.Games.GamesProgress); + if (user.id === CLIENT_ID) throw t(LanguageKeys.Commands.Games.GamesSkyra); + if (user.bot) throw t(LanguageKeys.Commands.Games.GamesBot); + if (user.id === message.author.id) throw t(LanguageKeys.Commands.Games.GamesSelf); + if (this.client.connectFour.has(message.channel.id)) throw t(LanguageKeys.Commands.Games.GamesProgress); this.client.connectFour.set(message.channel.id, null); try { const [response] = await this.prompt .createPrompt(message, { target: user }) - .run(language.get(LanguageKeys.Commands.Games.C4Prompt, { challenger: message.author.toString(), challengee: user.toString() })); + .run(t(LanguageKeys.Commands.Games.C4Prompt, { challenger: message.author.toString(), challengee: user.toString() })); if (response) { await this.client.connectFour.create(message, message.author, user)!.run(); } else { - await message.alert(language.get(LanguageKeys.Commands.Games.GamesPromptDeny)); + await message.alert(t(LanguageKeys.Commands.Games.GamesPromptDeny)); } } catch (error) { if (typeof error !== 'string') this.client.emit(Events.Wtf, error); - await message.alert(language.get(LanguageKeys.Commands.Games.GamesPromptTimeout)); + await message.alert(t(LanguageKeys.Commands.Games.GamesPromptTimeout)); } finally { this.client.connectFour.delete(message.channel.id); } diff --git a/src/commands/Games/coinflip.ts b/src/commands/Games/coinflip.ts index 0e6f6fac3b7..da22fdf6509 100644 --- a/src/commands/Games/coinflip.ts +++ b/src/commands/Games/coinflip.ts @@ -3,7 +3,8 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand' import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const enum CoinType { Heads, @@ -14,8 +15,8 @@ const enum CoinType { aliases: ['cf'], bucket: 2, cooldown: 7, - description: (language) => language.get(LanguageKeys.Commands.Games.CoinFlipDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.CoinFlipExtended), + description: LanguageKeys.Commands.Games.CoinFlipDescription, + extendedHelp: LanguageKeys.Commands.Games.CoinFlipExtended, requiredPermissions: ['EMBED_LINKS'], usage: '(coin:cointype) (wager:coinwager)', usageDelim: ' ' @@ -25,10 +26,10 @@ const enum CoinType { 'cointype', async (arg, _possible, message) => { if (!arg) return null; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const lArg = arg.toLowerCase(); - const face = language.get(LanguageKeys.Commands.Games.CoinFlipCoinNames).findIndex((coin) => coin.toLowerCase() === lArg); - if (face === -1) throw language.get(LanguageKeys.Commands.Games.CoinFlipInvalidCoinname, { arg }); + const face = t(LanguageKeys.Commands.Games.CoinFlipCoinNames).findIndex((coin) => coin.toLowerCase() === lArg); + if (face === -1) throw t(LanguageKeys.Commands.Games.CoinFlipInvalidCoinName, { arg }); return face; } ], @@ -44,17 +45,17 @@ export default class extends SkyraCommand { private readonly cdnTypes = ['heads', 'tails'] as const; public async run(message: KlasaMessage, [guess, wager]: [CoinType | null, number | 'cashless']) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - if (guess === null) return this.noGuess(message, language); - if (wager === 'cashless') return this.cashless(message, language, guess); + if (guess === null) return this.noGuess(message, t); + if (wager === 'cashless') return this.cashless(message, t, guess); const { users } = await DbSet.connect(); const settings = await users.ensure(message.author.id); const balance = settings.money; if (balance < wager) { - throw language.get(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); + throw t(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); } const result = this.flipCoin(); @@ -64,14 +65,14 @@ export default class extends SkyraCommand { return message.send( (await this.buildEmbed(message, result)) - .setTitle(language.get(won ? LanguageKeys.Commands.Games.CoinFlipWinTitle : LanguageKeys.Commands.Games.CoinFlipLoseTitle)) + .setTitle(t(won ? LanguageKeys.Commands.Games.CoinFlipWinTitle : LanguageKeys.Commands.Games.CoinFlipLoseTitle)) .setDescription( - language.get( + t( won ? LanguageKeys.Commands.Games.CoinFlipWinDescriptionWithWager : LanguageKeys.Commands.Games.CoinFlipLoseDescriptionWithWager, { - result: language.get(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result], + result: t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result], wager } ) @@ -79,30 +80,30 @@ export default class extends SkyraCommand { ); } - private async cashless(message: KlasaMessage, language: Language, guess: CoinType) { + private async cashless(message: KlasaMessage, t: TFunction, guess: CoinType) { const result = this.flipCoin(); const won = result === guess; return message.send( (await this.buildEmbed(message, result)) - .setTitle(language.get(won ? LanguageKeys.Commands.Games.CoinFlipWinTitle : LanguageKeys.Commands.Games.CoinFlipLoseTitle)) + .setTitle(t(won ? LanguageKeys.Commands.Games.CoinFlipWinTitle : LanguageKeys.Commands.Games.CoinFlipLoseTitle)) .setDescription( - language.get(won ? LanguageKeys.Commands.Games.CoinFlipWinDescription : LanguageKeys.Commands.Games.CoinFlipLoseDescription, { - result: language.get(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] + t(won ? LanguageKeys.Commands.Games.CoinFlipWinDescription : LanguageKeys.Commands.Games.CoinFlipLoseDescription, { + result: t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] }) ) ); } - private async noGuess(message: KlasaMessage, language: Language) { + private async noGuess(message: KlasaMessage, t: TFunction) { const result = this.flipCoin(); return message.send( (await this.buildEmbed(message, result)) // - .setTitle(language.get(LanguageKeys.Commands.Games.CoinFlipNoGuessTitle)) + .setTitle(t(LanguageKeys.Commands.Games.CoinFlipNoGuessTitle)) .setDescription( - language.get(LanguageKeys.Commands.Games.CoinFlipNoGuessDescription, { - result: language.get(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] + t(LanguageKeys.Commands.Games.CoinFlipNoGuessDescription, { + result: t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] }) ) ); diff --git a/src/commands/Games/higherLower.ts b/src/commands/Games/higherLower.ts index 4ba21efd73b..5410f205ad7 100644 --- a/src/commands/Games/higherLower.ts +++ b/src/commands/Games/higherLower.ts @@ -8,7 +8,7 @@ import { LLRCData, LongLivingReactionCollector } from '#utils/LongLivingReaction import { resolveEmoji } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const enum HigherLowerReactions { Higher = 'a:sarrow_up:658450971655012363', @@ -22,8 +22,8 @@ const enum HigherLowerReactions { aliases: ['hilo', 'higherlower', 'hl'], bucket: 2, cooldown: 7, - description: (language) => language.get(LanguageKeys.Commands.Games.HigherLowerDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.HigherLowerExtended), + description: LanguageKeys.Commands.Games.HigherLowerDescription, + extendedHelp: LanguageKeys.Commands.Games.HigherLowerExtended, requiredPermissions: ['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'USE_EXTERNAL_EMOJIS'], runIn: ['text'], usage: '' @@ -35,19 +35,19 @@ export default class extends SkyraCommand { private readonly kTimer = Time.Minute * 3; public async run(message: GuildMessage, [wager]: [number]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const { users } = await DbSet.connect(); const settings = await users.ensure(message.author.id); const balance = settings.money; if (balance < wager) { - throw language.get(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); + throw t(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); } settings.money -= wager; await settings.save(); - const response = (await message.send(language.get(LanguageKeys.Commands.Games.HigherLowerLoading))) as GuildMessage; + const response = (await message.send(t(LanguageKeys.Commands.Games.HigherLowerLoading))) as GuildMessage; const game: HigherLowerGameData = { /** The game's reaction collector */ llrc: new LongLivingReactionCollector( @@ -74,7 +74,7 @@ export default class extends SkyraCommand { } ), response, - language, + t, running: true, turn: 1, number: this.random(50), @@ -87,7 +87,7 @@ export default class extends SkyraCommand { while (game.running) { // Send the embed - const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.language.get(LanguageKeys.Commands.Games.HigherLowerEmbed, { + const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.t(LanguageKeys.Commands.Games.HigherLowerEmbed, { turn: game.turn, number: game.number }); @@ -151,7 +151,7 @@ export default class extends SkyraCommand { } private async win(game: HigherLowerGameData, message: GuildMessage, settings: UserEntity) { - const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.language.get(LanguageKeys.Commands.Games.HigherLowerWin, { + const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.t(LanguageKeys.Commands.Games.HigherLowerWin, { potentials: this.calculateWinnings(game.wager, game.turn), number: game.number }); @@ -174,7 +174,7 @@ export default class extends SkyraCommand { await this.cashout(message, game, settings); break; case HigherLowerReactions.Ok: - await game.response.edit(game.language.get(LanguageKeys.Commands.Games.HigherLowerNewround), { embed: null }); + await game.response.edit(game.t(LanguageKeys.Commands.Games.HigherLowerNewRound), { embed: null }); break; case HigherLowerReactions.Cancel: await this.end(game, message, settings, true); @@ -196,7 +196,7 @@ export default class extends SkyraCommand { await settings.save(); } - const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.language.get(LanguageKeys.Commands.Games.HigherLowerLose, { + const { title: TITLE, description: DESCRIPTION, footer: FOOTER } = game.t(LanguageKeys.Commands.Games.HigherLowerLose, { number: game.number, losses }); @@ -222,7 +222,7 @@ export default class extends SkyraCommand { if (game.canceledByChoice && game.turn === 1) { // Say bye! - const { title: TITLE, description: DESCRIPTION } = game.language.get(LanguageKeys.Commands.Games.HigherLowerCancel, { + const { title: TITLE, description: DESCRIPTION } = game.t(LanguageKeys.Commands.Games.HigherLowerCancel, { username: message.author.username }); @@ -244,8 +244,8 @@ export default class extends SkyraCommand { settings.money += winnings; await settings.save(); - const { title: TITLE } = game.language.get(LanguageKeys.Commands.Games.HigherLowerWin, { potentials: 0, number: 0 }); - const { description: FOOTER } = game.language.get(LanguageKeys.Commands.Games.HigherLowerCancel, { username: message.author.username }); + const { title: TITLE } = game.t(LanguageKeys.Commands.Games.HigherLowerWin, { potentials: 0, number: 0 }); + const { description: FOOTER } = game.t(LanguageKeys.Commands.Games.HigherLowerCancel, { username: message.author.username }); // Let the user know we're done! await game.response.edit( @@ -253,7 +253,7 @@ export default class extends SkyraCommand { new MessageEmbed() .setColor(game.color) .setTitle(TITLE) - .setDescription(game.language.get(LanguageKeys.Commands.Games.HigherLowerCashout, { amount: winnings })) + .setDescription(game.t(LanguageKeys.Commands.Games.HigherLowerCashout, { amount: winnings })) .setFooter(FOOTER) ); } @@ -322,7 +322,7 @@ export default class extends SkyraCommand { interface HigherLowerGameData { llrc: LongLivingReactionCollector; response: GuildMessage; - language: Language; + t: TFunction; running: boolean; number: number; turn: number; diff --git a/src/commands/Games/hungergames.ts b/src/commands/Games/hungergames.ts index 8053d9cc200..e421b555470 100644 --- a/src/commands/Games/hungergames.ts +++ b/src/commands/Games/hungergames.ts @@ -11,13 +11,14 @@ import { sleep } from '#utils/sleep'; import { cleanMentions, floatPromise } from '#utils/util'; import { chunk, isFunction } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['hunger-games', 'hg'], cooldown: 0, - description: (language) => language.get(LanguageKeys.Commands.Games.HungerGamesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.HungerGamesExtended), + description: LanguageKeys.Commands.Games.HungerGamesDescription, + extendedHelp: LanguageKeys.Commands.Games.HungerGamesExtended, requiredPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '[user:string{,50}] [...]', @@ -39,16 +40,15 @@ export default class extends SkyraCommand { if (author && !tributes.includes(author.username)) tributes.push(author.username); } } else if (tributes.length === 0) { - const [prefix, language] = await message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); - - throw language.get(LanguageKeys.Commands.Games.GamesNoPlayers, { prefix }); + const [prefix, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); + throw t(LanguageKeys.Commands.Games.GamesNoPlayers, { prefix }); } const filtered = new Set(tributes); - const language = await message.fetchLanguage(); - if (filtered.size !== tributes.length) throw language.get(LanguageKeys.Commands.Games.GamesRepeat); - if (this.playing.has(message.channel.id)) throw language.get(LanguageKeys.Commands.Games.GamesProgress); - if (filtered.size < 4 || filtered.size > 48) throw language.get(LanguageKeys.Commands.Games.GamesTooManyOrFew, { min: 4, max: 48 }); + const t = await message.fetchT(); + if (filtered.size !== tributes.length) throw t(LanguageKeys.Commands.Games.GamesRepeat); + if (this.playing.has(message.channel.id)) throw t(LanguageKeys.Commands.Games.GamesProgress); + if (filtered.size < 4 || filtered.size > 48) throw t(LanguageKeys.Commands.Games.GamesTooManyOrFew, { min: 4, max: 48 }); this.playing.add(message.channel.id); let resolve: ((value: boolean) => void) | null = null; @@ -89,8 +89,8 @@ export default class extends SkyraCommand { : LanguageKeys.Commands.Games.HungerGamesNight; // Main logic of the game - const { results, deaths } = this.makeResultEvents(game, language.get(events).map(HungerGamesUsage.create)); - const texts = this.buildTexts(language, game, results, deaths); + const { results, deaths } = this.makeResultEvents(game, t(events).map(HungerGamesUsage.create)); + const texts = this.buildTexts(t, game, results, deaths); // Ask for the user to proceed: for (const text of texts) { @@ -117,14 +117,14 @@ export default class extends SkyraCommand { // Delete the previous message, and if stopped, send stop. floatPromise(this, gameMessage.nuke()); - if (!verification) return message.channel.postable ? message.sendLocale(LanguageKeys.Commands.Games.HungerGamesStop) : undefined; + if (!verification) return message.channel.postable ? message.send(t(LanguageKeys.Commands.Games.HungerGamesStop)) : undefined; } if (game.bloodbath) game.bloodbath = false; else game.sun = !game.sun; } // The match finished with one remaining player - return message.sendLocale(LanguageKeys.Commands.Games.HungerGamesWinner, [{ winner: game.tributes.values().next().value }]); + return message.send(t(LanguageKeys.Commands.Games.HungerGamesWinner, { winner: game.tributes.values().next().value })); } finally { game.llrc.end(); } @@ -165,23 +165,18 @@ export default class extends SkyraCommand { } } - private buildTexts(language: Language, game: HungerGamesGame, results: string[], deaths: string[]) { + private buildTexts(t: TFunction, game: HungerGamesGame, results: string[], deaths: string[]) { const headerKey = game.bloodbath ? LanguageKeys.Commands.Games.HungerGamesResultHeaderBloodbath : game.sun ? LanguageKeys.Commands.Games.HungerGamesResultHeaderSun : LanguageKeys.Commands.Games.HungerGamesResultHeaderMoon; - const header = language.get(headerKey, { game }); + const header = t(headerKey, { game }); const death = deaths.length - ? `${language.get( - deaths.length === 1 - ? LanguageKeys.Commands.Games.HungerGamesResultDeaths - : LanguageKeys.Commands.Games.HungerGamesResultDeathsPlural, - { deaths: deaths.length } - )}\n\n${deaths.map((d) => `- ${d}`).join('\n')}` + ? `${t(LanguageKeys.Commands.Games.HungerGamesResultDeaths, { deaths: deaths.length })}\n\n${deaths.map((d) => `- ${d}`).join('\n')}` : ''; - const proceed = language.get(LanguageKeys.Commands.Games.HungerGamesResultProceed); + const proceed = t(LanguageKeys.Commands.Games.HungerGamesResultProceed); const panels = chunk(results, 5); const texts = panels.map((panel) => `__**${header}:**__\n\n${panel.map((text) => `- ${text}`).join('\n')}\n\n_${proceed}_`); diff --git a/src/commands/Games/slotmachine.ts b/src/commands/Games/slotmachine.ts index dd5090d4f1f..f8babc721cf 100644 --- a/src/commands/Games/slotmachine.ts +++ b/src/commands/Games/slotmachine.ts @@ -1,7 +1,6 @@ import { DbSet } from '#lib/database'; import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { Emojis } from '#utils/constants'; import { Slotmachine } from '#utils/Games/Slotmachine'; import { ApplyOptions } from '@skyra/decorators'; import { KlasaMessage } from 'klasa'; @@ -10,24 +9,23 @@ import { KlasaMessage } from 'klasa'; aliases: ['slot', 'slots', 'slotmachines'], bucket: 2, cooldown: 7, - description: (language) => language.get(LanguageKeys.Commands.Games.SlotmachineDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.SlotmachineExtended), + description: LanguageKeys.Commands.Games.SlotMachineDescription, + extendedHelp: LanguageKeys.Commands.Games.SlotMachineExtended, requiredPermissions: ['ATTACH_FILES'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [wager]: [number]) { + const t = await message.fetchT(); const { users } = await DbSet.connect(); const settings = await users.ensureProfile(message.author.id); const balance = settings.money; if (balance < wager) { - throw await message.fetchLocale(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); + throw t(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); } const [attachment, amount] = await new Slotmachine(message, wager, settings).run(); - const titles = await message.fetchLocale(LanguageKeys.Commands.Games.SlotmachineTitles); - - return message.send([`**${titles.previous}:** ${balance} ${Emojis.Shiny}`, `**${titles.new}:** ${amount} ${Emojis.Shiny}`].join('\n'), { + return message.send(t(LanguageKeys.Commands.Games.BalanceDifference, { previous: balance, next: amount }), { files: [{ attachment, name: 'slots.png' }] }); } diff --git a/src/commands/Games/tictactoe.ts b/src/commands/Games/tictactoe.ts index b02dc56eb34..f51ae3ba1d2 100644 --- a/src/commands/Games/tictactoe.ts +++ b/src/commands/Games/tictactoe.ts @@ -16,8 +16,8 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['ttt'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Games.TicTacToeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.TicTacToeExtended), + description: LanguageKeys.Commands.Games.TicTacToeDescription, + extendedHelp: LanguageKeys.Commands.Games.TicTacToeExtended, requiredPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '' @@ -27,7 +27,7 @@ export default class extends SkyraCommand { } public async run(message: GuildMessage, [user]: [User]) { - if (this.channels.has(message.channel.id)) throw await message.fetchLocale(LanguageKeys.Commands.Games.GamesProgress); + if (this.channels.has(message.channel.id)) throw await message.resolveKey(LanguageKeys.Commands.Games.GamesProgress); const player1 = this.getAuthorController(message); const player2 = await this.getTargetController(message, user); @@ -48,18 +48,18 @@ export default class extends SkyraCommand { private async getTargetController(message: GuildMessage, user: User) { if (user.id === CLIENT_ID) return new TicTacToeBotController(); - const language = await message.fetchLanguage(); - if (user.bot) throw language.get(LanguageKeys.Commands.Games.GamesBot); - if (user.id === message.author.id) throw language.get(LanguageKeys.Commands.Games.GamesSelf); + const t = await message.fetchT(); + if (user.bot) throw t(LanguageKeys.Commands.Games.GamesBot); + if (user.id === message.author.id) throw t(LanguageKeys.Commands.Games.GamesSelf); const [response] = await this.prompt.createPrompt(message, { target: user }).run( - language.get(LanguageKeys.Commands.Games.TicTacToePrompt, { + t(LanguageKeys.Commands.Games.TicTacToePrompt, { challenger: message.author.toString(), challengee: user.toString() }) ); if (response) return new TicTacToeHumanController(user.username, user.id); - throw language.get(LanguageKeys.Commands.Games.GamesPromptDeny); + throw t(LanguageKeys.Commands.Games.GamesPromptDeny); } } diff --git a/src/commands/Games/trivia.ts b/src/commands/Games/trivia.ts index dafee701f67..61db0508c49 100644 --- a/src/commands/Games/trivia.ts +++ b/src/commands/Games/trivia.ts @@ -6,12 +6,13 @@ import { pickRandom, shuffle } from '#utils/util'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { DMChannel, MessageCollector, MessageEmbed, TextChannel, User } from 'discord.js'; import { decode } from 'he'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Games.TriviaDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.TriviaExtended), + description: LanguageKeys.Commands.Games.TriviaDescription, + extendedHelp: LanguageKeys.Commands.Games.TriviaExtended, usage: '[category:category] [boolean|truefalse|multiple] [easy|hard|medium] [duration:timespan-seconds]', usageDelim: ' ', requiredPermissions: ['ADD_REACTIONS', 'EMBED_LINKS', 'READ_MESSAGE_HISTORY'] @@ -23,7 +24,7 @@ import { KlasaMessage, Language } from 'klasa'; if (!arg) return CATEGORIES.general; arg = arg.toLowerCase(); const category = Reflect.get(CATEGORIES, arg); - if (!category) throw await message.fetchLocale(LanguageKeys.Commands.Games.TriviaInvalidCategory); + if (!category) throw await message.resolveKey(LanguageKeys.Commands.Games.TriviaInvalidCategory); return category; } ], @@ -50,13 +51,13 @@ export default class extends SkyraCommand { number? ] ) { - const language = await message.fetchLanguage(); - if (this.#channels.has(message.channel.id)) throw language.get(LanguageKeys.Commands.Games.TriviaActiveGame); + const t = await message.fetchT(); + if (this.#channels.has(message.channel.id)) throw t(LanguageKeys.Commands.Games.TriviaActiveGame); this.#channels.add(message.channel.id); try { - await message.send(pickRandom(language.get(LanguageKeys.System.Loading))); + await message.send(pickRandom(t(LanguageKeys.System.Loading))); const data = await getQuestion(category, difficulty, questionType); const possibleAnswers = questionType === QuestionType.Boolean || questionType === QuestionType.TrueFalse @@ -64,7 +65,7 @@ export default class extends SkyraCommand { : shuffle([data.correct_answer, ...data.incorrect_answers].map((ans) => decode(ans))); const correctAnswer = decode(data.correct_answer); - await message.send(this.buildQuestionEmbed(language, data, possibleAnswers)); + await message.send(this.buildQuestionEmbed(t, data, possibleAnswers)); const filter = (msg: KlasaMessage) => { const num = Number(msg.content); return Number.isInteger(num) && num > 0 && num <= possibleAnswers.length; @@ -84,21 +85,21 @@ export default class extends SkyraCommand { return collector.stop(); } participants.add(collected.author.id); - return message.channel.send(language.get(LanguageKeys.Commands.Games.TriviaIncorrect, { attempt })); + return message.channel.send(t(LanguageKeys.Commands.Games.TriviaIncorrect, { attempt })); }) .on('end', () => { this.#channels.delete(message.channel.id); - if (!winner) return message.channel.send(language.get(LanguageKeys.Commands.Games.TriviaNoAnswer, { correctAnswer })); - return message.channel.send(language.get(LanguageKeys.Commands.Games.TriviaWinner, { winner: winner.toString(), correctAnswer })); + if (!winner) return message.channel.send(t(LanguageKeys.Commands.Games.TriviaNoAnswer, { correctAnswer })); + return message.channel.send(t(LanguageKeys.Commands.Games.TriviaWinner, { winner: winner.toString(), correctAnswer })); }); } catch { this.#channels.delete(message.channel.id); - throw language.get(LanguageKeys.Misc.UnexpectedIssue); + throw t(LanguageKeys.Misc.UnexpectedIssue); } } - public buildQuestionEmbed(language: Language, data: QuestionData, possibleAnswers: string[]) { - const titles = language.get(LanguageKeys.Commands.Games.TriviaEmbedTitles); + public buildQuestionEmbed(t: TFunction, data: QuestionData, possibleAnswers: string[]) { + const titles = t(LanguageKeys.Commands.Games.TriviaEmbedTitles); const questionDisplay = possibleAnswers.map((possible, i) => `${i + 1}. ${possible}`); return new MessageEmbed() .setAuthor(titles.trivia) diff --git a/src/commands/Games/wheeloffortune.ts b/src/commands/Games/wheeloffortune.ts index c5068dc58f2..be2f20817c0 100644 --- a/src/commands/Games/wheeloffortune.ts +++ b/src/commands/Games/wheeloffortune.ts @@ -1,7 +1,6 @@ import { DbSet } from '#lib/database'; import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { Emojis } from '#utils/constants'; import { WheelOfFortune } from '#utils/Games/WheelOfFortune'; import { ApplyOptions } from '@skyra/decorators'; import { KlasaMessage } from 'klasa'; @@ -9,24 +8,23 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['wof'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Games.WheelOfFortuneDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Games.WheelOfFortuneExtended), + description: LanguageKeys.Commands.Games.WheelOfFortuneDescription, + extendedHelp: LanguageKeys.Commands.Games.WheelOfFortuneExtended, requiredPermissions: ['ATTACH_FILES'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [wager]: [number]) { + const t = await message.fetchT(); const { users } = await DbSet.connect(); const settings = await users.ensureProfile(message.author.id); const balance = settings.money; if (balance < wager) { - throw await message.fetchLocale(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); + throw t(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); } const [attachment, amount] = await new WheelOfFortune(message, wager, settings).run(); - const titles = await message.fetchLocale(LanguageKeys.Commands.Games.WheelOfFortuneTitles); - - return message.send([`**${titles.previous}:** ${balance} ${Emojis.Shiny}`, `**${titles.new}:** ${amount} ${Emojis.Shiny}`].join('\n'), { + return message.send(t(LanguageKeys.Commands.Games.BalanceDifference, { previous: balance, next: amount }), { files: [{ attachment, name: 'wof.png' }] }); } diff --git a/src/commands/General/Chat Bot Info/help.ts b/src/commands/General/Chat Bot Info/help.ts index 874cc3154b1..613d9eef945 100644 --- a/src/commands/General/Chat Bot Info/help.ts +++ b/src/commands/General/Chat Bot Info/help.ts @@ -3,14 +3,13 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand' import { UserRichDisplay } from '#lib/structures/UserRichDisplay'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; -import { LanguageHelp, LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; +import { LanguageHelp } from '#utils/LanguageHelp'; import { pickRandom } from '#utils/util'; -import { isFunction, isNumber, noop } from '@sapphire/utilities'; +import { isNumber, noop } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { Collection, MessageEmbed, Permissions, TextChannel } from 'discord.js'; -import { Command, KlasaMessage, Language } from 'klasa'; - -type ExtendedHelpData = string | LanguageHelpDisplayOptions; +import { TFunction } from 'i18next'; +import { Command, KlasaMessage } from 'klasa'; const PERMISSIONS_RICHDISPLAY = new Permissions([ Permissions.FLAGS.MANAGE_MESSAGES, @@ -35,7 +34,8 @@ function sortCommandsAlphabetically(_: Command[], __: Command[], firstCategory: @ApplyOptions({ aliases: ['commands', 'cmd', 'cmds'], - description: (language) => language.get(LanguageKeys.Commands.General.HelpDescription), + description: LanguageKeys.Commands.General.HelpDescription, + extendedHelp: LanguageKeys.Commands.General.HelpExtended, guarded: true, usage: '(Command:command|page:integer|category:category)', flagSupport: true @@ -58,8 +58,8 @@ export default class extends SkyraCommand { }); } - public async run(message: KlasaMessage, [commandOrPage]: [Command | number | undefined]) { - const language = await message.fetchLanguage(); + public async run(message: KlasaMessage, [commandOrPage]: [SkyraCommand | number | undefined]) { + const t = await message.fetchT(); if (message.flagArgs.categories || message.flagArgs.cat) { const commandsByCategory = await this._fetchCommands(message); @@ -68,10 +68,7 @@ export default class extends SkyraCommand { for (const [category, commands] of commandsByCategory) { const line = String(++i).padStart(2, '0'); commandCategories.push( - `\`${line}.\` **${category}** → ${language.get( - commands.length === 1 ? LanguageKeys.Commands.General.HelpCommandCount : LanguageKeys.Commands.General.HelpCommandCountPlural, - { count: commands.length } - )}` + `\`${line}.\` **${category}** → ${t(LanguageKeys.Commands.General.HelpCommandCount, { count: commands.length })}` ); } @@ -80,7 +77,7 @@ export default class extends SkyraCommand { // Handle case for a single command const command = typeof commandOrPage === 'object' ? commandOrPage : null; - if (command) return message.send(await this.buildCommandHelp(message, language, command)); + if (command) return message.send(await this.buildCommandHelp(message, t, command)); const prefix = (await this.client.fetchPrefix(message)) as string; @@ -90,10 +87,13 @@ export default class extends SkyraCommand { (message.channel as TextChannel).permissionsFor(this.client.user!)!.has(PERMISSIONS_RICHDISPLAY) ) { const response = await message.send( - language.get(LanguageKeys.Commands.General.HelpAllFlag, { prefix }), - new MessageEmbed({ description: pickRandom(language.get(LanguageKeys.System.Loading)), color: BrandingColors.Secondary }) + t(LanguageKeys.Commands.General.HelpAllFlag, { prefix }), + new MessageEmbed({ + description: pickRandom(t(LanguageKeys.System.Loading) as string[]), + color: BrandingColors.Secondary + }) ); - const display = await this.buildDisplay(message, language, prefix); + const display = await this.buildDisplay(message, t, prefix); // Extract start page and sanitize it const page = isNumber(commandOrPage) ? commandOrPage - 1 : null; @@ -103,14 +103,14 @@ export default class extends SkyraCommand { } try { - const response = await message.author.send(await this.buildHelp(message, language, prefix), { split: { char: '\n' } }); - return message.channel.type === 'dm' ? response : await message.sendLocale(LanguageKeys.Commands.General.HelpDm); + const response = await message.author.send(await this.buildHelp(message, t, prefix), { split: { char: '\n' } }); + return message.channel.type === 'dm' ? response : await message.sendTranslated(LanguageKeys.Commands.General.HelpDm); } catch { - return message.channel.type === 'dm' ? null : message.sendLocale(LanguageKeys.Commands.General.HelpNodm); + return message.channel.type === 'dm' ? null : message.sendTranslated(LanguageKeys.Commands.General.HelpNoDm); } } - private async buildHelp(message: KlasaMessage, language: Language, prefix: string) { + private async buildHelp(message: KlasaMessage, language: TFunction, prefix: string) { const commands = await this._fetchCommands(message); const helpMessage: string[] = []; @@ -121,7 +121,7 @@ export default class extends SkyraCommand { return helpMessage.join('\n'); } - private async buildDisplay(message: KlasaMessage, language: Language, prefix: string) { + private async buildDisplay(message: KlasaMessage, language: TFunction, prefix: string) { const commandsByCategory = await this._fetchCommands(message); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); @@ -136,8 +136,8 @@ export default class extends SkyraCommand { return display; } - private async buildCommandHelp(message: KlasaMessage, language: Language, command: Command) { - const builderData = language.get(LanguageKeys.System.HelpTitles); + private async buildCommandHelp(message: KlasaMessage, t: TFunction, command: SkyraCommand) { + const builderData = t(LanguageKeys.System.HelpTitles); const builder = new LanguageHelp() .setExplainedUsage(builderData.explainedUsage) @@ -145,13 +145,12 @@ export default class extends SkyraCommand { .setPossibleFormats(builderData.possibleFormats) .setReminder(builderData.reminders); - const extendedHelpData = isFunction(command.extendedHelp) ? (command.extendedHelp(language) as ExtendedHelpData) : command.extendedHelp; - - const extendedHelp = typeof extendedHelpData === 'string' ? extendedHelpData : builder.display(command.name, extendedHelpData); + const extendedHelpData = t(command.extendedHelp); + const extendedHelp = builder.display(command.name, extendedHelpData); - const data = language.get(LanguageKeys.Commands.General.HelpData, { + const data = t(LanguageKeys.Commands.General.HelpData, { footerName: command.name, - titleDescription: isFunction(command.description) ? command.description(language) : command.description, + titleDescription: t(command.description), usage: command.usage.fullUsage(message), extendedHelp }); @@ -164,21 +163,21 @@ export default class extends SkyraCommand { .setDescription([data.usage, data.extended].join('\n')); } - private formatCommand(language: Language, prefix: string, richDisplay: boolean, command: Command) { - const description = isFunction(command.description) ? command.description(language) : command.description; + private formatCommand(t: TFunction, prefix: string, richDisplay: boolean, command: SkyraCommand) { + const description = t(command.description); return richDisplay ? `• ${prefix}${command.name} → ${description}` : `• **${prefix}${command.name}** → ${description}`; } private async _fetchCommands(message: KlasaMessage) { const run = this.client.inhibitors.run.bind(this.client.inhibitors, message); - const commands = new Collection(); + const commands = new Collection(); await Promise.all( this.client.commands.map((command) => run(command, true) .then(() => { const category = commands.get(command.fullCategory.join(' → ')); - if (category) category.push(command); - else commands.set(command.fullCategory.join(' → '), [command]); + if (category) category.push(command as SkyraCommand); + else commands.set(command.fullCategory.join(' → '), [command as SkyraCommand]); return null; }) .catch(noop) diff --git a/src/commands/General/Chat Bot Info/info.ts b/src/commands/General/Chat Bot Info/info.ts index ba5c7d929c6..b4a1214e96e 100644 --- a/src/commands/General/Chat Bot Info/info.ts +++ b/src/commands/General/Chat Bot Info/info.ts @@ -6,12 +6,12 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['details', 'what'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.General.InfoDescription), + description: LanguageKeys.Commands.General.InfoDescription, + extendedHelp: LanguageKeys.Commands.General.InfoExtended, guarded: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage) { - const content = (await message.fetchLocale(LanguageKeys.Commands.General.InfoBody)).join('\n'); - return message.send(content); + return message.send(await message.resolveKey(LanguageKeys.Commands.General.InfoBody)); } } diff --git a/src/commands/General/Chat Bot Info/invite.ts b/src/commands/General/Chat Bot Info/invite.ts index cd8a9e4479e..90637d8ad35 100644 --- a/src/commands/General/Chat Bot Info/invite.ts +++ b/src/commands/General/Chat Bot Info/invite.ts @@ -4,12 +4,13 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; +import { TFunction } from 'i18next'; import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.General.InviteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.General.InviteExtended), + description: LanguageKeys.Commands.General.InviteDescription, + extendedHelp: LanguageKeys.Commands.General.InviteExtended, usage: '[noperms]', flagSupport: true, guarded: true, @@ -17,31 +18,30 @@ import { KlasaMessage } from 'klasa'; }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [noperms]: ['noperms' | undefined]) { + const t = await message.fetchT(); if (noperms === 'noperms' || Reflect.has(message.flagArgs, 'nopermissions')) { - return message.send(await this.getEmbed(message, { permissions: false })); + return message.send(await this.getEmbed(t, { permissions: false })); } - return message.send(await this.getEmbed(message, { permissions: true })); + return message.send(await this.getEmbed(t, { permissions: true })); } public async init() { if (this.client.application && !this.client.application.botPublic) this.permissionLevel = PermissionLevels.BotOwner; } - private async getEmbed(message: KlasaMessage, { permissions }: { permissions: boolean }): Promise { - const language = await message.fetchLanguage(); - + private getEmbed(t: TFunction, { permissions }: { permissions: boolean }): MessageEmbed { return new MessageEmbed() // .setColor(BrandingColors.Primary) .setDescription( [ [ - `[${language.get(LanguageKeys.Commands.General.InvitePermissionInviteText)}](https://invite.skyra.pw${ + `[${t(LanguageKeys.Commands.General.InvitePermissionInviteText)}](https://invite.skyra.pw${ permissions ? '' : '/no-permissions' })`, - `[${language.get(LanguageKeys.Commands.General.InvitePermissionSupportServerText)}](https://join.skyra.pw)` + `[${t(LanguageKeys.Commands.General.InvitePermissionSupportServerText)}](https://join.skyra.pw)` ].join(' | '), - permissions ? language.get(LanguageKeys.Commands.General.InvitePermissionsDescription) : undefined + permissions ? t(LanguageKeys.Commands.General.InvitePermissionsDescription) : undefined ] .filter(Boolean) .join('\n') diff --git a/src/commands/General/Chat Bot Info/ping.ts b/src/commands/General/Chat Bot Info/ping.ts index 6495d98e1c8..ac4f5fb7a7f 100644 --- a/src/commands/General/Chat Bot Info/ping.ts +++ b/src/commands/General/Chat Bot Info/ping.ts @@ -6,15 +6,16 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['pong'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.General.PingDescription), + description: LanguageKeys.Commands.General.PingDescription, + extendedHelp: LanguageKeys.Commands.General.PingExtended, guarded: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage) { - const language = await message.fetchLanguage(); - const msg = await message.send(language.get(LanguageKeys.Commands.General.Ping)); + const t = await message.fetchT(); + const msg = await message.send(t(LanguageKeys.Commands.General.Ping)); return message.send( - language.get(LanguageKeys.Commands.General.PingPong, { + t(LanguageKeys.Commands.General.PingPong, { diff: (msg.editedTimestamp || msg.createdTimestamp) - (message.editedTimestamp || message.createdTimestamp), ping: Math.round(this.client.ws.ping) }) diff --git a/src/commands/Giveaway/gcreate.ts b/src/commands/Giveaway/gcreate.ts index 5176175b2e2..e84b2fd01fb 100644 --- a/src/commands/Giveaway/gcreate.ts +++ b/src/commands/Giveaway/gcreate.ts @@ -9,8 +9,8 @@ const YEAR = 1000 * 60 * 60 * 24 * 365; @ApplyOptions({ aliases: ['giveawayschedule', 'gs', 'gc', 'gschedule'], - description: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayScheduleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayScheduleExtended), + description: LanguageKeys.Commands.Giveaway.GiveawayScheduleDescription, + extendedHelp: LanguageKeys.Commands.Giveaway.GiveawayScheduleExtended, requiredPermissions: ['EMBED_LINKS', 'ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '[channel:textchannelname{2}] ', @@ -27,8 +27,8 @@ export default class extends SkyraCommand { const scheduleOffset = schedule.getTime() - Date.now(); const durationOffset = duration.getTime() - Date.now(); - if (durationOffset < 9500 || scheduleOffset < 9500) throw await message.fetchLocale(LanguageKeys.Giveaway.Time); - if (durationOffset > YEAR || scheduleOffset > YEAR) throw await message.fetchLocale(LanguageKeys.Giveaway.TimeTooLong); + if (durationOffset < 9500 || scheduleOffset < 9500) throw await message.resolveKey(LanguageKeys.Giveaway.Time); + if (durationOffset > YEAR || scheduleOffset > YEAR) throw await message.resolveKey(LanguageKeys.Giveaway.TimeTooLong); // Resolve the amount of winners the giveaway will have let winners = Number(message.flagArgs.winners) ? parseInt(message.flagArgs.winners, 10) : 1; @@ -46,6 +46,6 @@ export default class extends SkyraCommand { catchUp: true }); - return message.sendLocale(LanguageKeys.Giveaway.Scheduled, [{ scheduledTime: scheduleOffset }]); + return message.sendTranslated(LanguageKeys.Giveaway.Scheduled, [{ scheduledTime: scheduleOffset }]); } } diff --git a/src/commands/Giveaway/greroll.ts b/src/commands/Giveaway/greroll.ts index 0d857770e5d..6de9119aa3d 100644 --- a/src/commands/Giveaway/greroll.ts +++ b/src/commands/Giveaway/greroll.ts @@ -9,13 +9,13 @@ import { fetchReactionUsers, resolveEmoji } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { DiscordAPIError, HTTPError, Message } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { FetchError } from 'node-fetch'; @ApplyOptions({ aliases: ['gr', 'groll'], - description: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayRerollDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayRerollExtended), + description: LanguageKeys.Commands.Giveaway.GiveawayRerollDescription, + extendedHelp: LanguageKeys.Commands.Giveaway.GiveawayRerollExtended, requiredPermissions: ['READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '[winners:number{1,100}] [message:message]', @@ -26,20 +26,20 @@ export default class extends SkyraCommand { #kResolvedEmoji = resolveEmoji(kRawEmoji)!; public async run(message: GuildMessage, [winnerAmount = 1, rawTarget]: [number, GuildMessage | undefined]) { - const language = await message.fetchLanguage(); - const target = await this.resolveMessage(message, rawTarget, language); + const t = await message.fetchT(); + const target = await this.resolveMessage(message, rawTarget, t); const { title } = target.embeds[0]; const winners = await this.pickWinners(target, winnerAmount); const content = winners - ? language.get(LanguageKeys.Giveaway.EndedMessage, { + ? t(LanguageKeys.Giveaway.EndedMessage, { winners: winners.map((winner) => `<@${winner}>`), title: title! }) - : language.get(LanguageKeys.Giveaway.EndedMessageNoWinner, { title: title! }); + : t(LanguageKeys.Giveaway.EndedMessageNoWinner, { title: title! }); return message.send(content, { allowedMentions: { users: [...new Set([message.author.id, ...(winners || [])])], roles: [] } }); } - private async resolveMessage(message: GuildMessage, rawTarget: GuildMessage | undefined, language: Language) { + private async resolveMessage(message: GuildMessage, rawTarget: GuildMessage | undefined, t: TFunction) { const target = rawTarget ? // If rawMessage is defined then we check everything sans the colour this.validateMessage(rawTarget) @@ -48,7 +48,7 @@ export default class extends SkyraCommand { : // If rawTarget was undefined then we fetch it from the API and we check embed colour (await message.channel.messages.fetch({ limit: 100 })).find((msg) => this.validatePossibleMessage(msg)) || null; if (target) return target as GuildMessage; - throw language.get(LanguageKeys.Commands.Giveaway.GiveawayRerollInvalid); + throw t(LanguageKeys.Commands.Giveaway.GiveawayRerollInvalid); } private async pickWinners(message: GuildMessage, winnerAmount: number) { diff --git a/src/commands/Giveaway/gstart.ts b/src/commands/Giveaway/gstart.ts index 744fdad6917..3fbc75b161f 100644 --- a/src/commands/Giveaway/gstart.ts +++ b/src/commands/Giveaway/gstart.ts @@ -9,8 +9,8 @@ const kWinnersArgRegex = /^([1-9]|\d\d+)w$/i; @ApplyOptions({ aliases: ['giveaway'], - description: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Giveaway.GiveawayExtended), + description: LanguageKeys.Commands.Giveaway.GiveawayDescription, + extendedHelp: LanguageKeys.Commands.Giveaway.GiveawayExtended, requiredPermissions: ['EMBED_LINKS', 'ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], runIn: ['text'], usage: '[channel:textchannelname{2}] [winners:winners] ', @@ -31,8 +31,8 @@ export default class extends SkyraCommand { public async run(message: GuildMessage, [channel = message.channel as TextChannel, time, winners, title]: [TextChannel, Date, number, string]) { const offset = time.getTime() - Date.now(); - if (offset < 9500) throw await message.fetchLocale(LanguageKeys.Giveaway.Time); - if (offset > Time.Year) throw await message.fetchLocale(LanguageKeys.Giveaway.TimeTooLong); + if (offset < 9500) throw await message.resolveKey(LanguageKeys.Giveaway.Time); + if (offset > Time.Year) throw await message.resolveKey(LanguageKeys.Giveaway.TimeTooLong); if (winners > 25) winners = 25; await this.client.giveaways.create({ diff --git a/src/commands/Google/currenttime.ts b/src/commands/Google/currenttime.ts index 93393b23d56..cdaaaa2cf17 100644 --- a/src/commands/Google/currenttime.ts +++ b/src/commands/Google/currenttime.ts @@ -5,15 +5,16 @@ import { TOKENS } from '#root/config'; import { GoogleResponseCodes, handleNotOK, queryGoogleMapsAPI } from '#utils/Google'; import { fetch, FetchResultTypes } from '#utils/util'; import { MessageEmbed } from 'discord.js'; -import { CommandStore, KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { CommandStore, KlasaMessage } from 'klasa'; export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { aliases: ['ctime'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Google.CurrentTimeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Google.CurrentTimeExtended), + description: LanguageKeys.Commands.Google.CurrentTimeDescription, + extendedHelp: LanguageKeys.Commands.Google.CurrentTimeExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }); @@ -21,16 +22,16 @@ export default class extends SkyraCommand { public async run(message: KlasaMessage, [location]: [string]) { const { formattedAddress, lat, lng } = await queryGoogleMapsAPI(message, location); - const language = await message.fetchLanguage(); - const { status, ...timeData } = await this.fetchAPI(language, lat, lng); + const t = await message.fetchT(); + const { status, ...timeData } = await this.fetchAPI(t, lat, lng); - if (status !== GoogleResponseCodes.Ok) throw language.get(handleNotOK(status, this.client)); + if (status !== GoogleResponseCodes.Ok) throw t(handleNotOK(status, this.client)); - const dstEnabled = language.get( + const dstEnabled = t( Number(timeData.dst) === 0 ? LanguageKeys.Commands.Google.CurrentTimeDst : LanguageKeys.Commands.Google.CurrentTimeNoDst ); - const titles = language.get(LanguageKeys.Commands.Google.CurrentTimeTitles, { dst: dstEnabled }); + const titles = t(LanguageKeys.Commands.Google.CurrentTimeTitles, { dst: dstEnabled }); return message.send( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) @@ -40,14 +41,14 @@ export default class extends SkyraCommand { `**${titles.currentTime}**: ${timeData.formatted.split(' ')[1]}`, `**${titles.currentDate}**: ${timeData.formatted.split(' ')[0]}`, `**${titles.country}**: ${timeData.countryName}`, - `**${titles.gmsOffset}**: ${language.duration(timeData.gmtOffset * 1000)}`, + `**${titles.gmsOffset}**: ${t(LanguageKeys.Globals.DurationValue, { value: timeData.gmtOffset * 1000 })}`, `${titles.dst}` ].join('\n') ) ); } - private async fetchAPI(language: Language, lat: number, lng: number) { + private async fetchAPI(t: TFunction, lat: number, lng: number) { const url = new URL('http://api.timezonedb.com/v2.1/get-time-zone'); url.searchParams.append('by', 'position'); url.searchParams.append('format', 'json'); @@ -56,7 +57,7 @@ export default class extends SkyraCommand { url.searchParams.append('lng', lng.toString()); url.searchParams.append('fields', 'countryName,countryCode,formatted,dst,gmtOffset'); return fetch(url, FetchResultTypes.JSON).catch(() => { - throw language.get(LanguageKeys.Commands.Google.CurrentTimeLocationNotFound); + throw t(LanguageKeys.Commands.Google.CurrentTimeLocationNotFound); }); } } diff --git a/src/commands/Google/gimage.ts b/src/commands/Google/gimage.ts index 5854407b270..9d75488f459 100644 --- a/src/commands/Google/gimage.ts +++ b/src/commands/Google/gimage.ts @@ -14,8 +14,8 @@ import { MessageEmbed } from 'discord.js'; aliases: ['googleimage', 'img'], cooldown: 10, nsfw: true, // Google will return explicit results when seaching for explicit terms, even when safe-search is on - description: (language) => language.get(LanguageKeys.Commands.Google.GimageDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Google.GimageExtended), + description: LanguageKeys.Commands.Google.GimageDescription, + extendedHelp: LanguageKeys.Commands.Google.GimageExtended, usage: '' }) @CreateResolvers([ @@ -29,13 +29,13 @@ import { MessageEmbed } from 'discord.js'; ]) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [query]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const [response, { items }] = await Promise.all([ - message.send(new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)), + message.send(new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)), queryGoogleCustomSearchAPI(message, CustomSearchType.Image, query) ]); - if (!items || !items.length) throw language.get(handleNotOK(GoogleResponseCodes.ZeroResults, message.client)); + if (!items || !items.length) throw t(handleNotOK(GoogleResponseCodes.ZeroResults, message.client)); const display = await this.buildDisplay(message, items); diff --git a/src/commands/Google/gsearch.ts b/src/commands/Google/gsearch.ts index 9baeb07f238..75efe92d505 100644 --- a/src/commands/Google/gsearch.ts +++ b/src/commands/Google/gsearch.ts @@ -13,8 +13,8 @@ import { MessageEmbed } from 'discord.js'; @ApplyOptions({ aliases: ['google', 'googlesearch', 'g', 'search'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Google.GsearchDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Google.GsearchExtended), + description: LanguageKeys.Commands.Google.GsearchDescription, + extendedHelp: LanguageKeys.Commands.Google.GsearchExtended, usage: '' }) @CreateResolvers([ @@ -28,13 +28,13 @@ import { MessageEmbed } from 'discord.js'; ]) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [query]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const [response, { items }] = await Promise.all([ - message.send(new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)), + message.send(new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)), queryGoogleCustomSearchAPI(message, CustomSearchType.Search, query) ]); - if (!items || !items.length) throw language.get(handleNotOK(GoogleResponseCodes.ZeroResults, message.client)); + if (!items || !items.length) throw t(handleNotOK(GoogleResponseCodes.ZeroResults, message.client)); const display = await this.buildDisplay(message, items); diff --git a/src/commands/Google/lmgtfy.ts b/src/commands/Google/lmgtfy.ts index c2157f7ca7f..c273a66b205 100644 --- a/src/commands/Google/lmgtfy.ts +++ b/src/commands/Google/lmgtfy.ts @@ -8,8 +8,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['letmegooglethatforyou'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Google.LmgtfyDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Google.LmgtfyExtended), + description: LanguageKeys.Commands.Google.LmgtfyDescription, + extendedHelp: LanguageKeys.Commands.Google.LmgtfyExtended, usage: '', requiredPermissions: ['EMBED_LINKS'], flagSupport: true @@ -21,7 +21,7 @@ export default class extends SkyraCommand { new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setDescription( - `[${await message.fetchLocale(LanguageKeys.Commands.Google.LmgtfyClick)}](https://lmgtfy.com?q=${encodeURIComponent( + `[${await message.resolveKey(LanguageKeys.Commands.Google.LmgtfyClick)}](https://lmgtfy.com?q=${encodeURIComponent( query )}&s=${searchEngine})` ) diff --git a/src/commands/Google/weather.ts b/src/commands/Google/weather.ts index 4773dfe348d..c7968fe302f 100644 --- a/src/commands/Google/weather.ts +++ b/src/commands/Google/weather.ts @@ -30,8 +30,8 @@ const enum TemperatureUnit { @ApplyOptions({ bucket: 2, cooldown: 120, - description: (language) => language.get(LanguageKeys.Commands.Google.WeatherDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Google.WeatherExtended), + description: LanguageKeys.Commands.Google.WeatherDescription, + extendedHelp: LanguageKeys.Commands.Google.WeatherExtended, requiredPermissions: ['ATTACH_FILES'], usage: '', flagSupport: true diff --git a/src/commands/Management/Configuration/manageCommandAutodelete.ts b/src/commands/Management/Configuration/manageCommandAutodelete.ts index b3b1d75d950..2977f32be98 100644 --- a/src/commands/Management/Configuration/manageCommandAutodelete.ts +++ b/src/commands/Management/Configuration/manageCommandAutodelete.ts @@ -10,8 +10,8 @@ import { TextChannel } from 'discord.js'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteExtended), + description: LanguageKeys.Commands.Management.ManageCommandAutoDeleteDescription, + extendedHelp: LanguageKeys.Commands.Management.ManageCommandAutoDeleteExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -26,32 +26,30 @@ import { TextChannel } from 'discord.js'; if (!arg) return message.channel; const channel = await message.client.arguments.get('textchannelname')!.run(arg, _, message); if (channel.type === 'text') return channel; - throw await message.fetchLocale(LanguageKeys.Commands.Management.ManageCommandAutoDeleteTextChannel); + throw await message.resolveKey(LanguageKeys.Commands.Management.ManageCommandAutoDeleteTextChannel); } ], ['timespan', (arg, _, message, [type]) => (type === 'add' ? message.client.arguments.get('timespan')!.run(arg, _, message) : undefined)] ]) export default class extends SkyraCommand { public async show(message: GuildMessage) { - const [commandAutoDelete, language] = await message.guild.readSettings((settings) => [ + const [commandAutoDelete, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.CommandAutoDelete], settings.getLanguage() ]); - if (!commandAutoDelete.length) throw language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); + if (!commandAutoDelete.length) throw t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); const list: string[] = []; for (const entry of commandAutoDelete) { const channel = this.client.channels.cache.get(entry[0]) as TextChannel; - if (channel) list.push(`${channel.name.padEnd(26)} :: ${language.duration(entry[1] / 60000)}`); + if (channel) list.push(`${channel.name.padEnd(26)} :: ${t(LanguageKeys.Globals.DurationValue, { value: entry[1] / 60000 })}`); } - if (!list.length) throw language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); - return message.send( - language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShow, { codeblock: codeBlock('asciidoc', list.join('\n')) }) - ); + if (!list.length) throw t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShow, { codeblock: codeBlock('asciidoc', list.join('\n')) })); } public async add(message: GuildMessage, [channel, duration]: [TextChannel, number]) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const commandAutodelete = settings[GuildSettings.CommandAutoDelete]; const index = commandAutodelete.findIndex(([id]) => id === channel.id); const value: readonly [string, number] = [channel.id, duration]; @@ -62,34 +60,32 @@ export default class extends SkyraCommand { return settings.getLanguage(); }); - return message.send( - language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteAdd, { channel: channel.toString(), time: duration }) - ); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteAdd, { channel: channel.toString(), time: duration })); } public async remove(message: GuildMessage, [channel]: [TextChannel]) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const commandAutodelete = settings[GuildSettings.CommandAutoDelete]; const index = commandAutodelete.findIndex(([id]) => id === channel.id); - const language = settings.getLanguage(); + const t = settings.getLanguage(); if (index === -1) { - throw language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemoveNotSet, { channel: channel.toString() }); + throw t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemoveNotSet, { channel: channel.toString() }); } commandAutodelete.splice(index, 1); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemove, { channel: channel.toString() })); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemove, { channel: channel.toString() })); } public async reset(message: GuildMessage) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { settings[GuildSettings.CommandAutoDelete].length = 0; return settings.getLanguage(); }); - return message.send(language.get(LanguageKeys.Commands.Management.ManageCommandAutoDeleteReset)); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteReset)); } } diff --git a/src/commands/Management/Configuration/manageCommandChannel.ts b/src/commands/Management/Configuration/manageCommandChannel.ts index 9f655487e25..330a4639105 100644 --- a/src/commands/Management/Configuration/manageCommandChannel.ts +++ b/src/commands/Management/Configuration/manageCommandChannel.ts @@ -9,8 +9,8 @@ import { TextChannel } from 'discord.js'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.ManageCommandChannelDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.ManageCommandChannelExtended), + description: LanguageKeys.Commands.Management.ManageCommandChannelDescription, + extendedHelp: LanguageKeys.Commands.Management.ManageCommandChannelExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -24,7 +24,7 @@ import { TextChannel } from 'discord.js'; if (!arg) return message.channel; const channel = await message.client.arguments.get('textchannelname')!.run(arg, possible, message); if (channel.type === 'text') return channel; - throw await message.fetchLocale(LanguageKeys.Commands.Management.ManageCommandChannelTextChannel); + throw await message.resolveKey(LanguageKeys.Commands.Management.ManageCommandChannelTextChannel); } ], [ @@ -35,13 +35,13 @@ import { TextChannel } from 'discord.js'; const command = await message.client.arguments.get('command')!.run(arg, possible, message); if (!command.disabled && command.permissionLevel < 9) return command; } - throw await message.fetchLocale(LanguageKeys.Commands.Management.ManageCommandChannelRequiredCommand); + throw await message.resolveKey(LanguageKeys.Commands.Management.ManageCommandChannelRequiredCommand); } ] ]) export default class extends SkyraCommand { public async show(message: GuildMessage, [channel]: [TextChannel]) { - const [disabledCommandsChannels, language] = await message.guild.readSettings((settings) => [ + const [disabledCommandsChannels, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.DisabledCommandChannels], settings.getLanguage() ]); @@ -49,48 +49,46 @@ export default class extends SkyraCommand { const entry = disabledCommandsChannels.find((e) => e.channel === channel.id); if (entry && entry.commands.length) { return message.send( - language.get(LanguageKeys.Commands.Management.ManageCommandChannelShow, { + t(LanguageKeys.Commands.Management.ManageCommandChannelShow, { channel: channel.toString(), commands: `\`${entry.commands.join('` | `')}\`` }) ); } - throw language.get(LanguageKeys.Commands.Management.ManageCommandChannelShowEmpty); + throw t(LanguageKeys.Commands.Management.ManageCommandChannelShowEmpty); } public async add(message: GuildMessage, [channel, command]: [TextChannel, SkyraCommand]) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; const indexOfChannel = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - const language = settings.getLanguage(); + const t = settings.getLanguage(); if (indexOfChannel === -1) { settings[GuildSettings.DisabledCommandChannels].push({ channel: channel.id, commands: [command.name] }); } else { const disabledCommandChannel = disabledCommandsChannels[indexOfChannel]; if (disabledCommandChannel.commands.includes(command.name)) - throw language.get(LanguageKeys.Commands.Management.ManageCommandChannelAddAlreadySet); + throw t(LanguageKeys.Commands.Management.ManageCommandChannelAddAlreadySet); settings[GuildSettings.DisabledCommandChannels][indexOfChannel].commands.push(command.name); } - return language; + return t; }); - return message.send( - language.get(LanguageKeys.Commands.Management.ManageCommandChannelAdd, { channel: channel.toString(), command: command.name }) - ); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandChannelAdd, { channel: channel.toString(), command: command.name })); } public async remove(message: GuildMessage, [channel, command]: [TextChannel, SkyraCommand]) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; const indexOfChannel = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - const language = settings.getLanguage(); + const t = settings.getLanguage(); if (indexOfChannel === -1) { - throw language.get(LanguageKeys.Commands.Management.ManageCommandChannelRemoveNotSet, { channel: channel.toString() }); + throw t(LanguageKeys.Commands.Management.ManageCommandChannelRemoveNotSet, { channel: channel.toString() }); } const disabledCommandChannel = disabledCommandsChannels[indexOfChannel]; @@ -104,28 +102,26 @@ export default class extends SkyraCommand { } } - return language; + return t; }); - return message.send( - language.get(LanguageKeys.Commands.Management.ManageCommandChannelRemove, { channel: channel.toString(), command: command.name }) - ); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandChannelRemove, { channel: channel.toString(), command: command.name })); } public async reset(message: GuildMessage, [channel]: [TextChannel]) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; const entryIndex = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - const language = settings.getLanguage(); + const t = settings.getLanguage(); if (entryIndex === -1) { - throw language.get(LanguageKeys.Commands.Management.ManageCommandChannelResetEmpty); + throw t(LanguageKeys.Commands.Management.ManageCommandChannelResetEmpty); } settings[GuildSettings.DisabledCommandChannels].splice(entryIndex, 1); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.ManageCommandChannelReset, { channel: channel.toString() })); + return message.send(t(LanguageKeys.Commands.Management.ManageCommandChannelReset, { channel: channel.toString() })); } } diff --git a/src/commands/Management/Configuration/manageReactionRoles.ts b/src/commands/Management/Configuration/manageReactionRoles.ts index 05f889ae6d0..6ca74594137 100644 --- a/src/commands/Management/Configuration/manageReactionRoles.ts +++ b/src/commands/Management/Configuration/manageReactionRoles.ts @@ -15,8 +15,8 @@ import { Guild, MessageEmbed, Role, TextChannel } from 'discord.js'; aliases: ['mrr', 'managereactionrole', 'managerolereaction', 'managerolereactions'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.ManageReactionRolesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.ManageReactionRolesExtended), + description: LanguageKeys.Commands.Management.ManageReactionRolesDescription, + extendedHelp: LanguageKeys.Commands.Management.ManageReactionRolesExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -48,16 +48,13 @@ import { Guild, MessageEmbed, Role, TextChannel } from 'discord.js'; ]) export default class extends SkyraCommand { public async show(message: GuildMessage) { - const [reactionRoles, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.ReactionRoles], - settings.getLanguage() - ]); + const [reactionRoles, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.ReactionRoles], settings.getLanguage()]); if (reactionRoles.length === 0) { - throw language.get(LanguageKeys.Commands.Management.ManageReactionRolesShowEmpty); + throw t(LanguageKeys.Commands.Management.ManageReactionRolesShowEmpty); } const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); @@ -79,26 +76,26 @@ export default class extends SkyraCommand { channel: channel!.id, role: role.id }; - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { settings[GuildSettings.ReactionRoles].push(reactionRole); return settings.getLanguage(); }); return message.send( - language.get(LanguageKeys.Commands.Management.ManageReactionRolesAddChannel, { + t(LanguageKeys.Commands.Management.ManageReactionRolesAddChannel, { emoji: displayEmoji(reactionRole.emoji), channel: channel!.toString() }) ); } - const language = await message.fetchLanguage(); - await message.send(language.get(LanguageKeys.Commands.Management.ManageReactionRolesAddPrompt)); + const t = await message.fetchT(); + await message.send(t(LanguageKeys.Commands.Management.ManageReactionRolesAddPrompt)); const reaction = await LongLivingReactionCollector.collectOne(this.client, { filter: (reaction) => reaction.userID === message.author.id && reaction.guild.id === message.guild.id }); - if (!reaction) throw language.get(LanguageKeys.Commands.Management.ManageReactionRolesAddMissing); + if (!reaction) throw t(LanguageKeys.Commands.Management.ManageReactionRolesAddMissing); const reactionRole: ReactionRole = { emoji: resolveEmoji(reaction.emoji)!, @@ -111,47 +108,45 @@ export default class extends SkyraCommand { }); const url = ``; - return message.send(language.get(LanguageKeys.Commands.Management.ManageReactionRolesAdd, { emoji: displayEmoji(reactionRole.emoji), url })); + return message.send(t(LanguageKeys.Commands.Management.ManageReactionRolesAdd, { emoji: displayEmoji(reactionRole.emoji), url })); } public async remove(message: GuildMessage, [role, messageID]: [Role, string]) { - const [reactionRole, language] = await message.guild.writeSettings((settings) => { + const [reactionRole, t] = await message.guild.writeSettings((settings) => { const reactionRoles = settings[GuildSettings.ReactionRoles]; - const language = settings.getLanguage(); + const t = settings.getLanguage(); const reactionRoleIndex = reactionRoles.findIndex((entry) => (entry.message ?? entry.channel) === messageID && entry.role === role.id); - if (reactionRoleIndex === -1) throw language.get(LanguageKeys.Commands.Management.ManageReactionRolesRemoveNotExists); + if (reactionRoleIndex === -1) throw t(LanguageKeys.Commands.Management.ManageReactionRolesRemoveNotExists); const removedReactionRole = reactionRoles[reactionRoleIndex]; reactionRoles.splice(reactionRoleIndex, 1); - return [removedReactionRole, language]; + return [removedReactionRole, t]; }); const url = reactionRole.message ? `` : `<#${reactionRole.channel}>`; - return message.send( - language.get(LanguageKeys.Commands.Management.ManageReactionRolesRemove, { emoji: displayEmoji(reactionRole.emoji), url }) - ); + return message.send(t(LanguageKeys.Commands.Management.ManageReactionRolesRemove, { emoji: displayEmoji(reactionRole.emoji), url })); } public async reset(message: GuildMessage) { - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { const reactionRoles = settings[GuildSettings.ReactionRoles]; - const language = settings.getLanguage(); + const t = settings.getLanguage(); if (reactionRoles.length === 0) { - throw language.get(LanguageKeys.Commands.Management.ManageReactionRolesResetEmpty); + throw t(LanguageKeys.Commands.Management.ManageReactionRolesResetEmpty); } reactionRoles.length = 0; - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.ManageReactionRolesReset)); + return message.send(t(LanguageKeys.Commands.Management.ManageReactionRolesReset)); } private format(entry: ReactionRole, guild: Guild): string { diff --git a/src/commands/Management/Configuration/setIgnoreChannels.ts b/src/commands/Management/Configuration/setIgnoreChannels.ts index a4917778c36..0c6c2dec880 100644 --- a/src/commands/Management/Configuration/setIgnoreChannels.ts +++ b/src/commands/Management/Configuration/setIgnoreChannels.ts @@ -12,8 +12,8 @@ export default class extends SkyraCommand { super(store, file, directory, { bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.SetIgnoreChannelsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetIgnoreChannelsExtended), + description: LanguageKeys.Commands.Management.SetIgnoreChannelsDescription, + extendedHelp: LanguageKeys.Commands.Management.SetIgnoreChannelsExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], usage: '' @@ -22,9 +22,9 @@ export default class extends SkyraCommand { public async run(message: GuildMessage, [channel]: [TextChannel | 'here']) { if (channel === 'here') channel = message.channel as TextChannel; - else if (!isTextBasedChannel(channel)) throw await message.fetchLocale(LanguageKeys.Misc.ConfigurationTextChannelRequired); + else if (!isTextBasedChannel(channel)) throw await message.resolveKey(LanguageKeys.Misc.ConfigurationTextChannelRequired); - const [language, oldLength, newLength] = await message.guild.writeSettings((settings) => { + const [t, oldLength, newLength] = await message.guild.writeSettings((settings) => { const ignoredChannels = settings[GuildSettings.DisabledChannels]; const oldLength = ignoredChannels.length; @@ -40,7 +40,7 @@ export default class extends SkyraCommand { }); return message.send( - language.get( + t( oldLength < newLength ? LanguageKeys.Commands.Management.SetIgnoreChannelsSet : LanguageKeys.Commands.Management.SetIgnoreChannelsRemoved, diff --git a/src/commands/Management/Configuration/setImageLogs.ts b/src/commands/Management/Configuration/setImageLogs.ts index f1fa2439b65..07c0619bab6 100644 --- a/src/commands/Management/Configuration/setImageLogs.ts +++ b/src/commands/Management/Configuration/setImageLogs.ts @@ -4,8 +4,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Management.SetImageLogsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetImageLogsExtended), + description: LanguageKeys.Commands.Management.SetImageLogsDescription, + extendedHelp: LanguageKeys.Commands.Management.SetImageLogsExtended, responseKey: LanguageKeys.Commands.Management.SetImageLogsSet, settingsKey: GuildSettings.Channels.ImageLogs }) diff --git a/src/commands/Management/Configuration/setMemberLogs.ts b/src/commands/Management/Configuration/setMemberLogs.ts index c7f24e14cee..4150d26457e 100644 --- a/src/commands/Management/Configuration/setMemberLogs.ts +++ b/src/commands/Management/Configuration/setMemberLogs.ts @@ -4,8 +4,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Management.SetMemberLogsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetMemberLogsExtended), + description: LanguageKeys.Commands.Management.SetMemberLogsDescription, + extendedHelp: LanguageKeys.Commands.Management.SetMemberLogsExtended, responseKey: LanguageKeys.Commands.Management.SetMemberLogsSet, settingsKey: GuildSettings.Channels.MemberLogs }) diff --git a/src/commands/Management/Configuration/setMessageLogs.ts b/src/commands/Management/Configuration/setMessageLogs.ts index 2ccd22fe0bd..09481de098a 100644 --- a/src/commands/Management/Configuration/setMessageLogs.ts +++ b/src/commands/Management/Configuration/setMessageLogs.ts @@ -4,8 +4,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Management.SetMessageLogsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetMessageLogsExtended), + description: LanguageKeys.Commands.Management.SetMessageLogsDescription, + extendedHelp: LanguageKeys.Commands.Management.SetMessageLogsExtended, responseKey: LanguageKeys.Commands.Management.SetMessageLogsSet, settingsKey: GuildSettings.Channels.MessageLogs }) diff --git a/src/commands/Management/Configuration/setModLogs.ts b/src/commands/Management/Configuration/setModLogs.ts index 10b0ccd3016..de3c469d5d9 100644 --- a/src/commands/Management/Configuration/setModLogs.ts +++ b/src/commands/Management/Configuration/setModLogs.ts @@ -4,9 +4,9 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Management.SetModerationLogsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetModerationLogsExtended), - responseKey: LanguageKeys.Commands.Management.SetModLogsSet, + description: LanguageKeys.Commands.Management.SetModerationLogsDescription, + extendedHelp: LanguageKeys.Commands.Management.SetModerationLogsExtended, + responseKey: LanguageKeys.Commands.Management.SetModerationLogsSet, settingsKey: GuildSettings.Channels.ModerationLogs }) export default class extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setPrefix.ts b/src/commands/Management/Configuration/setPrefix.ts index b32c84fc067..711e1484932 100644 --- a/src/commands/Management/Configuration/setPrefix.ts +++ b/src/commands/Management/Configuration/setPrefix.ts @@ -8,8 +8,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.SetprefixDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetprefixExtended), + description: LanguageKeys.Commands.Management.SetPrefixDescription, + extendedHelp: LanguageKeys.Commands.Management.SetPrefixExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], usage: '', @@ -17,21 +17,21 @@ import { ApplyOptions } from '@skyra/decorators'; }) export default class extends SkyraCommand { public async run(message: GuildMessage, [prefix]: [string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // If it's the same value, throw: if (settings[GuildSettings.Prefix] === prefix) { - throw language.get(LanguageKeys.Misc.ConfigurationEquals); + throw t(LanguageKeys.Misc.ConfigurationEquals); } // Else set the new value: settings[GuildSettings.Prefix] = prefix; - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.SetPrefixSet, { prefix }), { + return message.send(t(LanguageKeys.Commands.Management.SetPrefixSet, { prefix }), { allowedMentions: { users: [message.author.id], roles: [] } }); } diff --git a/src/commands/Management/Configuration/setStarboardEmoji.ts b/src/commands/Management/Configuration/setStarboardEmoji.ts index eef15130070..9ec12f20c22 100644 --- a/src/commands/Management/Configuration/setStarboardEmoji.ts +++ b/src/commands/Management/Configuration/setStarboardEmoji.ts @@ -1,38 +1,35 @@ import { GuildSettings } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.SetStarboardEmojiDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.SetStarboardEmojiExtended), + description: LanguageKeys.Commands.Management.SetStarboardEmojiDescription, + extendedHelp: LanguageKeys.Commands.Management.SetStarboardEmojiExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], usage: '' }) export default class extends SkyraCommand { public async run(message: GuildMessage, [emoji]: [string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // If it's the same value, throw: if (settings[GuildSettings.Starboard.Emoji] === emoji) { - throw language.get(LanguageKeys.Misc.ConfigurationEquals); + throw t(LanguageKeys.Misc.ConfigurationEquals); } // Else set the new value: settings[GuildSettings.Starboard.Emoji] = emoji; - return language; + return t; }); - return message.send( - language.get(LanguageKeys.Commands.Management.SetStarboardEmojiSet, { emoji: emoji.includes(':') ? `<${emoji}>` : emoji }) - ); + return message.send(t(LanguageKeys.Commands.Management.SetStarboardEmojiSet, { emoji: emoji.includes(':') ? `<${emoji}>` : emoji })); } } diff --git a/src/commands/Management/Helpers/guildInfo.ts b/src/commands/Management/Helpers/guildInfo.ts index c425acdd1e1..07e7383b38a 100644 --- a/src/commands/Management/Helpers/guildInfo.ts +++ b/src/commands/Management/Helpers/guildInfo.ts @@ -1,20 +1,18 @@ import { DbSet } from '#lib/database'; import { SkyraEmbed } from '#lib/discord'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { cast } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { Role } from 'discord.js'; -import { CommandOptions } from 'klasa'; const SORT = (x: Role, y: Role) => Number(y.position > x.position) || Number(x.position === y.position) - 1; -@ApplyOptions({ +@ApplyOptions({ aliases: ['serverinfo'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Management.GuildInfoDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.GuildInfoExtended), + description: LanguageKeys.Commands.Management.GuildInfoDescription, + extendedHelp: LanguageKeys.Commands.Management.GuildInfoExtended, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'] }) @@ -29,62 +27,50 @@ export default class extends SkyraCommand { else if (channel.type === 'category') cChannels++; } - const language = await message.fetchLanguage(); - const serverInfoTitles = cast(language.get(LanguageKeys.Commands.Management.GuildInfoTitles)); + const t = await message.fetchT(); + const serverInfoTitles = t(LanguageKeys.Commands.Management.GuildInfoTitles); const roles = [...message.guild.roles.cache.values()].sort(SORT); roles.pop(); const owner = await this.client.users.fetch(message.guild.ownerID); + return message.send( new SkyraEmbed() .setColor(await DbSet.fetchColor(message)) .setThumbnail(message.guild.iconURL()!) .setTitle(`${message.guild.name} [${message.guild.id}]`) - .splitFields( - language.get( - roles.length === 1 ? LanguageKeys.Commands.Tools.WhoisMemberRoles : LanguageKeys.Commands.Tools.WhoisMemberRolesPlural, - { count: roles.length } - ), - roles.join(' ') + .splitFields(t(LanguageKeys.Commands.Tools.WhoisMemberRoles, { count: roles.length }), roles.join(' ')) + .addField( + serverInfoTitles.MEMBERS, + t(LanguageKeys.Commands.Management.GuildInfoMembers, { + memberCount: message.guild.memberCount, + owner + }), + true ) .addField( serverInfoTitles.CHANNELS, - language.get(LanguageKeys.Commands.Management.GuildInfoChannels, { + t(LanguageKeys.Commands.Management.GuildInfoChannels, { text: tChannels, voice: vChannels, categories: cChannels, afkChannelText: message.guild.afkChannelID - ? language.get(LanguageKeys.Commands.Management.GuildInfoChannelsAfkChannelText, { + ? t(LanguageKeys.Commands.Management.GuildInfoChannelsAfkChannelText, { afkChannel: message.guild.afkChannelID, - afkTime: message.guild.afkTimeout + afkTime: message.guild.afkTimeout / 60 }) - : `**${language.get(LanguageKeys.Globals.None)}**` - }), - true - ) - .addField( - serverInfoTitles.MEMBERS, - language.get(LanguageKeys.Commands.Management.GuildInfoMembers, { - count: message.guild.memberCount.toLocaleString(language.name), - owner + : `**${t(LanguageKeys.Globals.None)}**` }), true ) .addField( serverInfoTitles.OTHER, - language.get(LanguageKeys.Commands.Management.GuildInfoOther, { + t(LanguageKeys.Commands.Management.GuildInfoOther, { size: message.guild.roles.cache.size, region: message.guild.region, createdAt: message.guild.createdTimestamp, verificationLevel: message.guild.verificationLevel - }), - true + }) ) ); } } - -interface ServerInfoTitles { - CHANNELS: string; - MEMBERS: string; - OTHER: string; -} diff --git a/src/commands/Management/Helpers/roleInfo.ts b/src/commands/Management/Helpers/roleInfo.ts index 26a8b5f4926..e1a14590982 100644 --- a/src/commands/Management/Helpers/roleInfo.ts +++ b/src/commands/Management/Helpers/roleInfo.ts @@ -1,17 +1,15 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; -import { cast } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed, Permissions, Role } from 'discord.js'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.RoleInfoDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.RoleInfoExtended), + description: LanguageKeys.Commands.Management.RoleInfoDescription, + extendedHelp: LanguageKeys.Commands.Management.RoleInfoExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], @@ -19,36 +17,30 @@ import { CommandOptions } from 'klasa'; }) export default class extends SkyraCommand { public async run(message: GuildMessage, [role = message.member.roles.highest]: [Role?]) { - const language = await message.fetchLanguage(); - const roleInfoTitles = cast(language.get(LanguageKeys.Commands.Management.RoleInfoTitles)); + const t = await message.fetchT(); + const roleInfoTitles = t(LanguageKeys.Commands.Management.RoleInfoTitles); const permissions = role.permissions.has(Permissions.FLAGS.ADMINISTRATOR) - ? language.get(LanguageKeys.Commands.Management.RoleInfoAll) + ? t(LanguageKeys.Commands.Management.RoleInfoAll) : role.permissions.toArray().length > 0 ? role.permissions .toArray() - .map((key) => `+ **${language.PERMISSIONS[key]}**`) + .map((key) => `+ **${t(`permissions:${key}`, key)}**`) .join('\n') - : language.get(LanguageKeys.Commands.Management.RoleInfoNoPermissions); + : t(LanguageKeys.Commands.Management.RoleInfoNoPermissions); return message.send( new MessageEmbed() .setColor(role.color || BrandingColors.Secondary) .setTitle(`${role.name} [${role.id}]`) .setDescription( - language - .get(LanguageKeys.Commands.Management.RoleInfoData, { - role, - hoisted: language.get(role.hoist ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No), - mentionable: language.get(role.mentionable ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No) - }) - .join('\n') + t(LanguageKeys.Commands.Management.RoleInfoData, { + role, + hoisted: t(role.hoist ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No), + mentionable: t(role.mentionable ? LanguageKeys.Globals.Yes : LanguageKeys.Globals.No) + }) ) .addField(roleInfoTitles.PERMISSIONS, permissions) ); } } - -interface RoleInfoTitles { - PERMISSIONS: string; -} diff --git a/src/commands/Management/Members/stickyRoles.ts b/src/commands/Management/Members/stickyRoles.ts index 4afbe711b7b..ad412ed2425 100644 --- a/src/commands/Management/Members/stickyRoles.ts +++ b/src/commands/Management/Members/stickyRoles.ts @@ -8,8 +8,8 @@ import { Role, User } from 'discord.js'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Management.StickyRolesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.StickyRolesExtended), + description: LanguageKeys.Commands.Management.StickyRolesDescription, + extendedHelp: LanguageKeys.Commands.Management.StickyRolesExtended, permissionLevel: PermissionLevels.Administrator, requiredGuildPermissions: ['MANAGE_ROLES'], runIn: ['text'], @@ -21,7 +21,7 @@ import { Role, User } from 'discord.js'; [ 'username', async (arg, possible, msg) => { - if (!arg) throw await msg.fetchLocale(LanguageKeys.Commands.Management.StickyRolesRequiredUser); + if (!arg) throw await msg.resolveKey(LanguageKeys.Commands.Management.StickyRolesRequiredUser); return msg.client.arguments.get('username')!.run(arg, possible, msg); } ], @@ -29,7 +29,7 @@ import { Role, User } from 'discord.js'; 'rolename', async (arg, possible, msg, [action]) => { if (action === 'reset' || action === 'show') return undefined; - if (!arg) throw await msg.fetchLocale(LanguageKeys.Commands.Management.StickyRolesRequiredRole); + if (!arg) throw await msg.resolveKey(LanguageKeys.Commands.Management.StickyRolesRequiredRole); return msg.client.arguments.get('rolename')!.run(arg, possible, msg); } ] @@ -37,40 +37,37 @@ import { Role, User } from 'discord.js'; export default class extends SkyraCommand { public async reset(message: GuildMessage, [user]: [User]) { const roles = await message.guild.stickyRoles.fetch(user.id); - if (!roles.length) throw await message.fetchLocale(LanguageKeys.Commands.Management.StickyRolesNotExists, { user: user.username }); + if (!roles.length) throw await message.resolveKey(LanguageKeys.Commands.Management.StickyRolesNotExists, { user: user.username }); await message.guild.stickyRoles.clear(user.id); - return message.sendLocale(LanguageKeys.Commands.Management.StickyRolesReset, [{ user: user.username }]); + return message.sendTranslated(LanguageKeys.Commands.Management.StickyRolesReset, [{ user: user.username }]); } public async remove(message: GuildMessage, [user, role]: [User, Role]) { const roles = await message.guild.stickyRoles.fetch(user.id); - if (!roles.length) throw await message.fetchLocale(LanguageKeys.Commands.Management.StickyRolesNotExists, { user: user.username }); + if (!roles.length) throw await message.resolveKey(LanguageKeys.Commands.Management.StickyRolesNotExists, { user: user.username }); await message.guild.stickyRoles.remove(user.id, role.id); - return message.sendLocale(LanguageKeys.Commands.Management.StickyRolesRemove, [{ user: user.username }]); + return message.sendTranslated(LanguageKeys.Commands.Management.StickyRolesRemove, [{ user: user.username }]); } public async add(message: GuildMessage, [user, role]: [User, Role]) { await message.guild.stickyRoles.add(user.id, role.id); - return message.sendLocale(LanguageKeys.Commands.Management.StickyRolesAdd, [{ user: user.username }]); + return message.sendTranslated(LanguageKeys.Commands.Management.StickyRolesAdd, [{ user: user.username }]); } public async show(message: GuildMessage, [user]: [User]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const sticky = await message.guild.stickyRoles.fetch(user.id); - if (!sticky.length) throw language.get(LanguageKeys.Commands.Management.StickyRolesShowEmpty); + if (!sticky.length) throw t(LanguageKeys.Commands.Management.StickyRolesShowEmpty); const roles = message.guild.roles.cache; const names = sticky.map((role) => roles.get(role)!.name); return message.send( - language.get(LanguageKeys.Commands.Management.StickyRolesShowSingle, { + t(LanguageKeys.Commands.Management.StickyRolesShowSingle, { user: user.username, - roles: language.list( - names.map((name) => `\`${name}\``), - language.get(LanguageKeys.Globals.And) - ) + roles: names.map((name) => `\`${name}\``) }) ); } diff --git a/src/commands/Management/Message Filters/attachmentMode.ts b/src/commands/Management/Message Filters/attachmentMode.ts index b9d4bcf7480..ee04191e013 100644 --- a/src/commands/Management/Message Filters/attachmentMode.ts +++ b/src/commands/Management/Message Filters/attachmentMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['attachment-mode', 'attachments-mode', 'att-mode', 'manageAttachment', 'manageattachment'], - description: (language) => language.get(LanguageKeys.Commands.Management.AttachmentsModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.AttachmentsModeExtended) + description: LanguageKeys.Commands.Management.AttachmentsModeDescription, + extendedHelp: LanguageKeys.Commands.Management.AttachmentsModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'attachments'; diff --git a/src/commands/Management/Message Filters/capitalsMode.ts b/src/commands/Management/Message Filters/capitalsMode.ts index 177e31f4f81..8bc3d9aaa3b 100644 --- a/src/commands/Management/Message Filters/capitalsMode.ts +++ b/src/commands/Management/Message Filters/capitalsMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['capitals-mode', 'caps-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.CapitalsModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.CapitalsModeExtended) + description: LanguageKeys.Commands.Management.CapitalsModeDescription, + extendedHelp: LanguageKeys.Commands.Management.CapitalsModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'capitals'; diff --git a/src/commands/Management/Message Filters/filter.ts b/src/commands/Management/Message Filters/filter.ts index dffaec14c1c..08eb6e9d7c2 100644 --- a/src/commands/Management/Message Filters/filter.ts +++ b/src/commands/Management/Message Filters/filter.ts @@ -1,16 +1,15 @@ import { GuildSettings } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ bucket: 2, cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Management.FilterDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.FilterExtended), + description: LanguageKeys.Commands.Management.FilterDescription, + extendedHelp: LanguageKeys.Commands.Management.FilterExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -23,71 +22,71 @@ import { CommandOptions } from 'klasa'; async (arg, _, message, [type]) => { if (type === 'reset' || type === 'show') return undefined; if (arg) return arg.toLowerCase(); - throw await message.fetchLocale(LanguageKeys.Commands.Management.FilterUndefinedWord); + throw await message.resolveKey(LanguageKeys.Commands.Management.FilterUndefinedWord); } ] ]) export default class extends SkyraCommand { public async add(message: GuildMessage, [word]: [string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // Check if the word is not filtered: const words = settings[GuildSettings.Selfmod.Filter.Raw]; const regex = settings.wordFilterRegExp; if (words.includes(word) || (regex && regex.test(word))) { - throw language.get(LanguageKeys.Commands.Management.FilterAlreadyFiltered); + throw t(LanguageKeys.Commands.Management.FilterAlreadyFiltered); } // Add the word to the list: words.push(word); // Return language for re-use: - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.FilterAdded, { word })); + return message.send(t(LanguageKeys.Commands.Management.FilterAdded, { word })); } public async remove(message: GuildMessage, [word]: [string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // Check if the word is not filtered: const words = settings[GuildSettings.Selfmod.Filter.Raw]; const index = words.indexOf(word); if (index === -1) { - throw language.get(LanguageKeys.Commands.Management.FilterNotFiltered); + throw t(LanguageKeys.Commands.Management.FilterNotFiltered); } // Remove the word from the list: words.splice(index, 1); // Return language for re-use: - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.FilterRemoved, { word })); + return message.send(t(LanguageKeys.Commands.Management.FilterRemoved, { word })); } public async reset(message: GuildMessage) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // Set an empty array: settings[GuildSettings.Selfmod.Filter.Raw].length = 0; // Return language for re-use: - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.FilterReset)); + return message.send(t(LanguageKeys.Commands.Management.FilterReset)); } public async show(message: GuildMessage) { - const raw = await message.guild.readSettings(GuildSettings.Selfmod.Filter.Raw); + const [raw, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Selfmod.Filter.Raw], settings.getLanguage()]); return raw.length - ? message.sendLocale(LanguageKeys.Commands.Management.FilterShow, [{ words: `\`${raw.join('`, `')}\`` }]) - : message.sendLocale(LanguageKeys.Commands.Management.FilterShowEmpty); + ? message.send(t(LanguageKeys.Commands.Management.FilterShow, { words: `\`${raw.join('`, `')}\`` })) + : message.send(t(LanguageKeys.Commands.Management.FilterShowEmpty)); } } diff --git a/src/commands/Management/Message Filters/filterMode.ts b/src/commands/Management/Message Filters/filterMode.ts index 6dd7b138652..dbf803e5613 100644 --- a/src/commands/Management/Message Filters/filterMode.ts +++ b/src/commands/Management/Message Filters/filterMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['word-filter-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.FilterModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.FilterModeDescription) + description: LanguageKeys.Commands.Management.FilterModeDescription, + extendedHelp: LanguageKeys.Commands.Management.FilterModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'words'; diff --git a/src/commands/Management/Message Filters/inviteMode.ts b/src/commands/Management/Message Filters/inviteMode.ts index 850a4287989..083b6da44ec 100644 --- a/src/commands/Management/Message Filters/inviteMode.ts +++ b/src/commands/Management/Message Filters/inviteMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['invites-mode', 'inv-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.InviteModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.InviteModeExtended) + description: LanguageKeys.Commands.Management.InviteModeDescription, + extendedHelp: LanguageKeys.Commands.Management.InviteModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'invites'; diff --git a/src/commands/Management/Message Filters/linkMode.ts b/src/commands/Management/Message Filters/linkMode.ts index d35559df206..7162047ca92 100644 --- a/src/commands/Management/Message Filters/linkMode.ts +++ b/src/commands/Management/Message Filters/linkMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['link-mode', 'lmode', 'linkfilter', 'extlinks', 'externallinks'], - description: (language) => language.get(LanguageKeys.Commands.Management.LinkModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.LinkModeExtended) + description: LanguageKeys.Commands.Management.LinkModeDescription, + extendedHelp: LanguageKeys.Commands.Management.LinkModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'links'; diff --git a/src/commands/Management/Message Filters/messageMode.ts b/src/commands/Management/Message Filters/messageMode.ts index d139e9c3b7a..6973280859b 100644 --- a/src/commands/Management/Message Filters/messageMode.ts +++ b/src/commands/Management/Message Filters/messageMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['message-mode', 'msg-mode', 'm-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.MessageModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.MessageModeExtended) + description: LanguageKeys.Commands.Management.MessageModeDescription, + extendedHelp: LanguageKeys.Commands.Management.MessageModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'messages'; diff --git a/src/commands/Management/Message Filters/newlineMode.ts b/src/commands/Management/Message Filters/newlineMode.ts index 13c7238016f..247bf8cab9b 100644 --- a/src/commands/Management/Message Filters/newlineMode.ts +++ b/src/commands/Management/Message Filters/newlineMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['newline-mode', 'nl-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.NewlineModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.NewlineModeExtended) + description: LanguageKeys.Commands.Management.NewlineModeDescription, + extendedHelp: LanguageKeys.Commands.Management.NewlineModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'newlines'; diff --git a/src/commands/Management/Reaction Filters/reactionMode.ts b/src/commands/Management/Reaction Filters/reactionMode.ts index c8a5d3f7ed1..6c4993ea16e 100644 --- a/src/commands/Management/Reaction Filters/reactionMode.ts +++ b/src/commands/Management/Reaction Filters/reactionMode.ts @@ -1,14 +1,14 @@ import { AdderKey, GuildEntity, GuildSettings } from '#lib/database'; import { SelfModerationCommand } from '#lib/structures/SelfModerationCommand'; +import { SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { KeyOfType } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; -import { CommandOptions } from 'klasa'; -@ApplyOptions({ +@ApplyOptions({ aliases: ['reaction-mode', 'r-mode'], - description: (language) => language.get(LanguageKeys.Commands.Management.ReactionModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.ReactionModeExtended) + description: LanguageKeys.Commands.Management.ReactionModeDescription, + extendedHelp: LanguageKeys.Commands.Management.ReactionModeExtended }) export default class extends SelfModerationCommand { protected $adder: AdderKey = 'reactions'; diff --git a/src/commands/Management/createMute.ts b/src/commands/Management/createMute.ts index 1ccab6d7592..1bee2968598 100644 --- a/src/commands/Management/createMute.ts +++ b/src/commands/Management/createMute.ts @@ -10,8 +10,8 @@ import { Permissions, Role } from 'discord.js'; @ApplyOptions({ cooldown: 150, - description: (language) => language.get(LanguageKeys.Commands.Management.CreateMuteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.CreateMuteExtended), + description: LanguageKeys.Commands.Management.CreateMuteDescription, + extendedHelp: LanguageKeys.Commands.Management.CreateMuteExtended, permissionLevel: PermissionLevels.Administrator, requiredGuildPermissions: [Permissions.FLAGS.MANAGE_CHANNELS, Permissions.FLAGS.MANAGE_ROLES], runIn: ['text'] @@ -21,26 +21,26 @@ export default class extends SkyraCommand { private rolePrompt = this.definePrompt(''); public async run(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.Muted, role.id]]); if (message.reactable) return message.react(resolveEmoji(Emojis.GreenTick)!); - return message.sendLocale(LanguageKeys.Commands.Admin.ConfUpdated, [ - { + return message.send( + t(LanguageKeys.Commands.Admin.ConfUpdated, { key: GuildSettings.Roles.Muted, response: role.name - } - ]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + }) + ); + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.muteSetup(message); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } return null; diff --git a/src/commands/Management/nick.ts b/src/commands/Management/nick.ts index 5df1a9724fb..f723d090945 100644 --- a/src/commands/Management/nick.ts +++ b/src/commands/Management/nick.ts @@ -1,27 +1,24 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { CommandStore } from 'klasa'; +import { ApplyOptions } from '@skyra/decorators'; +@ApplyOptions({ + aliases: ['nickname'], + cooldown: 30, + description: LanguageKeys.Commands.Management.NickDescription, + extendedHelp: LanguageKeys.Commands.Management.NickExtended, + permissionLevel: PermissionLevels.Moderator, + requiredPermissions: ['CHANGE_NICKNAME'], + runIn: ['text'], + usage: '[nick:string{,32}]' +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - aliases: ['nickname'], - cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Management.NickDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.NickExtended), - permissionLevel: PermissionLevels.Moderator, - requiredPermissions: ['CHANGE_NICKNAME'], - runIn: ['text'], - usage: '[nick:string{,32}]' - }); - } - public async run(message: GuildMessage, [nickname = '']: [string?]) { await message.guild.me!.setNickname(nickname); return nickname - ? message.alert(await message.fetchLocale(LanguageKeys.Commands.Management.NickSet, { nickname })) - : message.alert(await message.fetchLocale(LanguageKeys.Commands.Management.NickCleared)); + ? message.alert(await message.resolveKey(LanguageKeys.Commands.Management.NickSet, { nickname })) + : message.alert(await message.resolveKey(LanguageKeys.Commands.Management.NickCleared)); } } diff --git a/src/commands/Management/permissionNodes.ts b/src/commands/Management/permissionNodes.ts index 7cb1e707a05..0e3a3079abc 100644 --- a/src/commands/Management/permissionNodes.ts +++ b/src/commands/Management/permissionNodes.ts @@ -12,8 +12,8 @@ import { Command } from 'klasa'; bucket: 2, cooldown: 10, permissionLevel: PermissionLevels.Administrator, - description: (language) => language.get(LanguageKeys.Commands.Management.PermissionNodesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.PermissionNodesExtended), + description: LanguageKeys.Commands.Management.PermissionNodesDescription, + extendedHelp: LanguageKeys.Commands.Management.PermissionNodesExtended, subcommands: true, runIn: ['text'], usage: ' (type:type) (command:command)', @@ -32,72 +32,70 @@ import { Command } from 'klasa'; async (arg, _possible, message, [action]) => { if (action === 'reset' || action === 'show') return undefined; if (/allow|deny/i.test(arg)) return arg.toLowerCase(); - throw await message.fetchLocale(LanguageKeys.Commands.Management.PermissionNodesInvalidType); + throw await message.resolveKey(LanguageKeys.Commands.Management.PermissionNodesInvalidType); } ] ]) export default class extends SkyraCommand { public async add(message: GuildMessage, [target, action, command]: [Role | GuildMember, PermissionNodeAction, Command]) { - if (!this.checkPermissions(message, target)) throw await message.fetchLocale(LanguageKeys.Commands.Management.PermissionNodesHigher); + if (!this.checkPermissions(message, target)) throw await message.resolveKey(LanguageKeys.Commands.Management.PermissionNodesHigher); - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { settings.permissionNodes.add(target, command.name, action); return settings.getLanguage(); }); - return message.send(language.get(LanguageKeys.Commands.Management.PermissionNodesAdd)); + return message.send(t(LanguageKeys.Commands.Management.PermissionNodesAdd)); } public async remove(message: GuildMessage, [target, action, command]: [Role | GuildMember, PermissionNodeAction, Command]) { - if (!this.checkPermissions(message, target)) throw await message.fetchLocale(LanguageKeys.Commands.Management.PermissionNodesHigher); + if (!this.checkPermissions(message, target)) throw await message.resolveKey(LanguageKeys.Commands.Management.PermissionNodesHigher); - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { settings.permissionNodes.remove(target, command.name, action); return settings.getLanguage(); }); - return message.send(language.get(LanguageKeys.Commands.Management.PermissionNodesRemove)); + return message.send(t(LanguageKeys.Commands.Management.PermissionNodesRemove)); } public async reset(message: GuildMessage, [target]: [Role | GuildMember]) { - if (!this.checkPermissions(message, target)) throw await message.fetchLocale(LanguageKeys.Commands.Management.PermissionNodesHigher); + if (!this.checkPermissions(message, target)) throw await message.resolveKey(LanguageKeys.Commands.Management.PermissionNodesHigher); - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { settings.permissionNodes.reset(target); return settings.getLanguage(); }); - return message.send(language.get(LanguageKeys.Commands.Management.PermissionNodesReset)); + return message.send(t(LanguageKeys.Commands.Management.PermissionNodesReset)); } public async show(message: GuildMessage, [target]: [Role | GuildMember]) { - if (!this.checkPermissions(message, target)) throw await message.fetchLocale(LanguageKeys.Commands.Management.PermissionNodesHigher); + if (!this.checkPermissions(message, target)) throw await message.resolveKey(LanguageKeys.Commands.Management.PermissionNodesHigher); const isRole = target instanceof Role; const key = isRole ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; - const [nodes, language] = await message.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); + const [nodes, t] = await message.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); const node = nodes.find((n) => n.id === target.id); - if (typeof node === 'undefined') throw language.get(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); + if (typeof node === 'undefined') throw t(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); return message.send([ - language.get(LanguageKeys.Commands.Management.PermissionNodesShowName, { + t(LanguageKeys.Commands.Management.PermissionNodesShowName, { name: isRole ? (target as Role).name : (target as GuildMember).displayName }), - language.get(LanguageKeys.Commands.Management.PermissionNodesShowAllow, { + t(LanguageKeys.Commands.Management.PermissionNodesShowAllow, { allow: node.allow.length - ? language.list( - node.allow.map((command) => `\`${command}\``), - language.get(LanguageKeys.Globals.And) - ) - : language.get(LanguageKeys.Globals.None) + ? t(LanguageKeys.Globals.AndListValue, { + value: node.allow.map((command) => `\`${command}\``) + }) + : t(LanguageKeys.Globals.None) }), - language.get(LanguageKeys.Commands.Management.PermissionNodesShowDeny, { + t(LanguageKeys.Commands.Management.PermissionNodesShowDeny, { deny: node.deny.length - ? language.list( - node.deny.map((command) => `\`${command}\``), - language.get(LanguageKeys.Globals.And) - ) - : language.get(LanguageKeys.Globals.None) + ? t(LanguageKeys.Globals.AndListValue, { + value: node.deny.map((command) => `\`${command}\``) + }) + : t(LanguageKeys.Globals.None) }) ]); } diff --git a/src/commands/Management/roles.ts b/src/commands/Management/roles.ts index 08f2cd2ee24..1b4bfdd54ed 100644 --- a/src/commands/Management/roles.ts +++ b/src/commands/Management/roles.ts @@ -13,8 +13,8 @@ import { MessageEmbed, Role } from 'discord.js'; @ApplyOptions({ aliases: ['pr', 'role', 'public-roles', 'public-role'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Management.RolesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.RolesExtended), + description: LanguageKeys.Commands.Management.RolesDescription, + extendedHelp: LanguageKeys.Commands.Management.RolesExtended, requiredGuildPermissions: ['MANAGE_ROLES'], requiredPermissions: ['MANAGE_MESSAGES'], usage: '(roles:rolenames)' @@ -47,7 +47,7 @@ import { MessageEmbed, Role } from 'discord.js'; ]) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [roles]: [Role[]]) { - const [rolesPublic, prefix, allRoleSets, rolesRemoveInitial, rolesInitial, language] = await message.guild.readSettings((settings) => [ + const [rolesPublic, prefix, allRoleSets, rolesRemoveInitial, rolesInitial, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Roles.Public], settings[GuildSettings.Prefix], settings[GuildSettings.Roles.UniqueRoleSets], @@ -56,9 +56,9 @@ export default class extends RichDisplayCommand { settings.getLanguage() ]); - if (!roles) throw language.get(LanguageKeys.Commands.Management.RolesListEmpty); + if (!roles) throw t(LanguageKeys.Commands.Management.RolesListEmpty); if (!roles.length) { - if (message.args.some((v) => v.length !== 0)) throw language.get(LanguageKeys.Commands.Management.RolesAbort, { prefix }); + if (message.args.some((v) => v.length !== 0)) throw t(LanguageKeys.Commands.Management.RolesAbort, { prefix }); return this.list(message, rolesPublic); } const memberRoles = new Set(message.member!.roles.cache.keys()); @@ -117,13 +117,13 @@ export default class extends RichDisplayCommand { // Apply the roles if (removedRoles.length || addedRoles.length) - await message.member!.roles.set([...memberRoles], language.get(LanguageKeys.Commands.Management.RolesAuditLog)); + await message.member!.roles.set([...memberRoles], t(LanguageKeys.Commands.Management.RolesAuditLog)); const output: string[] = []; - if (unlistedRoles.length) output.push(language.get(LanguageKeys.Commands.Management.RolesNotPublic, { roles: unlistedRoles.join('`, `') })); - if (unmanageable.length) output.push(language.get(LanguageKeys.Commands.Management.RolesNotManageable, { roles: unmanageable.join('`, `') })); - if (removedRoles.length) output.push(language.get(LanguageKeys.Commands.Management.RolesRemoved, { roles: removedRoles.join('`, `') })); - if (addedRoles.length) output.push(language.get(LanguageKeys.Commands.Management.RolesAdded, { roles: addedRoles.join('`, `') })); + if (unlistedRoles.length) output.push(t(LanguageKeys.Commands.Management.RolesNotPublic, { roles: unlistedRoles.join('`, `') })); + if (unmanageable.length) output.push(t(LanguageKeys.Commands.Management.RolesNotManageable, { roles: unmanageable.join('`, `') })); + if (removedRoles.length) output.push(t(LanguageKeys.Commands.Management.RolesRemoved, { roles: removedRoles.join('`, `') })); + if (addedRoles.length) output.push(t(LanguageKeys.Commands.Management.RolesAdded, { roles: addedRoles.join('`, `') })); return message.send(output.join('\n')); } @@ -143,24 +143,24 @@ export default class extends RichDisplayCommand { await message.guild.writeSettings([[GuildSettings.Roles.Public, [...allRoles]]]); } - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // There's the possibility all roles could be inexistent, therefore the system // would filter and remove them all, causing this to be empty. - if (!roles.length) throw language.get(LanguageKeys.Commands.Management.RolesListEmpty); + if (!roles.length) throw t(LanguageKeys.Commands.Management.RolesListEmpty); const display = new UserRichDisplay( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setAuthor(this.client.user!.username, this.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setTitle(language.get(LanguageKeys.Commands.Management.RolesListTitle)) + .setTitle(t(LanguageKeys.Commands.Management.RolesListTitle)) ); const pages = Math.ceil(roles.length / 10); for (let i = 0; i < pages; i++) display.addPage((template: MessageEmbed) => template.setDescription(roles.slice(i * 10, i * 10 + 10))); const response = await message.send( - new MessageEmbed({ description: pickRandom(language.get(LanguageKeys.System.Loading)), color: BrandingColors.Secondary }) + new MessageEmbed({ description: pickRandom(t(LanguageKeys.System.Loading)), color: BrandingColors.Secondary }) ); await display.start(response, message.author.id); return response; diff --git a/src/commands/Management/triggers.ts b/src/commands/Management/triggers.ts index 1bb4531b1e1..9fa48aa263d 100644 --- a/src/commands/Management/triggers.ts +++ b/src/commands/Management/triggers.ts @@ -13,8 +13,8 @@ const REG_TYPE = /^(alias|reaction)$/i; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Management.TriggersDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Management.TriggersExtended), + description: LanguageKeys.Commands.Management.TriggersDescription, + extendedHelp: LanguageKeys.Commands.Management.TriggersExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -27,14 +27,14 @@ const REG_TYPE = /^(alias|reaction)$/i; async (arg, _, message, [action]) => { if (action === 'show') return undefined; if (REG_TYPE.test(arg)) return arg.toLowerCase(); - throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersNoType); + throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersNoType); } ], [ 'input', async (arg, _, message, [action]) => { if (action === 'show') return undefined; - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersNoOutput); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersNoOutput); return arg.toLowerCase(); } ], @@ -42,23 +42,23 @@ const REG_TYPE = /^(alias|reaction)$/i; 'output', async (arg, _, message, [action, type]) => { if (action === 'show' || action === 'remove') return undefined; - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersNoOutput); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersNoOutput); if (type === 'reaction') { const emoji = resolveEmoji(arg); - if (!emoji) throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersInvalidReaction); + if (!emoji) throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersInvalidReaction); try { await message.react(emoji); return emoji; } catch { - throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersInvalidReaction); + throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersInvalidReaction); } } if (type === 'alias') { const command = message.client.commands.get(arg); if (command && command.permissionLevel < PermissionLevels.BotOwner) return command.name; - throw await message.fetchLocale(LanguageKeys.Commands.Management.TriggersInvalidAlias); + throw await message.resolveKey(LanguageKeys.Commands.Management.TriggersInvalidAlias); } return null; @@ -67,44 +67,44 @@ const REG_TYPE = /^(alias|reaction)$/i; ]) export default class extends SkyraCommand { public async remove(message: GuildMessage, [type, input]: [string, string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const key = this.getListName(type); const list = settings[key]; const index = list.findIndex((entry) => entry.input === input); - if (index === -1) throw language.get(LanguageKeys.Commands.Management.TriggersRemoveNotTaken); + if (index === -1) throw t(LanguageKeys.Commands.Management.TriggersRemoveNotTaken); list.splice(index, 1); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.TriggersRemove)); + return message.send(t(LanguageKeys.Commands.Management.TriggersRemove)); } public async add(message: GuildMessage, [type, input, output]: [string, string, string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const key = this.getListName(type); const list = settings[key]; const alreadySet = list.some((entry) => entry.input === input); - if (alreadySet) throw language.get(LanguageKeys.Commands.Management.TriggersAddTaken); + if (alreadySet) throw t(LanguageKeys.Commands.Management.TriggersAddTaken); list.push(this.format(type, input, output) as any); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Management.TriggersAdd)); + return message.send(t(LanguageKeys.Commands.Management.TriggersAdd)); } @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async show(message: GuildMessage) { - const [aliases, includes, language] = await message.guild.readSettings((settings) => [ + const [aliases, includes, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Trigger.Alias], settings[GuildSettings.Trigger.Includes], settings.getLanguage() @@ -117,7 +117,7 @@ export default class extends SkyraCommand { for (const react of includes) { output.push(`Reaction :: \`${react.input}\` -> ${displayEmoji(react.output)}`); } - if (!output.length) throw language.get(LanguageKeys.Commands.Management.TriggersListEmpty); + if (!output.length) throw t(LanguageKeys.Commands.Management.TriggersListEmpty); const display = new UserRichDisplay( new MessageEmbed() diff --git a/src/commands/Misc/chase.ts b/src/commands/Misc/chase.ts index ec2b0b130aa..4c8be891ef4 100644 --- a/src/commands/Misc/chase.ts +++ b/src/commands/Misc/chase.ts @@ -13,8 +13,8 @@ import { join } from 'path'; @ApplyOptions({ bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.ChaseDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.ChaseExtended), + description: LanguageKeys.Commands.Misc.ChaseDescription, + extendedHelp: LanguageKeys.Commands.Misc.ChaseExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/cuddle.ts b/src/commands/Misc/cuddle.ts index 4295517c00b..0874bc1209d 100644 --- a/src/commands/Misc/cuddle.ts +++ b/src/commands/Misc/cuddle.ts @@ -12,8 +12,8 @@ import { join } from 'path'; @ApplyOptions({ bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.CuddleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.CuddleExtended), + description: LanguageKeys.Commands.Misc.CuddleDescription, + extendedHelp: LanguageKeys.Commands.Misc.CuddleExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/deletthis.ts b/src/commands/Misc/deletthis.ts index 1f775f40092..c8fab7227d4 100644 --- a/src/commands/Misc/deletthis.ts +++ b/src/commands/Misc/deletthis.ts @@ -14,8 +14,8 @@ import { join } from 'path'; aliases: ['deletethis'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.DeletthisDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.DeletthisExtended), + description: LanguageKeys.Commands.Misc.DeletThisDescription, + extendedHelp: LanguageKeys.Commands.Misc.DeletThisExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/f.ts b/src/commands/Misc/f.ts index f85df98d030..9b9c88f7182 100644 --- a/src/commands/Misc/f.ts +++ b/src/commands/Misc/f.ts @@ -13,8 +13,8 @@ import { join } from 'path'; aliases: ['pray'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.FDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.FExtended), + description: LanguageKeys.Commands.Misc.FDescription, + extendedHelp: LanguageKeys.Commands.Misc.FExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '[user:username]' diff --git a/src/commands/Misc/goodnight.ts b/src/commands/Misc/goodnight.ts index a4975aab23a..711b01b8ad5 100644 --- a/src/commands/Misc/goodnight.ts +++ b/src/commands/Misc/goodnight.ts @@ -13,8 +13,8 @@ import { join } from 'path'; aliases: ['night'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.GoodnightDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.GoodnightExtended), + description: LanguageKeys.Commands.Misc.GoodNightDescription, + extendedHelp: LanguageKeys.Commands.Misc.GoodNightExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/goofytime.ts b/src/commands/Misc/goofytime.ts index 844ac6de207..f0ab6cfe2fc 100644 --- a/src/commands/Misc/goofytime.ts +++ b/src/commands/Misc/goofytime.ts @@ -13,8 +13,8 @@ import { join } from 'path'; aliases: ['goof', 'goofy', 'daddy', 'goofie', 'goofietime'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.GoofytimeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.GoofytimeExtended), + description: LanguageKeys.Commands.Misc.GoofyTimeDescription, + extendedHelp: LanguageKeys.Commands.Misc.GoofyTimeExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/hug.ts b/src/commands/Misc/hug.ts index 762380de596..e32e941a107 100644 --- a/src/commands/Misc/hug.ts +++ b/src/commands/Misc/hug.ts @@ -12,8 +12,8 @@ import { join } from 'path'; @ApplyOptions({ bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.HugDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.HugExtended), + description: LanguageKeys.Commands.Misc.HugDescription, + extendedHelp: LanguageKeys.Commands.Misc.HugExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/ineedhealing.ts b/src/commands/Misc/ineedhealing.ts index 63096455fd4..02198a7b7fa 100644 --- a/src/commands/Misc/ineedhealing.ts +++ b/src/commands/Misc/ineedhealing.ts @@ -13,8 +13,8 @@ import { join } from 'path'; aliases: ['heal', 'healing'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.IneedhealingDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.IneedhealingExtended), + description: LanguageKeys.Commands.Misc.INeedHealingDescription, + extendedHelp: LanguageKeys.Commands.Misc.INeedHealingExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/randreddit.ts b/src/commands/Misc/randreddit.ts index 143749c30d5..ebefbb12374 100644 --- a/src/commands/Misc/randreddit.ts +++ b/src/commands/Misc/randreddit.ts @@ -5,7 +5,8 @@ import { Reddit } from '#lib/types/definitions/Reddit'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { fetch, FetchResultTypes } from '#utils/util'; import { TextChannel } from 'discord.js'; -import { CommandStore, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { CommandStore } from 'klasa'; export default class extends SkyraCommand { private readonly kBlacklist = /nsfl|morbidreality|watchpeopledie|fiftyfifty|stikk/i; @@ -16,25 +17,25 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['rand', 'rand-reddit', 'reddit'], cooldown: 3, - description: (language) => language.get(LanguageKeys.Commands.Misc.RandRedditDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.RandRedditExtended), + description: LanguageKeys.Commands.Misc.RandRedditDescription, + extendedHelp: LanguageKeys.Commands.Misc.RandRedditExtended, usage: '' }); this.createCustomResolver('reddit', async (arg, _possible, message) => { - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Misc.RandRedditRequiredReddit); - if (!this.kUsernameRegex.test(arg)) throw await message.fetchLocale(LanguageKeys.Commands.Misc.RandRedditInvalidArgument); - if (this.kBlacklist.test(arg)) throw await message.fetchLocale(LanguageKeys.Commands.Misc.RandRedditBanned); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Misc.RandRedditRequiredReddit); + if (!this.kUsernameRegex.test(arg)) throw await message.resolveKey(LanguageKeys.Commands.Misc.RandRedditInvalidArgument); + if (this.kBlacklist.test(arg)) throw await message.resolveKey(LanguageKeys.Commands.Misc.RandRedditBanned); return arg.toLowerCase(); }); } public async run(message: GuildMessage, [reddit]: [string]) { - const language = await message.fetchLanguage(); - const { kind, data } = await this.fetchData(language, reddit); + const t = await message.fetchT(); + const { kind, data } = await this.fetchData(t, reddit); if (!kind || !data || data.children.length === 0) { - throw language.get(LanguageKeys.Commands.Misc.RandRedditFail); + throw t(LanguageKeys.Commands.Misc.RandRedditFail); } const nsfwEnabled = message.guild !== null && (message.channel as TextChannel).nsfw; @@ -43,12 +44,12 @@ export default class extends SkyraCommand { : data.children.filter((child) => !child.data.over_18 && !this.kTitleBlacklist.test(child.data.title)); if (posts.length === 0) { - throw language.get(nsfwEnabled ? LanguageKeys.Commands.Misc.RandRedditAllNsfl : LanguageKeys.Commands.Misc.RandRedditAllNsfw); + throw t(nsfwEnabled ? LanguageKeys.Commands.Misc.RandRedditAllNsfl : LanguageKeys.Commands.Misc.RandRedditAllNsfw); } const post = posts[Math.floor(Math.random() * posts.length)].data; return message.send( - language.get(LanguageKeys.Commands.Misc.RandRedditMessage, { + t(LanguageKeys.Commands.Misc.RandRedditMessage, { title: post.title, author: post.author, url: post.spoiler ? `||${post.url}||` : post.url @@ -56,35 +57,35 @@ export default class extends SkyraCommand { ); } - private async fetchData(language: Language, reddit: string) { + private async fetchData(t: TFunction, reddit: string) { try { return await fetch>(`https://www.reddit.com/r/${reddit}/.json?limit=30`, FetchResultTypes.JSON); } catch (error) { - this.handleError(error, language); + this.handleError(error, t); } } - private handleError(error: FetchError, language: Language): never { + private handleError(error: FetchError, t: TFunction): never { let parsed: RedditError | undefined = undefined; try { parsed = error.toJSON() as RedditError; } catch { - throw language.get(LanguageKeys.System.ParseError); + throw t(LanguageKeys.System.ParseError); } switch (parsed.error) { case 403: { - if (parsed.reason === 'private') throw language.get(LanguageKeys.Commands.Misc.RandRedditErrorPrivate); - if (parsed.reason === 'quarantined') throw language.get(LanguageKeys.Commands.Misc.RandRedditErrorQuarantined); + if (parsed.reason === 'private') throw t(LanguageKeys.Commands.Misc.RandRedditErrorPrivate); + if (parsed.reason === 'quarantined') throw t(LanguageKeys.Commands.Misc.RandRedditErrorQuarantined); break; } case 404: { - if (!Reflect.has(parsed, 'reason')) throw language.get(LanguageKeys.Commands.Misc.RandRedditErrorNotFound); - if (Reflect.get(parsed, 'reason') === 'banned') throw language.get(LanguageKeys.Commands.Misc.RandRedditErrorBanned); + if (!Reflect.has(parsed, 'reason')) throw t(LanguageKeys.Commands.Misc.RandRedditErrorNotFound); + if (Reflect.get(parsed, 'reason') === 'banned') throw t(LanguageKeys.Commands.Misc.RandRedditErrorBanned); break; } case 500: { - throw language.get(LanguageKeys.System.ExternalServerError); + throw t(LanguageKeys.System.ExternalServerError); } } diff --git a/src/commands/Misc/reddituser.ts b/src/commands/Misc/reddituser.ts index a8dd2b2eff6..c74d320173c 100644 --- a/src/commands/Misc/reddituser.ts +++ b/src/commands/Misc/reddituser.ts @@ -7,42 +7,40 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText, roundNumber } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { Collection, MessageEmbed } from 'discord.js'; import { decode } from 'he'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['redditor'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Misc.RedditUserDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.RedditUserExtended), + description: LanguageKeys.Commands.Misc.RedditUserDescription, + extendedHelp: LanguageKeys.Commands.Misc.RedditUserExtended, usage: '' }) export default class extends RichDisplayCommand { - private joinedRedditTimestamp = new Timestamp('MMMM d YYYY'); private usernameRegex = /^(?:\/?u\/)?[A-Za-z0-9_-]*$/; public async init() { this.createCustomResolver('user', async (arg, _possible, message) => { - if (!this.usernameRegex.test(arg)) throw await message.fetchLocale(LanguageKeys.Commands.Misc.RedditUserInvalidUser, { user: arg }); + if (!this.usernameRegex.test(arg)) throw await message.resolveKey(LanguageKeys.Commands.Misc.RedditUserInvalidUser, { user: arg }); arg = arg.replace(/^\/?u\//, ''); return arg; }); } public async run(message: GuildMessage, [user]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const [about, comments, posts] = await this.fetchData(user, language); - if (!about || !comments || !posts || !comments.length || !posts.length) throw language.get(LanguageKeys.Commands.Misc.RedditUserQueryFailed); + const [about, comments, posts] = await this.fetchData(user, t); + if (!about || !comments || !posts || !comments.length || !posts.length) throw t(LanguageKeys.Commands.Misc.RedditUserQueryFailed); comments.sort((a, b) => b.score - a.score); - const display = await this.buildDisplay(message, about, comments, posts, language); + const display = await this.buildDisplay(message, about, comments, posts, t); await display.start(response, message.author.id); return response; } @@ -52,17 +50,17 @@ export default class extends RichDisplayCommand { about: Reddit.AboutDataElement, comments: Reddit.CommentDataElement[], posts: Reddit.PostDataElement[], - language: Language + t: TFunction ) { - const titles = language.get(LanguageKeys.Commands.Misc.RedditUserTitles); - const fieldsData = language.get(LanguageKeys.Commands.Misc.RedditUserData, { + const titles = t(LanguageKeys.Commands.Misc.RedditUserTitles); + const fieldsData = t(LanguageKeys.Commands.Misc.RedditUserData, { user: about.name, - timestamp: this.joinedRedditTimestamp.displayUTC(about.created * 1000) + timestamp: about.created * 1000 }); const [bestComment] = comments; const worstComment = comments[comments.length - 1]; const complexity = roundNumber(this.calculateTextComplexity(comments), 2); - const complexityLevels = language.get(LanguageKeys.Commands.Misc.RedditUserComplexityLevels); + const complexityLevels = t(LanguageKeys.Commands.Misc.RedditUserComplexityLevels); return new UserRichDisplay( new MessageEmbed() @@ -93,7 +91,7 @@ export default class extends RichDisplayCommand { cutText( [ `/r/${bestComment.subreddit} ❯ **${bestComment.score}**`, - `${language.duration(Date.now() - bestComment.created * 1000, 3)} ago`, + `${t(LanguageKeys.Globals.DurationValue, { value: Date.now() - bestComment.created * 1000 })} ago`, `[${fieldsData.permalink}](https://reddit.com${bestComment.permalink})`, decode(bestComment.body) ].join('\n'), @@ -105,7 +103,7 @@ export default class extends RichDisplayCommand { cutText( [ `/r/${worstComment.subreddit} ❯ **${worstComment.score}**`, - `${language.duration(Date.now() - worstComment.created * 1000, 3)} ago`, + `${t(LanguageKeys.Globals.DurationValue, { value: Date.now() - worstComment.created * 1000 })} ago`, `[${fieldsData.permalink}](https://reddit.com${worstComment.permalink})`, decode(worstComment.body) ].join('\n'), @@ -116,13 +114,13 @@ export default class extends RichDisplayCommand { .setFooterSuffix(` • ${fieldsData.dataAvailableFor}`); } - private async fetchData(user: string, language: Language) { - return Promise.all([this.fetchAbout(user, language), this.fetchComments(user, language), this.fetchPosts(user, language)]); + private async fetchData(user: string, t: TFunction) { + return Promise.all([this.fetchAbout(user, t), this.fetchComments(user, t), this.fetchPosts(user, t)]); } - private async fetchAbout(user: string, language: Language) { + private async fetchAbout(user: string, t: TFunction) { const { data } = await fetch>(`https://www.reddit.com/user/${user}/about/.json`, FetchResultTypes.JSON).catch(() => { - throw language.get(LanguageKeys.Commands.Misc.RedditUserQueryFailed); + throw t(LanguageKeys.Commands.Misc.RedditUserQueryFailed); }); return data; } @@ -135,20 +133,20 @@ export default class extends RichDisplayCommand { * @param after Recursive parameter, determines after which comment to start fetching * @param dataElements Recursive parameter, the previously fetched comments to retain a total */ - private async fetchComments(user: string, language: Language, after = '', dataElements: Reddit.CommentDataElement[] = []) { + private async fetchComments(user: string, t: TFunction, after = '', dataElements: Reddit.CommentDataElement[] = []) { const url = new URL(`https://www.reddit.com/user/${user}/comments.json`); url.searchParams.append('after', after); url.searchParams.append('limit', '100'); const { data } = await fetch>(url, FetchResultTypes.JSON).catch(() => { - throw language.get(LanguageKeys.Commands.Misc.RedditUserQueryFailed); + throw t(LanguageKeys.Commands.Misc.RedditUserQueryFailed); }); for (const child of data.children) { dataElements.push(child.data); } - if (data.children.length === 100) await this.fetchComments(user, language, data.children[99].data.name, dataElements); + if (data.children.length === 100) await this.fetchComments(user, t, data.children[99].data.name, dataElements); return dataElements; } @@ -161,20 +159,20 @@ export default class extends RichDisplayCommand { * @param after Recursive parameter, determines after which post to start fetching * @param dataElements Recursive parameter, the previously fetched posts to retain a total */ - private async fetchPosts(user: string, language: Language, after = '', dataElements: Reddit.PostDataElement[] = []) { + private async fetchPosts(user: string, t: TFunction, after = '', dataElements: Reddit.PostDataElement[] = []) { const url = new URL(`https://www.reddit.com/user/${user}/submitted.json`); url.searchParams.append('after', after); url.searchParams.append('limit', '100'); const { data } = await fetch>(url, FetchResultTypes.JSON).catch(() => { - throw language.get(LanguageKeys.Commands.Misc.RedditUserQueryFailed); + throw t(LanguageKeys.Commands.Misc.RedditUserQueryFailed); }); for (const child of data.children) { dataElements.push(child.data); } - if (data.children.length === 100) await this.fetchPosts(user, language, data.children[99].data.name, dataElements); + if (data.children.length === 100) await this.fetchPosts(user, t, data.children[99].data.name, dataElements); return dataElements; } diff --git a/src/commands/Misc/ship.ts b/src/commands/Misc/ship.ts index 69254c2e38e..bcee32ea806 100644 --- a/src/commands/Misc/ship.ts +++ b/src/commands/Misc/ship.ts @@ -13,8 +13,8 @@ import { join } from 'path'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Misc.ShipDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.ShipExtended), + description: LanguageKeys.Commands.Misc.ShipDescription, + extendedHelp: LanguageKeys.Commands.Misc.ShipExtended, requiredPermissions: ['ATTACH_FILES'], usage: '(firstUser:user) (secondUser:user)', usageDelim: ' ' @@ -67,7 +67,8 @@ export default class extends SkyraCommand { .toBufferAsync(); // Return the lovely message - const data = await message.fetchLocale(LanguageKeys.Commands.Misc.ShipData, { + const t = await message.fetchT(); + const data = t(LanguageKeys.Commands.Misc.ShipData, { romeoUsername: firstUser.username, julietUsername: secondUser.username, shipName: this.getShipName([...firstUser.username], [...secondUser.username]) diff --git a/src/commands/Misc/slap.ts b/src/commands/Misc/slap.ts index 09384089631..ff6f124096a 100644 --- a/src/commands/Misc/slap.ts +++ b/src/commands/Misc/slap.ts @@ -13,8 +13,8 @@ import { join } from 'path'; @ApplyOptions({ bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.SlapDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.SlapExtended), + description: LanguageKeys.Commands.Misc.SlapDescription, + extendedHelp: LanguageKeys.Commands.Misc.SlapExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/snipe.ts b/src/commands/Misc/snipe.ts index 45a8db07de2..a3e957bd570 100644 --- a/src/commands/Misc/snipe.ts +++ b/src/commands/Misc/snipe.ts @@ -10,8 +10,8 @@ export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { aliases: ['sniped'], - description: (language) => language.get(LanguageKeys.Commands.Misc.SnipeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.SnipeExtended), + description: LanguageKeys.Commands.Misc.SnipeDescription, + extendedHelp: LanguageKeys.Commands.Misc.SnipeExtended, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'] }); @@ -19,10 +19,10 @@ export default class extends SkyraCommand { public async run(message: GuildMessage) { const { sniped } = message.channel as TextChannel; - if (sniped === null) throw await message.fetchLocale(LanguageKeys.Commands.Misc.SnipeEmpty); + if (sniped === null) throw await message.resolveKey(LanguageKeys.Commands.Misc.SnipeEmpty); const embed = new MessageEmbed() - .setTitle(await message.fetchLocale(LanguageKeys.Commands.Misc.SnipeTitle)) + .setTitle(await message.resolveKey(LanguageKeys.Commands.Misc.SnipeTitle)) .setColor(await DbSet.fetchColor(sniped)) .setAuthor(sniped.author.username, sniped.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setTimestamp(sniped.createdTimestamp); diff --git a/src/commands/Misc/thesearch.ts b/src/commands/Misc/thesearch.ts index 8fc89769a42..bb459da8677 100644 --- a/src/commands/Misc/thesearch.ts +++ b/src/commands/Misc/thesearch.ts @@ -13,8 +13,8 @@ export default class extends SkyraCommand { super(store, file, directory, { bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.ThesearchDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.ThesearchExtended), + description: LanguageKeys.Commands.Misc.TheSearchDescription, + extendedHelp: LanguageKeys.Commands.Misc.TheSearchExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '' diff --git a/src/commands/Misc/triggered.ts b/src/commands/Misc/triggered.ts index 996d56f86c0..3a6438f0ca0 100644 --- a/src/commands/Misc/triggered.ts +++ b/src/commands/Misc/triggered.ts @@ -23,8 +23,8 @@ export default class extends SkyraCommand { super(store, file, directory, { bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Misc.TriggeredDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.TriggeredExtended), + description: LanguageKeys.Commands.Misc.TriggeredDescription, + extendedHelp: LanguageKeys.Commands.Misc.TriggeredExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '[user:username]' diff --git a/src/commands/Misc/upvote.ts b/src/commands/Misc/upvote.ts index 75f12b4d154..ab84b5cf448 100644 --- a/src/commands/Misc/upvote.ts +++ b/src/commands/Misc/upvote.ts @@ -6,12 +6,12 @@ export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { aliases: ['updoot'], - description: (language) => language.get(LanguageKeys.Commands.Misc.UpvoteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.UpvoteExtended) + description: LanguageKeys.Commands.Misc.UpvoteDescription, + extendedHelp: LanguageKeys.Commands.Misc.UpvoteExtended }); } public run(message: KlasaMessage) { - return message.sendLocale(LanguageKeys.Commands.Misc.UpvoteMessage); + return message.sendTranslated(LanguageKeys.Commands.Misc.UpvoteMessage); } } diff --git a/src/commands/Misc/vaporwave.ts b/src/commands/Misc/vaporwave.ts index e1536ead528..a6d775d7e0f 100644 --- a/src/commands/Misc/vaporwave.ts +++ b/src/commands/Misc/vaporwave.ts @@ -6,8 +6,8 @@ export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Misc.VaporwaveDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Misc.VaporwaveExtended), + description: LanguageKeys.Commands.Misc.VaporwaveDescription, + extendedHelp: LanguageKeys.Commands.Misc.VaporwaveExtended, spam: true, usage: '' }); @@ -16,6 +16,6 @@ export default class extends SkyraCommand { public async run(message: KlasaMessage, [input]: [string]) { let output = ''; for (let i = 0; i < input.length; i++) output += input[i] === ' ' ? ' ' : String.fromCharCode(input.charCodeAt(i) + 0xfee0); - return message.sendLocale(LanguageKeys.Commands.Misc.VaporwaveOutput, [{ str: output }]); + return message.sendTranslated(LanguageKeys.Commands.Misc.VaporwaveOutput, [{ str: output }]); } } diff --git a/src/commands/Moderation/Management/history.ts b/src/commands/Moderation/Management/history.ts index 72c275964ba..7e6f3026c14 100644 --- a/src/commands/Moderation/Management/history.ts +++ b/src/commands/Moderation/Management/history.ts @@ -17,8 +17,8 @@ type DurationDisplay = (time: number) => string; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.HistoryDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.HistoryExtended), + description: LanguageKeys.Commands.Moderation.HistoryDescription, + extendedHelp: LanguageKeys.Commands.Moderation.HistoryExtended, permissionLevel: PermissionLevels.Moderator, runIn: ['text'], usage: ' [user:username]', @@ -37,7 +37,7 @@ export default class extends SkyraCommand { if (log.invalidated || log.appealType) continue; switch (log.typeVariation) { case Moderation.TypeVariation.Ban: - case Moderation.TypeVariation.Softban: + case Moderation.TypeVariation.SoftBan: ++bans; break; case Moderation.TypeVariation.Mute: @@ -52,34 +52,22 @@ export default class extends SkyraCommand { } const index = Math.min(COLORS.length - 1, warnings + mutes + kicks + bans); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); return message.send( new MessageEmbed() .setColor(COLORS[index]) .setAuthor(target.username, target.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setFooter( - language.get(LanguageKeys.Commands.Moderation.HistoryFooterNew, { + t(LanguageKeys.Commands.Moderation.HistoryFooterNew, { warnings, mutes, kicks, bans, - warningsText: - warnings === 1 - ? language.get(LanguageKeys.Commands.Moderation.HistoryFooterWarning, { count: warnings }) - : language.get(LanguageKeys.Commands.Moderation.HistoryFooterWarningPlural, { count: warnings }), - mutesText: - mutes === 1 - ? language.get(LanguageKeys.Commands.Moderation.HistoryFooterMutes, { count: mutes }) - : language.get(LanguageKeys.Commands.Moderation.HistoryFooterMutesPlural, { count: mutes }), - kicksText: - kicks === 1 - ? language.get(LanguageKeys.Commands.Moderation.HistoryFooterKicks, { count: kicks }) - : language.get(LanguageKeys.Commands.Moderation.HistoryFooterKicksPlural, { count: kicks }), - bansText: - bans === 1 - ? language.get(LanguageKeys.Commands.Moderation.HistoryFooterBans, { count: bans }) - : language.get(LanguageKeys.Commands.Moderation.HistoryFooterBansPlural, { count: bans }) + warningsText: t(LanguageKeys.Commands.Moderation.HistoryFooterWarning, { count: warnings }), + mutesText: t(LanguageKeys.Commands.Moderation.HistoryFooterMutes, { count: mutes }), + kicksText: t(LanguageKeys.Commands.Moderation.HistoryFooterKicks, { count: kicks }), + bansText: t(LanguageKeys.Commands.Moderation.HistoryFooterBans, { count: bans }) }) ) ); @@ -87,33 +75,26 @@ export default class extends SkyraCommand { @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async details(message: GuildMessage, [target = message.author]: [User]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const entries = (await message.guild.moderation.fetch(target.id)).filter((log) => !log.invalidated && !log.appealType); - if (!entries.size) throw language.get(LanguageKeys.Commands.Moderation.ModerationsEmpty); + if (!entries.size) throw t(LanguageKeys.Commands.Moderation.ModerationsEmpty); const display = new UserRichDisplay( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setAuthor(this.client.user!.username, this.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setTitle( - language.get( - entries.size === 1 - ? LanguageKeys.Commands.Moderation.ModerationsAmount - : LanguageKeys.Commands.Moderation.ModerationsAmountPlural, - { count: entries.size } - ) - ) + .setTitle(t(LanguageKeys.Commands.Moderation.ModerationsAmount, { count: entries.size })) ); // Fetch usernames const usernames = await this.fetchAllModerators(entries); // Set up the formatter - const durationDisplay = language.duration.bind(language); + const durationDisplay = (value: number) => t(LanguageKeys.Globals.DurationValue, { value }); for (const page of chunk([...entries.values()], 10)) { display.addPage((template: MessageEmbed) => { diff --git a/src/commands/Moderation/Management/moderations.ts b/src/commands/Moderation/Management/moderations.ts index 1d3f0fd9eaf..c2d001bfe72 100644 --- a/src/commands/Moderation/Management/moderations.ts +++ b/src/commands/Moderation/Management/moderations.ts @@ -15,43 +15,36 @@ import { MessageEmbed, User } from 'discord.js'; aliases: ['moderation'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.ModerationsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.ModerationsExtended), + description: LanguageKeys.Commands.Moderation.ModerationsDescription, + extendedHelp: LanguageKeys.Commands.Moderation.ModerationsExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['MANAGE_MESSAGES'], usage: ' [user:username]' }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [action, target]: ['mutes' | 'warnings' | 'warns' | 'all', User?]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const entries = (await (target ? message.guild.moderation.fetch(target.id) : message.guild.moderation.fetch())).filter( this.getFilter(action, target) ); - if (!entries.size) throw language.get(LanguageKeys.Commands.Moderation.ModerationsEmpty); + if (!entries.size) throw t(LanguageKeys.Commands.Moderation.ModerationsEmpty); const display = new UserRichDisplay( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setAuthor(this.client.user!.username, this.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setTitle( - language.get( - entries.size === 1 - ? LanguageKeys.Commands.Moderation.ModerationsAmount - : LanguageKeys.Commands.Moderation.ModerationsAmountPlural, - { count: entries.size } - ) - ) + .setTitle(t(LanguageKeys.Commands.Moderation.ModerationsAmount, { count: entries.size })) ); // Fetch usernames const usernames = await (target ? this.fetchAllModerators(entries) : this.fetchAllUsers(entries)); // Set up the formatter - const durationDisplay = language.duration.bind(language); + const durationDisplay = (value: number) => t(LanguageKeys.Globals.DurationValue, { value }); const displayName = action === 'all'; const format = target ? this.displayModerationLogFromModerators.bind(this, usernames, durationDisplay, displayName) diff --git a/src/commands/Moderation/Management/mutes.ts b/src/commands/Moderation/Management/mutes.ts index b869c41d319..d5c463c72f0 100644 --- a/src/commands/Moderation/Management/mutes.ts +++ b/src/commands/Moderation/Management/mutes.ts @@ -10,8 +10,8 @@ import type Moderations from './moderations'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.MutesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.MutesExtended), + description: LanguageKeys.Commands.Moderation.MutesDescription, + extendedHelp: LanguageKeys.Commands.Moderation.MutesExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['EMBED_LINKS', 'MANAGE_MESSAGES'], runIn: ['text'], diff --git a/src/commands/Moderation/Management/warnings.ts b/src/commands/Moderation/Management/warnings.ts index 4e72dfa581d..fd76a4adc38 100644 --- a/src/commands/Moderation/Management/warnings.ts +++ b/src/commands/Moderation/Management/warnings.ts @@ -10,8 +10,8 @@ import type Moderations from './moderations'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.WarningsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.WarningsExtended), + description: LanguageKeys.Commands.Moderation.WarningsDescription, + extendedHelp: LanguageKeys.Commands.Moderation.WarningsExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['EMBED_LINKS', 'MANAGE_MESSAGES'], runIn: ['text'], diff --git a/src/commands/Moderation/Restriction/restrictAttachment.ts b/src/commands/Moderation/Restriction/restrictAttachment.ts index 6ddd1f13d6f..7c11f40e61b 100644 --- a/src/commands/Moderation/Restriction/restrictAttachment.ts +++ b/src/commands/Moderation/Restriction/restrictAttachment.ts @@ -11,8 +11,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['restricted-attachment', 'ra'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictAttachmentDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictAttachmentExtended), + description: LanguageKeys.Commands.Moderation.RestrictAttachmentDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RestrictAttachmentExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,28 +24,25 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Roles.RestrictedAttachment], - settings.getLanguage() - ]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.RestrictedAttachment], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) { - throw language.get(LanguageKeys.Commands.Moderation.RestrictLowlevel); + throw t(LanguageKeys.Commands.Moderation.RestrictLowlevel); } - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.RestrictedAttachment, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.restrictionSetup(message, ModerationSetupRestriction.Attachment); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/Restriction/restrictEmbed.ts b/src/commands/Moderation/Restriction/restrictEmbed.ts index 8910da68f1a..8f9684024da 100644 --- a/src/commands/Moderation/Restriction/restrictEmbed.ts +++ b/src/commands/Moderation/Restriction/restrictEmbed.ts @@ -11,8 +11,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['restricted-embed', 're'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictEmbedDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictEmbedExtended), + description: LanguageKeys.Commands.Moderation.RestrictEmbedDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RestrictEmbedExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,26 +24,23 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Roles.RestrictedEmbed], - settings.getLanguage() - ]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.RestrictedEmbed], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) - throw language.get(LanguageKeys.Commands.Moderation.RestrictLowlevel); - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + throw t(LanguageKeys.Commands.Moderation.RestrictLowlevel); + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.RestrictedEmbed, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.restrictionSetup(message, ModerationSetupRestriction.Embed); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/Restriction/restrictEmoji.ts b/src/commands/Moderation/Restriction/restrictEmoji.ts index bcb1906115b..b4c88a3e6d4 100644 --- a/src/commands/Moderation/Restriction/restrictEmoji.ts +++ b/src/commands/Moderation/Restriction/restrictEmoji.ts @@ -11,8 +11,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['restrict-external-emoji', 'restricted-emoji', 'restricted-external-emoji', 'ree', 'restrict-emojis'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictEmojiDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictEmojiExtended), + description: LanguageKeys.Commands.Moderation.RestrictEmojiDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RestrictEmojiExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,26 +24,23 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Roles.RestrictedEmoji], - settings.getLanguage() - ]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.RestrictedEmoji], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) - throw language.get(LanguageKeys.Commands.Moderation.RestrictLowlevel); - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + throw t(LanguageKeys.Commands.Moderation.RestrictLowlevel); + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.kRolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.RestrictedEmoji, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.restrictionSetup(message, ModerationSetupRestriction.Emoji); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/Restriction/restrictReaction.ts b/src/commands/Moderation/Restriction/restrictReaction.ts index 214c03e4389..926a7f2ee18 100644 --- a/src/commands/Moderation/Restriction/restrictReaction.ts +++ b/src/commands/Moderation/Restriction/restrictReaction.ts @@ -11,8 +11,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['restricted-reaction', 'rr'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictReactionDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictReactionExtended), + description: LanguageKeys.Commands.Moderation.RestrictReactionDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RestrictReactionExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,26 +24,23 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Roles.RestrictedReaction], - settings.getLanguage() - ]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.RestrictedReaction], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) - throw language.get(LanguageKeys.Commands.Moderation.RestrictLowlevel); - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + throw t(LanguageKeys.Commands.Moderation.RestrictLowlevel); + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.RestrictedReaction, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.restrictionSetup(message, ModerationSetupRestriction.Reaction); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/Restriction/restrictVoice.ts b/src/commands/Moderation/Restriction/restrictVoice.ts index 99153be1310..89b6addd688 100644 --- a/src/commands/Moderation/Restriction/restrictVoice.ts +++ b/src/commands/Moderation/Restriction/restrictVoice.ts @@ -11,8 +11,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['restricted-voice', 'rv'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictVoiceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RestrictVoiceExtended), + description: LanguageKeys.Commands.Moderation.RestrictVoiceDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RestrictVoiceExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,26 +24,23 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Roles.RestrictedVoice], - settings.getLanguage() - ]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.RestrictedVoice], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) - throw language.get(LanguageKeys.Commands.Moderation.RestrictLowlevel); - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + throw t(LanguageKeys.Commands.Moderation.RestrictLowlevel); + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.RestrictedVoice, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.restrictionSetup(message, ModerationSetupRestriction.Voice); - await message.sendLocale(LanguageKeys.Misc.CommandSuccess); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.sendLocale(LanguageKeys.Monitors.CommandHandlerAborted); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/Restriction/unrestrictAttachment.ts b/src/commands/Moderation/Restriction/unrestrictAttachment.ts index 851d697197a..feba4468157 100644 --- a/src/commands/Moderation/Restriction/unrestrictAttachment.ts +++ b/src/commands/Moderation/Restriction/unrestrictAttachment.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['un-restricted-attachment', 'ura'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictAttachmentDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictAttachmentExtended), + description: LanguageKeys.Commands.Moderation.UnrestrictAttachmentDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnrestrictAttachmentExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -17,14 +17,14 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, prefix, language] = await message.guild.readSettings((settings) => [ + const [id, prefix, t] = await message.guild.readSettings((settings) => [ settings[this.kPath], settings[GuildSettings.Prefix], settings.getLanguage() ]); if (id && message.guild.roles.cache.has(id)) return false; - throw language.get(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw t(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix, path: this.kPath }); diff --git a/src/commands/Moderation/Restriction/unrestrictEmbed.ts b/src/commands/Moderation/Restriction/unrestrictEmbed.ts index 838b87e3138..145058eeb11 100644 --- a/src/commands/Moderation/Restriction/unrestrictEmbed.ts +++ b/src/commands/Moderation/Restriction/unrestrictEmbed.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['un-restricted-embed', 'ure'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictEmbedDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictEmbedExtended), + description: LanguageKeys.Commands.Moderation.UnrestrictEmbedDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnrestrictEmbedExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -17,14 +17,14 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, prefix, language] = await message.guild.readSettings((settings) => [ + const [id, prefix, t] = await message.guild.readSettings((settings) => [ settings[this.kPath], settings[GuildSettings.Prefix], settings.getLanguage() ]); if (id && message.guild.roles.cache.has(id)) return false; - throw language.get(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw t(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix, path: this.kPath }); diff --git a/src/commands/Moderation/Restriction/unrestrictEmoji.ts b/src/commands/Moderation/Restriction/unrestrictEmoji.ts index 5db0068d387..7d5d1b26098 100644 --- a/src/commands/Moderation/Restriction/unrestrictEmoji.ts +++ b/src/commands/Moderation/Restriction/unrestrictEmoji.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['un-restrict-external-emoji', 'unrestricted-emoji', 'unrestricted-external-emoji', 'uree', 'unrestrict-emojis'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictEmojiDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictEmojiExtended), + description: LanguageKeys.Commands.Moderation.UnrestrictEmojiDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnrestrictEmojiExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -17,7 +17,7 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, prefix, language] = await message.guild.readSettings((settings) => [ + const [id, prefix, t] = await message.guild.readSettings((settings) => [ settings[this.kPath], settings[GuildSettings.Prefix], settings.getLanguage() @@ -25,7 +25,7 @@ export default class extends ModerationCommand { if (id && message.guild.roles.cache.has(id)) return false; - throw language.get(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw t(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix, path: this.kPath }); diff --git a/src/commands/Moderation/Restriction/unrestrictReaction.ts b/src/commands/Moderation/Restriction/unrestrictReaction.ts index 617ad72421c..c794fea4088 100644 --- a/src/commands/Moderation/Restriction/unrestrictReaction.ts +++ b/src/commands/Moderation/Restriction/unrestrictReaction.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['un-restricted-reaction', 'urr'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictReactionDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictReactionExtended), + description: LanguageKeys.Commands.Moderation.UnrestrictReactionDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnrestrictReactionExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -17,14 +17,14 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, prefix, language] = await message.guild.readSettings((settings) => [ + const [id, prefix, t] = await message.guild.readSettings((settings) => [ settings[this.kPath], settings[GuildSettings.Prefix], settings.getLanguage() ]); if (id && message.guild.roles.cache.has(id)) return false; - throw language.get(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw t(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix, path: this.kPath }); diff --git a/src/commands/Moderation/Restriction/unrestrictVoice.ts b/src/commands/Moderation/Restriction/unrestrictVoice.ts index 43d9ee4ef3f..7f573879f52 100644 --- a/src/commands/Moderation/Restriction/unrestrictVoice.ts +++ b/src/commands/Moderation/Restriction/unrestrictVoice.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['un-restricted-voice', 'urv'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictVoiceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnrestrictVoiceExtended), + description: LanguageKeys.Commands.Moderation.UnrestrictVoiceDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnrestrictVoiceExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -17,7 +17,7 @@ export default class extends ModerationCommand { public async inhibit(message: GuildMessage) { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, prefix, language] = await message.guild.readSettings((settings) => [ + const [id, prefix, t] = await message.guild.readSettings((settings) => [ settings[this.kPath], settings[GuildSettings.Prefix], settings.getLanguage() @@ -25,7 +25,7 @@ export default class extends ModerationCommand { if (id && message.guild.roles.cache.has(id)) return false; - throw language.get(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw t(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix, path: this.kPath }); diff --git a/src/commands/Moderation/Utilities/case.ts b/src/commands/Moderation/Utilities/case.ts index a32db2be5a0..d31ede14ebf 100644 --- a/src/commands/Moderation/Utilities/case.ts +++ b/src/commands/Moderation/Utilities/case.ts @@ -1,25 +1,22 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { CommandStore } from 'klasa'; +import { ApplyOptions } from '@skyra/decorators'; +@ApplyOptions({ + cooldown: 5, + description: LanguageKeys.Commands.Moderation.CaseDescription, + extendedHelp: LanguageKeys.Commands.Moderation.CaseExtended, + permissionLevel: PermissionLevels.Moderator, + requiredPermissions: ['EMBED_LINKS'], + runIn: ['text'], + usage: '' +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Moderation.CaseDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.CaseExtended), - permissionLevel: PermissionLevels.Moderator, - requiredPermissions: ['EMBED_LINKS'], - runIn: ['text'], - usage: '' - }); - } - public async run(message: GuildMessage, [index]: [number | 'latest']) { const modlog = index === 'latest' ? (await message.guild.moderation.fetch()).last() : await message.guild.moderation.fetch(index); if (modlog) return message.send(await modlog.prepareEmbed()); - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.ReasonNotExists); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.ReasonNotExists); } } diff --git a/src/commands/Moderation/Utilities/flow.ts b/src/commands/Moderation/Utilities/flow.ts index e16d9ccdd30..33c21f55e1f 100644 --- a/src/commands/Moderation/Utilities/flow.ts +++ b/src/commands/Moderation/Utilities/flow.ts @@ -8,19 +8,21 @@ import { TextChannel } from 'discord.js'; @ApplyOptions({ bucket: 2, cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Moderation.FlowDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.FlowExtended), + description: LanguageKeys.Commands.Moderation.FlowDescription, + extendedHelp: LanguageKeys.Commands.Moderation.FlowExtended, permissionLevel: PermissionLevels.Moderator, runIn: ['text'], usage: '[channel:textchannelname]' }) export default class extends SkyraCommand { public async run(message: GuildMessage, [channel = message.channel as TextChannel]: [TextChannel?]) { - if (!channel.readable) throw await message.fetchLocale(LanguageKeys.Misc.ChannelNotReadable); + const t = await message.fetchT(); + + if (!channel.readable) throw t(LanguageKeys.Misc.ChannelNotReadable); const messages = await channel.messages.fetch({ limit: 100, before: message.id }); const minimum = message.createdTimestamp - 60000; const amount = messages.reduce((prev, curr) => (curr.createdTimestamp > minimum ? prev + 1 : prev), 0); - return message.sendLocale(LanguageKeys.Commands.Moderation.Flow, [{ amount }]); + return message.send(t(LanguageKeys.Commands.Moderation.Flow, { amount })); } } diff --git a/src/commands/Moderation/Utilities/permissions.ts b/src/commands/Moderation/Utilities/permissions.ts index 23ca5008508..64b6bfd02e8 100644 --- a/src/commands/Moderation/Utilities/permissions.ts +++ b/src/commands/Moderation/Utilities/permissions.ts @@ -12,8 +12,8 @@ const PERMISSION_FLAGS = Object.keys(Permissions.FLAGS) as PermissionString[]; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.PermissionsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.PermissionsExtended), + description: LanguageKeys.Commands.Moderation.PermissionsDescription, + extendedHelp: LanguageKeys.Commands.Moderation.PermissionsExtended, permissionLevel: PermissionLevels.Administrator, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], @@ -21,28 +21,28 @@ const PERMISSION_FLAGS = Object.keys(Permissions.FLAGS) as PermissionString[]; }) export default class extends SkyraCommand { public async run(message: GuildMessage, [user = message.author]: [User]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - if (!user) throw language.get(LanguageKeys.Misc.UserNotExistent); + if (!user) throw t(LanguageKeys.Misc.UserNotExistent); const member = await message.guild.members.fetch(user.id).catch(() => { - throw language.get(LanguageKeys.Misc.UserNotInGuild); + throw t(LanguageKeys.Misc.UserNotInGuild); }); const { permissions } = member; const list = [ZeroWidthSpace]; if (permissions.has(Permissions.FLAGS.ADMINISTRATOR)) { - list.push(language.get(LanguageKeys.Commands.Moderation.PermissionsAll)); + list.push(t(LanguageKeys.Commands.Moderation.PermissionsAll)); } else { for (const flag of PERMISSION_FLAGS) { - list.push(`${permissions.has(flag) ? '🔹' : '🔸'} ${language.PERMISSIONS[flag] || flag}`); + list.push(`${permissions.has(flag) ? '🔹' : '🔸'} ${t(`permissions:${flag}`, flag)}`); } } return message.send( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) - .setTitle(language.get(LanguageKeys.Commands.Moderation.Permissions, { username: user.tag, id: user.id })) + .setTitle(t(LanguageKeys.Commands.Moderation.Permissions, { username: user.tag, id: user.id })) .setDescription(list.join('\n')) ); } diff --git a/src/commands/Moderation/Utilities/reason.ts b/src/commands/Moderation/Utilities/reason.ts index 6d0c72b30fd..ecb8f797a8f 100644 --- a/src/commands/Moderation/Utilities/reason.ts +++ b/src/commands/Moderation/Utilities/reason.ts @@ -8,8 +8,8 @@ import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Moderation.ReasonDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.ReasonExtended), + description: LanguageKeys.Commands.Moderation.ReasonDescription, + extendedHelp: LanguageKeys.Commands.Moderation.ReasonExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], @@ -29,12 +29,7 @@ export default class extends SkyraCommand { public async run(message: GuildMessage, [cases, reason]: [number[], string]) { const entries = await message.guild.moderation.fetch(cases); if (!entries.size) { - throw await message.fetchLocale( - cases.length === 1 - ? LanguageKeys.Commands.Moderation.ModerationCaseNotExists - : LanguageKeys.Commands.Moderation.ModerationCaseNotExistsPlural, - { count: cases.length } - ); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.ModerationCaseNotExists, { count: cases.length }); } const imageURL = getImage(message); @@ -55,14 +50,11 @@ export default class extends SkyraCommand { return message.alert( ( - await message.fetchLocale( - cases.length === 1 ? LanguageKeys.Commands.Moderation.ReasonUpdated : LanguageKeys.Commands.Moderation.ReasonUpdatedPlural, - { - entries: cases, - newReason: reason, - count: cases.length - } - ) + await message.resolveKey(LanguageKeys.Commands.Moderation.ReasonUpdated, { + entries: cases, + newReason: reason, + count: cases.length + }) ).join('\n') ); } diff --git a/src/commands/Moderation/Utilities/slowmode.ts b/src/commands/Moderation/Utilities/slowmode.ts index 4a4175a8c59..7dfa689b132 100644 --- a/src/commands/Moderation/Utilities/slowmode.ts +++ b/src/commands/Moderation/Utilities/slowmode.ts @@ -13,8 +13,8 @@ const MAXIMUM_TIME = (Time.Hour * 6) / 1000; bucket: 2, cooldown: 5, cooldownLevel: 'channel', - description: (language) => language.get(LanguageKeys.Commands.Moderation.SlowmodeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.SlowmodeExtended), + description: LanguageKeys.Commands.Moderation.SlowmodeDescription, + extendedHelp: LanguageKeys.Commands.Moderation.SlowmodeExtended, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['MANAGE_CHANNELS'], runIn: ['text'], @@ -25,12 +25,14 @@ const MAXIMUM_TIME = (Time.Hour * 6) / 1000; ]) export default class extends SkyraCommand { public async run(message: GuildMessage, [cooldown]: ['reset' | 'off' | number]) { + const t = await message.fetchT(); + if (cooldown === 'reset' || cooldown === 'off' || cooldown < 0) cooldown = 0; - else if (cooldown > MAXIMUM_TIME) throw await message.fetchLocale(LanguageKeys.Commands.Moderation.SlowmodeTooLong); + else if (cooldown > MAXIMUM_TIME) throw t(LanguageKeys.Commands.Moderation.SlowmodeTooLong); const channel = message.channel as TextChannel; await channel.setRateLimitPerUser(cooldown); return cooldown === 0 - ? message.sendLocale(LanguageKeys.Commands.Moderation.SlowmodeReset) - : message.sendLocale(LanguageKeys.Commands.Moderation.SlowmodeSet, [{ cooldown: cooldown * 1000 }]); + ? message.send(t(LanguageKeys.Commands.Moderation.SlowmodeReset)) + : message.send(t(LanguageKeys.Commands.Moderation.SlowmodeSet, { cooldown: cooldown * 1000 })); } } diff --git a/src/commands/Moderation/Utilities/time.ts b/src/commands/Moderation/Utilities/time.ts index 07016898499..4113e8c882f 100644 --- a/src/commands/Moderation/Utilities/time.ts +++ b/src/commands/Moderation/Utilities/time.ts @@ -6,12 +6,12 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Moderation } from '#utils/constants'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { Permissions, User } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Moderation.TimeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.TimeExtended), + description: LanguageKeys.Commands.Moderation.TimeDescription, + extendedHelp: LanguageKeys.Commands.Moderation.TimeExtended, permissionLevel: PermissionLevels.Moderator, runIn: ['text'], usage: '[cancel] (timer:timer)', @@ -22,7 +22,7 @@ import { Language } from 'klasa'; 'timer', async (arg, possible, message, [cancel]) => { if (cancel === 'cancel') return null; - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Moderation.TimeUndefinedTime); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Moderation.TimeUndefinedTime); const restString = (await message.client.arguments.get('...string')!.run(arg, possible, message)) as string; return message.client.arguments.get('timespan')!.run(restString, possible, message); @@ -33,19 +33,19 @@ export default class extends SkyraCommand { public async run(message: GuildMessage, [cancel, caseID, duration]: ['cancel', number | 'latest', number | null]) { if (caseID === 'latest') caseID = await message.guild.moderation.count(); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const entry = await message.guild.moderation.fetch(caseID); - if (!entry) throw language.get(LanguageKeys.Commands.Moderation.ModerationCaseNotExists, { count: 1 }); - if (!cancel && entry.temporaryType) throw language.get(LanguageKeys.Commands.Moderation.TimeTimed); + if (!entry) throw t(LanguageKeys.Commands.Moderation.ModerationCaseNotExists, { count: 1 }); + if (!cancel && entry.temporaryType) throw t(LanguageKeys.Commands.Moderation.TimeTimed); const user = await entry.fetchUser(); - await this.validateAction(message, language, entry, user); + await this.validateAction(message, t, entry, user); const task = this.client.schedules.queue.find( (tk) => tk.data && tk.data[Moderation.SchemaKeys.Case] === entry.caseID && tk.data[Moderation.SchemaKeys.Guild] === entry.guild.id )!; if (cancel) { - if (!task) throw language.get(LanguageKeys.Commands.Moderation.TimeNotScheduled); + if (!task) throw t(LanguageKeys.Commands.Moderation.TimeNotScheduled); await message.guild.moderation.fetchChannelMessages(); await entry.edit({ @@ -53,15 +53,15 @@ export default class extends SkyraCommand { moderatorID: message.author.id }); - return message.send(language.get(LanguageKeys.Commands.Moderation.TimeAborted, { title: entry.title })); + return message.send(t(LanguageKeys.Commands.Moderation.TimeAborted, { title: entry.title })); } if (entry.appealType || entry.invalidated) { - throw language.get(LanguageKeys.Commands.Moderation.ModerationLogAppealed); + throw t(LanguageKeys.Commands.Moderation.ModerationLogAppealed); } if (task) { - throw language.get(LanguageKeys.Commands.Moderation.ModerationTimed, { + throw t(LanguageKeys.Commands.Moderation.ModerationTimed, { remaining: (task.data.timestamp as number) - Date.now() }); } @@ -71,23 +71,23 @@ export default class extends SkyraCommand { duration, moderatorID: message.author.id }); - return message.send(language.get(LanguageKeys.Commands.Moderation.TimeScheduled, { title: entry.title, user, time: duration! })); + return message.send(t(LanguageKeys.Commands.Moderation.TimeScheduled, { title: entry.title, user, time: duration! })); } - private async validateAction(message: GuildMessage, language: Language, modlog: ModerationEntity, user: User) { + private async validateAction(message: GuildMessage, t: TFunction, modlog: ModerationEntity, user: User) { switch (modlog.type) { case Moderation.TypeCodes.FastTemporaryBan: case Moderation.TypeCodes.TemporaryBan: case Moderation.TypeCodes.Ban: - return this.checkBan(message, language, user); + return this.checkBan(message, t, user); case Moderation.TypeCodes.FastTemporaryMute: case Moderation.TypeCodes.TemporaryMute: case Moderation.TypeCodes.Mute: - return this.checkMute(message, language, user); + return this.checkMute(message, t, user); case Moderation.TypeCodes.FastTemporaryVoiceMute: case Moderation.TypeCodes.TemporaryVoiceMute: case Moderation.TypeCodes.VoiceMute: - return this.checkVMute(message, language, user); + return this.checkVMute(message, t, user); case Moderation.TypeCodes.Warning: case Moderation.TypeCodes.FastTemporaryWarning: case Moderation.TypeCodes.TemporaryWarning: @@ -109,37 +109,37 @@ export default class extends SkyraCommand { case Moderation.TypeCodes.TemporaryRestrictionVoice: return; default: - throw language.get(LanguageKeys.Commands.Moderation.TimeUnsupportedType); + throw t(LanguageKeys.Commands.Moderation.TimeUnsupportedType); } } - private async checkBan(message: GuildMessage, language: Language, user: User) { + private async checkBan(message: GuildMessage, t: TFunction, user: User) { if (!message.guild.me!.permissions.has(Permissions.FLAGS.BAN_MEMBERS)) { - throw language.get(LanguageKeys.Commands.Moderation.UnbanMissingPermission); + throw t(LanguageKeys.Commands.Moderation.UnbanMissingPermission); } if (!(await message.guild.security.actions.userIsBanned(user))) { - throw language.get(LanguageKeys.Commands.Moderation.GuildBansNotFound); + throw t(LanguageKeys.Commands.Moderation.GuildBansNotFound); } } - private async checkMute(message: GuildMessage, language: Language, user: User) { + private async checkMute(message: GuildMessage, t: TFunction, user: User) { if (!message.guild.me!.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) { - throw language.get(LanguageKeys.Commands.Moderation.UnmuteMissingPermission); + throw t(LanguageKeys.Commands.Moderation.UnmuteMissingPermission); } if (!(await message.guild.security.actions.userIsMuted(user))) { - throw language.get(LanguageKeys.Commands.Moderation.MuteUserNotMuted); + throw t(LanguageKeys.Commands.Moderation.MuteUserNotMuted); } } - private async checkVMute(message: GuildMessage, language: Language, user: User) { + private async checkVMute(message: GuildMessage, t: TFunction, user: User) { if (!message.guild.me!.permissions.has(Permissions.FLAGS.MUTE_MEMBERS)) { - throw language.get(LanguageKeys.Commands.Moderation.VmuteMissingPermission); + throw t(LanguageKeys.Commands.Moderation.VmuteMissingPermission); } if (!(await message.guild.security.actions.userIsVoiceMuted(user))) { - throw language.get(LanguageKeys.Commands.Moderation.VmuteUserNotMuted); + throw t(LanguageKeys.Commands.Moderation.VmuteUserNotMuted); } } } diff --git a/src/commands/Moderation/addrole.ts b/src/commands/Moderation/addrole.ts index 74120ae99ac..b8b5d539671 100644 --- a/src/commands/Moderation/addrole.ts +++ b/src/commands/Moderation/addrole.ts @@ -9,8 +9,8 @@ import { Role, User } from 'discord.js'; @ApplyOptions({ aliases: ['ar'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.AddRoleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.AddRoleExtended), + description: LanguageKeys.Commands.Moderation.AddRoleDescription, + extendedHelp: LanguageKeys.Commands.Moderation.AddRoleExtended, requiredMember: true, optionalDuration: true, requiredGuildPermissions: ['MANAGE_ROLES'], diff --git a/src/commands/Moderation/ban.ts b/src/commands/Moderation/ban.ts index b82b8f3eeaa..8caa43b3146 100644 --- a/src/commands/Moderation/ban.ts +++ b/src/commands/Moderation/ban.ts @@ -9,8 +9,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['b'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.BanDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.BanExtended), + description: LanguageKeys.Commands.Moderation.BanDescription, + extendedHelp: LanguageKeys.Commands.Moderation.BanExtended, optionalDuration: true, requiredMember: false, requiredGuildPermissions: ['BAN_MEMBERS'] @@ -38,14 +38,14 @@ export default class extends ModerationCommand { if (preHandled) preHandled.unlock(); } - public async checkModeratable(...[message, language, context]: ArgumentTypes['checkModeratable']>) { - const member = await super.checkModeratable(message, language, context); - if (member && !member.bannable) throw language.get(LanguageKeys.Commands.Moderation.BanNotBannable); + public async checkModeratable(...[message, t, context]: ArgumentTypes['checkModeratable']>) { + const member = await super.checkModeratable(message, t, context); + if (member && !member.bannable) throw t(LanguageKeys.Commands.Moderation.BanNotBannable); return member; } private async getDays(message: GuildMessage) { - const regex = new RegExp(await message.fetchLocale(LanguageKeys.Commands.Moderation.ModerationDays), 'i'); + const regex = new RegExp(await message.resolveKey(LanguageKeys.Commands.Moderation.ModerationDays), 'i'); for (const [key, value] of Object.entries(message.flagArgs)) { if (regex.test(key)) { const parsed = Number(value); diff --git a/src/commands/Moderation/dehoist.ts b/src/commands/Moderation/dehoist.ts index 39db06686fc..02efefa1a30 100644 --- a/src/commands/Moderation/dehoist.ts +++ b/src/commands/Moderation/dehoist.ts @@ -8,15 +8,15 @@ import { pickRandom } from '#utils/util'; import { codeBlock } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { GuildMember, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const [kLowestNumberCode, kHighestNumberCode] = ['0'.charCodeAt(0), '9'.charCodeAt(0)]; @ApplyOptions({ aliases: ['dh'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Moderation.DehoistDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.DehoistExtended), + description: LanguageKeys.Commands.Moderation.DehoistDescription, + extendedHelp: LanguageKeys.Commands.Moderation.DehoistExtended, runIn: ['text'], permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['MANAGE_NICKNAMES', 'EMBED_LINKS'] @@ -25,12 +25,10 @@ export default class extends SkyraCommand { private kLowestCode = 'A'.charCodeAt(0); public async run(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (message.guild.members.cache.size !== message.guild.memberCount) { - await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) - ); + await message.send(new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)); await message.guild.members.fetch(); } @@ -41,7 +39,7 @@ export default class extends SkyraCommand { if (member.manageable && this.shouldDehoist(member)) hoistedMembers.push(member); } - const response = await message.send(language.get(LanguageKeys.Commands.Moderation.DehoistStarting, { count: hoistedMembers.length })); + const response = await message.send(t(LanguageKeys.Commands.Moderation.DehoistStarting, { count: hoistedMembers.length })); for (let i = 0; i < hoistedMembers.length; i++) { const member = hoistedMembers[i]; @@ -63,15 +61,13 @@ export default class extends SkyraCommand { // update the counter every 10 dehoists if ((i + 1) % 10 === 0) { const dehoistPercentage = (i / hoistedMembers.length) * 100; - await message.send( - language.get(LanguageKeys.Commands.Moderation.DehoistProgress, { count: i + 1, percentage: Math.round(dehoistPercentage) }) - ); + await message.send(t(LanguageKeys.Commands.Moderation.DehoistProgress, { count: i + 1, percentage: Math.round(dehoistPercentage) })); } } // We're done! return response.edit({ - embed: await this.prepareFinalEmbed(message, language, counter, errored), + embed: await this.prepareFinalEmbed(message, t, counter, errored), content: null }); } @@ -86,8 +82,8 @@ export default class extends SkyraCommand { return char < this.kLowestCode && (char < kLowestNumberCode || char > kHighestNumberCode); } - private async prepareFinalEmbed(message: GuildMessage, language: Language, dehoistedMembers: number, erroredChanges: ErroredChange[]) { - const embedLanguage = language.get(LanguageKeys.Commands.Moderation.DehoistEmbed, { + private async prepareFinalEmbed(message: GuildMessage, t: TFunction, dehoistedMembers: number, erroredChanges: ErroredChange[]) { + const embedLanguage = t(LanguageKeys.Commands.Moderation.DehoistEmbed, { dehoistedMemberCount: dehoistedMembers, dehoistedWithErrorsCount: dehoistedMembers - erroredChanges.length, errored: erroredChanges.length, diff --git a/src/commands/Moderation/kick.ts b/src/commands/Moderation/kick.ts index e1a62b9e990..33da8c2f276 100644 --- a/src/commands/Moderation/kick.ts +++ b/src/commands/Moderation/kick.ts @@ -8,8 +8,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['k'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.KickDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.KickExtended), + description: LanguageKeys.Commands.Moderation.KickDescription, + extendedHelp: LanguageKeys.Commands.Moderation.KickExtended, requiredGuildPermissions: ['KICK_MEMBERS'], requiredMember: true }) @@ -34,9 +34,9 @@ export default class extends ModerationCommand { if (preHandled) preHandled.unlock(); } - public async checkModeratable(...[message, language, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, language, context); - if (member && !member.kickable) throw language.get(LanguageKeys.Commands.Moderation.KickNotKickable); + public async checkModeratable(...[message, t, context]: ArgumentTypes) { + const member = await super.checkModeratable(message, t, context); + if (member && !member.kickable) throw t(LanguageKeys.Commands.Moderation.KickNotKickable); return member; } } diff --git a/src/commands/Moderation/lockdown.ts b/src/commands/Moderation/lockdown.ts index b25c33fd42a..4c67820939e 100644 --- a/src/commands/Moderation/lockdown.ts +++ b/src/commands/Moderation/lockdown.ts @@ -5,14 +5,14 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { PreciseTimeout } from '#utils/PreciseTimeout'; import { ApplyOptions } from '@skyra/decorators'; import { Permissions, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['lock', 'unlock'], cooldown: 5, subcommands: true, - description: (language) => language.get(LanguageKeys.Commands.Moderation.LockdownDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.LockdownExtended), + description: LanguageKeys.Commands.Moderation.LockdownDescription, + extendedHelp: LanguageKeys.Commands.Moderation.LockdownExtended, runIn: ['text'], usage: ' [target:textchannelname] [duration:timespan]', usageDelim: ' ', @@ -25,34 +25,34 @@ export default class extends SkyraCommand { } public async unlock(message: GuildMessage, [channel = message.channel as TextChannel]: [TextChannel]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const entry = message.guild.security.lockdowns.get(channel.id); if (typeof entry === 'undefined') { - throw language.get(LanguageKeys.Commands.Moderation.LockdownUnlocked, { channel: channel.toString() }); + throw t(LanguageKeys.Commands.Moderation.LockdownUnlocked, { channel: channel.toString() }); } - return entry.timeout ? entry.timeout.stop() : this._unlock(message, language, channel); + return entry.timeout ? entry.timeout.stop() : this._unlock(message, t, channel); } public async lock(message: GuildMessage, [channel = message.channel as TextChannel, duration]: [TextChannel, number?]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // If there was a lockdown, abort lock if (message.guild.security.lockdowns.has(channel.id)) { - throw language.get(LanguageKeys.Commands.Moderation.LockdownLocked, { channel: channel.toString() }); + throw t(LanguageKeys.Commands.Moderation.LockdownLocked, { channel: channel.toString() }); } // Get the role, then check if the user could send messages const role = message.guild.roles.cache.get(message.guild.id)!; const couldSend = channel.permissionsFor(role)?.has(Permissions.FLAGS.SEND_MESSAGES, false) ?? true; - if (!couldSend) throw language.get(LanguageKeys.Commands.Moderation.LockdownLocked, { channel: channel.toString() }); + if (!couldSend) throw t(LanguageKeys.Commands.Moderation.LockdownLocked, { channel: channel.toString() }); // If they can send, begin locking - const response = await message.sendLocale(LanguageKeys.Commands.Moderation.LockdownLocking, [{ channel: channel.toString() }]); + const response = await message.send(t(LanguageKeys.Commands.Moderation.LockdownLocking, { channel: channel.toString() })); await channel.updateOverwrite(role, { SEND_MESSAGES: false }); if (message.channel.postable) { - await response.edit(language.get(LanguageKeys.Commands.Moderation.LockdownLock, { channel: channel.toString() })).catch(() => null); + await response.edit(t(LanguageKeys.Commands.Moderation.LockdownLock, { channel: channel.toString() })).catch(() => null); } // Create the timeout @@ -62,13 +62,13 @@ export default class extends SkyraCommand { // Perform cleanup later if (timeout) { await timeout.run(); - await this._unlock(message, language, channel); + await this._unlock(message, t, channel); } } - private async _unlock(message: GuildMessage, language: Language, channel: TextChannel) { + private async _unlock(message: GuildMessage, t: TFunction, channel: TextChannel) { channel.guild.security.lockdowns.delete(channel.id); await channel.updateOverwrite(channel.guild.id, { SEND_MESSAGES: true }); - return message.send(language.get(LanguageKeys.Commands.Moderation.LockdownOpen, { channel: channel.toString() })); + return message.send(t(LanguageKeys.Commands.Moderation.LockdownOpen, { channel: channel.toString() })); } } diff --git a/src/commands/Moderation/mute.ts b/src/commands/Moderation/mute.ts index 38cac1686ac..5a58adac69a 100644 --- a/src/commands/Moderation/mute.ts +++ b/src/commands/Moderation/mute.ts @@ -10,8 +10,8 @@ import { Role } from 'discord.js'; @ApplyOptions({ aliases: ['m'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.MuteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.MuteExtended), + description: LanguageKeys.Commands.Moderation.MuteDescription, + extendedHelp: LanguageKeys.Commands.Moderation.MuteExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MANAGE_ROLES'] @@ -24,25 +24,25 @@ export default class extends ModerationCommand { // If the command run is not this one (potentially help command) or the guild is null, return with no error. if (message.command !== this || message.guild === null) return false; - const [id, language] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); + const [id, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); const role = (id && message.guild.roles.cache.get(id)) || null; if (!role) { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator))) { - throw language.get(LanguageKeys.Commands.Moderation.MuteLowlevel); + throw t(LanguageKeys.Commands.Moderation.MuteLowlevel); } - if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { + if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { const [role] = (await this.rolePrompt .createPrompt(message, { time: 30000, limit: 1 }) - .run(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; + .run(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName))) as [Role]; await message.guild.writeSettings([[GuildSettings.Roles.Muted, role.id]]); - } else if (await message.ask(language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { + } else if (await message.ask(t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { await message.guild.security.actions.muteSetup(message); - await message.send(language.get(LanguageKeys.Misc.CommandSuccess)); + await message.send(t(LanguageKeys.Commands.Moderation.Success)); } else { - await message.send(language.get(LanguageKeys.Monitors.CommandHandlerAborted)); + await message.send(t(LanguageKeys.Monitors.CommandHandlerAborted)); } } diff --git a/src/commands/Moderation/prune.ts b/src/commands/Moderation/prune.ts index c6734d2684a..6a20b74acbd 100644 --- a/src/commands/Moderation/prune.ts +++ b/src/commands/Moderation/prune.ts @@ -11,8 +11,8 @@ import { cleanMentions, floatPromise } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { Collection, EmbedField, Guild, Message, MessageAttachment, MessageEmbed, TextChannel, User } from 'discord.js'; -import { constants, Language } from 'klasa'; -import { Timestamp } from '@sapphire/time-utilities'; +import { TFunction } from 'i18next'; +import { constants } from 'klasa'; const enum Position { Before, @@ -34,8 +34,8 @@ const enum Filter { @ApplyOptions({ aliases: ['purge', 'nuke', 'sweep'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Moderation.PruneDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.PruneExtended), + description: LanguageKeys.Commands.Moderation.PruneDescription, + extendedHelp: LanguageKeys.Commands.Moderation.PruneExtended, permissionLevel: PermissionLevels.Moderator, flagSupport: true, requiredPermissions: ['MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY', 'EMBED_LINKS'], @@ -44,7 +44,6 @@ const enum Filter { usageDelim: ' ' }) export default class extends SkyraCommand { - private readonly timestamp = new Timestamp('YYYY/MM/DD hh:mm:ss'); private readonly kColor = Moderation.metadata.get(Moderation.TypeCodes.Prune)!.color; private readonly kMessageRegExp = constants.MENTION_REGEX.snowflake; private readonly kInviteRegExp = /(?:discord\.(?:gg|io|me|plus|link)|invite\.(?:gg|ink)|discord(?:app)?\.com\/invite)\/(?:[\w-]{2,})/i; @@ -79,20 +78,20 @@ export default class extends SkyraCommand { this.createCustomResolver('filter', async (argument, _possible, message) => { if (!argument) return undefined; const filter = this.kCommandPruneFilters[argument.toLowerCase()]; - if (typeof filter === 'undefined') throw await message.fetchLocale(LanguageKeys.Commands.Moderation.PruneInvalidFilter); + if (typeof filter === 'undefined') throw await message.resolveKey(LanguageKeys.Commands.Moderation.PruneInvalidFilter); return filter; }) .createCustomResolver('position', async (argument, _possible, message) => { if (!argument) return null; const position = this.kCommandPrunePositions[argument.toLowerCase()]; - if (typeof position === 'undefined') throw await message.fetchLocale(LanguageKeys.Commands.Moderation.PruneInvalidPosition); + if (typeof position === 'undefined') throw await message.resolveKey(LanguageKeys.Commands.Moderation.PruneInvalidPosition); return position; }) .createCustomResolver('message', async (argument, possible, message, [, , position]: string[]) => { if (position === null) return message; const fetched = this.kMessageRegExp.test(argument) ? await message.channel.messages.fetch(argument).catch(() => null) : null; - if (fetched === null) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidMessage, { name: possible.name }); + if (fetched === null) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidMessage, { name: possible.name }); return fetched; }); } @@ -107,7 +106,7 @@ export default class extends SkyraCommand { // For example `prune 642748845687570444` (invalid ID) or `prune u` (invalid filter) // are invalid command usages and therefore, for the sake of protection, Skyra should // not execute an erroneous command. - if (message.args.length > 4) throw await message.fetchLocale(LanguageKeys.Commands.Moderation.PruneInvalid); + if (message.args.length > 4) throw await message.resolveKey(LanguageKeys.Commands.Moderation.PruneInvalid); const position = this.resolvePosition(rawPosition); const filter = this.resolveFilter(rawFilter); @@ -122,7 +121,7 @@ export default class extends SkyraCommand { // Filter the messages by their age const now = Date.now(); const filtered = messages.filter((m) => now - m.createdTimestamp < 1209600000); - if (filtered.size === 0) throw await message.fetchLocale(LanguageKeys.Commands.Moderation.PruneNoDeletes); + if (filtered.size === 0) throw await message.resolveKey(LanguageKeys.Commands.Moderation.PruneNoDeletes); // Perform a bulk delete, throw if it returns unknown message. const filteredKeys = this.resolveKeys([...filtered.keys()], position, limit); @@ -135,13 +134,10 @@ export default class extends SkyraCommand { return Reflect.has(message.flagArgs, 'silent') ? null : message.alert( - await message.fetchLocale( - filteredKeys.length === 1 ? LanguageKeys.Commands.Moderation.PruneAlert : LanguageKeys.Commands.Moderation.PruneAlertPlural, - { - count: filteredKeys.length, - total: limit - } - ) + await message.resolveKey(LanguageKeys.Commands.Moderation.PruneAlert, { + count: filteredKeys.length, + total: limit + }) ); } @@ -194,7 +190,7 @@ export default class extends SkyraCommand { // Filter the messages collection by the deleted messages, so no extras are added. messages = messages.filter((_, key) => rawMessages.includes(key)); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Send the message to the prune logs channel. await channel.send('', { @@ -204,46 +200,41 @@ export default class extends SkyraCommand { message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) ) .setDescription( - language.get( - messages.size === 1 - ? LanguageKeys.Commands.Moderation.PruneLogMessage - : LanguageKeys.Commands.Moderation.PruneLogMessagePlural, - { - channel: (message.channel as TextChannel).toString(), - author: message.author.toString(), - count: messages.size - } - ) + t(LanguageKeys.Commands.Moderation.PruneLogMessage, { + channel: (message.channel as TextChannel).toString(), + author: message.author.toString(), + count: messages.size + }) ) .setColor(this.kColor) .setTimestamp(), - files: [this.generateAttachment(language, messages)] + files: [this.generateAttachment(t, messages)] }); } } - private generateAttachment(language: Language, messages: Collection) { - const header = language.get(LanguageKeys.Commands.Moderation.PruneLogHeader); + private generateAttachment(t: TFunction, messages: Collection) { + const header = t(LanguageKeys.Commands.Moderation.PruneLogHeader); const processed = messages - .map((message) => this.formatMessage(message)) + .map((message) => this.formatMessage(t, message)) .reverse() .join('\n\n'); const buffer = Buffer.from(`${header}\n\n${processed}`); return new MessageAttachment(buffer, 'prune.txt'); } - private formatMessage(message: GuildMessage) { - const header = this.formatHeader(message); + private formatMessage(t: TFunction, message: GuildMessage) { + const header = this.formatHeader(t, message); const content = this.formatContents(message); return `${header}\n${content}`; } - private formatHeader(message: GuildMessage) { - return `${this.formatTimestamp(message.createdTimestamp)} ${message.system ? 'SYSTEM' : this.formatAuthor(message.author)}`; + private formatHeader(t: TFunction, message: GuildMessage) { + return `${this.formatTimestamp(t, message.createdTimestamp)} ${message.system ? 'SYSTEM' : this.formatAuthor(message.author)}`; } - private formatTimestamp(timestamp: number) { - return `[${this.timestamp.displayUTC(timestamp)}]`; + private formatTimestamp(t: TFunction, timestamp: number) { + return `[${t(LanguageKeys.Globals.TimeFullValue, { value: timestamp })}]`; } private formatAuthor(author: User) { diff --git a/src/commands/Moderation/removerole.ts b/src/commands/Moderation/removerole.ts index d737c0f243d..0b3db7fb12a 100644 --- a/src/commands/Moderation/removerole.ts +++ b/src/commands/Moderation/removerole.ts @@ -9,8 +9,8 @@ import { Role, User } from 'discord.js'; @ApplyOptions({ aliases: ['rro'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.RemoveroleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.RemoveroleExtended), + description: LanguageKeys.Commands.Moderation.RemoveRoleDescription, + extendedHelp: LanguageKeys.Commands.Moderation.RemoveRoleExtended, requiredMember: true, optionalDuration: true, requiredGuildPermissions: ['MANAGE_ROLES'], diff --git a/src/commands/Moderation/setnickname.ts b/src/commands/Moderation/setnickname.ts index f9c7c1c7a36..2680732a98d 100644 --- a/src/commands/Moderation/setnickname.ts +++ b/src/commands/Moderation/setnickname.ts @@ -9,8 +9,8 @@ import { User } from 'discord.js'; @ApplyOptions({ aliases: ['sn'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.SetNicknameDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.SetNicknameExtended), + description: LanguageKeys.Commands.Moderation.SetNicknameDescription, + extendedHelp: LanguageKeys.Commands.Moderation.SetNicknameExtended, requiredMember: true, optionalDuration: true, requiredGuildPermissions: ['MANAGE_NICKNAMES'], diff --git a/src/commands/Moderation/softban.ts b/src/commands/Moderation/softban.ts index b8174a3c4b3..f4b11ce3eba 100644 --- a/src/commands/Moderation/softban.ts +++ b/src/commands/Moderation/softban.ts @@ -9,8 +9,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['sb'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.SoftBanDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.SoftBanExtended), + description: LanguageKeys.Commands.Moderation.SoftBanDescription, + extendedHelp: LanguageKeys.Commands.Moderation.SoftBanExtended, requiredMember: false, requiredPermissions: ['BAN_MEMBERS'] }) @@ -38,14 +38,14 @@ export default class extends ModerationCommand { if (preHandled) preHandled.unlock(); } - public async checkModeratable(...[message, language, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, language, context); - if (member && !member.bannable) throw language.get(LanguageKeys.Commands.Moderation.BanNotBannable); + public async checkModeratable(...[message, t, context]: ArgumentTypes) { + const member = await super.checkModeratable(message, t, context); + if (member && !member.bannable) throw t(LanguageKeys.Commands.Moderation.BanNotBannable); return member; } private async getDays(message: GuildMessage) { - const regex = new RegExp(await message.fetchLocale(LanguageKeys.Commands.Moderation.ModerationDays), 'i'); + const regex = new RegExp(await message.resolveKey(LanguageKeys.Commands.Moderation.ModerationDays), 'i'); for (const [key, value] of Object.entries(message.flagArgs)) { if (regex.test(key)) { const parsed = Number(value); diff --git a/src/commands/Moderation/togglemoderationdm.ts b/src/commands/Moderation/togglemoderationdm.ts index 5e1c7bdd5cc..7d0fe7a17a6 100644 --- a/src/commands/Moderation/togglemoderationdm.ts +++ b/src/commands/Moderation/togglemoderationdm.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['togglemdm', 'togglemoddm', 'tmdm'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Moderation.ToggleModerationDmDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.ToggleModerationDmExtended) + description: LanguageKeys.Commands.Moderation.ToggleModerationDmDescription, + extendedHelp: LanguageKeys.Commands.Moderation.ToggleModerationDmExtended }) export default class extends SkyraCommand { public async run(message: GuildMessage) { @@ -20,7 +20,7 @@ export default class extends SkyraCommand { return user.save(); }); - return message.sendLocale( + return message.sendTranslated( updated.moderationDM ? LanguageKeys.Commands.Moderation.ToggleModerationDmToggledEnabled : LanguageKeys.Commands.Moderation.ToggleModerationDmToggledDisabled diff --git a/src/commands/Moderation/unban.ts b/src/commands/Moderation/unban.ts index 065811b4942..09a663dc5d4 100644 --- a/src/commands/Moderation/unban.ts +++ b/src/commands/Moderation/unban.ts @@ -9,8 +9,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['ub'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnbanDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnbanExtended), + description: LanguageKeys.Commands.Moderation.UnbanDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnbanExtended, requiredMember: false, requiredPermissions: ['BAN_MEMBERS'] }) @@ -23,12 +23,12 @@ export default class extends ModerationCommand { // If the fetch failed, throw an error saying that the fetch failed: if (bans === null) { - throw await message.fetchLocale(LanguageKeys.System.FetchBansFail); + throw await message.resolveKey(LanguageKeys.System.FetchBansFail); } // If there were no bans, throw an error saying that the ban list is empty: if (bans.length === 0) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.GuildBansEmpty); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.GuildBansEmpty); } return { @@ -55,11 +55,11 @@ export default class extends ModerationCommand { } public checkModeratable( - ...[message, language, { preHandled, target, ...context }]: ArgumentTypes< + ...[message, t, { preHandled, target, ...context }]: ArgumentTypes< ModerationCommand['checkModeratable'] > ) { - if (!preHandled.bans.includes(target.id)) throw language.get(LanguageKeys.Commands.Moderation.GuildBansNotFound); - return super.checkModeratable(message, language, { preHandled, target, ...context }); + if (!preHandled.bans.includes(target.id)) throw t(LanguageKeys.Commands.Moderation.GuildBansNotFound); + return super.checkModeratable(message, t, { preHandled, target, ...context }); } } diff --git a/src/commands/Moderation/unmute.ts b/src/commands/Moderation/unmute.ts index 98439defffc..863284ebd29 100644 --- a/src/commands/Moderation/unmute.ts +++ b/src/commands/Moderation/unmute.ts @@ -8,8 +8,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['um'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnmuteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnmuteExtended), + description: LanguageKeys.Commands.Moderation.UnmuteDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnmuteExtended, requiredGuildPermissions: ['MANAGE_ROLES'] }) export default class extends ModerationCommand { @@ -20,7 +20,7 @@ export default class extends ModerationCommand { if (message.command !== this || message.guild === null) return false; const id = await message.guild.readSettings(this.kPath); if (id && message.guild.roles.cache.has(id)) return false; - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { + throw await message.resolveKey(LanguageKeys.Commands.Moderation.GuildSettingsRolesRestricted, { prefix: await message.guild.readSettings(GuildSettings.Prefix), path: this.kPath }); diff --git a/src/commands/Moderation/unwarn.ts b/src/commands/Moderation/unwarn.ts index 5cef6075b09..096082815dc 100644 --- a/src/commands/Moderation/unwarn.ts +++ b/src/commands/Moderation/unwarn.ts @@ -8,13 +8,13 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['uw', 'unwarning'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.UnwarnDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.UnwarnExtended), + description: LanguageKeys.Commands.Moderation.UnwarnDescription, + extendedHelp: LanguageKeys.Commands.Moderation.UnwarnExtended, usage: ' [reason:...string]' }) export default class extends ModerationCommand { public async run(message: GuildMessage, [caseID, reason]: [number, string]) { - const [autoDelete, messageDisplay, reasonDisplay, language] = await message.guild.readSettings((settings) => [ + const [autoDelete, messageDisplay, reasonDisplay, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Messages.ModerationAutoDelete], settings[GuildSettings.Messages.ModerationMessageDisplay], settings[GuildSettings.Messages.ModerationReasonDisplay], @@ -23,7 +23,7 @@ export default class extends ModerationCommand { const modlog = await message.guild.moderation.fetch(caseID); if (!modlog || !modlog.isType(Moderation.TypeCodes.Warning)) { - throw language.get(LanguageKeys.Commands.Moderation.GuildWarnNotFound); + throw t(LanguageKeys.Commands.Moderation.GuildWarnNotFound); } const user = await modlog.fetchUser(); @@ -37,7 +37,7 @@ export default class extends ModerationCommand { if (messageDisplay) { const originalReason = reasonDisplay ? unwarnLog.reason : null; return message.send( - language.get( + t( originalReason ? LanguageKeys.Commands.Moderation.ModerationOutputWithReason : LanguageKeys.Commands.Moderation.ModerationOutput, { @@ -47,7 +47,7 @@ export default class extends ModerationCommand { reason: originalReason } ) - ) as Promise; + ); } return null; diff --git a/src/commands/Moderation/vmute.ts b/src/commands/Moderation/vmute.ts index b9b6edfd1db..5910a8ffba8 100644 --- a/src/commands/Moderation/vmute.ts +++ b/src/commands/Moderation/vmute.ts @@ -6,8 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['vm'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.VmuteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.VmuteExtended), + description: LanguageKeys.Commands.Moderation.VmuteDescription, + extendedHelp: LanguageKeys.Commands.Moderation.VmuteExtended, optionalDuration: true, requiredMember: true, requiredGuildPermissions: ['MUTE_MEMBERS'] @@ -26,9 +26,9 @@ export default class extends ModerationCommand { ); } - public async checkModeratable(...[message, language, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, language, context); - if (member && member.voice.serverMute) throw language.get(LanguageKeys.Commands.Moderation.MuteMuted); + public async checkModeratable(...[message, t, context]: ArgumentTypes) { + const member = await super.checkModeratable(message, t, context); + if (member && member.voice.serverMute) throw t(LanguageKeys.Commands.Moderation.MuteMuted); return member; } } diff --git a/src/commands/Moderation/voicekick.ts b/src/commands/Moderation/voicekick.ts index 5738b3d33b1..95547554ff0 100644 --- a/src/commands/Moderation/voicekick.ts +++ b/src/commands/Moderation/voicekick.ts @@ -6,8 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['vk'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.VoiceKickDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.VoiceKickExtended), + description: LanguageKeys.Commands.Moderation.VoiceKickDescription, + extendedHelp: LanguageKeys.Commands.Moderation.VoiceKickExtended, requiredMember: true, requiredPermissions: ['MANAGE_CHANNELS', 'MOVE_MEMBERS'] }) @@ -24,9 +24,9 @@ export default class extends ModerationCommand { ); } - public async checkModeratable(...[message, language, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, language, context); - if (member && !member.voice.channelID) throw language.get(LanguageKeys.Commands.Moderation.GuildMemberNotVoicechannel); + public async checkModeratable(...[message, t, context]: ArgumentTypes) { + const member = await super.checkModeratable(message, t, context); + if (member && !member.voice.channelID) throw t(LanguageKeys.Commands.Moderation.GuildMemberNotVoicechannel); return member; } } diff --git a/src/commands/Moderation/vunmute.ts b/src/commands/Moderation/vunmute.ts index f46034b3748..68f80fda6ba 100644 --- a/src/commands/Moderation/vunmute.ts +++ b/src/commands/Moderation/vunmute.ts @@ -6,8 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['uvm', 'vum', 'unvmute'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.VunmuteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.VunmuteExtended), + description: LanguageKeys.Commands.Moderation.VunmuteDescription, + extendedHelp: LanguageKeys.Commands.Moderation.VunmuteExtended, requiredMember: true, requiredPermissions: ['MUTE_MEMBERS'] }) @@ -24,9 +24,9 @@ export default class extends ModerationCommand { ); } - public async checkModeratable(...[message, language, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, language, context); - if (member && !member.voice.serverMute) throw language.get(LanguageKeys.Commands.Moderation.VmuteUserNotMuted); + public async checkModeratable(...[message, t, context]: ArgumentTypes) { + const member = await super.checkModeratable(message, t, context); + if (member && !member.voice.serverMute) throw t(LanguageKeys.Commands.Moderation.VmuteUserNotMuted); return member; } } diff --git a/src/commands/Moderation/warn.ts b/src/commands/Moderation/warn.ts index 466059feb2a..11356334a8f 100644 --- a/src/commands/Moderation/warn.ts +++ b/src/commands/Moderation/warn.ts @@ -7,8 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['w', 'warning'], - description: (language) => language.get(LanguageKeys.Commands.Moderation.WarnDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Moderation.WarnExtended), + description: LanguageKeys.Commands.Moderation.WarnDescription, + extendedHelp: LanguageKeys.Commands.Moderation.WarnExtended, permissionLevel: PermissionLevels.Moderator, requiredMember: true, optionalDuration: true diff --git a/src/commands/Music/add.ts b/src/commands/Music/add.ts index 820a65ef741..8709934c0c7 100644 --- a/src/commands/Music/add.ts +++ b/src/commands/Music/add.ts @@ -6,15 +6,15 @@ import { requireUserInVoiceChannel } from '#utils/Music/Decorators'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.AddDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.AddExtended), + description: LanguageKeys.Commands.Music.AddDescription, + extendedHelp: LanguageKeys.Commands.Music.AddExtended, usage: '', flagSupport: true }) export default class extends MusicCommand { @requireUserInVoiceChannel() public async run(message: GuildMessage, [songs]: [string[]]) { - if (!songs || !songs.length) throw await message.fetchLocale(LanguageKeys.MusicManager.FetchNoMatches); + if (!songs || !songs.length) throw await message.resolveKey(LanguageKeys.MusicManager.FetchNoMatches); const tracks = songs.map((track) => ({ author: message.author.id, track })); await message.guild.audio.add(...tracks); diff --git a/src/commands/Music/exportqueue.ts b/src/commands/Music/exportqueue.ts index 2c8a4e89823..8d9610b0c8e 100644 --- a/src/commands/Music/exportqueue.ts +++ b/src/commands/Music/exportqueue.ts @@ -12,8 +12,8 @@ export const maximumExportQueueSize = 100; @ApplyOptions({ aliases: ['eq'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Music.ExportQueueDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.ExportQueueExtended), + description: LanguageKeys.Commands.Music.ExportQueueDescription, + extendedHelp: LanguageKeys.Commands.Music.ExportQueueExtended, requiredGuildPermissions: ['ATTACH_FILES'], runIn: ['text'] }) @@ -24,7 +24,7 @@ export default class extends SkyraCommand { const head = await audio.getCurrentTrack().then((v) => this.serializeCurrent(v)); const data = await audio.tracks().then((tracks) => this.serializeQueue(tracks, head)); - return message.channel.send(await message.fetchLocale(LanguageKeys.Commands.Music.ExportQueueSuccess, { guildName: name }), { + return message.channel.send(await message.resolveKey(LanguageKeys.Commands.Music.ExportQueueSuccess, { guildName: name }), { files: [{ attachment: Buffer.from(data), name: `${name}-${Date.now()}.squeue` }] }); } diff --git a/src/commands/Music/importqueue.ts b/src/commands/Music/importqueue.ts index e01c34d8496..64659d8b6d0 100644 --- a/src/commands/Music/importqueue.ts +++ b/src/commands/Music/importqueue.ts @@ -14,8 +14,8 @@ import { maximumExportQueueSize } from './exportqueue'; @ApplyOptions({ aliases: ['iq'], cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Music.ImportQueueDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.ImportQueueExtended), + description: LanguageKeys.Commands.Music.ImportQueueDescription, + extendedHelp: LanguageKeys.Commands.Music.ImportQueueExtended, usage: '', flagSupport: true }) @@ -23,7 +23,7 @@ import { maximumExportQueueSize } from './exportqueue'; [ 'squeue', async (arg, possible, message) => { - if (!arg && message.attachments.size === 0) throw await message.fetchLocale(LanguageKeys.MusicManager.ImportQueueNotFound); + if (!arg && message.attachments.size === 0) throw await message.resolveKey(LanguageKeys.MusicManager.ImportQueueNotFound); return message.attachments.first()?.url ?? message.client.arguments.get('url')!.run(arg, possible, message); } ] @@ -38,7 +38,7 @@ export default class extends MusicCommand { // Add the tracks const added = await audio.add(...tracks); - if (added === 0) throw await message.fetchLocale(LanguageKeys.MusicManager.TooManySongs); + if (added === 0) throw await message.resolveKey(LanguageKeys.MusicManager.TooManySongs); this.client.emit(Events.MusicAddNotify, message, tracks); } @@ -48,7 +48,7 @@ export default class extends MusicCommand { const raw = await fetch(url, FetchResultTypes.Buffer); return deserialize(raw); } catch { - throw await message.fetchLocale(LanguageKeys.MusicManager.ImportQueueError); + throw await message.resolveKey(LanguageKeys.MusicManager.ImportQueueError); } } diff --git a/src/commands/Music/join.ts b/src/commands/Music/join.ts index f68fec14f96..3f2d235bc5b 100644 --- a/src/commands/Music/join.ts +++ b/src/commands/Music/join.ts @@ -9,7 +9,8 @@ const { FLAGS } = Permissions; @ApplyOptions({ aliases: ['connect'], - description: (language) => language.get(LanguageKeys.Commands.Music.JoinDescription) + description: LanguageKeys.Commands.Music.JoinDescription, + extendedHelp: LanguageKeys.Commands.Music.JoinExtended }) export default class extends MusicCommand { @requireUserInVoiceChannel() @@ -18,7 +19,7 @@ export default class extends MusicCommand { const { channel } = message.member.voice; // If the member is not in a voice channel then throw - if (!channel) throw await message.fetchLocale(LanguageKeys.Commands.Music.JoinNoVoicechannel); + if (!channel) throw await message.resolveKey(LanguageKeys.Commands.Music.JoinNoVoiceChannel); const { audio } = message.guild; @@ -35,27 +36,27 @@ export default class extends MusicCommand { // Connect to Lavalink and join the voice channel await audio.connect(channel.id); } catch { - return message.sendLocale(LanguageKeys.Commands.Music.JoinFailed); + return message.sendTranslated(LanguageKeys.Commands.Music.JoinFailed); } - return message.sendLocale(LanguageKeys.Commands.Music.JoinSuccess, [{ channel: `<#${channel.id}>` }]); + return message.sendTranslated(LanguageKeys.Commands.Music.JoinSuccess, [{ channel: `<#${channel.id}>` }]); } private async resolvePermissions(message: GuildMessage, voiceChannel: VoiceChannel): Promise { const permissions = voiceChannel.permissionsFor(message.guild.me!)!; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Administrators can join voice channels even if they are full - if (voiceChannel.full && !permissions.has(FLAGS.ADMINISTRATOR)) throw language.get(LanguageKeys.Commands.Music.JoinVoiceFull); - if (!permissions.has(FLAGS.CONNECT)) throw language.get(LanguageKeys.Commands.Music.JoinVoiceNoConnect); - if (!permissions.has(FLAGS.SPEAK)) throw language.get(LanguageKeys.Commands.Music.JoinVoiceNoSpeak); + if (voiceChannel.full && !permissions.has(FLAGS.ADMINISTRATOR)) throw t(LanguageKeys.Commands.Music.JoinVoiceFull); + if (!permissions.has(FLAGS.CONNECT)) throw t(LanguageKeys.Commands.Music.JoinVoiceNoConnect); + if (!permissions.has(FLAGS.SPEAK)) throw t(LanguageKeys.Commands.Music.JoinVoiceNoSpeak); } private async checkSkyraPlaying(message: GuildMessage, audio: Queue, voiceChannel: VoiceChannel): Promise { const selfVoiceChannel = audio.player.playing ? audio.voiceChannelID : null; if (selfVoiceChannel === null) return; - throw await message.fetchLocale( + throw await message.resolveKey( voiceChannel.id === selfVoiceChannel ? LanguageKeys.Commands.Music.JoinVoiceSame : LanguageKeys.Commands.Music.JoinVoiceDifferent ); } diff --git a/src/commands/Music/leave.ts b/src/commands/Music/leave.ts index c4ae32700d2..d6ab42c32a4 100644 --- a/src/commands/Music/leave.ts +++ b/src/commands/Music/leave.ts @@ -5,8 +5,8 @@ import { requireDj, requireSkyraInVoiceChannel } from '#utils/Music/Decorators'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.LeaveDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.LeaveExtended), + description: LanguageKeys.Commands.Music.LeaveDescription, + extendedHelp: LanguageKeys.Commands.Music.LeaveExtended, flagSupport: true }) export default class extends MusicCommand { @@ -24,6 +24,6 @@ export default class extends MusicCommand { await audio.clear(); } - return message.sendLocale(LanguageKeys.Commands.Music.LeaveSuccess, [{ channel: `<#${channelID}>` }]); + return message.sendTranslated(LanguageKeys.Commands.Music.LeaveSuccess, [{ channel: `<#${channelID}>` }]); } } diff --git a/src/commands/Music/pause.ts b/src/commands/Music/pause.ts index dcd02fe385a..4e554d8e16e 100644 --- a/src/commands/Music/pause.ts +++ b/src/commands/Music/pause.ts @@ -12,7 +12,8 @@ import { import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.PauseDescription) + description: LanguageKeys.Commands.Music.PauseDescription, + extendedHelp: LanguageKeys.Commands.Music.PauseExtended }) export default class extends MusicCommand { @requireUserInVoiceChannel() diff --git a/src/commands/Music/play.ts b/src/commands/Music/play.ts index b38ae8f08dc..8f93133b1e2 100644 --- a/src/commands/Music/play.ts +++ b/src/commands/Music/play.ts @@ -6,8 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['p'], - description: (language) => language.get(LanguageKeys.Commands.Music.PlayDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.PlayExtended), + description: LanguageKeys.Commands.Music.PlayDescription, + extendedHelp: LanguageKeys.Commands.Music.PlayExtended, usage: '[song:song]', flagSupport: true }) @@ -25,7 +25,7 @@ export default class extends MusicCommand { // Retrieve the currently playing track, then check if there is at least one track to be played. const current = await audio.getCurrentTrack(); if (!current && (await audio.count()) === 0) { - return message.sendLocale(LanguageKeys.Commands.Music.PlayQueueEmpty); + return message.sendTranslated(LanguageKeys.Commands.Music.PlayQueueEmpty); } // If Skyra is not in a voice channel, join @@ -35,13 +35,13 @@ export default class extends MusicCommand { // If Skyra is already playing, send a message. if (audio.playing) { - return message.sendLocale(LanguageKeys.Commands.Music.PlayQueuePlaying); + return message.sendTranslated(LanguageKeys.Commands.Music.PlayQueuePlaying); } if (current && audio.paused) { await audio.resume(); const track = await audio.player.node.decode(current.track); - await message.sendLocale(LanguageKeys.Commands.Music.PlayQueuePaused, [{ song: `<${track.uri}>` }]); + await message.sendTranslated(LanguageKeys.Commands.Music.PlayQueuePaused, [{ song: `<${track.uri}>` }]); } else { await audio.setTextChannelID(message.channel.id); await audio.start(); diff --git a/src/commands/Music/playing.ts b/src/commands/Music/playing.ts index d3729d79a8b..ec01a72a22f 100644 --- a/src/commands/Music/playing.ts +++ b/src/commands/Music/playing.ts @@ -9,7 +9,8 @@ import { MessageEmbed } from 'discord.js'; @ApplyOptions({ aliases: ['np', 'nowplaying'], - description: (language) => language.get(LanguageKeys.Commands.Music.PlayingDescription), + description: LanguageKeys.Commands.Music.PlayingDescription, + extendedHelp: LanguageKeys.Commands.Music.PlayingExtended, requiredPermissions: ['EMBED_LINKS'] }) export default class extends MusicCommand { @@ -20,7 +21,7 @@ export default class extends MusicCommand { const { audio } = message.guild; const entry = await audio.getCurrentTrack(); - if (!entry) throw await message.fetchLocale(LanguageKeys.Commands.Music.PlayingQueueEmpty); + if (!entry) throw await message.resolveKey(LanguageKeys.Commands.Music.PlayingQueueEmpty); const track = await audio.player.node.decode(entry.track); const embed = await this.getMessageEmbed(message, track); @@ -33,7 +34,7 @@ export default class extends MusicCommand { .setTitle(track.title) .setURL(track.uri) .setAuthor(track.author) - .setDescription(await message.fetchLocale(LanguageKeys.Commands.Music.PlayingDuration, { duration: showSeconds(track.length) })) + .setDescription(await message.resolveKey(LanguageKeys.Commands.Music.PlayingDuration, { duration: showSeconds(track.length) })) .setTimestamp(); const imageUrl = this.getSongImage(track.uri, track.identifier); diff --git a/src/commands/Music/promote.ts b/src/commands/Music/promote.ts index ac724349ee2..f3da2595dd1 100644 --- a/src/commands/Music/promote.ts +++ b/src/commands/Music/promote.ts @@ -11,8 +11,8 @@ import { import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.PromoteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Music.PromoteExtended), + description: LanguageKeys.Commands.Music.PromoteDescription, + extendedHelp: LanguageKeys.Commands.Music.PromoteExtended, usage: '' }) export default class extends MusicCommand { @@ -25,19 +25,14 @@ export default class extends MusicCommand { // Minus one as user input is 1-based while the code is 0-based: --index; - const language = await message.fetchLanguage(); - if (index < 0) throw language.get(LanguageKeys.Commands.Music.RemoveIndexInvalid); + const t = await message.fetchT(); + if (index < 0) throw t(LanguageKeys.Commands.Music.RemoveIndexInvalid); const { audio } = message.guild; const length = await audio.count(); if (index >= length) { - throw language.get(LanguageKeys.Commands.Music.RemoveIndexOutOfBounds, { - songs: language.get( - length === 1 ? LanguageKeys.Commands.Music.AddPlaylistSongs : LanguageKeys.Commands.Music.AddPlaylistSongsPlural, - { - count: length - } - ) + throw t(LanguageKeys.Commands.Music.RemoveIndexOutOfBounds, { + songs: t(LanguageKeys.Commands.Music.AddPlaylistSongs, { count: length }) }); } @@ -45,6 +40,6 @@ export default class extends MusicCommand { const track = await audio.player.node.decode(entry!.track); await audio.moveTracks(index, 0); - await message.channel.send(language.get(LanguageKeys.Commands.Music.PromoteSuccess, { title: track.title, url: track.uri })); + await message.channel.send(t(LanguageKeys.Commands.Music.PromoteSuccess, { title: track.title, url: track.uri })); } } diff --git a/src/commands/Music/queue-clear.ts b/src/commands/Music/queue-clear.ts index 6f7c8a96ffe..a537ccfe2e0 100644 --- a/src/commands/Music/queue-clear.ts +++ b/src/commands/Music/queue-clear.ts @@ -6,7 +6,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['qc', 'clear'], - description: (language) => language.get(LanguageKeys.Commands.Music.ClearDescription) + description: LanguageKeys.Commands.Music.ClearDescription, + extendedHelp: LanguageKeys.Commands.Music.ClearExtended }) export default class extends MusicCommand { @requireQueueNotEmpty() @@ -15,6 +16,6 @@ export default class extends MusicCommand { const { audio } = message.guild; const count = await audio.count(); await audio.clearTracks(); - return message.sendLocale(LanguageKeys.Commands.Music.ClearSuccess, [{ count }]); + return message.sendTranslated(LanguageKeys.Commands.Music.ClearSuccess, [{ count }]); } } diff --git a/src/commands/Music/queue.ts b/src/commands/Music/queue.ts index 45b78f66625..07e9006aba4 100644 --- a/src/commands/Music/queue.ts +++ b/src/commands/Music/queue.ts @@ -11,28 +11,29 @@ import { chunk } from '@sapphire/utilities'; import { TrackInfo } from '@skyra/audio'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import type { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['q', 'playing-time', 'pt'], - description: (language) => language.get(LanguageKeys.Commands.Music.QueueDescription), + description: LanguageKeys.Commands.Music.QueueDescription, + extendedHelp: LanguageKeys.Commands.Music.QueueExtended, requiredPermissions: ['ADD_REACTIONS', 'MANAGE_MESSAGES', 'EMBED_LINKS', 'READ_MESSAGE_HISTORY'] }) export default class extends MusicCommand { @requireQueueNotEmpty() public async run(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Send the loading message const response = await message.send( - new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(language.get(LanguageKeys.System.Loading))) + new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(t(LanguageKeys.System.Loading))) ); // Generate the pages with 5 songs each const queueDisplay = new UserRichDisplay( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) - .setTitle(language.get(LanguageKeys.Commands.Music.QueueTitle, { guildname: message.guild.name })) + .setTitle(t(LanguageKeys.Commands.Music.QueueTitle, { guildname: message.guild.name })) ); const { audio } = message.guild; @@ -42,44 +43,38 @@ export default class extends MusicCommand { if (current) { const track = current.entry.info; const nowPlayingDescription = [ - track.isStream ? language.get(LanguageKeys.Commands.Music.QueueNowPlayingLiveStream) : showSeconds(track.length), - language.get(LanguageKeys.Commands.Music.QueueNowPlaying, { + track.isStream ? t(LanguageKeys.Commands.Music.QueueNowPlayingLiveStream) : showSeconds(track.length), + t(LanguageKeys.Commands.Music.QueueNowPlaying, { title: track.title, url: track.uri, - requester: await this.fetchRequesterName(message, language, current.entry.author) + requester: await this.fetchRequesterName(message, t, current.entry.author) }) ]; if (!track.isStream) { nowPlayingDescription.push( - language.get(LanguageKeys.Commands.Music.QueueNowPlayingTimeRemaining, { + t(LanguageKeys.Commands.Music.QueueNowPlayingTimeRemaining, { timeRemaining: showSeconds(track.length - current.position) }) ); } - queueDisplay.embedTemplate.addField(language.get(LanguageKeys.Commands.Music.QueueNowPlayingTitle), nowPlayingDescription.join(' | ')); + queueDisplay.embedTemplate.addField(t(LanguageKeys.Commands.Music.QueueNowPlayingTitle), nowPlayingDescription.join(' | ')); } if (tracks.length) { // Format the song entries - const songFields = await Promise.all(tracks.map((track, position) => this.generateTrackField(message, language, position, track))); + const songFields = await Promise.all(tracks.map((track, position) => this.generateTrackField(message, t, position, track))); const totalDuration = this.calculateTotalDuration(tracks); - const totalDescription = language.get(LanguageKeys.Commands.Music.QueueTotal, { - songs: language.get( - tracks.length === 1 ? LanguageKeys.Commands.Music.AddPlaylistSongs : LanguageKeys.Commands.Music.AddPlaylistSongsPlural, - { - count: tracks.length - } - ), + const totalDescription = t(LanguageKeys.Commands.Music.QueueTotal, { + songs: t(LanguageKeys.Commands.Music.AddPlaylistSongs, { + count: tracks.length + }), remainingTime: showSeconds(totalDuration) }); - queueDisplay.embedTemplate.addField(language.get(LanguageKeys.Commands.Music.QueueTotalTitle), totalDescription); - queueDisplay.embedTemplate.addField( - ZeroWidthSpace, - language.get(LanguageKeys.Commands.Music.QueueDashboardInfo, { guild: message.guild }) - ); + queueDisplay.embedTemplate.addField(t(LanguageKeys.Commands.Music.QueueTotalTitle), totalDescription); + queueDisplay.embedTemplate.addField(ZeroWidthSpace, t(LanguageKeys.Commands.Music.QueueDashboardInfo, { guild: message.guild })); for (const page of chunk(songFields, 5)) { queueDisplay.addPage((embed: MessageEmbed) => embed.setDescription(page.join('\n\n'))); @@ -96,9 +91,9 @@ export default class extends MusicCommand { return response.edit(undefined, queueDisplay.template); } - private async generateTrackField(message: GuildMessage, language: Language, position: number, entry: DecodedQueueEntry) { - const username = await this.fetchRequesterName(message, language, entry.author); - return language.get(LanguageKeys.Commands.Music.QueueLine, { + private async generateTrackField(message: GuildMessage, t: TFunction, position: number, entry: DecodedQueueEntry) { + const username = await this.fetchRequesterName(message, t, entry.author); + return t(LanguageKeys.Commands.Music.QueueLine, { position: position + 1, duration: showSeconds(entry.data.length), title: entry.data.title, @@ -117,7 +112,7 @@ export default class extends MusicCommand { return accumulator; } - private async fetchRequesterName(message: GuildMessage, language: Language, userID: string): Promise { + private async fetchRequesterName(message: GuildMessage, t: TFunction, userID: string): Promise { try { return (await message.guild.members.fetch(userID)).displayName; } catch {} @@ -126,7 +121,7 @@ export default class extends MusicCommand { return (await this.client.users.fetch(userID)).username; } catch {} - return language.get(LanguageKeys.Misc.UnknownUser); + return t(LanguageKeys.Misc.UnknownUser); } private async getTrackInformation(audio: Queue): Promise { diff --git a/src/commands/Music/remove.ts b/src/commands/Music/remove.ts index cbbcf7cb18c..81403384ac8 100644 --- a/src/commands/Music/remove.ts +++ b/src/commands/Music/remove.ts @@ -6,24 +6,25 @@ import { requireQueueNotEmpty } from '#utils/Music/Decorators'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.RemoveDescription), + description: LanguageKeys.Commands.Music.RemoveDescription, + extendedHelp: LanguageKeys.Commands.Music.RemoveExtended, usage: '' }) export default class extends MusicCommand { @requireQueueNotEmpty() public async run(message: GuildMessage, [index]: [number]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Minus one as user input is 1-based while the code is 0-based: --index; - if (index < 0) throw language.get(LanguageKeys.Commands.Music.RemoveIndexInvalid); + if (index < 0) throw t(LanguageKeys.Commands.Music.RemoveIndexInvalid); const { audio } = message.guild; const count = await audio.count(); if (index >= count) { - throw language.get(LanguageKeys.Commands.Music.RemoveIndexOutOfBounds, { - songs: language.get(count === 1 ? LanguageKeys.Commands.Music.AddPlaylistSongs : LanguageKeys.Commands.Music.AddPlaylistSongsPlural, { + throw t(LanguageKeys.Commands.Music.RemoveIndexOutOfBounds, { + songs: t(LanguageKeys.Commands.Music.AddPlaylistSongs, { count }) }); diff --git a/src/commands/Music/repeat.ts b/src/commands/Music/repeat.ts index 07dfa743f4c..7c666d5c877 100644 --- a/src/commands/Music/repeat.ts +++ b/src/commands/Music/repeat.ts @@ -7,7 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['replay'], - description: (language) => language.get(LanguageKeys.Commands.Music.RepeatDescription) + description: LanguageKeys.Commands.Music.RepeatDescription, + extendedHelp: LanguageKeys.Commands.Music.RepeatExtended }) export default class extends MusicCommand { @requireUserInVoiceChannel() diff --git a/src/commands/Music/resume.ts b/src/commands/Music/resume.ts index e6d8fcc525a..51faa4adcb4 100644 --- a/src/commands/Music/resume.ts +++ b/src/commands/Music/resume.ts @@ -6,7 +6,8 @@ import { requireMusicPaused, requireSameVoiceChannel, requireSkyraInVoiceChannel import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.ResumeDescription) + description: LanguageKeys.Commands.Music.ResumeDescription, + extendedHelp: LanguageKeys.Commands.Music.ResumeExtended }) export default class extends MusicCommand { @requireUserInVoiceChannel() diff --git a/src/commands/Music/seek.ts b/src/commands/Music/seek.ts index 4c94c3775ad..c4d2e6feed9 100644 --- a/src/commands/Music/seek.ts +++ b/src/commands/Music/seek.ts @@ -6,7 +6,8 @@ import { requireDj, requireMusicPlaying } from '#utils/Music/Decorators'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.SeekDescription), + description: LanguageKeys.Commands.Music.SeekDescription, + extendedHelp: LanguageKeys.Commands.Music.SeekExtended, usage: '' }) export default class extends MusicCommand { diff --git a/src/commands/Music/shuffle.ts b/src/commands/Music/shuffle.ts index 9bc495a726a..50dbeb1c8b6 100644 --- a/src/commands/Music/shuffle.ts +++ b/src/commands/Music/shuffle.ts @@ -5,7 +5,8 @@ import { requireDj, requireQueueNotEmpty } from '#utils/Music/Decorators'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.ShuffleDescription) + description: LanguageKeys.Commands.Music.ShuffleDescription, + extendedHelp: LanguageKeys.Commands.Music.ShuffleExtended }) export default class extends MusicCommand { @requireQueueNotEmpty() @@ -15,6 +16,6 @@ export default class extends MusicCommand { await audio.shuffleTracks(); const amount = await audio.count(); - await message.sendLocale(LanguageKeys.Commands.Music.ShuffleSuccess, [{ amount }]); + await message.sendTranslated(LanguageKeys.Commands.Music.ShuffleSuccess, [{ amount }]); } } diff --git a/src/commands/Music/skip.ts b/src/commands/Music/skip.ts index 838ad74c08a..8ad0db38a6d 100644 --- a/src/commands/Music/skip.ts +++ b/src/commands/Music/skip.ts @@ -8,7 +8,8 @@ import { ApplyOptions } from '@skyra/decorators'; import { VoiceChannel } from 'discord.js'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Music.SkipDescription), + description: LanguageKeys.Commands.Music.SkipDescription, + extendedHelp: LanguageKeys.Commands.Music.SkipExtended, usage: '[force]' }) export default class extends MusicCommand { @@ -31,12 +32,12 @@ export default class extends MusicCommand { } private async canSkipWithForce(message: GuildMessage, voiceChannel: VoiceChannel): Promise { - return (await message.member.canManage(voiceChannel)) ? null : message.fetchLocale(LanguageKeys.Commands.Music.SkipPermissions); + return (await message.member.canManage(voiceChannel)) ? null : message.resolveKey(LanguageKeys.Commands.Music.SkipPermissions); } private async canSkipWithoutForce(message: GuildMessage, audio: Queue, listeners: number): Promise { const added = await audio.addSkipVote(message.author.id); - if (!added) return message.fetchLocale(LanguageKeys.Commands.Music.SkipVotesVoted); + if (!added) return message.resolveKey(LanguageKeys.Commands.Music.SkipVotesVoted); const amount = await audio.countSkipVotes(); if (amount <= 3) return null; @@ -44,6 +45,6 @@ export default class extends MusicCommand { const needed = Math.ceil(listeners * 0.4); if (needed <= amount) return null; - return message.fetchLocale(LanguageKeys.Commands.Music.SkipVotesTotal, { amount, needed }); + return message.resolveKey(LanguageKeys.Commands.Music.SkipVotesTotal, { amount, needed }); } } diff --git a/src/commands/Music/volume.ts b/src/commands/Music/volume.ts index b45efa13d75..ef27f277359 100644 --- a/src/commands/Music/volume.ts +++ b/src/commands/Music/volume.ts @@ -7,7 +7,8 @@ import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ aliases: ['vol'], - description: (language) => language.get(LanguageKeys.Commands.Music.VolumeDescription), + description: LanguageKeys.Commands.Music.VolumeDescription, + extendedHelp: LanguageKeys.Commands.Music.VolumeExtended, usage: '[volume:number]' }) export default class extends MusicCommand { @@ -21,12 +22,12 @@ export default class extends MusicCommand { // If no argument was given if (typeof volume === 'undefined' || volume === previous) { - return message.sendLocale(LanguageKeys.Commands.Music.VolumeSuccess, [{ volume: previous }]); + return message.sendTranslated(LanguageKeys.Commands.Music.VolumeSuccess, [{ volume: previous }]); } const channel = audio.voiceChannel!; if (channel.listeners.length >= 4 && !(await message.member.canManage(channel))) { - throw await message.fetchLocale(LanguageKeys.Inhibitors.MusicDjMember); + throw await message.resolveKey(LanguageKeys.Inhibitors.MusicDjMember); } // Set the volume diff --git a/src/commands/Pokemon/ability.ts b/src/commands/Pokemon/ability.ts index d1adad33d03..3f26dd2fd6d 100644 --- a/src/commands/Pokemon/ability.ts +++ b/src/commands/Pokemon/ability.ts @@ -6,28 +6,29 @@ import { fetchGraphQLPokemon, getAbilityDetailsByFuzzy, parseBulbapediaURL } fro import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['abilities', 'pokeability'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.AbilityDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.AbilityExtended), + description: LanguageKeys.Commands.Pokemon.AbilityDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.AbilityExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [ability]: [string]) { - const language = await message.fetchLanguage(); - const abilityDetails = await this.fetchAPI(language, ability.toLowerCase()); - const embedTitles = language.get(LanguageKeys.Commands.Pokemon.AbilityEmbedTitles); + const t = await message.fetchT(); + const abilityDetails = await this.fetchAPI(t, ability.toLowerCase()); + const embedTitles = t(LanguageKeys.Commands.Pokemon.AbilityEmbedTitles); const embed = new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setAuthor(`${embedTitles.authorTitle} - ${toTitleCase(abilityDetails.name)}`, CdnUrls.Pokedex) .setDescription(abilityDetails.desc || abilityDetails.shortDesc) .addField( - language.get(LanguageKeys.System.PokedexExternalResource), + t(LanguageKeys.System.PokedexExternalResource), [ `[Bulbapedia](${parseBulbapediaURL(abilityDetails.bulbapediaPage)} )`, `[Serebii](${abilityDetails.serebiiPage})`, @@ -42,12 +43,12 @@ export default class extends SkyraCommand { return message.send(embed); } - private async fetchAPI(language: Language, ability: string) { + private async fetchAPI(t: TFunction, ability: string) { try { const { data } = await fetchGraphQLPokemon<'getAbilityDetailsByFuzzy'>(getAbilityDetailsByFuzzy, { ability }); return data.getAbilityDetailsByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.AbilityQueryFail, { ability }); + throw t(LanguageKeys.Commands.Pokemon.AbilityQueryFail, { ability }); } } } diff --git a/src/commands/Pokemon/flavors.ts b/src/commands/Pokemon/flavors.ts index 5521085afed..d215797e40d 100644 --- a/src/commands/Pokemon/flavors.ts +++ b/src/commands/Pokemon/flavors.ts @@ -10,35 +10,35 @@ import { DexDetails } from '@favware/graphql-pokemon'; import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['flavor', 'flavour', 'flavours'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.FlavorsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.FlavorsExtended), + description: LanguageKeys.Commands.Pokemon.FlavorsDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.FlavorsExtended, usage: '', flagSupport: true }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [pokemon]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const pokemonData = await this.fetchAPI(language, pokemon.toLowerCase()); + const pokemonData = await this.fetchAPI(t, pokemon.toLowerCase()); await this.buildDisplay(message, pokemonData).start(response, message.author.id); return response; } - private async fetchAPI(language: Language, pokemon: string) { + private async fetchAPI(t: TFunction, pokemon: string) { try { const { data } = await fetchGraphQLPokemon<'getPokemonDetailsByFuzzy'>(getPokemonFlavorTextsByFuzzy, { pokemon }); return data.getPokemonDetailsByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.FlavorsQueryFail, { pokemon }); + throw t(LanguageKeys.Commands.Pokemon.FlavorsQueryFail, { pokemon }); } } diff --git a/src/commands/Pokemon/item.ts b/src/commands/Pokemon/item.ts index dca47838f1f..fbfa2a5a1c7 100644 --- a/src/commands/Pokemon/item.ts +++ b/src/commands/Pokemon/item.ts @@ -6,23 +6,24 @@ import { fetchGraphQLPokemon, getItemDetailsByFuzzy, parseBulbapediaURL } from ' import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['pokeitem', 'bag'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.ItemDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.ItemExtended), + description: LanguageKeys.Commands.Pokemon.ItemDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.ItemExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [item]: [string]) { - const language = await message.fetchLanguage(); - const itemDetails = await this.fetchAPI(language, item.toLowerCase()); + const t = await message.fetchT(); + const itemDetails = await this.fetchAPI(t, item.toLowerCase()); - const embedTranslations = language.get(LanguageKeys.Commands.Pokemon.ItemEmbedData, { - availableInGen8: language.get(itemDetails.isNonstandard === 'Past' ? LanguageKeys.Globals.No : LanguageKeys.Globals.Yes) + const embedTranslations = t(LanguageKeys.Commands.Pokemon.ItemEmbedData, { + availableInGen8: t(itemDetails.isNonstandard === 'Past' ? LanguageKeys.Globals.No : LanguageKeys.Globals.Yes) }); return message.send( new MessageEmbed() @@ -33,7 +34,7 @@ export default class extends SkyraCommand { .addField(embedTranslations.generationIntroduced, itemDetails.generationIntroduced, true) .addField(embedTranslations.availableInGeneration8Title, embedTranslations.availableInGeneration8Data, true) .addField( - language.get(LanguageKeys.System.PokedexExternalResource), + t(LanguageKeys.System.PokedexExternalResource), [ `[Bulbapedia](${parseBulbapediaURL(itemDetails.bulbapediaPage)} )`, `[Serebii](${itemDetails.serebiiPage})`, @@ -43,12 +44,12 @@ export default class extends SkyraCommand { ); } - private async fetchAPI(language: Language, item: string) { + private async fetchAPI(t: TFunction, item: string) { try { const { data } = await fetchGraphQLPokemon<'getItemDetailsByFuzzy'>(getItemDetailsByFuzzy, { item }); return data.getItemDetailsByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.ItemQueryFail, { item }); + throw t(LanguageKeys.Commands.Pokemon.ItemQueryFail, { item }); } } } diff --git a/src/commands/Pokemon/learn.ts b/src/commands/Pokemon/learn.ts index 758dbae5e4d..2ff32050335 100644 --- a/src/commands/Pokemon/learn.ts +++ b/src/commands/Pokemon/learn.ts @@ -11,15 +11,15 @@ import { LearnsetEntry, LearnsetLevelUpMove } from '@favware/graphql-pokemon'; import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const kPokemonGenerations = new Set(['1', '2', '3', '4', '5', '6', '7', '8']); @ApplyOptions({ aliases: ['learnset', 'learnall'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.LearnDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.LearnExtended), + description: LanguageKeys.Commands.Pokemon.LearnDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.LearnExtended, usage: '[generation:generation] ', usageDelim: ' ', flagSupport: true @@ -29,47 +29,47 @@ const kPokemonGenerations = new Set(['1', '2', '3', '4', '5', '6', '7', '8']); 'generation', async (arg, possible, message) => { if (kPokemonGenerations.has(arg)) return message.client.arguments.get('integer')!.run(arg, possible, message); - throw await message.fetchLocale(LanguageKeys.Commands.Pokemon.LearnInvalidGeneration, { generation: arg }); + throw await message.resolveKey(LanguageKeys.Commands.Pokemon.LearnInvalidGeneration, { generation: arg }); } ] ]) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [generation = 8, pokemon, moves]: [number, string, string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const movesList = moves.split(', '); - const learnsetData = await this.fetchAPI(pokemon, movesList, generation, language); + const learnsetData = await this.fetchAPI(pokemon, movesList, generation, t); - await this.buildDisplay(message, learnsetData, generation, movesList, language) // + await this.buildDisplay(message, learnsetData, generation, movesList, t) // .start(response, message.author.id); return response; } - private async fetchAPI(pokemon: string, moves: string[], generation: number, language: Language) { + private async fetchAPI(pokemon: string, moves: string[], generation: number, t: TFunction) { try { const { data } = await fetchGraphQLPokemon<'getPokemonLearnsetByFuzzy'>(getPokemonLearnsetByFuzzy, { pokemon, moves, generation }); return data.getPokemonLearnsetByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.LearnQueryFailed, { + throw t(LanguageKeys.Commands.Pokemon.LearnQueryFailed, { pokemon, - moves: language.list(moves, language.get(LanguageKeys.Globals.And)) + moves }); } } - private parseMove(language: Language, pokemon: string, generation: number, move: string, method: string) { - return language.get(LanguageKeys.Commands.Pokemon.LearnMethod, { generation, pokemon, move, method }); + private parseMove(t: TFunction, pokemon: string, generation: number, move: string, method: string) { + return t(LanguageKeys.Commands.Pokemon.LearnMethod, { generation, pokemon, move, method }); } - private buildDisplay(message: GuildMessage, learnsetData: LearnsetEntry, generation: number, moves: string[], language: Language) { + private buildDisplay(message: GuildMessage, learnsetData: LearnsetEntry, generation: number, moves: string[], t: TFunction) { const display = new UserRichDisplay( new MessageEmbed() .setColor(resolveColour(learnsetData.color)) .setAuthor(`#${learnsetData.num} - ${toTitleCase(learnsetData.species)}`, CdnUrls.Pokedex) - .setTitle(language.get(LanguageKeys.Commands.Pokemon.LearnTitle, { pokemon: learnsetData.species, generation })) + .setTitle(t(LanguageKeys.Commands.Pokemon.LearnTitle, { pokemon: learnsetData.species, generation })) .setThumbnail(message.flagArgs.shiny ? learnsetData.shinySprite : learnsetData.sprite) ); @@ -80,9 +80,9 @@ export default class extends RichDisplayCommand { if (learnableMethods.length === 0) { return display.addPage((embed: MessageEmbed) => embed.setDescription( - language.get(LanguageKeys.Commands.Pokemon.LearnCannotLearn, { + t(LanguageKeys.Commands.Pokemon.LearnCannotLearn, { pokemon: learnsetData.species, - moves: language.list(moves, language.get(LanguageKeys.Globals.Or)) + moves }) ) ); @@ -90,8 +90,8 @@ export default class extends RichDisplayCommand { for (const [methodName, methodData] of learnableMethods) { const method = methodData.map((move) => { - const methodTypes = language.get(LanguageKeys.Commands.Pokemon.LearnMethodTypes, { level: move.level }); - return this.parseMove(language, learnsetData.species, move.generation!, move.name!, methodTypes[methodName]); + const methodTypes = t(LanguageKeys.Commands.Pokemon.LearnMethodTypes, { level: move.level }); + return this.parseMove(t, learnsetData.species, move.generation!, move.name!, methodTypes[methodName]); }); display.addPage((embed) => embed.setDescription(method)); diff --git a/src/commands/Pokemon/move.ts b/src/commands/Pokemon/move.ts index d4c197bab01..90a1e7cefd9 100644 --- a/src/commands/Pokemon/move.ts +++ b/src/commands/Pokemon/move.ts @@ -11,41 +11,41 @@ import { MoveEntry } from '@favware/graphql-pokemon'; import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.MoveDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.MoveExtended), + description: LanguageKeys.Commands.Pokemon.MoveDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.MoveExtended, usage: '' }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [move]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const moveData = await this.fetchAPI(move.toLowerCase(), language); + const moveData = await this.fetchAPI(move.toLowerCase(), t); - const display = await this.buildDisplay(message, moveData, language); + const display = await this.buildDisplay(message, moveData, t); await display.start(response, message.author.id); return response; } - private async fetchAPI(move: string, language: Language) { + private async fetchAPI(move: string, t: TFunction) { try { const { data } = await fetchGraphQLPokemon<'getMoveDetailsByFuzzy'>(getMoveDetailsByFuzzy, { move }); return data.getMoveDetailsByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.MoveQueryFail, { move }); + throw t(LanguageKeys.Commands.Pokemon.MoveQueryFail, { move }); } } - private async buildDisplay(message: GuildMessage, moveData: MoveEntry, language: Language) { - const embedTranslations = language.get(LanguageKeys.Commands.Pokemon.MoveEmbedData, { - availableInGen8: language.get(moveData.isNonstandard === 'Past' ? LanguageKeys.Globals.No : LanguageKeys.Globals.Yes) + private async buildDisplay(message: GuildMessage, moveData: MoveEntry, t: TFunction) { + const embedTranslations = t(LanguageKeys.Commands.Pokemon.MoveEmbedData, { + availableInGen8: t(moveData.isNonstandard === 'Past' ? LanguageKeys.Globals.No : LanguageKeys.Globals.Yes) }); - const externalResources = language.get(LanguageKeys.System.PokedexExternalResource); + const externalResources = t(LanguageKeys.System.PokedexExternalResource); const externalSources = [ `[Bulbapedia](${parseBulbapediaURL(moveData.bulbapediaPage)} )`, `[Serebii](${moveData.serebiiPage})`, diff --git a/src/commands/Pokemon/pokedex.ts b/src/commands/Pokemon/pokedex.ts index a16585c59fa..0d04857c430 100644 --- a/src/commands/Pokemon/pokedex.ts +++ b/src/commands/Pokemon/pokedex.ts @@ -11,7 +11,7 @@ import { AbilitiesEntry, DexDetails, GenderEntry, StatsEntry } from '@favware/gr import { toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; enum BaseStats { hp = 'HP', @@ -25,31 +25,31 @@ enum BaseStats { @ApplyOptions({ aliases: ['pokemon', 'dex', 'mon', 'poke', 'dexter'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.PokedexDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.PokedexExtended), + description: LanguageKeys.Commands.Pokemon.PokedexDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.PokedexExtended, requiredPermissions: ['EMBED_LINKS'], usage: '', flagSupport: true }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [pokemon]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const pokeDetails = await this.fetchAPI(pokemon.toLowerCase(), language); + const pokeDetails = await this.fetchAPI(pokemon.toLowerCase(), t); - await this.buildDisplay(message, pokeDetails, language) // + await this.buildDisplay(message, pokeDetails, t) // .start(response, message.author.id); return response; } - private async fetchAPI(pokemon: string, language: Language) { + private async fetchAPI(pokemon: string, t: TFunction) { try { const { data } = await fetchGraphQLPokemon<'getPokemonDetailsByFuzzy'>(getPokemonDetailsByFuzzy, { pokemon }); return data.getPokemonDetailsByFuzzy; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.PokedexQueryFail, { pokemon }); + throw t(LanguageKeys.Commands.Pokemon.PokedexQueryFail, { pokemon }); } } @@ -151,17 +151,17 @@ export default class extends RichDisplayCommand { return evoChain; } - private buildDisplay(message: GuildMessage, pokeDetails: DexDetails, language: Language) { + private buildDisplay(message: GuildMessage, pokeDetails: DexDetails, t: TFunction) { const abilities = this.getAbilities(pokeDetails.abilities); const baseStats = this.getBaseStats(pokeDetails.baseStats); const evoChain = this.getEvoChain(pokeDetails); - const embedTranslations = language.get(LanguageKeys.Commands.Pokemon.PokedexEmbedData, { + const embedTranslations = t(LanguageKeys.Commands.Pokemon.PokedexEmbedData, { otherFormes: pokeDetails.otherFormes ?? [], cosmeticFormes: pokeDetails.cosmeticFormes ?? [] }); if (pokeDetails.num <= 0) return this.parseCAPPokemon({ message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }); - return this.parseRegularPokemon({ message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }, language); + return this.parseRegularPokemon({ message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }, t); } private parseCAPPokemon({ message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }: PokemonToDisplayArgs) { @@ -191,11 +191,8 @@ export default class extends RichDisplayCommand { ); } - private parseRegularPokemon( - { message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }: PokemonToDisplayArgs, - language: Language - ) { - const externalResources = language.get(LanguageKeys.System.PokedexExternalResource); + private parseRegularPokemon({ message, pokeDetails, abilities, baseStats, evoChain, embedTranslations }: PokemonToDisplayArgs, t: TFunction) { + const externalResources = t(LanguageKeys.System.PokedexExternalResource); const externalResourceData = [ `[Bulbapedia](${parseBulbapediaURL(pokeDetails.bulbapediaPage)} )`, `[Serebii](${pokeDetails.serebiiPage})`, diff --git a/src/commands/Pokemon/type.ts b/src/commands/Pokemon/type.ts index db7d1158c35..f5f4d21895f 100644 --- a/src/commands/Pokemon/type.ts +++ b/src/commands/Pokemon/type.ts @@ -10,7 +10,7 @@ import { pickRandom } from '#utils/util'; import { TypeEntry, TypeMatchups, Types } from '@favware/graphql-pokemon'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const kPokemonTypes = new Set([ 'bug', @@ -36,8 +36,8 @@ const kPokemonTypes = new Set([ @ApplyOptions({ aliases: ['matchup', 'weakness', 'advantage'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Pokemon.TypeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Pokemon.TypeExtended), + description: LanguageKeys.Commands.Pokemon.TypeDescription, + extendedHelp: LanguageKeys.Commands.Pokemon.TypeExtended, usage: '' }) @CreateResolvers([ @@ -46,10 +46,10 @@ const kPokemonTypes = new Set([ async (arg: string | string[], _, message) => { arg = (arg as string).toLowerCase().split(' '); - if (arg.length > 2) throw await message.fetchLocale(LanguageKeys.Commands.Pokemon.TypeTooManyTypes); + if (arg.length > 2) throw await message.resolveKey(LanguageKeys.Commands.Pokemon.TypeTooManyTypes); for (const type of arg) { - if (!kPokemonTypes.has(type)) throw await message.fetchLocale(LanguageKeys.Commands.Pokemon.TypeNotAType, { type }); + if (!kPokemonTypes.has(type)) throw await message.resolveKey(LanguageKeys.Commands.Pokemon.TypeNotAType, { type }); } return arg; @@ -58,24 +58,24 @@ const kPokemonTypes = new Set([ ]) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [types]: [Types[]]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const typeMatchups = await this.fetchAPI(types, language); + const typeMatchups = await this.fetchAPI(types, t); - const display = await this.buildDisplay(message, types, typeMatchups, language); + const display = await this.buildDisplay(message, types, typeMatchups, t); await display.start(response, message.author.id); return response; } - private async fetchAPI(types: Types[], language: Language) { + private async fetchAPI(types: Types[], t: TFunction) { try { const { data } = await fetchGraphQLPokemon<'getTypeMatchup'>(getTypeMatchup, { types }); return data.getTypeMatchup; } catch { - throw language.get(LanguageKeys.Commands.Pokemon.TypeQueryFail, { - types: types.map((val) => `\`${val}\``).join(` ${language.get(LanguageKeys.Globals.And)} `) + throw t(LanguageKeys.Commands.Pokemon.TypeQueryFail, { + types: types.map((val) => `\`${val}\``) }); } } @@ -100,9 +100,9 @@ export default class extends RichDisplayCommand { return regularMatchup.map((type) => `\`${type}\``).join(', '); } - private async buildDisplay(message: GuildMessage, types: Types[], typeMatchups: TypeMatchups, language: Language) { - const embedTranslations = language.get(LanguageKeys.Commands.Pokemon.TypeEmbedData, { types }); - const externalResources = language.get(LanguageKeys.System.PokedexExternalResource); + private async buildDisplay(message: GuildMessage, types: Types[], typeMatchups: TypeMatchups, t: TFunction) { + const embedTranslations = t(LanguageKeys.Commands.Pokemon.TypeEmbedData, { types }); + const externalResources = t(LanguageKeys.System.PokedexExternalResource); const externalSources = [ `[Bulbapedia](${parseBulbapediaURL(`https://bulbapedia.bulbagarden.net/wiki/${types[0]}_(type)`)} )`, `[Serebii](https://www.serebii.net/pokedex-sm/${types[0].toLowerCase()}.shtml)`, diff --git a/src/commands/Social/Member Management/social.ts b/src/commands/Social/Member Management/social.ts index 03124482f0b..1b11dcf2d87 100644 --- a/src/commands/Social/Member Management/social.ts +++ b/src/commands/Social/Member Management/social.ts @@ -9,8 +9,8 @@ import { User } from 'discord.js'; @ApplyOptions({ bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.SocialDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.SocialExtended), + description: LanguageKeys.Commands.Social.SocialDescription, + extendedHelp: LanguageKeys.Commands.Social.SocialExtended, permissionLevel: PermissionLevels.Administrator, runIn: ['text'], subcommands: true, @@ -35,9 +35,7 @@ export default class extends SkyraCommand { settings.points = newAmount; await settings.save(); - return message.sendLocale(amount === 1 ? LanguageKeys.Commands.Social.SocialAdd : LanguageKeys.Commands.Social.SocialAddPlural, [ - { user: user.username, amount: newAmount, count: amount } - ]); + return message.sendTranslated(LanguageKeys.Commands.Social.SocialAdd, [{ user: user.username, amount: newAmount, count: amount }]); } const created = new MemberEntity(); @@ -46,23 +44,19 @@ export default class extends SkyraCommand { created.points = amount; await members.insert(created); - return message.sendLocale(amount === 1 ? LanguageKeys.Commands.Social.SocialAdd : LanguageKeys.Commands.Social.SocialAddPlural, [ - { user: user.username, amount, count: amount } - ]); + return message.sendTranslated(LanguageKeys.Commands.Social.SocialAdd, [{ user: user.username, amount, count: amount }]); } public async remove(message: GuildMessage, [user, amount]: [User, number]) { const { members } = await DbSet.connect(); const settings = await members.findOne({ where: { userID: user.id, guildID: message.guild.id } }); - if (!settings) throw await message.fetchLocale(LanguageKeys.Commands.Social.SocialMemberNotexists); + if (!settings) throw await message.resolveKey(LanguageKeys.Commands.Social.SocialMemberNotExists); const newAmount = Math.max(settings.points - amount, 0); settings.points = newAmount; await settings.save(); - return message.sendLocale(amount === 1 ? LanguageKeys.Commands.Social.SocialRemove : LanguageKeys.Commands.Social.SocialRemovePlural, [ - { user: user.username, amount: newAmount, count: amount } - ]); + return message.sendTranslated(LanguageKeys.Commands.Social.SocialRemove, [{ user: user.username, amount: newAmount, count: amount }]); } public async set(message: GuildMessage, [user, amount]: [User, number]) { @@ -85,17 +79,17 @@ export default class extends SkyraCommand { } const variation = amount - oldValue; - const language = await message.fetchLanguage(); - if (variation === 0) return language.get(LanguageKeys.Commands.Social.SocialUnchanged, { user: user.username }); + const t = await message.fetchT(); + if (variation === 0) return t(LanguageKeys.Commands.Social.SocialUnchanged, { user: user.username }); return message.send( variation > 0 - ? language.get(variation === 1 ? LanguageKeys.Commands.Social.SocialAdd : LanguageKeys.Commands.Social.SocialAddPlural, { + ? t(LanguageKeys.Commands.Social.SocialAdd, { user: user.username, amount, count: variation }) - : language.get(variation === -1 ? LanguageKeys.Commands.Social.SocialRemove : LanguageKeys.Commands.Social.SocialRemovePlural, { + : t(LanguageKeys.Commands.Social.SocialRemove, { user: user.username, amount, count: -variation @@ -106,6 +100,6 @@ export default class extends SkyraCommand { public async reset(message: GuildMessage, [user]: [User]) { const { members } = await DbSet.connect(); await members.delete({ userID: user.id, guildID: message.guild.id }); - return message.sendLocale(LanguageKeys.Commands.Social.SocialReset, [{ user: user.username }]); + return message.sendTranslated(LanguageKeys.Commands.Social.SocialReset, [{ user: user.username }]); } } diff --git a/src/commands/Social/Profile Management/banner.ts b/src/commands/Social/Profile Management/banner.ts index 2284a5491da..e20da9821f5 100644 --- a/src/commands/Social/Profile Management/banner.ts +++ b/src/commands/Social/Profile Management/banner.ts @@ -9,7 +9,7 @@ import { pickRandom } from '#utils/util'; import { roundNumber } from '@sapphire/utilities'; import { ApplyOptions, requiredPermissions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { getManager } from 'typeorm'; const CDN_URL = CdnUrls.BannersBasePath; @@ -18,8 +18,8 @@ const CDN_URL = CdnUrls.BannersBasePath; aliases: ['banners', 'wallpaper', 'wallpapers', 'background', 'backgrounds'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.BannerDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.BannerExtended), + description: LanguageKeys.Commands.Social.BannerDescription, + extendedHelp: LanguageKeys.Commands.Social.BannerExtended, requiredPermissions: ['MANAGE_MESSAGES'], runIn: ['text'], subcommands: true, @@ -34,7 +34,7 @@ export default class extends SkyraCommand { @requiredPermissions(['EMBED_LINKS']) public async buy(message: GuildMessage, [banner]: [BannerCache]) { - const [{ users }, [prefix, language]] = await Promise.all([ + const [{ users }, [prefix, t]] = await Promise.all([ DbSet.connect(), message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()] as const) ]); @@ -42,15 +42,13 @@ export default class extends SkyraCommand { const author = await users.ensureProfile(message.author.id); const banners = new Set(author.profile.banners); if (banners.has(banner.id)) { - throw language.get(LanguageKeys.Commands.Social.BannerBought, { prefix, banner: banner.id }); + throw t(LanguageKeys.Commands.Social.BannerBought, { prefix, banner: banner.id }); } - if (author.money < banner.price) throw language.get(LanguageKeys.Commands.Social.BannerMoney, { money: author.money, cost: banner.price }); + if (author.money < banner.price) throw t(LanguageKeys.Commands.Social.BannerMoney, { money: author.money, cost: banner.price }); const accepted = await this.prompt(message, banner); - if (!accepted) throw language.get(LanguageKeys.Commands.Social.BannerPaymentCancelled); - - if (author.money < banner.price) throw language.get(LanguageKeys.Commands.Social.BannerMoney, { money: author.money, cost: banner.price }); + if (!accepted) throw t(LanguageKeys.Commands.Social.BannerPaymentCancelled); await getManager().transaction(async (em) => { const existingBannerAuthor = await em.findOne(UserEntity, banner.author); @@ -70,58 +68,58 @@ export default class extends SkyraCommand { await em.save(author); }); - return message.send(language.get(LanguageKeys.Commands.Social.BannerBuy, { banner: banner.title })); + return message.send(t(LanguageKeys.Commands.Social.BannerBuy, { banner: banner.title })); } public async reset(message: GuildMessage) { - const [{ users }, [prefix, language]] = await Promise.all([ + const [{ users }, [prefix, t]] = await Promise.all([ DbSet.connect(), message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()] as const) ]); await users.lock([message.author.id], async (id) => { const user = await users.ensureProfile(id); - if (!user.profile.banners.length) throw language.get(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); - if (user.profile.bannerProfile === '0001') throw language.get(LanguageKeys.Commands.Social.BannerResetDefault); + if (!user.profile.banners.length) throw t(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); + if (user.profile.bannerProfile === '0001') throw t(LanguageKeys.Commands.Social.BannerResetDefault); user.profile.bannerProfile = '0001'; return user.save(); }); - return message.send(language.get(LanguageKeys.Commands.Social.BannerReset)); + return message.send(t(LanguageKeys.Commands.Social.BannerReset)); } public async set(message: GuildMessage, [banner]: [BannerCache]) { - const [{ users }, [prefix, language]] = await Promise.all([ + const [{ users }, [prefix, t]] = await Promise.all([ DbSet.connect(), message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()] as const) ]); await users.lock([message.author.id], async (id) => { const user = await users.ensureProfile(id); - if (!user.profile.banners.length) throw language.get(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); - if (!user.profile.banners.includes(banner.id)) throw language.get(LanguageKeys.Commands.Social.BannerSetNotBought); + if (!user.profile.banners.length) throw t(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); + if (!user.profile.banners.includes(banner.id)) throw t(LanguageKeys.Commands.Social.BannerSetNotBought); user.profile.bannerProfile = banner.id; return user.save(); }); - return message.send(language.get(LanguageKeys.Commands.Social.BannerSet, { banner: banner.title })); + return message.send(t(LanguageKeys.Commands.Social.BannerSet, { banner: banner.title })); } @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async show(message: GuildMessage) { - const [response] = await this.listPrompt.createPrompt(message).run(await message.fetchLocale(LanguageKeys.Commands.Social.BannerPrompt)); + const [response] = await this.listPrompt.createPrompt(message).run(await message.resolveKey(LanguageKeys.Commands.Social.BannerPrompt)); return response === 'all' ? this.buyList(message) : this.userList(message); } public async init() { this.createCustomResolver('banner', async (arg, _, message, [type]) => { if (type === 'show' || type === 'reset') return undefined; - if (!arg) throw await message.fetchLocale(LanguageKeys.Commands.Social.BannerMissing, type); + if (!arg) throw await message.resolveKey(LanguageKeys.Commands.Social.BannerMissing, type); const banner = this.banners.get(arg); if (banner) return banner; - throw await message.fetchLocale(LanguageKeys.Commands.Social.BannerNotexists, { + throw await message.resolveKey(LanguageKeys.Commands.Social.BannerNotExists, { prefix: await message.guild!.readSettings(GuildSettings.Prefix) }); }); @@ -151,16 +149,16 @@ export default class extends SkyraCommand { } private async buyList(message: GuildMessage) { - return this.runDisplay(message, await message.fetchLanguage(), this.display); + return this.runDisplay(message, await message.fetchT(), this.display); } private async userList(message: GuildMessage) { - const [prefix, language] = await message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); + const [prefix, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); const { users } = await DbSet.connect(); const user = await users.ensureProfile(message.author.id); const banners = new Set(user.profile.banners); - if (!banners.size) throw language.get(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); + if (!banners.size) throw t(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const id of banners) { @@ -175,13 +173,13 @@ export default class extends SkyraCommand { } } - return this.runDisplay(message, language, display); + return this.runDisplay(message, t, display); } - private async runDisplay(message: GuildMessage, language: Language, display: UserRichDisplay | null) { + private async runDisplay(message: GuildMessage, t: TFunction, display: UserRichDisplay | null) { if (display !== null) { const response = await message.send( - new MessageEmbed({ description: pickRandom(language.get(LanguageKeys.System.Loading)), color: BrandingColors.Secondary }) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); await display.start(response, message.author.id); return response; diff --git a/src/commands/Social/Profile Management/toggledarkmode.ts b/src/commands/Social/Profile Management/toggledarkmode.ts index 1ae577df7d0..07d0b485d7e 100644 --- a/src/commands/Social/Profile Management/toggledarkmode.ts +++ b/src/commands/Social/Profile Management/toggledarkmode.ts @@ -7,8 +7,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['darkmode', 'toggledarktheme', 'darktheme'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Social.ToggleDarkModeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.ToggleDarkModeExtended) + description: LanguageKeys.Commands.Social.ToggleDarkModeDescription, + extendedHelp: LanguageKeys.Commands.Social.ToggleDarkModeExtended }) export default class extends SkyraCommand { public async run(message: KlasaMessage, []: []) { @@ -20,7 +20,7 @@ export default class extends SkyraCommand { return user.save(); }); - return message.sendLocale( + return message.sendTranslated( updated.profile.darkTheme ? LanguageKeys.Commands.Social.ToggleDarkModeEnabled : LanguageKeys.Commands.Social.ToggleDarkModeDisabled ); } diff --git a/src/commands/Social/autorole.ts b/src/commands/Social/autorole.ts index fa11eb3e04c..bf739fd6dc4 100644 --- a/src/commands/Social/autorole.ts +++ b/src/commands/Social/autorole.ts @@ -12,8 +12,8 @@ const SORT = (x: RolesAuto, y: RolesAuto) => Number(x.points > y.points) || Numb @ApplyOptions({ aliases: ['autoroles', 'levelrole', 'lvlrole'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.AutoRoleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.AutoRoleExtended), + description: LanguageKeys.Commands.Social.AutoRoleDescription, + extendedHelp: LanguageKeys.Commands.Social.AutoRoleExtended, permissionLevel: PermissionLevels.Administrator, requiredGuildPermissions: ['MANAGE_ROLES'], runIn: ['text'], @@ -39,16 +39,16 @@ const SORT = (x: RolesAuto, y: RolesAuto) => Number(x.points > y.points) || Numb ]) export default class extends SkyraCommand { public async init() { - this.customizeResponse('role', (message) => message.fetchLocale(LanguageKeys.Misc.CommandRequireRole)) // - .customizeResponse('points', (message) => message.fetchLocale(LanguageKeys.Commands.Social.AutoRolePointsRequired)); + this.customizeResponse('role', (message) => message.resolveKey(LanguageKeys.Commands.Social.AutoRoleRequireRole)) // + .customizeResponse('points', (message) => message.resolveKey(LanguageKeys.Commands.Social.AutoRolePointsRequired)); } public async show(message: GuildMessage) { const output = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = settings.getLanguage(); const autoRoles = settings[GuildSettings.Roles.Auto]; - if (!autoRoles.length) throw language.get(LanguageKeys.Commands.Social.AutoRoleListEmpty); + if (!autoRoles.length) throw t(LanguageKeys.Commands.Social.AutoRoleListEmpty); const filtered = new Set(autoRoles); const output: string[] = []; @@ -62,7 +62,7 @@ export default class extends SkyraCommand { settings[GuildSettings.Roles.Auto] = [...filtered]; } - if (!output.length) throw language.get(LanguageKeys.Commands.Social.AutoRoleListEmpty); + if (!output.length) throw t(LanguageKeys.Commands.Social.AutoRoleListEmpty); return output; }); @@ -71,58 +71,58 @@ export default class extends SkyraCommand { } public async add(message: GuildMessage, [role, points]: [Role, number]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const roles = settings[GuildSettings.Roles.Auto]; if (roles.length && roles.some((entry) => entry.id === role.id)) { - throw language.get(LanguageKeys.Commands.Social.AutoRoleUpdateConfigured); + throw t(LanguageKeys.Commands.Social.AutoRoleUpdateConfigured); } const sorted = [...roles, { id: role.id, points }].sort(SORT); settings[GuildSettings.Roles.Auto] = sorted; - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Social.AutoRoleAdd, { role, points })); + return message.send(t(LanguageKeys.Commands.Social.AutoRoleAdd, { role, points })); } public async remove(message: GuildMessage, [role]: [Role]) { - const [roleEntry, language] = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const [roleEntry, t] = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const roles = settings[GuildSettings.Roles.Auto]; const roleIndex = roles.findIndex((entry) => entry.id === role.id); if (roleIndex === -1) { - throw language.get(LanguageKeys.Commands.Social.AutoRoleUpdateConfigured); + throw t(LanguageKeys.Commands.Social.AutoRoleUpdateUnconfigured); } const roleEntry = roles[roleIndex]; roles.splice(roleIndex, 1); - return [roleEntry, language]; + return [roleEntry, t]; }); - return message.send(language.get(LanguageKeys.Commands.Social.AutoRoleRemove, { role, before: roleEntry.points })); + return message.send(t(LanguageKeys.Commands.Social.AutoRoleRemove, { role, before: roleEntry.points })); } public async update(message: GuildMessage, [role, points]: [Role, number]) { - const [autoRole, language] = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const [autoRole, t] = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const roleIndex = settings[GuildSettings.Roles.Auto].findIndex((entry) => entry.id === role.id); if (roleIndex === -1) { - throw language.get(LanguageKeys.Commands.Social.AutoRoleUpdateUnconfigured); + throw t(LanguageKeys.Commands.Social.AutoRoleUpdateUnconfigured); } const autoRole = settings[GuildSettings.Roles.Auto][roleIndex]; const clone = deepClone(settings[GuildSettings.Roles.Auto]); settings[GuildSettings.Roles.Auto] = clone.sort(SORT); - return [autoRole, language]; + return [autoRole, t]; }); - return message.send(language.get(LanguageKeys.Commands.Social.AutoRoleUpdate, { role, points, before: autoRole.points })); + return message.send(t(LanguageKeys.Commands.Social.AutoRoleUpdate, { role, points, before: autoRole.points })); } } diff --git a/src/commands/Social/balance.ts b/src/commands/Social/balance.ts index 7246b88249a..f76806aca86 100644 --- a/src/commands/Social/balance.ts +++ b/src/commands/Social/balance.ts @@ -10,22 +10,22 @@ export default class extends SkyraCommand { aliases: ['bal', 'credits'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.BalanceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.BalanceExtended), + description: LanguageKeys.Commands.Social.BalanceDescription, + extendedHelp: LanguageKeys.Commands.Social.BalanceExtended, usage: '[user:username]', spam: true }); } public async run(message: KlasaMessage, [user = message.author]: [User]) { - const language = await message.fetchLanguage(); - if (user.bot) throw language.get(LanguageKeys.Commands.Social.BalanceBots); + const t = await message.fetchT(); + if (user.bot) throw t(LanguageKeys.Commands.Social.BalanceBots); const { users } = await DbSet.connect(); const money = (await users.findOne(user.id))?.money ?? 0; return message.author === user - ? message.send(language.get(LanguageKeys.Commands.Social.BalanceSelf, { amount: language.groupDigits(money) })) - : message.send(language.get(LanguageKeys.Commands.Social.Balance, { user: user.username, amount: language.groupDigits(money) })); + ? message.send(t(LanguageKeys.Commands.Social.BalanceSelf, { amount: money })) + : message.send(t(LanguageKeys.Commands.Social.Balance, { user: user.username, amount: money })); } } diff --git a/src/commands/Social/daily.ts b/src/commands/Social/daily.ts index ec2bef08501..5780e42e73d 100644 --- a/src/commands/Social/daily.ts +++ b/src/commands/Social/daily.ts @@ -4,7 +4,8 @@ import { Schedules } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Time } from '#utils/constants'; import { ApplyOptions } from '@skyra/decorators'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const GRACE_PERIOD = Time.Hour; const DAILY_PERIOD = Time.Hour * 12; @@ -14,8 +15,8 @@ const REMINDER_FLAGS = ['remind', 'reminder', 'remindme']; @ApplyOptions({ aliases: ['dailies'], cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.DailyDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.DailyExtended), + description: LanguageKeys.Commands.Social.DailyDescription, + extendedHelp: LanguageKeys.Commands.Social.DailyExtended, spam: true, flagSupport: true }) @@ -23,7 +24,7 @@ export default class extends SkyraCommand { public async run(message: KlasaMessage) { const now = Date.now(); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const connection = await DbSet.connect(); return connection.users.lock([message.author.id], async (id) => { const settings = await connection.users.ensureCooldowns(id); @@ -33,8 +34,8 @@ export default class extends SkyraCommand { // It's been 12 hours, grant dailies if (!settings.cooldowns.daily || settings.cooldowns.daily.getTime() <= now) { return message.send( - language.get(LanguageKeys.Commands.Social.DailyTimeSuccess, { - amount: await this.claimDaily(message, language, connection, settings, now + DAILY_PERIOD, toRemind) + t(LanguageKeys.Commands.Social.DailyTimeSuccess, { + amount: await this.claimDaily(message, t, connection, settings, now + DAILY_PERIOD, toRemind) }) ); } @@ -42,23 +43,23 @@ export default class extends SkyraCommand { const remaining = settings.cooldowns.daily.getTime() - now; // If it's not under the grace period (1 hour), tell them the time - if (remaining > GRACE_PERIOD) return message.send(language.get(LanguageKeys.Commands.Social.DailyTime, { time: remaining })); + if (remaining > GRACE_PERIOD) return message.send(t(LanguageKeys.Commands.Social.DailyTime, { time: remaining })); // It's been 11-12 hours, ask for the user if they want to claim the grace period - const accepted = await message.ask(language.get(LanguageKeys.Commands.Social.DailyGrace, { remaining }).join('\n')); - if (!accepted) return message.send(language.get(LanguageKeys.Commands.Social.DailyGraceDenied)); + const accepted = await message.ask(t(LanguageKeys.Commands.Social.DailyGrace, { remaining })); + if (!accepted) return message.send(t(LanguageKeys.Commands.Social.DailyGraceDenied)); // The user accepted the grace period return message.send( - language.get(LanguageKeys.Commands.Social.DailyGraceAccepted, { - amount: await this.claimDaily(message, language, connection, settings, now + remaining + DAILY_PERIOD, toRemind), + t(LanguageKeys.Commands.Social.DailyGraceAccepted, { + amount: await this.claimDaily(message, t, connection, settings, now + remaining + DAILY_PERIOD, toRemind), remaining: remaining + DAILY_PERIOD }) ); }); } - private async claimDaily(message: KlasaMessage, language: Language, connection: DbSet, settings: UserEntity, nextTime: number, remind: boolean) { + private async claimDaily(message: KlasaMessage, t: TFunction, connection: DbSet, settings: UserEntity, nextTime: number, remind: boolean) { const money = this.calculateDailies(message, await connection.clients.ensure(), settings); settings.money += money; @@ -68,7 +69,7 @@ export default class extends SkyraCommand { if (remind) { await this.client.schedules.add(Schedules.Reminder, nextTime, { data: { - content: language.get(LanguageKeys.Commands.Social.DailyCollect), + content: t(LanguageKeys.Commands.Social.DailyCollect), user: message.author.id } }); diff --git a/src/commands/Social/divorce.ts b/src/commands/Social/divorce.ts index eaa7d059bd5..95ce79be97c 100644 --- a/src/commands/Social/divorce.ts +++ b/src/commands/Social/divorce.ts @@ -8,24 +8,24 @@ import { User } from 'discord.js'; import { KlasaMessage } from 'klasa'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Social.DivorceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.DivorceExtended), + description: LanguageKeys.Commands.Social.DivorceDescription, + extendedHelp: LanguageKeys.Commands.Social.DivorceExtended, requiredPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [user]: [User]) { - const language = await message.fetchLanguage(); - if (user === message.author) throw language.get(LanguageKeys.Commands.Social.DivorceSelf); + const t = await message.fetchT(); + if (user === message.author) throw t(LanguageKeys.Commands.Social.DivorceSelf); const { users } = await DbSet.connect(); return users.lock([message.author.id, user.id], async (authorID, targetID) => { const entry = await users.fetchSpouse(authorID, targetID); - if (!entry) return message.sendLocale(LanguageKeys.Commands.Social.DivorceNotTaken); + if (!entry) return message.sendTranslated(LanguageKeys.Commands.Social.DivorceNotTaken); // Ask the user if they're sure - const accept = await message.ask(language.get(LanguageKeys.Commands.Social.DivorcePrompt)); - if (!accept) return message.sendLocale(LanguageKeys.Commands.Social.DivorceCancel); + const accept = await message.ask(t(LanguageKeys.Commands.Social.DivorcePrompt)); + if (!accept) return message.sendTranslated(LanguageKeys.Commands.Social.DivorceCancel); // Remove the spouse await users.deleteSpouse(entry); @@ -34,11 +34,11 @@ export default class extends SkyraCommand { floatPromise( this, resolveOnErrorCodes( - user.send(language.get(LanguageKeys.Commands.Social.DivorceDm, { user: message.author.username })), + user.send(t(LanguageKeys.Commands.Social.DivorceDm, { user: message.author.username })), RESTJSONErrorCodes.CannotSendMessagesToThisUser ) ); - return message.sendLocale(LanguageKeys.Commands.Social.DivorceSuccess, [{ user: user.toString() }]); + return message.sendTranslated(LanguageKeys.Commands.Social.DivorceSuccess, [{ user: user.toString() }]); }); } } diff --git a/src/commands/Social/leaderboard.ts b/src/commands/Social/leaderboard.ts index 924cd1ba81c..3a5bd73d4be 100644 --- a/src/commands/Social/leaderboard.ts +++ b/src/commands/Social/leaderboard.ts @@ -17,8 +17,8 @@ export default class extends SkyraCommand { aliases: ['top', 'scoreboard'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.LeaderboardDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.LeaderboardExtended), + description: LanguageKeys.Commands.Social.LeaderboardDescription, + extendedHelp: LanguageKeys.Commands.Social.LeaderboardExtended, runIn: ['text'], usage: '[global|local] [index:integer]', usageDelim: ' ', @@ -56,9 +56,9 @@ export default class extends SkyraCommand { } } - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (promises.length) { - await message.send(pickRandom(language.get(LanguageKeys.System.Loading))); + await message.send(pickRandom(t(LanguageKeys.System.Loading))); await Promise.all(promises); } for (const value of retrievedPage) { @@ -66,8 +66,8 @@ export default class extends SkyraCommand { } page.push(''); - page.push(language.get(LanguageKeys.FuzzySearch.Page, { page: index + 1, pageCount, results: listSize.toLocaleString() })); - page.push(language.get(LanguageKeys.Misc.CommandScoreboardPosition, { position })); + page.push(t(LanguageKeys.Commands.Social.LeaderboardListifyPage, { page: index + 1, pageCount, results: listSize })); + page.push(t(LanguageKeys.Commands.Social.ScoreboardPosition, { position })); return page; } diff --git a/src/commands/Social/level.ts b/src/commands/Social/level.ts index 2ba09da492e..ba7ab7e45bc 100644 --- a/src/commands/Social/level.ts +++ b/src/commands/Social/level.ts @@ -16,8 +16,8 @@ const THEMES_FOLDER = join(cdnFolder, 'skyra-assets', 'banners'); aliases: ['lvl', 'rank'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.LevelDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.LevelExtended), + description: LanguageKeys.Commands.Social.LevelDescription, + extendedHelp: LanguageKeys.Commands.Social.LevelExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '[local|global] [user:username]', @@ -47,7 +47,8 @@ export default class extends SkyraCommand { fetchAvatar(user, 256) ]); - const title = await message.fetchLocale(LanguageKeys.Commands.Social.Level); + const t = await message.fetchT(); + const title = t(LanguageKeys.Commands.Social.Level); return ( new Canvas(640, 174) // Draw the background @@ -71,15 +72,15 @@ export default class extends SkyraCommand { // Draw the information .setTextAlign('right') - .printText(points.toString(), 606, 73) - .printText((nextLevel - points).toString(), 606, 131) + .printText(t(LanguageKeys.Globals.NumberCompactValue, { value: points }), 606, 73) + .printText(t(LanguageKeys.Globals.NumberValue, { value: nextLevel - points }), 606, 131) // Draw the level .setTextAlign('center') .setTextFont('35px RobotoLight') .printText(title.level, 268, 73) .setTextFont('45px RobotoRegular') - .printText(level.toString(), 268, 128) + .printText(t(LanguageKeys.Globals.NumberValue, { value: level }), 268, 128) // Draw the avatar .save() diff --git a/src/commands/Social/married.ts b/src/commands/Social/married.ts index d0691cbccff..4c894e1d2e3 100644 --- a/src/commands/Social/married.ts +++ b/src/commands/Social/married.ts @@ -11,8 +11,8 @@ import { MessageEmbed } from 'discord.js'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.MarriedDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.MarriedExtended) + description: LanguageKeys.Commands.Social.MarriedDescription, + extendedHelp: LanguageKeys.Commands.Social.MarriedExtended }) export default class extends RichDisplayCommand { public run(message: GuildMessage) { @@ -20,14 +20,14 @@ export default class extends RichDisplayCommand { } private async display(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const { users } = await DbSet.connect(); const spouses = await users.fetchSpouses(message.author.id); - if (spouses.length === 0) return message.sendLocale(LanguageKeys.Commands.Social.MarryNotTaken); + if (spouses.length === 0) return message.send(t(LanguageKeys.Commands.Social.MarryNotTaken)); const usernames = chunk( await Promise.all(spouses.map(async (user) => `${await this.client.users.fetch(user).then((user) => user.username)} (\`${user}\`)`)), @@ -37,9 +37,7 @@ export default class extends RichDisplayCommand { const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const usernameChunk of usernames) { - display.addPage((embed: MessageEmbed) => - embed.setDescription(language.get(LanguageKeys.Commands.Social.MarryWith, { users: usernameChunk })) - ); + display.addPage((embed: MessageEmbed) => embed.setDescription(t(LanguageKeys.Commands.Social.MarryWith, { users: usernameChunk }))); } await display.start(response, message.author.id); diff --git a/src/commands/Social/marry.ts b/src/commands/Social/marry.ts index f83caaa31df..844dcea0604 100644 --- a/src/commands/Social/marry.ts +++ b/src/commands/Social/marry.ts @@ -26,8 +26,8 @@ async function askYesNo(channel: TextChannel | DMChannel | NewsChannel, user: Us @ApplyOptions({ cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.MarryDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.MarryExtended), + description: LanguageKeys.Commands.Social.MarryDescription, + extendedHelp: LanguageKeys.Commands.Social.MarryExtended, usage: '(user:username)' }) @CreateResolvers([ @@ -46,17 +46,17 @@ export default class extends RichDisplayCommand { private async marry(message: GuildMessage, user: User) { const { author, channel } = message; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); switch (user.id) { case CLIENT_ID: - return message.sendLocale(LanguageKeys.Commands.Social.MarrySkyra); + return message.send(t(LanguageKeys.Commands.Social.MarrySkyra)); case AELIA_ID: - return message.sendLocale(LanguageKeys.Commands.Social.MarryAelia); + return message.send(t(LanguageKeys.Commands.Social.MarryAelia)); case author.id: - return message.sendLocale(LanguageKeys.Commands.Social.MarrySelf); + return message.send(t(LanguageKeys.Commands.Social.MarrySelf)); } - if (user.bot) return message.sendLocale(LanguageKeys.Commands.Social.MarryBots); + if (user.bot) return message.send(t(LanguageKeys.Commands.Social.MarryBots)); const { users, clients } = await DbSet.connect(); const clientSettings = await clients.findOne(CLIENT_ID); @@ -65,13 +65,13 @@ export default class extends RichDisplayCommand { // Retrieve the author's spouses const spouses = await users.fetchSpouses(authorID); if (spouses.includes(targetID)) { - throw language.get(LanguageKeys.Commands.Social.MarryAlreadyMarried, { user }); + throw t(LanguageKeys.Commands.Social.MarryAlreadyMarried, { user }); } // Check if the author can marry another user const authorLimit = premiumUsers.includes(authorID) ? 20 : 10; if (spouses.length >= authorLimit) { - throw language.get(LanguageKeys.Commands.Social.MarryAuthorTooMany, { limit: authorLimit }); + throw t(LanguageKeys.Commands.Social.MarryAuthorTooMany, { limit: authorLimit }); } // Retrieve the target's spouses @@ -80,36 +80,31 @@ export default class extends RichDisplayCommand { // Check if the target can marry another user const targetLimit = premiumUsers.includes(targetID) ? 20 : 10; if (targetSpouses.length >= targetLimit) { - throw language.get(LanguageKeys.Commands.Social.MarryTargetTooMany, { limit: targetLimit }); + throw t(LanguageKeys.Commands.Social.MarryTargetTooMany, { limit: targetLimit }); } // Warn if starting polygamy: // Check if the author is already monogamous. if (spouses.length === 1) { - const answer = await askYesNo(channel, author, language.get(LanguageKeys.Commands.Social.MarryAuthorTaken, { author })); + const answer = await askYesNo(channel, author, t(LanguageKeys.Commands.Social.MarryAuthorTaken, { author })); if (answer !== YesNoAnswer.Yes) - return message.sendLocale(LanguageKeys.Commands.Social.MarryAuthorMultipleCancel, [ - { user: await this.client.users.fetch(spouses[0]).then((user) => user.username) } - ]); + return message.send( + t(LanguageKeys.Commands.Social.MarryAuthorMultipleCancel, [ + { user: await this.client.users.fetch(spouses[0]).then((user) => user.username) } + ]) + ); // Check if the author's first potential spouse is already married. } else if (spouses.length === 0 && targetSpouses.length > 0) { - const answer = await askYesNo( - channel, - author, - language.get( - targetSpouses.length === 1 ? LanguageKeys.Commands.Social.MarryTaken : LanguageKeys.Commands.Social.MarryTakenPlural, - { count: targetSpouses.length } - ) - ); - if (answer !== YesNoAnswer.Yes) return message.sendLocale(LanguageKeys.Commands.Social.MarryMultipleCancel); + const answer = await askYesNo(channel, author, t(LanguageKeys.Commands.Social.MarryTaken, { count: targetSpouses.length })); + if (answer !== YesNoAnswer.Yes) return message.send(t(LanguageKeys.Commands.Social.MarryMultipleCancel)); } - const answer = await askYesNo(channel, user, language.get(LanguageKeys.Commands.Social.MarryPetition, { author, user })); + const answer = await askYesNo(channel, user, t(LanguageKeys.Commands.Social.MarryPetition, { author, user })); switch (answer) { case YesNoAnswer.Timeout: - return message.sendLocale(LanguageKeys.Commands.Social.MarryNoreply); + return message.send(t(LanguageKeys.Commands.Social.MarryNoReply)); case YesNoAnswer.ImplicitNo: - return message.sendLocale(LanguageKeys.Commands.Social.MarryDenied); + return message.send(t(LanguageKeys.Commands.Social.MarryDenied)); case YesNoAnswer.Yes: break; default: @@ -120,7 +115,7 @@ export default class extends RichDisplayCommand { settings.spouses = (settings.spouses ?? []).concat(await users.ensure(targetID)); await settings.save(); - return message.sendLocale(LanguageKeys.Commands.Social.MarryAccepted, [{ author, user }]); + return message.send(t(LanguageKeys.Commands.Social.MarryAccepted, { author: author.toString(), user: user.toString() })); }); } } diff --git a/src/commands/Social/mylevel.ts b/src/commands/Social/mylevel.ts index 467e2197764..109fef26e8f 100644 --- a/src/commands/Social/mylevel.ts +++ b/src/commands/Social/mylevel.ts @@ -10,8 +10,8 @@ export default class extends SkyraCommand { super(store, file, directory, { bucket: 2, cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Social.MylevelDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.MylevelExtended), + description: LanguageKeys.Commands.Social.MyLevelDescription, + extendedHelp: LanguageKeys.Commands.Social.MyLevelExtended, runIn: ['text'], usage: '[user:username]' }); @@ -23,18 +23,18 @@ export default class extends SkyraCommand { const { members } = await DbSet.connect(); const memberSettings = await members.findOne({ where: { userID: user.id, guildID: message.guild.id } }); const memberPoints = memberSettings?.points ?? 0; - const [roles, language] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.Auto], settings.getLanguage()]); + const [roles, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.Auto], settings.getLanguage()]); const nextRole = this.getLatestRole(memberPoints, roles); const title = nextRole - ? `\n${language.get(LanguageKeys.Commands.Social.MylevelNext, { + ? `\n${t(LanguageKeys.Commands.Social.MyLevelNext, { remaining: nextRole.points - memberPoints, next: nextRole.points })}` : ''; return user.id === message.author.id - ? message.send(language.get(LanguageKeys.Commands.Social.MylevelSelf, { points: memberPoints, next: title })) - : message.send(language.get(LanguageKeys.Commands.Social.Mylevel, { points: memberPoints, next: title, user: user.username })); + ? message.send(t(LanguageKeys.Commands.Social.MyLevelSelf, { points: memberPoints, next: title })) + : message.send(t(LanguageKeys.Commands.Social.MyLevel, { points: memberPoints, next: title, user: user.username })); } public getLatestRole(points: number, autoroles: readonly RolesAuto[]) { diff --git a/src/commands/Social/pay.ts b/src/commands/Social/pay.ts index 3a8621d22cd..a21266f58fe 100644 --- a/src/commands/Social/pay.ts +++ b/src/commands/Social/pay.ts @@ -4,7 +4,8 @@ import { GuildMessage } from '#lib/types'; import { Events } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { User } from 'discord.js'; -import { CommandStore, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { CommandStore } from 'klasa'; import { getManager } from 'typeorm'; export default class extends SkyraCommand { @@ -12,8 +13,8 @@ export default class extends SkyraCommand { super(store, file, directory, { bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.PayDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.PayExtended), + description: LanguageKeys.Commands.Social.PayDescription, + extendedHelp: LanguageKeys.Commands.Social.PayExtended, runIn: ['text'], spam: true, usage: ' ', @@ -22,28 +23,26 @@ export default class extends SkyraCommand { } public async run(message: GuildMessage, [money, user]: [number, User]) { - const language = await message.fetchLanguage(); - if (message.author === user) throw language.get(LanguageKeys.Commands.Social.PaySelf); - if (user.bot) return message.send(language.get(LanguageKeys.Commands.Social.SocialPayBot)); + const t = await message.fetchT(); + if (message.author === user) throw t(LanguageKeys.Commands.Social.PaySelf); + if (user.bot) return message.send(t(LanguageKeys.Commands.Social.SocialPayBot)); - if (money <= 0) throw language.get(LanguageKeys.Resolvers.PositiveAmount); + if (money <= 0) throw t(LanguageKeys.Resolvers.PositiveAmount); const { users } = await DbSet.connect(); const response = await users.lock([message.author.id, user.id], async (authorID, targetID) => { const settings = await users.ensure(authorID); const currencyBeforePrompt = settings.money; - if (currencyBeforePrompt < money) - throw language.get(LanguageKeys.Commands.Social.PayMissingMoney, { needed: money, has: currencyBeforePrompt }); + if (currencyBeforePrompt < money) throw t(LanguageKeys.Commands.Social.PayMissingMoney, { needed: money, has: currencyBeforePrompt }); - const accepted = await message.ask(language.get(LanguageKeys.Commands.Social.PayPrompt, { user: user.username, amount: money })); + const accepted = await message.ask(t(LanguageKeys.Commands.Social.PayPrompt, { user: user.username, amount: money })); await settings.reload(); const currencyAfterPrompt = settings.money; - if (currencyAfterPrompt < money) - throw language.get(LanguageKeys.Commands.Social.PayMissingMoney, { needed: money, has: currencyBeforePrompt }); + if (currencyAfterPrompt < money) throw t(LanguageKeys.Commands.Social.PayMissingMoney, { needed: money, has: currencyBeforePrompt }); - if (!accepted) return this.denyPayment(language); + if (!accepted) return this.denyPayment(t); await getManager().transaction(async (em) => { settings.money -= money; @@ -62,18 +61,18 @@ export default class extends SkyraCommand { } }); - return this.acceptPayment(message, language, user, money); + return this.acceptPayment(message, t, user, money); }); return message.send(response); } - private acceptPayment(message: GuildMessage, language: Language, user: User, money: number) { + private acceptPayment(message: GuildMessage, t: TFunction, user: User, money: number) { this.client.emit(Events.MoneyPayment, message, message.author, user, money); - return language.get(LanguageKeys.Commands.Social.PayPromptAccept, { user: user.username, amount: money }); + return t(LanguageKeys.Commands.Social.PayPromptAccept, { user: user.username, amount: money }); } - private denyPayment(language: Language) { - return language.get(LanguageKeys.Commands.Social.PayPromptDeny); + private denyPayment(t: TFunction) { + return t(LanguageKeys.Commands.Social.PayPromptDeny); } } diff --git a/src/commands/Social/profile.ts b/src/commands/Social/profile.ts index 8f2b6e55ac2..3917f072782 100644 --- a/src/commands/Social/profile.ts +++ b/src/commands/Social/profile.ts @@ -17,8 +17,8 @@ const BADGES_FOLDER = join(cdnFolder, 'skyra-assets', 'badges'); @ApplyOptions({ bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.ProfileDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.ProfileExtended), + description: LanguageKeys.Commands.Social.ProfileDescription, + extendedHelp: LanguageKeys.Commands.Social.ProfileExtended, requiredPermissions: ['ATTACH_FILES'], spam: true, usage: '[local|global] [user:username]', @@ -52,7 +52,8 @@ export default class extends SkyraCommand { fetchAvatar(user, 256) ]); - const title = await message.fetchLocale(LanguageKeys.Commands.Social.Profile); + const t = await message.fetchT(); + const title = t(LanguageKeys.Commands.Social.Profile); const canvas = new Canvas(settings.profile.publicBadges.length ? 700 : 640, 391); if (settings.profile.publicBadges.length) { const badges = await Promise.all(settings.profile.publicBadges.map((name) => loadImage(join(BADGES_FOLDER, `${name}.png`)))); @@ -98,16 +99,16 @@ export default class extends SkyraCommand { .setTextAlign('right') .setTextFont('25px RobotoLight') .printText(rank.toString(), 594, 276) - .printText(`${settings.money} | ${settings.profile.vault}`, 594, 229) - .printText(settings.reputations.toString(), 594, 181) - .printText(points.toString(), 594, 346) + .printText(t(LanguageKeys.Commands.Social.ProfileMoney, { money: settings.money, vault: settings.profile.vault }), 594, 229) + .printText(t(LanguageKeys.Globals.NumberCompactValue, { value: settings.reputations }), 594, 181) + .printText(t(LanguageKeys.Globals.NumberValue, { value: points }), 594, 346) // Level .setTextAlign('center') .setTextFont('30px RobotoLight') .printText(title.level, 576, 58) .setTextFont('40px RobotoRegular') - .printText(level.toString(), 576, 100) + .printText(t(LanguageKeys.Globals.NumberValue, { value: level }), 576, 100) // Avatar .printCircularImage(imgAvatarSRC, 103, 103, 71) diff --git a/src/commands/Social/remindme.ts b/src/commands/Social/remindme.ts index 554d5c26aa0..142bbe28be6 100644 --- a/src/commands/Social/remindme.ts +++ b/src/commands/Social/remindme.ts @@ -6,7 +6,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors, Time } from '#utils/constants'; import { pickRandom } from '#utils/util'; import { chunk, cutText } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions, CreateResolvers, requiredPermissions, requiresGuildContext } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; import { KlasaMessage } from 'klasa'; @@ -30,8 +29,8 @@ interface ReminderScheduledTask extends ScheduleEntity { bucket: 2, subcommands: true, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.RemindmeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.RemindmeExtended), + description: LanguageKeys.Commands.Social.RemindMeDescription, + extendedHelp: LanguageKeys.Commands.Social.RemindMeExtended, usage: ' (value:idOrDuration) (description:description)', usageDelim: ' ' }) @@ -71,23 +70,23 @@ interface ReminderScheduledTask extends ScheduleEntity { [ 'idOrDuration', async (arg, possible, message, [action]: Actions[]) => { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); switch (action) { case Actions.List: return undefined; case Actions.Show: case Actions.Delete: { - if (!arg) throw language.get(LanguageKeys.Commands.Social.RemindmeDeleteNoId); + if (!arg) throw t(LanguageKeys.Commands.Social.RemindMeDeleteNoID); const id: number = await message.client.arguments.get('integer')!.run(arg, possible, message); for (const task of message.client.schedules.queue) { if (task.id !== id) continue; if (task.taskID !== Schedules.Reminder || !task.data || task.data.user !== message.author.id) break; return task; } - throw language.get(LanguageKeys.Commands.Social.RemindmeNotfound); + throw t(LanguageKeys.Commands.Social.RemindMeNotFound); } case Actions.Create: { - if (!arg) throw language.get(LanguageKeys.Commands.Social.RemindmeCreateNoDuration); + if (!arg) throw t(LanguageKeys.Commands.Social.RemindMeCreateNoDuration); return message.client.arguments.get('timespan')!.run(arg, { ...possible, min: Time.Minute }, message); } } @@ -97,14 +96,12 @@ interface ReminderScheduledTask extends ScheduleEntity { 'description', (arg, possible, message, [action]: Actions[]) => { if (action !== Actions.Create) return undefined; - if (!arg) return message.fetchLocale(LanguageKeys.Commands.Social.RemindmeCreateNoDescription); + if (!arg) return message.resolveKey(LanguageKeys.Commands.Social.RemindMeCreateNoDescription); return message.client.arguments.get('...string')!.run(arg, { ...possible, max: 1024 }, message); } ] ]) export default class extends SkyraCommand { - private readonly kTimestamp = new Timestamp('YYYY/MM/DD HH:mm:ss'); - public async create(message: KlasaMessage, [duration, description]: [number, string]) { const task = await this.client.schedules.add(Schedules.Reminder, Date.now() + duration, { catchUp: true, @@ -114,16 +111,16 @@ export default class extends SkyraCommand { } }); - return message.sendLocale(LanguageKeys.Commands.Social.RemindmeCreate, [{ id: task.id.toString() }]); + return message.sendTranslated(LanguageKeys.Commands.Social.RemindMeCreate, [{ id: task.id.toString() }]); } @requiresGuildContext((message: KlasaMessage) => - message.sendLocale(LanguageKeys.Resolvers.ChannelNotInGuildSubcommand, [{ command: message.command!.name, subcommand: 'list' }]) + message.sendTranslated(LanguageKeys.Resolvers.ChannelNotInGuildSubCommand, [{ command: message.command!.name, subcommand: 'list' }]) ) @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async list(message: KlasaMessage) { const tasks = this.client.schedules.queue.filter((task) => task.data && task.data.user === message.author.id); - if (!tasks.length) return message.sendLocale(LanguageKeys.Commands.Social.RemindmeListEmpty); + if (!tasks.length) return message.sendTranslated(LanguageKeys.Commands.Social.RemindMeListEmpty); const display = new UserRichDisplay( new MessageEmbed() @@ -131,14 +128,24 @@ export default class extends SkyraCommand { .setAuthor(this.client.user!.username, this.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) ); + const t = await message.fetchT(); const pages = chunk( - tasks.map((task) => `\`${task.id}\` - \`${this.kTimestamp.display(task.time)}\` - ${cutText(task.data.content as string, 40)}`), + tasks.map( + (task) => + `\`${task.id}\` - \`${t(LanguageKeys.Globals.TimeFullValue, { value: task.time })}\` - ${cutText( + task.data.content as string, + 40 + )}` + ), 10 ); for (const page of pages) display.addPage((template: MessageEmbed) => template.setDescription(page.join('\n'))); const response = await message.send( - new MessageEmbed({ description: pickRandom(await message.fetchLocale(LanguageKeys.System.Loading)), color: BrandingColors.Secondary }) + new MessageEmbed({ + description: pickRandom(t(LanguageKeys.System.Loading)), + color: BrandingColors.Secondary + }) ); await display.start(response, message.author.id); return response; @@ -154,7 +161,7 @@ export default class extends SkyraCommand { message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) ) .setDescription(task.data.content) - .setFooter(await message.fetchLocale(LanguageKeys.Commands.Social.RemindmeShowFooter, { id: task.id })) + .setFooter(await message.resolveKey(LanguageKeys.Commands.Social.RemindMeShowFooter, { id: task.id })) .setTimestamp(task.time) ); } @@ -162,6 +169,6 @@ export default class extends SkyraCommand { public async delete(message: KlasaMessage, [task]: [ReminderScheduledTask]) { const { id } = task; await task.delete(); - return message.sendLocale(LanguageKeys.Commands.Social.RemindmeDelete, [{ task, id }]); + return message.sendTranslated(LanguageKeys.Commands.Social.RemindMeDelete, [{ task, id }]); } } diff --git a/src/commands/Social/reputation.ts b/src/commands/Social/reputation.ts index 0a6c284c374..6cd59103a6e 100644 --- a/src/commands/Social/reputation.ts +++ b/src/commands/Social/reputation.ts @@ -13,8 +13,8 @@ export default class extends SkyraCommand { aliases: ['rep'], bucket: 2, cooldown: 30, - description: (language) => language.get(LanguageKeys.Commands.Social.ReputationDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.ReputationExtended), + description: LanguageKeys.Commands.Social.ReputationDescription, + extendedHelp: LanguageKeys.Commands.Social.ReputationExtended, runIn: ['text'], spam: true, usage: '[check] (user:username)', @@ -34,30 +34,27 @@ export default class extends SkyraCommand { const { users } = await DbSet.connect(); const selfSettings = await users.ensureProfileAndCooldowns(message.author.id); const extSettings = user ? await users.ensureProfile(user.id) : null; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (check) { - if (user.bot) throw language.get(LanguageKeys.Commands.Social.ReputationsBots); - const reputationPoints = - extSettings!.reputations === 1 - ? language.get(LanguageKeys.Commands.Social.Reputation, { count: extSettings!.reputations }) - : language.get(LanguageKeys.Commands.Social.ReputationPlural, { count: extSettings!.reputations }); + if (user.bot) throw t(LanguageKeys.Commands.Social.ReputationsBots); + const reputationPoints = t(LanguageKeys.Commands.Social.Reputation, { count: extSettings!.reputations }); return message.send( message.author === user - ? language.get(LanguageKeys.Commands.Social.ReputationsSelf, { points: selfSettings.reputations }) - : language.get(LanguageKeys.Commands.Social.Reputations, { user: user.username, points: reputationPoints }) + ? t(LanguageKeys.Commands.Social.ReputationsSelf, { points: selfSettings.reputations }) + : t(LanguageKeys.Commands.Social.Reputations, { user: user.username, points: reputationPoints }) ); } const timeReputation = selfSettings.cooldowns.reputation?.getTime(); if (timeReputation && timeReputation + Time.Day > now) { - return message.sendLocale(LanguageKeys.Commands.Social.ReputationTime, [{ remaining: timeReputation + Time.Day - now }]); + return message.sendTranslated(LanguageKeys.Commands.Social.ReputationTime, [{ remaining: timeReputation + Time.Day - now }]); } - if (!user) return message.sendLocale(LanguageKeys.Commands.Social.ReputationUsable); - if (user.bot) throw language.get(LanguageKeys.Commands.Social.ReputationsBots); - if (user === message.author) throw language.get(LanguageKeys.Commands.Social.ReputationSelf); + if (!user) return message.sendTranslated(LanguageKeys.Commands.Social.ReputationUsable); + if (user.bot) throw t(LanguageKeys.Commands.Social.ReputationsBots); + if (user === message.author) throw t(LanguageKeys.Commands.Social.ReputationSelf); await getManager().transaction(async (em) => { ++extSettings!.reputations; @@ -65,6 +62,6 @@ export default class extends SkyraCommand { await em.save([extSettings, selfSettings]); }); - return message.sendLocale(LanguageKeys.Commands.Social.ReputationGive, [{ user: user.toString() }]); + return message.sendTranslated(LanguageKeys.Commands.Social.ReputationGive, [{ user: user.toString() }]); } } diff --git a/src/commands/Social/setcolor.ts b/src/commands/Social/setcolor.ts index afb014fd4eb..515809dbb78 100644 --- a/src/commands/Social/setcolor.ts +++ b/src/commands/Social/setcolor.ts @@ -11,8 +11,8 @@ export default class extends SkyraCommand { aliases: ['setcolour'], bucket: 2, cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Social.SetColorDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.SetColorExtended), + description: LanguageKeys.Commands.Social.SetColorDescription, + extendedHelp: LanguageKeys.Commands.Social.SetColorExtended, requiredPermissions: ['EMBED_LINKS'], spam: true, usage: '' @@ -34,7 +34,7 @@ export default class extends SkyraCommand { new MessageEmbed() .setColor(b10.value) .setAuthor(message.author.tag, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setDescription(await message.fetchLocale(LanguageKeys.Commands.Social.SetColor, { color: hex.toString() })) + .setDescription(await message.resolveKey(LanguageKeys.Commands.Social.SetColor, { color: hex.toString() })) ); } } diff --git a/src/commands/Social/vault.ts b/src/commands/Social/vault.ts index c85488f5045..d686b8ea4ac 100644 --- a/src/commands/Social/vault.ts +++ b/src/commands/Social/vault.ts @@ -4,12 +4,13 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ArgumentTypes } from '@sapphire/utilities'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['bank'], - description: (language) => language.get(LanguageKeys.Commands.Social.VaultDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Social.VaultExtended), + description: LanguageKeys.Commands.Social.VaultDescription, + extendedHelp: LanguageKeys.Commands.Social.VaultExtended, requiredPermissions: ['EMBED_LINKS'], subcommands: true, usage: ' (coins:coins)', @@ -28,14 +29,14 @@ import { KlasaMessage, Language } from 'klasa'; } const coins = Number(arg); if (coins && coins >= 0) return message.client.arguments.get('integer')!.run(arg, possible, message); - throw await message.fetchLocale(LanguageKeys.Commands.Social.VaultInvalidCoins); + throw await message.resolveKey(LanguageKeys.Commands.Social.VaultInvalidCoins); } ] ]) export default class Vault extends SkyraCommand { public async deposit(message: KlasaMessage, [coins]: [number]) { const { users } = await DbSet.connect(); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const { money, vault } = await users.lock([message.author.id], async (id) => { const settings = await users.ensureProfile(id); @@ -43,7 +44,7 @@ export default class Vault extends SkyraCommand { const { vault } = settings.profile; if (coins !== undefined && money < coins) { - throw language.get(LanguageKeys.Commands.Social.VaultNotEnoughMoney, { money }); + throw t(LanguageKeys.Commands.Social.VaultNotEnoughMoney, { money }); } const newMoney = money - coins; @@ -53,7 +54,7 @@ export default class Vault extends SkyraCommand { return { money: newMoney, vault: newVault }; }); - return message.send(await this.buildEmbed(message, language, money, vault, coins, true)); + return message.send(await this.buildEmbed(message, t, money, vault, coins, true)); } public async dep(...args: ArgumentTypes) { @@ -62,7 +63,7 @@ export default class Vault extends SkyraCommand { public async withdraw(message: KlasaMessage, [coins]: [number]) { const { users } = await DbSet.connect(); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const { money, vault } = await users.lock([message.author.id], async (id) => { const settings = await users.ensureProfile(id); @@ -70,7 +71,7 @@ export default class Vault extends SkyraCommand { const { vault } = settings.profile; if (coins !== undefined && vault < coins) { - throw language.get(LanguageKeys.Commands.Social.VaultNotEnoughInVault, { vault }); + throw t(LanguageKeys.Commands.Social.VaultNotEnoughInVault, { vault }); } const newMoney = money + coins; @@ -80,7 +81,7 @@ export default class Vault extends SkyraCommand { return { money: newMoney, vault: newVault }; }); - return message.send(await this.buildEmbed(message, language, money, vault, coins)); + return message.send(await this.buildEmbed(message, t, money, vault, coins)); } public async with(...args: ArgumentTypes) { @@ -89,9 +90,9 @@ export default class Vault extends SkyraCommand { public async show(message: KlasaMessage) { const { users } = await DbSet.connect(); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const settings = await users.ensureProfile(message.author.id); - return message.send(await this.buildEmbed(message, language, settings.money, settings.profile.vault)); + return message.send(await this.buildEmbed(message, t, settings.money, settings.profile.vault)); } private updateBalance(money: number, vault: number, settings: UserEntity) { @@ -100,8 +101,8 @@ export default class Vault extends SkyraCommand { return settings.save(); } - private async buildEmbed(message: KlasaMessage, language: Language, money: number, vault: number, coins?: number, hasDeposited = false) { - const { accountMoney, accountVault, depositedDescription, withdrewDescription, showDescription } = language.get( + private async buildEmbed(message: KlasaMessage, t: TFunction, money: number, vault: number, coins?: number, hasDeposited = false) { + const { accountMoney, accountVault, depositedDescription, withdrewDescription, showDescription } = t( LanguageKeys.Commands.Social.VaultEmbedData, { coins } ); diff --git a/src/commands/Starboard/star.ts b/src/commands/Starboard/star.ts index b314719fa8d..358919950cf 100644 --- a/src/commands/Starboard/star.ts +++ b/src/commands/Starboard/star.ts @@ -11,8 +11,8 @@ const MEDALS = ['🥇', '🥈', '🥉']; @ApplyOptions({ aliases: [], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Starboard.StarDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Starboard.StarExtended), + description: LanguageKeys.Commands.Starboard.StarDescription, + extendedHelp: LanguageKeys.Commands.Starboard.StarExtended, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], subcommands: true, @@ -30,14 +30,14 @@ const MEDALS = ['🥇', '🥈', '🥉']; ]) export default class extends SkyraCommand { public async random(message: GuildMessage, [member]: [GuildMember?]): Promise { - const [minimum, starboardChannelID, language] = await message.guild.readSettings((settings) => [ + const [minimum, starboardChannelID, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Starboard.Minimum], settings[GuildSettings.Starboard.Channel], settings.getLanguage() ]); // If there is no configured starboard channel, return no stars - if (!starboardChannelID) return message.send(language.get(LanguageKeys.Commands.Starboard.StarNoChannel)); + if (!starboardChannelID) return message.send(t(LanguageKeys.Commands.Starboard.StarNoChannel)); const { starboards } = await DbSet.connect(); const qb = starboards @@ -53,13 +53,13 @@ export default class extends SkyraCommand { const starboardData = await qb.orderBy('RANDOM()').limit(1).getOne(); // If there is no starboard message, return no stars - if (!starboardData) return message.send(language.get(LanguageKeys.Commands.Starboard.StarNoStars)); + if (!starboardData) return message.send(t(LanguageKeys.Commands.Starboard.StarNoStars)); // If there is no configured starboard channel, return no stars const starboardChannel = message.guild.channels.cache.get(starboardChannelID) as TextChannel; if (!starboardChannel) { await message.guild.writeSettings([[GuildSettings.Starboard.Channel, null]]); - return message.send(language.get(LanguageKeys.Commands.Starboard.StarNoChannel)); + return message.send(t(LanguageKeys.Commands.Starboard.StarNoChannel)); } // If the channel the message was starred from does not longer exist, delete @@ -81,10 +81,7 @@ export default class extends SkyraCommand { } public async top(message: GuildMessage, [member, timespan]: [GuildMember?, number?]) { - const [minimum, language] = await message.guild.readSettings((settings) => [ - settings[GuildSettings.Starboard.Minimum], - settings.getLanguage() - ]); + const [minimum, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Starboard.Minimum], settings.getLanguage()]); const { starboards } = await DbSet.connect(); const qb = starboards @@ -98,7 +95,7 @@ export default class extends SkyraCommand { if (member) qb.andWhere('user_id = :user', { user: member.id }); const starboardMessages = await qb.getMany(); - if (starboardMessages.length === 0) return message.send(language.get(LanguageKeys.Commands.Starboard.StarNoStars)); + if (starboardMessages.length === 0) return message.send(t(LanguageKeys.Commands.Starboard.StarNoStars)); let totalStars = 0; const topMessages: [string, number][] = []; @@ -111,13 +108,13 @@ export default class extends SkyraCommand { if (postedAt < minimumPostedAt) continue; } const url = this.makeStarLink(starboardMessage.guildID, starboardMessage.channelID, starboardMessage.messageID); - const maskedUrl = `[${language.get(LanguageKeys.Misc.JumpTo)}](${url})`; + const maskedUrl = `[${t(LanguageKeys.Misc.JumpTo)}](${url})`; topMessages.push([maskedUrl, starboardMessage.stars]); topReceivers.set(starboardMessage.userID, (topReceivers.get(starboardMessage.userID) || 0) + starboardMessage.stars); totalStars += starboardMessage.stars; } - if (totalStars === 0) return message.send(language.get(LanguageKeys.Commands.Starboard.StarNoStars)); + if (totalStars === 0) return message.send(t(LanguageKeys.Commands.Starboard.StarNoStars)); const totalMessages = topMessages.length; const topThreeMessages = topMessages.sort((a, b) => (a[1] > b[1] ? -1 : 1)).slice(0, 3); @@ -127,45 +124,30 @@ export default class extends SkyraCommand { new MessageEmbed() .setColor(Colors.Amber) .addField( - language.get(LanguageKeys.Commands.Starboard.StarStats), - language.get(LanguageKeys.Commands.Starboard.StarStatsDescription, { - messages: language.get( - totalMessages === 1 ? LanguageKeys.Commands.Starboard.StarMessages : LanguageKeys.Commands.Starboard.StarMessagesPlural, - { count: totalMessages } - ), - stars: language.get(totalStars === 1 ? LanguageKeys.Commands.Starboard.Stars : LanguageKeys.Commands.Starboard.StarsPlural, { - count: totalStars - }) + t(LanguageKeys.Commands.Starboard.StarStats), + t(LanguageKeys.Commands.Starboard.StarStatsDescription, { + messages: t(LanguageKeys.Commands.Starboard.StarMessages, { count: totalMessages }), + stars: t(LanguageKeys.Commands.Starboard.Stars, { count: totalStars }) }) ) .addField( - language.get(LanguageKeys.Commands.Starboard.StarTopstarred), + t(LanguageKeys.Commands.Starboard.StarTopStarred), topThreeMessages.map(([mID, stars], index) => - language.get( - stars === 1 - ? LanguageKeys.Commands.Starboard.StarTopstarredDescription - : LanguageKeys.Commands.Starboard.StarTopstarredDescriptionPlural, - { - medal: MEDALS[index], - id: mID, - count: stars - } - ) + t(LanguageKeys.Commands.Starboard.StarTopStarredDescription, { + medal: MEDALS[index], + id: mID, + count: stars + }) ) ) .addField( - language.get(LanguageKeys.Commands.Starboard.StarTopreceivers), + t(LanguageKeys.Commands.Starboard.StarTopReceivers), topThreeReceivers.map(([uID, stars], index) => - language.get( - stars === 1 - ? LanguageKeys.Commands.Starboard.StarTopreceiversDescription - : LanguageKeys.Commands.Starboard.StarTopreceiversDescriptionPlural, - { - medal: MEDALS[index], - id: uID, - count: stars - } - ) + t(LanguageKeys.Commands.Starboard.StarTopReceiversDescription, { + medal: MEDALS[index], + id: uID, + count: stars + }) ) ) .setTimestamp() diff --git a/src/commands/Suggestions/resolvesuggestion.ts b/src/commands/Suggestions/resolvesuggestion.ts index 3ecc981eec2..ced0660b3f6 100644 --- a/src/commands/Suggestions/resolvesuggestion.ts +++ b/src/commands/Suggestions/resolvesuggestion.ts @@ -9,7 +9,7 @@ import { resolveOnErrorCodes } from '#utils/util'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { MessageEmbed, TextChannel } from 'discord.js'; -import type { Language } from 'klasa'; +import { TFunction } from 'i18next'; const enum SuggestionsColors { Accepted = 0x4cb02c, @@ -20,8 +20,8 @@ const enum SuggestionsColors { @ApplyOptions({ aliases: ['resu'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionExtended), + description: LanguageKeys.Commands.Suggestions.ResolveSuggestionDescription, + extendedHelp: LanguageKeys.Commands.Suggestions.ResolveSuggestionExtended, flagSupport: true, permissionLevel: PermissionLevels.Moderator, requiredPermissions: ['EMBED_LINKS'], @@ -34,26 +34,26 @@ const enum SuggestionsColors { 'suggestion', async (arg, _, message): Promise => { // Validate the suggestions channel ID - const [channelID, language] = await message.guild!.readSettings((settings) => [ + const [channelID, t] = await message.guild!.readSettings((settings) => [ settings[GuildSettings.Suggestions.SuggestionsChannel], settings.getLanguage() ]); - if (!channelID) throw language.get(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username }); + if (!channelID) throw t(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username }); // Validate the suggestion number const id = Number(arg); - if (!Number.isInteger(id) || id < 1) throw language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionInvalidId); + if (!Number.isInteger(id) || id < 1) throw t(LanguageKeys.Commands.Suggestions.ResolveSuggestionInvalidID); // Retrieve the suggestion data const { suggestions } = await DbSet.connect(); const suggestionData = await suggestions.findOne({ id, guildID: message.guild!.id }); - if (!suggestionData) throw language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionIdNotFound); + if (!suggestionData) throw t(LanguageKeys.Commands.Suggestions.ResolveSuggestionIDNotFound); const channel = message.client.channels.cache.get(channelID) as TextChannel; const suggestionMessage = await resolveOnErrorCodes(channel.messages.fetch(suggestionData.messageID), RESTJSONErrorCodes.UnknownMessage); if (suggestionMessage === null) { await suggestionData.remove(); - throw language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionMessageNotFound); + throw t(LanguageKeys.Commands.Suggestions.ResolveSuggestionMessageNotFound); } const suggestionAuthor = await message.client.users.fetch(suggestionData.authorID).catch(() => null); @@ -67,7 +67,7 @@ const enum SuggestionsColors { [ 'comment', (arg, possible, message) => { - if (typeof arg === 'undefined') return message.fetchLocale(LanguageKeys.Commands.Suggestions.ResolveSuggestionDefaultComment); + if (typeof arg === 'undefined') return message.resolveKey(LanguageKeys.Commands.Suggestions.ResolveSuggestionDefaultComment); return message.client.arguments.get('...string')!.run(arg, possible, message); } ] @@ -77,7 +77,7 @@ export default class extends SkyraCommand { message: GuildMessage, [suggestionData, action, comment]: [SuggestionData, 'accept' | 'a' | 'deny' | 'd' | 'consider' | 'c', string | undefined] ) { - const [shouldDM, shouldHideAuthor, shouldRepostSuggestion, language] = await message.guild.readSettings((settings) => [ + const [shouldDM, shouldHideAuthor, shouldRepostSuggestion, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Suggestions.OnAction.DM], settings[GuildSettings.Suggestions.OnAction.HideAuthor], settings[GuildSettings.Suggestions.OnAction.RepostMessage], @@ -88,10 +88,10 @@ export default class extends SkyraCommand { let newEmbed = new MessageEmbed(); let messageContent = ''; - const author = await this.getAuthor(message, shouldHideAuthor, language); + const author = await this.getAuthor(message, shouldHideAuthor, t); - const actions = language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionActions, { author }); - const DMActions = language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionActionsDms, { author, guild: message.guild.name }); + const actions = t(LanguageKeys.Commands.Suggestions.ResolveSuggestionActions, { author }); + const DMActions = t(LanguageKeys.Commands.Suggestions.ResolveSuggestionActionsDms, { author, guild: message.guild.name }); switch (action) { case 'a': @@ -115,7 +115,7 @@ export default class extends SkyraCommand { try { await suggestionData.author!.send(messageContent, { embed: newEmbed }); } catch { - await message.channel.send(language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionDmFail)); + await message.channel.send(t(LanguageKeys.Commands.Suggestions.ResolveSuggestionDmFail)); } } @@ -127,34 +127,34 @@ export default class extends SkyraCommand { const actionText = action === 'a' || action === 'accept' - ? language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessAcceptedText) + ? t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessAcceptedText) : action === 'd' || action === 'deny' - ? language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessDeniedText) - : language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessConsideredText); + ? t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessDeniedText) + : t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessConsideredText); - return message.send(language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccess, { id: suggestionData.id, actionText })); + return message.send(t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccess, { id: suggestionData.id, actionText })); } public async inhibit(message: GuildMessage) { // If the message that triggered this is not this command (potentially help command) or the guild is null, return with no error. if (!Object.is(message.command, this) || message.guild === null) return true; - const [channelID, language] = await message.guild.readSettings((settings) => [ + const [channelID, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Suggestions.SuggestionsChannel], settings.getLanguage() ]); if (channelID !== null) return false; - await message.send(language.get(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username })); + await message.send(t(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username })); return true; } - private async getAuthor(message: GuildMessage, hideAuthor: boolean, language: Language) { + private async getAuthor(message: GuildMessage, hideAuthor: boolean, t: TFunction) { if (Reflect.has(message.flagArgs, 'show-author') || Reflect.has(message.flagArgs, 'showAuthor')) return message.author.tag; if (Reflect.has(message.flagArgs, 'hide-author') || Reflect.has(message.flagArgs, 'hideAuthor') || hideAuthor) { return (await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator)) - ? language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorAdmin) - : language.get(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorModerator); + ? t(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorAdmin) + : t(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorModerator); } return message.author.tag; } diff --git a/src/commands/Suggestions/suggest.ts b/src/commands/Suggestions/suggest.ts index ee95dbe6e59..8823aeac31a 100644 --- a/src/commands/Suggestions/suggest.ts +++ b/src/commands/Suggestions/suggest.ts @@ -13,8 +13,8 @@ const requiredChannelPermissions = ['SEND_MESSAGES', 'READ_MESSAGE_HISTORY', 'VI @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Suggestions.SuggestDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Suggestions.SuggestExtended), + description: LanguageKeys.Commands.Suggestions.SuggestDescription, + extendedHelp: LanguageKeys.Commands.Suggestions.SuggestExtended, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], usage: '', @@ -35,21 +35,21 @@ export default class extends SkyraCommand { if (globalSuggestion) { suggestionsChannel = this.client.webhookFeedback!; } else { - const [suggestionsChannelID, language] = await guild.readSettings((settings) => [ + const [suggestionsChannelID, t] = await guild.readSettings((settings) => [ settings[GuildSettings.Suggestions.SuggestionsChannel], settings.getLanguage() ]); suggestionsChannel = this.client.channels.cache.get(suggestionsChannelID ?? '') as TextChannel | undefined; if (!suggestionsChannel?.postable) { - throw language.get(LanguageKeys.Commands.Suggestions.SuggestNopermissions, { + throw t(LanguageKeys.Commands.Suggestions.SuggestNoPermissions, { username: message.author.username, channel: (message.channel as TextChannel).toString() }); } } - const [[upvoteEmoji, downvoteEmoji, language], [suggestions, currentSuggestionId]] = await Promise.all([ + const [[upvoteEmoji, downvoteEmoji, t], [suggestions, currentSuggestionId]] = await Promise.all([ guild.readSettings( (settings) => [ @@ -69,7 +69,7 @@ export default class extends SkyraCommand { `${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ format: 'png', size: 128, dynamic: true }) ) - .setTitle(language.get(LanguageKeys.Commands.Suggestions.SuggestTitle, { id: currentSuggestionId + 1 })) + .setTitle(t(LanguageKeys.Commands.Suggestions.SuggestTitle, { id: currentSuggestionId + 1 })) .setDescription(suggestion) ); @@ -87,7 +87,7 @@ export default class extends SkyraCommand { } return message.send( - language.get(LanguageKeys.Commands.Suggestions.SuggestSuccess, { + t(LanguageKeys.Commands.Suggestions.SuggestSuccess, { channel: globalSuggestion ? 'Skyra Lounge' : suggestionsChannel.toString() }) ); @@ -103,19 +103,19 @@ export default class extends SkyraCommand { private async setChannel(message: GuildMessage) { // If the user doesn't have the rights to change guild configuration, do not proceed - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const manageable = await message.hasAtLeastPermissionLevel(PermissionLevels.Administrator); if (!manageable) { - await message.send(language.get(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username })); + await message.send(t(LanguageKeys.Commands.Suggestions.SuggestNoSetup, { username: message.author.username })); return true; } // Ask the user if they want to setup a channel const setup = await message.ask({ - content: language.get(LanguageKeys.Commands.Suggestions.SuggestNoSetupAsk, { username: message.author.username }) + content: t(LanguageKeys.Commands.Suggestions.SuggestNoSetupAsk, { username: message.author.username }) }); if (!setup) { - await message.send(language.get(LanguageKeys.Commands.Suggestions.SuggestNoSetupAbort)); + await message.send(t(LanguageKeys.Commands.Suggestions.SuggestNoSetupAbort)); return true; } @@ -126,30 +126,26 @@ export default class extends SkyraCommand { limit: 1, time: 30000 }) - .run(language.get(LanguageKeys.Commands.Suggestions.SuggestChannelPrompt)); + .run(t(LanguageKeys.Commands.Suggestions.SuggestChannelPrompt)); channel = (typeof channel === 'string' ? message.channel : channel) as TextChannel; if (!channel || channel.guild.id !== message.guild.id) { - await message.send(language.get(LanguageKeys.Resolvers.InvalidChannelName, { name: channel.name })); + await message.send(t(LanguageKeys.Resolvers.InvalidChannelName, { name: channel.name })); return true; } const missingPermissions = await this.missingBotPermissions(message); if (missingPermissions.length) { - const permissions = language.PERMISSIONS; - throw language.get(LanguageKeys.Inhibitors.MissingBotPerms, { - missing: language.list( - missingPermissions.map((permission) => permissions[permission]), - language.get(LanguageKeys.Globals.And) - ) + throw t(LanguageKeys.Inhibitors.MissingBotPerms, { + missing: missingPermissions.map((permission) => t(`permissions:${permission}`)) }); } // Update settings await message.guild.writeSettings([[GuildSettings.Suggestions.SuggestionsChannel, channel.id]]); - await message.send(language.get(LanguageKeys.Commands.Admin.ConfMenuSaved)); + await message.send(t(LanguageKeys.Commands.Admin.ConfMenuSaved)); return true; } diff --git a/src/commands/Admin/blocklist.ts b/src/commands/System/Admin/blocklist.ts similarity index 91% rename from src/commands/Admin/blocklist.ts rename to src/commands/System/Admin/blocklist.ts index 5609284cb14..140fbfe5f2a 100644 --- a/src/commands/Admin/blocklist.ts +++ b/src/commands/System/Admin/blocklist.ts @@ -12,7 +12,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['blacklist'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Admin.BlocklistDescription), + description: LanguageKeys.Commands.Admin.BlocklistDescription, + extendedHelp: LanguageKeys.Commands.Admin.BlocklistExtended, guarded: true, permissionLevel: PermissionLevels.BotOwner, usage: ' (user:optionalUser|guild:optionalGuild) [...]', @@ -77,7 +78,7 @@ export default class extends SkyraCommand { await clientEntity.save(); - return message.sendLocale(LanguageKeys.Commands.Admin.BlocklistResetSuccess); + return message.sendTranslated(LanguageKeys.Commands.Admin.BlocklistResetSuccess); } public async remove(message: KlasaMessage, usersAndGuilds: User[] | Guild[]) { @@ -98,7 +99,7 @@ export default class extends SkyraCommand { await clientEntity.save(); - return message.sendLocale(LanguageKeys.Commands.Admin.BlocklistSaveSuccess); + return message.sendTranslated(LanguageKeys.Commands.Admin.BlocklistSaveSuccess); } public async set(message: KlasaMessage, usersAndGuilds: User[] | Guild[]) { @@ -123,6 +124,6 @@ export default class extends SkyraCommand { await clientEntity.save(); - return message.sendLocale(LanguageKeys.Commands.Admin.BlocklistSaveSuccess); + return message.sendTranslated(LanguageKeys.Commands.Admin.BlocklistSaveSuccess); } } diff --git a/src/commands/System/Admin/disable.ts b/src/commands/System/Admin/disable.ts new file mode 100644 index 00000000000..4060d145297 --- /dev/null +++ b/src/commands/System/Admin/disable.ts @@ -0,0 +1,29 @@ +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; +import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { KlasaMessage, Piece } from 'klasa'; + +@ApplyOptions({ + description: LanguageKeys.Commands.System.DisableDescription, + extendedHelp: LanguageKeys.Commands.System.DisableExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '' +}) +export default class extends SkyraCommand { + public async run(message: KlasaMessage, [piece]: [Piece]) { + if ((piece.type === 'event' && piece.name === 'coreMessage') || (piece.type === 'monitor' && piece.name === 'commandHandler')) { + return message.sendTranslated(LanguageKeys.Commands.System.DisableWarn); + } + piece.disable(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.${piece.store}.get('${piece.name}').disable(); + `); + } + return message.sendTranslated(LanguageKeys.Commands.System.Disable, [{ type: piece.type, name: piece.name }], { + code: 'diff' + }); + } +} diff --git a/src/commands/System/Admin/dm.ts b/src/commands/System/Admin/dm.ts index c716edac8ef..593e8bc5708 100644 --- a/src/commands/System/Admin/dm.ts +++ b/src/commands/System/Admin/dm.ts @@ -1,21 +1,19 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageOptions, User } from 'discord.js'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { KlasaMessage } from 'klasa'; +@ApplyOptions({ + description: LanguageKeys.Commands.System.DmDescription, + extendedHelp: LanguageKeys.Commands.System.DmExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: ' ', + usageDelim: ' ' +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - description: (language) => language.get(LanguageKeys.Commands.System.DmDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.DmExtended), - guarded: true, - permissionLevel: PermissionLevels.BotOwner, - usage: ' ', - usageDelim: ' ' - }); - } - public async run(message: KlasaMessage, [user, content]: [User, string]) { const attachment = message.attachments.size > 0 ? message.attachments.first()!.url : null; const options: MessageOptions = {}; diff --git a/src/commands/System/Admin/enable.ts b/src/commands/System/Admin/enable.ts new file mode 100644 index 00000000000..7cee4a6f7c6 --- /dev/null +++ b/src/commands/System/Admin/enable.ts @@ -0,0 +1,24 @@ +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; +import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { KlasaMessage, Piece } from 'klasa'; + +@ApplyOptions({ + description: LanguageKeys.Commands.System.EnableDescription, + extendedHelp: LanguageKeys.Commands.System.EnableExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '' +}) +export default class extends SkyraCommand { + public async run(message: KlasaMessage, [piece]: [Piece]) { + piece.enable(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.${piece.store}.get('${piece.name}').enable(); + `); + } + return message.sendTranslated(LanguageKeys.Commands.System.Enable, [{ type: piece.type, name: piece.name }], { code: 'diff' }); + } +} diff --git a/src/commands/System/Admin/eval.ts b/src/commands/System/Admin/eval.ts index 053548c9554..d82e697dbf5 100644 --- a/src/commands/System/Admin/eval.ts +++ b/src/commands/System/Admin/eval.ts @@ -13,8 +13,8 @@ import { inspect } from 'util'; @ApplyOptions({ aliases: ['ev'], - description: (language) => language.get(LanguageKeys.Commands.System.EvalDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.EvalExtended), + description: LanguageKeys.Commands.System.EvalDescription, + extendedHelp: LanguageKeys.Commands.System.EvalExtended, guarded: true, permissionLevel: PermissionLevels.BotOwner, usage: '', @@ -53,10 +53,10 @@ export default class extends SkyraCommand { private async timedEval(message: KlasaMessage, code: string, flagTime: number) { if (flagTime === Infinity || flagTime === 0) return this.eval(message, code); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); return Promise.race([ sleep(flagTime).then(() => ({ - result: language.get(LanguageKeys.Commands.System.EvalTimeout, { seconds: flagTime / 1000 }), + result: t(LanguageKeys.Commands.System.EvalTimeout, { seconds: flagTime / 1000 }), success: false, time: '⏱ ...', type: 'EvalTimeoutError' diff --git a/src/commands/System/Admin/exec.ts b/src/commands/System/Admin/exec.ts index bd91558b53f..486f3224b87 100644 --- a/src/commands/System/Admin/exec.ts +++ b/src/commands/System/Admin/exec.ts @@ -1,25 +1,23 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { exec } from '#utils/exec'; import { fetch, FetchMethods, FetchResultTypes } from '#utils/util'; import { codeBlock } from '@sapphire/utilities'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageAttachment } from 'discord.js'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { KlasaMessage } from 'klasa'; +@ApplyOptions({ + aliases: ['execute'], + description: LanguageKeys.Commands.System.ExecDescription, + extendedHelp: LanguageKeys.Commands.System.ExecExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '', + flagSupport: true +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - aliases: ['execute'], - description: (language) => language.get(LanguageKeys.Commands.System.ExecDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.ExecExtended), - guarded: true, - permissionLevel: PermissionLevels.BotOwner, - usage: '', - flagSupport: true - }); - } - public async run(message: KlasaMessage, [input]: [string]) { const result = await exec(input, { timeout: Reflect.has(message.flagArgs, 'timeout') ? Number(message.flagArgs.timeout) : 60000 }).catch( (error) => ({ diff --git a/src/commands/System/Admin/heapsnapshot.ts b/src/commands/System/Admin/heapsnapshot.ts index 81b3e500856..7910350d1a3 100644 --- a/src/commands/System/Admin/heapsnapshot.ts +++ b/src/commands/System/Admin/heapsnapshot.ts @@ -23,29 +23,20 @@ * SOFTWARE. */ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { PermissionLevels } from '#lib/types/Enums'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { KlasaMessage } from 'klasa'; import { writeHeapSnapshot } from 'v8'; +@ApplyOptions({ + description: LanguageKeys.Commands.Admin.HeapSnapshotDescription, + extendedHelp: LanguageKeys.Commands.Admin.HeapSnapshotExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - description: 'Creates a heapdump for finding memory leaks.', - extendedHelp: [ - 'The heapsnapshot command is very useful for bots that have memory issues, it uses the heapdump library', - "which freezes the entire process for a moment to analize all elements from the process' HEAP, NEVER share", - 'heapsnapshot files with anybody, as everything your bot holds is included in that file.\n\nTo open heapsnapshot', - 'files, open Google Chrome, open Developer Tools, go to the tab Memory, and in Profiles, click on the buttom "load".', - 'Finally, open the profile and you will be given a table of all objects in your process, have fun!\n\nP.S:', - 'heapsnapshot files are as big as the amount of RAM you use, in big bots, the snapshots can freeze the bot', - 'much longer and the files can be much heavier.' - ].join(' '), - guarded: true, - permissionLevel: PermissionLevels.BotOwner - }); - } - public async run(message: KlasaMessage) { await message.send('Capturing HEAP Snapshot. This may take a while...'); diff --git a/src/commands/System/Admin/load.ts b/src/commands/System/Admin/load.ts new file mode 100644 index 00000000000..e2d892a94c4 --- /dev/null +++ b/src/commands/System/Admin/load.ts @@ -0,0 +1,68 @@ +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; +import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { access } from 'fs/promises'; +import { KlasaMessage, Stopwatch, Store } from 'klasa'; +import { join } from 'path'; + +@ApplyOptions({ + aliases: ['l'], + description: LanguageKeys.Commands.System.LoadDescription, + extendedHelp: LanguageKeys.Commands.System.LoadExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '[core] ', + usageDelim: ' ' +}) +export default class extends SkyraCommand { + private regExp = /\\\\?|\//g; + + public async run(message: KlasaMessage, [core, store, path]: ['core', Store, string]) { + const t = await message.fetchT(); + const splitPath = (path.endsWith('.js') ? path : `${path}.js`).split(this.regExp); + const timer = new Stopwatch(); + const piece = await (core ? this.tryEach(store, splitPath) : store.load(store.userDirectory, splitPath)); + + try { + if (!piece) throw t(LanguageKeys.Commands.System.LoadFail); + await piece.init(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') { + const piece = this.${piece.store}.load('${piece.directory}', ${JSON.stringify(splitPath)}); + if (piece) piece.init(); + } + `); + } + return message.send(t(LanguageKeys.Commands.System.Load, { time: timer.stop().toString(), type: store.name, name: piece.name })); + } catch (error) { + timer.stop(); + throw t(LanguageKeys.Commands.System.LoadError, { + type: store.name, + name: piece ? piece.name : splitPath.join('/'), + error + }); + } + } + + private async tryEach(store: Store, path: string[]) { + for (const dir of store.coreDirectories) if (await this.pathExists(join(dir, ...path))) return store.load(dir, path); + return undefined; + } + + /** + * Checks if a path exists. + * @function pathExists + * @memberof fsn/nextra + * @param path The path to check + */ + private async pathExists(path: string): Promise { + try { + await access(path); + return true; + } catch (err) { + return false; + } + } +} diff --git a/src/commands/System/Admin/reboot.ts b/src/commands/System/Admin/reboot.ts index d098f890556..2494126fc8a 100644 --- a/src/commands/System/Admin/reboot.ts +++ b/src/commands/System/Admin/reboot.ts @@ -1,20 +1,19 @@ -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { Events, PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ENABLE_INFLUX } from '#root/config'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { ApplyOptions } from '@skyra/decorators'; +import { KlasaMessage } from 'klasa'; +@ApplyOptions({ + description: LanguageKeys.Commands.System.RebootDescription, + extendedHelp: LanguageKeys.Commands.System.RebootExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - description: (language) => language.get(LanguageKeys.Commands.System.RebootDescription), - guarded: true, - permissionLevel: PermissionLevels.BotOwner - }); - } - public async run(message: KlasaMessage) { - await message.sendLocale(LanguageKeys.Commands.System.Reboot).catch((err) => this.client.emit(Events.ApiError, err)); + await message.sendTranslated(LanguageKeys.Commands.System.Reboot).catch((err) => this.client.emit(Events.ApiError, err)); if (ENABLE_INFLUX) { try { diff --git a/src/commands/System/Admin/reload.ts b/src/commands/System/Admin/reload.ts new file mode 100644 index 00000000000..cecf72ee8e4 --- /dev/null +++ b/src/commands/System/Admin/reload.ts @@ -0,0 +1,66 @@ +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; +import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { TFunction } from 'i18next'; +import { KlasaMessage, Piece, Stopwatch, Store } from 'klasa'; + +@ApplyOptions({ + aliases: ['r'], + description: LanguageKeys.Commands.System.ReloadDescription, + extendedHelp: LanguageKeys.Commands.System.ReloadExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '' +}) +export default class extends SkyraCommand { + public async run(message: KlasaMessage, [piece]: [Piece | Store | 'everything']) { + const t = await message.fetchT(); + + if (piece === 'everything') return this.everything(message, t); + if (piece instanceof Store) { + const timer = new Stopwatch(); + await piece.loadAll(); + await piece.init(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.${piece.name}.loadAll().then(() => this.${piece.name}.init()); + `); + } + return message.send(t(LanguageKeys.Commands.System.ReloadAll, { type: piece, time: timer.stop() })); + } + + try { + const itm = await piece.reload(); + const timer = new Stopwatch(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.${piece.store}.get('${piece.name}').reload(); + `); + } + return message.send(t(LanguageKeys.Commands.System.Reload, { type: itm.type, name: itm.name, time: timer.stop() })); + } catch (err) { + piece.store.set(piece); + return message.send(t(LanguageKeys.Commands.System.ReloadFailed, { type: piece.type, name: piece.name })); + } + } + + private async everything(message: KlasaMessage, t: TFunction) { + const timer = new Stopwatch(); + await Promise.all( + this.client.pieceStores.map(async (store) => { + await store.loadAll(); + await store.init(); + }) + ); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.pieceStores.map(async (store) => { + await store.loadAll(); + await store.init(); + }); + `); + } + return message.send(t(LanguageKeys.Commands.System.ReloadEverything, { time: timer.stop() })); + } +} diff --git a/src/commands/System/Admin/setavatar.ts b/src/commands/System/Admin/setavatar.ts index 8a2bd6127ed..3ca57f59cbd 100644 --- a/src/commands/System/Admin/setavatar.ts +++ b/src/commands/System/Admin/setavatar.ts @@ -6,8 +6,8 @@ import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { KlasaMessage } from 'klasa'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.System.SetAvatarDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.SetAvatarExtended), + description: LanguageKeys.Commands.System.SetAvatarDescription, + extendedHelp: LanguageKeys.Commands.System.SetAvatarExtended, guarded: true, permissionLevel: PermissionLevels.BotOwner, usage: '(attachment:attachment)' @@ -22,7 +22,7 @@ import { KlasaMessage } from 'klasa'; } const url = ((res) => res.protocol && IMAGE_EXTENSION.test(res.pathname) && res.hostname && res.href)(new URL(arg)); if (url) return fetch(url, FetchResultTypes.Buffer); - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidUrl, { name: possible.name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidUrl, { name: possible.name }); } ] ]) diff --git a/src/commands/System/Admin/unload.ts b/src/commands/System/Admin/unload.ts new file mode 100644 index 00000000000..7a3f08f4e59 --- /dev/null +++ b/src/commands/System/Admin/unload.ts @@ -0,0 +1,28 @@ +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; +import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; +import { KlasaMessage, Piece } from 'klasa'; + +@ApplyOptions({ + aliases: ['u'], + description: LanguageKeys.Commands.System.UnloadDescription, + extendedHelp: LanguageKeys.Commands.System.UnloadExtended, + guarded: true, + permissionLevel: PermissionLevels.BotOwner, + usage: '' +}) +export default class extends SkyraCommand { + public async run(message: KlasaMessage, [piece]: [Piece]) { + if ((piece.type === 'event' && piece.name === 'message') || (piece.type === 'monitor' && piece.name === 'commandHandler')) { + return message.sendTranslated(LanguageKeys.Commands.System.UnloadWarn); + } + piece.unload(); + if (this.client.shard) { + await this.client.shard.broadcastEval(` + if (String(this.options.shards) !== '${this.client.options.shards}') this.${piece.store}.get('${piece.name}').unload(); + `); + } + return message.sendTranslated(LanguageKeys.Commands.System.Unload, [{ type: piece.type, name: piece.name }]); + } +} diff --git a/src/commands/System/Admin/update.ts b/src/commands/System/Admin/update.ts index 423cef1186d..5ef5122cc33 100644 --- a/src/commands/System/Admin/update.ts +++ b/src/commands/System/Admin/update.ts @@ -1,5 +1,6 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { PermissionLevels } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Emojis, rootFolder } from '#utils/constants'; import { exec } from '#utils/exec'; import { sleep } from '#utils/sleep'; @@ -11,7 +12,8 @@ import { resolve } from 'path'; @ApplyOptions({ aliases: ['pull'], - description: 'Update the bot', + description: LanguageKeys.Commands.Admin.UpdateDescription, + extendedHelp: LanguageKeys.Commands.Admin.UpdateExtended, guarded: true, permissionLevel: PermissionLevels.BotOwner, usage: '[branch:string]', diff --git a/src/commands/System/donate.ts b/src/commands/System/donate.ts index 6e5a5d3c775..116f0008fbc 100644 --- a/src/commands/System/donate.ts +++ b/src/commands/System/donate.ts @@ -5,20 +5,20 @@ import { CommandStore, KlasaMessage } from 'klasa'; export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { - description: (language) => language.get(LanguageKeys.Commands.System.DonateDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.DonateExtended), + description: LanguageKeys.Commands.System.DonateDescription, + extendedHelp: LanguageKeys.Commands.System.DonateExtended, guarded: true }); } public async run(message: KlasaMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); try { - const extended = (language.get(LanguageKeys.Commands.System.DonateExtended).extendedHelp as string[]).join('\n'); + const extended = t(this.extendedHelp).extendedHelp!; const response = await message.author.send(extended); - return message.channel.type === 'text' ? await message.alert(language.get(LanguageKeys.Commands.System.DmSent)) : response; + return message.channel.type === 'text' ? await message.alert(t(LanguageKeys.Commands.System.DmSent)) : response; } catch { - return message.channel.type === 'text' ? null : message.alert(language.get(LanguageKeys.Commands.System.DmNotSent)); + return message.channel.type === 'text' ? null : message.alert(t(LanguageKeys.Commands.System.DmNotSent)); } } } diff --git a/src/commands/System/echo.ts b/src/commands/System/echo.ts index 44d337a98e7..8110d619383 100644 --- a/src/commands/System/echo.ts +++ b/src/commands/System/echo.ts @@ -9,8 +9,8 @@ export default class extends SkyraCommand { public constructor(store: CommandStore, file: string[], directory: string) { super(store, file, directory, { aliases: ['talk'], - description: (language) => language.get(LanguageKeys.Commands.System.EchoDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.EchoExtended), + description: LanguageKeys.Commands.System.EchoDescription, + extendedHelp: LanguageKeys.Commands.System.EchoExtended, guarded: true, permissionLevel: PermissionLevels.BotOwner, runIn: ['text'], diff --git a/src/commands/System/feedback.ts b/src/commands/System/feedback.ts index f741828eae8..5bbf71ddcca 100644 --- a/src/commands/System/feedback.ts +++ b/src/commands/System/feedback.ts @@ -6,8 +6,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ bucket: 2, cooldown: 20, - description: (language) => language.get(LanguageKeys.Commands.System.FeedbackDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.FeedbackExtended), + description: LanguageKeys.Commands.System.FeedbackDescription, + extendedHelp: LanguageKeys.Commands.System.FeedbackExtended, guarded: true, usage: '' }) diff --git a/src/commands/System/stats.ts b/src/commands/System/stats.ts index 6245f5c7fd4..21ea7492f8b 100644 --- a/src/commands/System/stats.ts +++ b/src/commands/System/stats.ts @@ -1,31 +1,29 @@ import { DbSet } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { roundNumber } from '@sapphire/utilities'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed, version } from 'discord.js'; -import { CommandStore, KlasaMessage } from 'klasa'; -import { cpus, uptime } from 'os'; - -export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - aliases: ['stats', 'sts'], - bucket: 2, - cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.System.StatsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.StatsExtended), - requiredPermissions: ['EMBED_LINKS'] - }); - } +import { KlasaMessage } from 'klasa'; +import { CpuInfo, cpus, uptime } from 'os'; +@ApplyOptions({ + aliases: ['stats', 'sts'], + bucket: 2, + cooldown: 15, + description: LanguageKeys.Commands.System.StatsDescription, + extendedHelp: LanguageKeys.Commands.System.StatsExtended, + requiredPermissions: ['EMBED_LINKS'] +}) +export default class UserCommand extends SkyraCommand { public async run(message: KlasaMessage) { return message.send(await this.buildEmbed(message)); } private async buildEmbed(message: KlasaMessage) { - const language = await message.fetchLanguage(); - const titles = language.get(LanguageKeys.Commands.System.StatsTitles); - const fields = language.get(LanguageKeys.Commands.System.StatsFields, { + const t = await message.fetchT(); + const titles = t(LanguageKeys.Commands.System.StatsTitles); + const fields = t(LanguageKeys.Commands.System.StatsFields, { stats: this.generalStatistics, uptime: this.uptimeStatistics, usage: this.usageStatistics @@ -39,10 +37,10 @@ export default class extends SkyraCommand { private get generalStatistics(): StatsGeneral { return { - channels: this.client.channels.cache.size.toLocaleString(), - guilds: this.client.guilds.cache.size.toLocaleString(), + channels: this.client.channels.cache.size, + guilds: this.client.guilds.cache.size, nodeJs: process.version, - users: this.client.guilds.cache.reduce((a, b) => a + b.memberCount, 0).toLocaleString(), + users: this.client.guilds.cache.reduce((a, b) => a + b.memberCount, 0), version: `v${version}` }; } @@ -58,18 +56,22 @@ export default class extends SkyraCommand { private get usageStatistics(): StatsUsage { const usage = process.memoryUsage(); return { - cpuLoad: cpus().map(({ times }) => roundNumber(((times.user + times.nice + times.sys + times.irq) / times.idle) * 10000) / 100), - ramTotal: `${Math.round(100 * (usage.heapTotal / 1048576)) / 100}MB`, - ramUsed: `${Math.round(100 * (usage.heapUsed / 1048576)) / 100}MB` + cpuLoad: cpus().map(UserCommand.formatCpuInfo.bind(null)).join(' | '), + ramTotal: usage.heapTotal / 1048576, + ramUsed: usage.heapUsed / 1048576 }; } + + private static formatCpuInfo({ times }: CpuInfo) { + return `${roundNumber(((times.user + times.nice + times.sys + times.irq) / times.idle) * 10000) / 100}%`; + } } export interface StatsGeneral { - channels: string; - guilds: string; + channels: number; + guilds: number; nodeJs: string; - users: string; + users: number; version: string; } @@ -80,7 +82,7 @@ export interface StatsUptime { } export interface StatsUsage { - cpuLoad: number[]; - ramTotal: string; - ramUsed: string; + cpuLoad: string; + ramTotal: number; + ramUsed: number; } diff --git a/src/commands/System/support.ts b/src/commands/System/support.ts index f191b0de1c0..4c56d0b86de 100644 --- a/src/commands/System/support.ts +++ b/src/commands/System/support.ts @@ -1,26 +1,24 @@ import { DbSet } from '#lib/database'; -import { SkyraCommand } from '#lib/structures/SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { CommandStore, KlasaMessage } from 'klasa'; +import { KlasaMessage } from 'klasa'; +@ApplyOptions({ + aliases: ['support-server', 'server'], + description: LanguageKeys.Commands.System.SupportDescription, + extendedHelp: LanguageKeys.Commands.System.SupportExtended, + guarded: true, + requiredPermissions: ['EMBED_LINKS'] +}) export default class extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string) { - super(store, file, directory, { - aliases: ['support-server', 'server'], - description: (language) => language.get(LanguageKeys.Commands.System.SupportDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.System.SupportExtended), - guarded: true, - requiredPermissions: ['EMBED_LINKS'] - }); - } - public async run(message: KlasaMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); return message.send( new MessageEmbed() - .setTitle(language.get(LanguageKeys.Commands.System.SupportEmbedTitle, { username: message.author.username })) - .setDescription(language.get(LanguageKeys.Commands.System.SupportEmbedDescription)) + .setTitle(t(LanguageKeys.Commands.System.SupportEmbedTitle, { username: message.author.username })) + .setDescription(t(LanguageKeys.Commands.System.SupportEmbedDescription)) .setColor(await DbSet.fetchColor(message)) ); } diff --git a/src/commands/Tags/tag.ts b/src/commands/Tags/tag.ts index 9644220c358..2246b182bd5 100644 --- a/src/commands/Tags/tag.ts +++ b/src/commands/Tags/tag.ts @@ -16,8 +16,8 @@ import { MessageEmbed } from 'discord.js'; @ApplyOptions({ aliases: ['tags', 'customcommand', 'copypasta'], - description: (language) => language.get(LanguageKeys.Commands.Tags.TagDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tags.TagExtended), + description: LanguageKeys.Commands.Tags.TagDescription, + extendedHelp: LanguageKeys.Commands.Tags.TagExtended, runIn: ['text'], subcommands: true, flagSupport: true, @@ -30,7 +30,7 @@ import { MessageEmbed } from 'discord.js'; 'tagname', async (arg, possible, message, [action]) => { if (action === 'list' || action === 'reset') return undefined; - if (!arg) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidString, { name: possible.name }); + if (!arg) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidString, { name: possible.name }); return arg.toLowerCase(); } ] @@ -41,87 +41,87 @@ export default class extends SkyraCommand { #kHexlessRegex = /^([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/i; @requiresPermission(PermissionLevels.Moderator, async (message: GuildMessage) => { - throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagPermissionLevel); + throw await message.resolveKey(LanguageKeys.Commands.Tags.TagPermissionLevel); }) public async add(message: GuildMessage, [id, content]: [string, string]) { // Check for permissions and content length - if (!content) throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagContentRequired); + if (!content) throw await message.resolveKey(LanguageKeys.Commands.Tags.TagContentRequired); - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); if (settings[GuildSettings.CustomCommands].some((command) => command.id === id)) - throw language.get(LanguageKeys.Commands.Tags.TagExists, { tag: id }); + throw t(LanguageKeys.Commands.Tags.TagExists, { tag: id }); settings[GuildSettings.CustomCommands].push(this.createTag(message, id, content)); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Tags.TagAdded, { name: id, content: cutText(content, 1850) })); + return message.send(t(LanguageKeys.Commands.Tags.TagAdded, { name: id, content: cutText(content, 1850) })); } @requiresPermission(PermissionLevels.Moderator, async (message: GuildMessage) => { - throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagPermissionLevel); + throw await message.resolveKey(LanguageKeys.Commands.Tags.TagPermissionLevel); }) public async remove(message: GuildMessage, [id]: [string]) { - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const tagIndex = settings[GuildSettings.CustomCommands].findIndex((command) => command.id === id); - if (tagIndex === -1) throw language.get(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); + if (tagIndex === -1) throw t(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); settings[GuildSettings.CustomCommands].splice(tagIndex, 1); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Tags.TagRemoved, { name: id })); + return message.send(t(LanguageKeys.Commands.Tags.TagRemoved, { name: id })); } @requiresPermission(PermissionLevels.Moderator, async (message: GuildMessage) => { - throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagPermissionLevel); + throw await message.resolveKey(LanguageKeys.Commands.Tags.TagPermissionLevel); }) public async reset(message: GuildMessage) { - const language = await message.guild.writeSettings((settings) => { + await message.guild.writeSettings((settings) => { settings[GuildSettings.CustomCommands].length = 0; - return settings.getLanguage(); }); - return message.send(language.get(LanguageKeys.Commands.Tags.TagReset)); + return message.sendTranslated(LanguageKeys.Commands.Tags.TagReset); } @requiresPermission(PermissionLevels.Moderator, async (message: GuildMessage) => { - throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagPermissionLevel); + throw await message.resolveKey(LanguageKeys.Commands.Tags.TagPermissionLevel); }) public async edit(message: GuildMessage, [id, content]: [string, string]) { - if (!content) throw await message.fetchLocale(LanguageKeys.Commands.Tags.TagContentRequired); + if (!content) throw await message.resolveKey(LanguageKeys.Commands.Tags.TagContentRequired); - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); const tagIndex = settings[GuildSettings.CustomCommands].findIndex((command) => command.id === id); - if (tagIndex === -1) throw language.get(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); + if (tagIndex === -1) throw t(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); settings[GuildSettings.CustomCommands].splice(tagIndex, 1, this.createTag(message, id, content)); - return language; + return t; }); - return message.send(language.get(LanguageKeys.Commands.Tags.TagEdited, { name: id, content: cutText(content, 1000) })); + return message.send(t(LanguageKeys.Commands.Tags.TagEdited, { name: id, content: cutText(content, 1000) })); } @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async list(message: GuildMessage) { // Get tags, prefix, and language - const [[tags, prefix], language] = await Promise.all([ - message.guild.readSettings([GuildSettings.CustomCommands, GuildSettings.Prefix]), - message.fetchLanguage() + const [tags, prefix, t] = await message.guild.readSettings((settings) => [ + settings[GuildSettings.CustomCommands], + settings[GuildSettings.Prefix], + settings.getLanguage() ]); - if (!tags.length) throw language.get(LanguageKeys.Commands.Tags.TagListEmpty); + if (!tags.length) throw t(LanguageKeys.Commands.Tags.TagListEmpty); const response = await message.send( - new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(language.get(LanguageKeys.System.Loading))) + new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(t(LanguageKeys.System.Loading))) ); // Get prefix and display all tags diff --git a/src/commands/Tools/Dictionary/define.ts b/src/commands/Tools/Dictionary/define.ts index 7feb0078843..20f8924b658 100644 --- a/src/commands/Tools/Dictionary/define.ts +++ b/src/commands/Tools/Dictionary/define.ts @@ -9,34 +9,34 @@ import { fetch, FetchResultTypes, IMAGE_EXTENSION, pickRandom } from '#utils/uti import { cutText, parseURL, toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['definition', 'defination', 'dictionary'], bucket: 2, cooldown: 20, - description: (language) => language.get(LanguageKeys.Commands.Tools.DefineDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.DefineExtended), + description: LanguageKeys.Commands.Tools.DefineDescription, + extendedHelp: LanguageKeys.Commands.Tools.DefineExtended, usage: '' }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [input]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const result = await this.fetchApi(language, input); - const display = await this.buildDisplay(result, message, language); + const result = await this.fetchApi(t, input); + const display = await this.buildDisplay(result, message, t); await display.start(response, message.author.id); return response; } - private async buildDisplay(results: OwlbotResultOk, message: GuildMessage, language: Language) { + private async buildDisplay(results: OwlbotResultOk, message: GuildMessage, t: TFunction) { const template = new MessageEmbed().setTitle(toTitleCase(results.word)).setColor(await DbSet.fetchColor(message)); - if (results.pronunciation) template.addField(language.get(LanguageKeys.Commands.Tools.DefinePronounciation), results.pronunciation, true); + if (results.pronunciation) template.addField(t(LanguageKeys.Commands.Tools.DefinePronunciation), results.pronunciation, true); const display = new UserRichDisplay(template).setFooterSuffix(' - Powered by Owlbot'); @@ -44,7 +44,7 @@ export default class extends RichDisplayCommand { const definition = this.content(result.definition); display.addPage((embed: MessageEmbed) => { embed - .addField('Type', result.type ? toTitleCase(result.type) : language.get(LanguageKeys.Commands.Tools.DefineUnknown), true) + .addField('Type', result.type ? toTitleCase(result.type) : t(LanguageKeys.Commands.Tools.DefineUnknown), true) .setDescription(definition); const imageUrl = IMAGE_EXTENSION.test(result.image_url ?? '') && parseURL(result.image_url ?? ''); @@ -57,7 +57,7 @@ export default class extends RichDisplayCommand { return display; } - private async fetchApi(language: Language, word: string) { + private async fetchApi(t: TFunction, word: string) { try { return await fetch( `https://owlbot.info/api/v4/dictionary/${encodeURIComponent(word.toLowerCase())}`, @@ -65,7 +65,7 @@ export default class extends RichDisplayCommand { FetchResultTypes.JSON ); } catch { - throw language.get(LanguageKeys.Commands.Tools.DefineNotfound); + throw t(LanguageKeys.Commands.Tools.DefineNotFound); } } diff --git a/src/commands/Tools/Dictionary/urban.ts b/src/commands/Tools/Dictionary/urban.ts index 36cd4f29eaa..4488bceb94e 100644 --- a/src/commands/Tools/Dictionary/urban.ts +++ b/src/commands/Tools/Dictionary/urban.ts @@ -8,21 +8,21 @@ import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText, toTitleCase } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['ud', 'urbandictionary'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.UrbanDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.UrbanExtended), + description: LanguageKeys.Commands.Tools.UrbanDescription, + extendedHelp: LanguageKeys.Commands.Tools.UrbanExtended, nsfw: true, usage: '' }) export default class extends RichDisplayCommand { public async run(message: GuildMessage, [query]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const result = await fetch( @@ -31,13 +31,13 @@ export default class extends RichDisplayCommand { ); const list = result.list.sort((a, b) => b.thumbs_up - b.thumbs_down - (a.thumbs_up - a.thumbs_down)); - const display = await this.buildDisplay(list, message, language, query); + const display = await this.buildDisplay(list, message, t, query); await display.start(response, message.author.id); return response; } - private async buildDisplay(results: UrbanDictionaryResultOkEntry[], message: GuildMessage, language: Language, query: string) { + private async buildDisplay(results: UrbanDictionaryResultOkEntry[], message: GuildMessage, language: TFunction, query: string) { const display = new UserRichDisplay( new MessageEmbed() .setTitle(`Urban Dictionary: ${toTitleCase(query)}`) @@ -62,9 +62,9 @@ export default class extends RichDisplayCommand { return display; } - private parseDefinition(definition: string, permalink: string, i18n: Language) { + private parseDefinition(definition: string, permalink: string, i18n: TFunction) { if (definition.length < 750) return definition; - return i18n.get(LanguageKeys.Misc.SystemTextTruncated, { definition: cutText(definition, 750), url: permalink }); + return i18n(LanguageKeys.Misc.SystemTextTruncated, { definition: cutText(definition, 750), url: permalink }); } } diff --git a/src/commands/Tools/Websearch/country.ts b/src/commands/Tools/Websearch/country.ts index 3bca8818194..be6359a0a24 100644 --- a/src/commands/Tools/Websearch/country.ts +++ b/src/commands/Tools/Websearch/country.ts @@ -6,43 +6,44 @@ import { BrandingColors } from '#utils/constants'; import { fetch, pickRandom } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const SuperScriptTwo = '\u00B2'; const mapNativeName = (data: { name: string; nativeName: string }) => `${data.name} ${data.nativeName === data.name ? '' : `(${data.nativeName})`}`; const mapCurrency = (currency: CurrencyData) => `${currency.name} (${currency.symbol})`; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Tools.CountryDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.CountryExtended), + description: LanguageKeys.Commands.Tools.CountryDescription, + extendedHelp: LanguageKeys.Commands.Tools.CountryExtended, usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [countryName]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const countries = await this.fetchAPI(language, countryName); - if (countries.length === 0) throw language.get(LanguageKeys.System.QueryFail); + const countries = await this.fetchAPI(t, countryName); + if (countries.length === 0) throw t(LanguageKeys.System.QueryFail); - const display = await this.buildDisplay(message, language, countries); + const display = await this.buildDisplay(message, t, countries); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, countryName: string) { + private async fetchAPI(t: TFunction, countryName: string) { try { return await fetch(`https://restcountries.eu/rest/v2/name/${encodeURIComponent(countryName)}`); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: KlasaMessage, language: Language, countries: CountryResultOk) { - const titles = language.get(LanguageKeys.Commands.Tools.CountryTitles); - const fieldsData = language.get(LanguageKeys.Commands.Tools.CountryFields); + private async buildDisplay(message: KlasaMessage, t: TFunction, countries: CountryResultOk) { + const titles = t(LanguageKeys.Commands.Tools.CountryTitles); + const fieldsData = t(LanguageKeys.Commands.Tools.CountryFields); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const country of countries) { @@ -56,7 +57,7 @@ export default class extends SkyraCommand { [ `${fieldsData.overview.officialName}: ${country.altSpellings[2] ?? country.name}`, `${fieldsData.overview.capital}: ${country.capital}`, - `${fieldsData.overview.population}: ${country.population.toLocaleString(language.name)}` + `${fieldsData.overview.population}: ${t(LanguageKeys.Globals.NumberValue, { value: country.population })}` ].join('\n') ) .addField(titles.LANGUAGES, country.languages.map(mapNativeName).join('\n')) @@ -64,8 +65,10 @@ export default class extends SkyraCommand { titles.OTHER, [ `${fieldsData.other.demonym}: ${country.demonym}`, - country.area ? `${fieldsData.other.area}: ${country.area.toLocaleString(language.name)} km${SuperScriptTwo}` : null, - `${fieldsData.other.currencies}: ${country.currencies.map(mapCurrency).join(', ')}` + country.area + ? `${fieldsData.other.area}: ${t(LanguageKeys.Globals.NumberValue, { value: country.area })} km${SuperScriptTwo}` + : null, + `${fieldsData.other.currencies}: ${t(LanguageKeys.Globals.AndListValue, { value: country.currencies.map(mapCurrency) })}` ] .filter(Boolean) .join('\n') diff --git a/src/commands/Tools/Websearch/dsearch.ts b/src/commands/Tools/Websearch/dsearch.ts index 89b235095d4..be396dc1a85 100644 --- a/src/commands/Tools/Websearch/dsearch.ts +++ b/src/commands/Tools/Websearch/dsearch.ts @@ -9,8 +9,8 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['duckduckgo'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.DuckDuckGoDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.DuckDuckGoExtended), + description: LanguageKeys.Commands.Tools.DuckDuckGoDescription, + extendedHelp: LanguageKeys.Commands.Tools.DuckDuckGoExtended, usage: '', usageDelim: ' ', requiredPermissions: ['EMBED_LINKS'] @@ -21,13 +21,13 @@ export default class extends SkyraCommand { const body = await fetch(`https://api.duckduckgo.com/?q=${encodeURIComponent(query)}&format=json`, FetchResultTypes.JSON); if (body.Heading.length === 0) { - throw await message.fetchLocale(LanguageKeys.Commands.Tools.DuckDuckGoNotfound); + throw await message.resolveKey(LanguageKeys.Commands.Tools.DuckDuckGoNotFound); } const embed = new MessageEmbed().setTitle(body.Heading).setURL(body.AbstractURL).setThumbnail(body.Image).setDescription(body.AbstractText); if (body.RelatedTopics && body.RelatedTopics.length > 0) { - embed.addField(await message.fetchLocale(LanguageKeys.Commands.Tools.DuckDuckGoLookalso), body.RelatedTopics[0].Text); + embed.addField(await message.resolveKey(LanguageKeys.Commands.Tools.DuckDuckGoLookAlso), body.RelatedTopics[0].Text); } return message.send(embed); diff --git a/src/commands/Tools/Websearch/eshop.ts b/src/commands/Tools/Websearch/eshop.ts index c9c4e0333b7..64316381097 100644 --- a/src/commands/Tools/Websearch/eshop.ts +++ b/src/commands/Tools/Websearch/eshop.ts @@ -7,39 +7,36 @@ import { TOKENS } from '#root/config'; import { BrandingColors, Mime } from '#utils/constants'; import { fetch, FetchMethods, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText, toTitleCase } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; import { decode } from 'he'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { stringify } from 'querystring'; const API_URL = `https://${TOKENS.NINTENDO_ID}-dsn.algolia.net/1/indexes/*/queries`; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.EshopDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.EshopExtended), + description: LanguageKeys.Commands.Tools.EshopDescription, + extendedHelp: LanguageKeys.Commands.Tools.EshopExtended, usage: '' }) export default class extends RichDisplayCommand { - private releaseDateTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [gameName]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { results: entries } = await this.fetchAPI(language, gameName); - if (!entries.length) throw language.get(LanguageKeys.System.QueryFail); + const { results: entries } = await this.fetchAPI(t, gameName); + if (!entries.length) throw t(LanguageKeys.System.QueryFail); - const display = await this.buildDisplay(message, language, entries[0].hits); + const display = await this.buildDisplay(message, t, entries[0].hits); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, gameName: string) { + private async fetchAPI(t: TFunction, gameName: string) { try { return fetch( API_URL, @@ -68,24 +65,24 @@ export default class extends RichDisplayCommand { FetchResultTypes.JSON ); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: GuildMessage, language: Language, entries: EShopHit[]) { - const titles = language.get(LanguageKeys.Commands.Tools.EshopTitles); + private async buildDisplay(message: GuildMessage, t: TFunction, entries: EShopHit[]) { + const titles = t(LanguageKeys.Commands.Tools.EshopTitles); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const game of entries) { const description = cutText(decode(game.description).replace(/\s\n {2,}/g, ' '), 750); const price = game.msrp ? game.msrp > 0 - ? language.get(LanguageKeys.Commands.Tools.EshopPricePaid, { price: game.msrp }) - : language.get(LanguageKeys.Commands.Tools.EshopPriceFree) + ? t(LanguageKeys.Commands.Tools.EshopPricePaid, { price: game.msrp }) + : t(LanguageKeys.Commands.Tools.EshopPriceFree) : 'TBD'; const esrbText = game.esrb ? [`**${game.esrb}**`, game.esrbDescriptors && game.esrbDescriptors.length ? ` - ${game.esrbDescriptors.join(', ')}` : ''].join('') - : language.get(LanguageKeys.Commands.Tools.EshopNotInDatabase); + : t(LanguageKeys.Commands.Tools.EshopNotInDatabase); display.addPage((embed: MessageEmbed) => embed @@ -97,7 +94,9 @@ export default class extends RichDisplayCommand { .addField(titles.availability, game.availability[0], true) .addField( titles.releaseDate, - game.releaseDateMask === 'TBD' ? game.releaseDateMask : this.releaseDateTimestamp.displayUTC(game.releaseDateMask), + game.releaseDateMask === 'TBD' + ? game.releaseDateMask + : t(LanguageKeys.Globals.TimeDateValue, { value: new Date(game.releaseDateMask).getTime() }), true ) .addField(titles.numberOfPlayers, toTitleCase(game.players), true) diff --git a/src/commands/Tools/Websearch/horoscope.ts b/src/commands/Tools/Websearch/horoscope.ts index 70bdb6cb6a0..f8da1ccd62f 100644 --- a/src/commands/Tools/Websearch/horoscope.ts +++ b/src/commands/Tools/Websearch/horoscope.ts @@ -7,7 +7,8 @@ import { createPick } from '#utils/util'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { Days, Sunsigns } from '@skyra/saelem'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; const kSunSigns = new Set([ 'capricorn', @@ -28,8 +29,8 @@ const kRandomSunSign = createPick([...kSunSigns]); @ApplyOptions({ aliases: ['saelem'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.HoroscopeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.HoroscopeExtended), + description: LanguageKeys.Commands.Tools.HoroscopeDescription, + extendedHelp: LanguageKeys.Commands.Tools.HoroscopeExtended, requiredGuildPermissions: ['EMBED_LINKS'], usage: ' [tomorrow|yesterday|today:default]', usageDelim: ' ' @@ -41,16 +42,16 @@ const kRandomSunSign = createPick([...kSunSigns]); const lowerCasedArgument = arg.toLowerCase(); if (kSunSigns.has(lowerCasedArgument)) return lowerCasedArgument; - throw await message.fetchLocale(LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, { sign: arg, maybe: kRandomSunSign() }); + throw await message.resolveKey(LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, { sign: arg, maybe: kRandomSunSign() }); } ] ]) export default class extends SkyraCommand { public async run(message: KlasaMessage, [sign, day]: [Sunsigns, Days]) { - const language = await message.fetchLanguage(); - const { date, intensity, keywords, mood, prediction, rating } = await this.fetchAPI(language, sign, day); + const t = await message.fetchT(); + const { date, intensity, keywords, mood, prediction, rating } = await this.fetchAPI(t, sign, day); - const titles = language.get(LanguageKeys.Commands.Tools.HoroscopeTitles, { + const titles = t(LanguageKeys.Commands.Tools.HoroscopeTitles, { sign, intensity, keywords, @@ -67,12 +68,12 @@ export default class extends SkyraCommand { ); } - private async fetchAPI(language: Language, sunsign: Sunsigns, day: Days) { + private async fetchAPI(t: TFunction, sunsign: Sunsigns, day: Days) { try { const { data } = await fetchSaelem<'getHoroscope'>(getHoroscope, { sunsign, day }); return data.getHoroscope; } catch { - throw language.get(LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, { sign: sunsign, maybe: kRandomSunSign() }); + throw t(LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, { sign: sunsign, maybe: kRandomSunSign() }); } } } diff --git a/src/commands/Tools/Websearch/igdb.ts b/src/commands/Tools/Websearch/igdb.ts index 24738576012..35d4205db07 100644 --- a/src/commands/Tools/Websearch/igdb.ts +++ b/src/commands/Tools/Websearch/igdb.ts @@ -8,10 +8,9 @@ import { BrandingColors, Mime } from '#utils/constants'; import { AgeRatingRatingEnum, Company, Game } from '#utils/External/IgdbTypes'; import { fetch, FetchMethods, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText, isNumber, roundNumber } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const API_URL = 'https://api.igdb.com/v4/games'; @@ -25,12 +24,11 @@ function isIgdbCompany(company: unknown): company is Company { @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.IgdbDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.IgdbExtended), + description: LanguageKeys.Commands.Tools.IgdbDescription, + extendedHelp: LanguageKeys.Commands.Tools.IgdbExtended, usage: '' }) export default class extends RichDisplayCommand { - private readonly releaseDateTimestamp = new Timestamp('MMMM d YYYY'); private readonly urlRegex = /https?:/i; private readonly igdbRequestHeaders = { 'Content-Type': Mime.Types.TextPlain, @@ -58,20 +56,20 @@ export default class extends RichDisplayCommand { ].join('; '); public async run(message: GuildMessage, [game]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const entries = await this.fetchAPI(language, game); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const entries = await this.fetchAPI(t, game); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(message, language, entries); + const display = await this.buildDisplay(message, t, entries); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, game: string) { + private async fetchAPI(t: TFunction, game: string) { try { return await fetch( API_URL, @@ -86,13 +84,13 @@ export default class extends RichDisplayCommand { FetchResultTypes.JSON ); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: GuildMessage, language: Language, entries: Game[]) { - const titles = language.get(LanguageKeys.Commands.Tools.IgdbTitles); - const fieldsData = language.get(LanguageKeys.Commands.Tools.IgdbData); + private async buildDisplay(message: GuildMessage, t: TFunction, entries: Game[]) { + const titles = t(LanguageKeys.Commands.Tools.IgdbTitles); + const fieldsData = t(LanguageKeys.Commands.Tools.IgdbData); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const game of entries) { @@ -110,7 +108,7 @@ export default class extends RichDisplayCommand { '', `**${titles.userScore}**: ${userRating}`, `**${titles.ageRating}**: ${this.resolveAgeRating(game.age_ratings, fieldsData.noAgeRatings)}`, - `**${titles.releaseDate}**: ${this.resolveReleaseDate(game.release_dates, fieldsData.noReleaseDate)}`, + `**${titles.releaseDate}**: ${this.resolveReleaseDate(t, game.release_dates, fieldsData.noReleaseDate)}`, `**${titles.genres}**: ${this.resolveGenres(game.genres, fieldsData.noGenres)}`, `**${titles.developers}**: ${this.resolveDevelopers(game.involved_companies, fieldsData.noDevelopers)}`, `**${titles.platform}**: ${this.resolvePlatforms(game.platforms, fieldsData.noPlatforms)}` @@ -157,9 +155,9 @@ export default class extends RichDisplayCommand { .join(', '); } - private resolveReleaseDate(releaseDates: Game['release_dates'], fallback: string) { + private resolveReleaseDate(t: TFunction, releaseDates: Game['release_dates'], fallback: string) { if (!releaseDates || releaseDates.length === 0 || isArrayOfNumbers(releaseDates) || !releaseDates[0].date) return fallback; - return this.releaseDateTimestamp.displayUTC(releaseDates[0].date * 1000); + return t(LanguageKeys.Globals.TimeDateValue, { value: releaseDates[0].date * 1000 }); } private resolvePlatforms(platforms: Game['platforms'], fallback: string) { diff --git a/src/commands/Tools/Websearch/itunes.ts b/src/commands/Tools/Websearch/itunes.ts index 15bde95ba15..d39a0e8d500 100644 --- a/src/commands/Tools/Websearch/itunes.ts +++ b/src/commands/Tools/Websearch/itunes.ts @@ -5,53 +5,50 @@ import { GuildMessage } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors } from '#utils/constants'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.ItunesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.ItunesExtended), + description: LanguageKeys.Commands.Tools.ITunesDescription, + extendedHelp: LanguageKeys.Commands.Tools.ITunesExtended, usage: '' }) export default class extends RichDisplayCommand { - private releaseDateTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [song]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { results: entries } = await this.fetchAPI(language, song); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const { results: entries } = await this.fetchAPI(t, song); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(message, language, entries); + const display = await this.buildDisplay(message, t, entries); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, song: string) { + private async fetchAPI(t: TFunction, song: string) { try { const url = new URL('https://itunes.apple.com/search'); url.searchParams.append('country', 'US'); url.searchParams.append('entity', 'song'); url.searchParams.append('explicit', 'no'); - url.searchParams.append('lang', language.name.toLowerCase()); + url.searchParams.append('lang', t.lng.toLowerCase()); url.searchParams.append('limit', '10'); url.searchParams.append('media', 'music'); url.searchParams.append('term', song); return await fetch(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: GuildMessage, language: Language, entries: ItunesData[]) { - const titles = language.get(LanguageKeys.Commands.Tools.ItunesTitles); + private async buildDisplay(message: GuildMessage, t: TFunction, entries: ItunesData[]) { + const titles = t(LanguageKeys.Commands.Tools.ITunesTitles); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); for (const song of entries) { @@ -64,7 +61,7 @@ export default class extends RichDisplayCommand { .addField(titles.collection, `[${song.collectionName}](${song.collectionViewUrl})`, true) .addField(titles.collectionPrice, `$${song.collectionPrice}`, true) .addField(titles.trackPrice, `$${song.trackPrice}`, true) - .addField(titles.trackReleaseDate, this.releaseDateTimestamp.displayUTC(song.releaseDate), true) + .addField(titles.trackReleaseDate, t(LanguageKeys.Globals.TimeDateValue, { value: new Date(song.releaseDate).getTime() }), true) .addField(titles.numberOfTracksInCollection, song.trackCount, true) .addField(titles.primaryGenre, song.primaryGenreName, true) .addField(titles.preview, `[${titles.previewLabel}](${song.previewUrl})`, true) diff --git a/src/commands/Tools/Websearch/movies.ts b/src/commands/Tools/Websearch/movies.ts index 9eb6ced3188..0ca4e28ae24 100644 --- a/src/commands/Tools/Websearch/movies.ts +++ b/src/commands/Tools/Websearch/movies.ts @@ -8,37 +8,34 @@ import { TOKENS } from '#root/config'; import { BrandingColors } from '#utils/constants'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['movie', 'tmdb'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.MoviesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.MoviesExtended), + description: LanguageKeys.Commands.Tools.MoviesDescription, + extendedHelp: LanguageKeys.Commands.Tools.MoviesExtended, usage: ' [year:str]', usageDelim: 'y:' }) export default class extends RichDisplayCommand { - private releaseDateTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [movie, year]: [string, string?]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { results: entries } = await this.fetchAPI(language, movie, year); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const { results: entries } = await this.fetchAPI(t, movie, year); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(message, language, entries); + const display = await this.buildDisplay(message, t, entries); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, movie: string, year?: string) { + private async fetchAPI(t: TFunction, movie: string, year?: string) { try { const url = new URL('https://api.themoviedb.org/3/search/movie'); url.searchParams.append('api_key', TOKENS.THEMOVIEDATABASE_KEY); @@ -48,27 +45,27 @@ export default class extends RichDisplayCommand { return await fetch(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async fetchMovieData(language: Language, movieId: number) { + private async fetchMovieData(t: TFunction, movieId: number) { try { const url = new URL(`https://api.themoviedb.org/3/movie/${movieId}`); url.searchParams.append('api_key', TOKENS.THEMOVIEDATABASE_KEY); return await fetch(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: GuildMessage, language: Language, movies: Tmdb.TmdbMovieList['results']) { - const titles = language.get(LanguageKeys.Commands.Tools.MoviesTitles); - const fieldsData = language.get(LanguageKeys.Commands.Tools.MoviesData); + private async buildDisplay(message: GuildMessage, t: TFunction, movies: Tmdb.TmdbMovieList['results']) { + const titles = t(LanguageKeys.Commands.Tools.MoviesTitles); + const fieldsData = t(LanguageKeys.Commands.Tools.MoviesData); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); - const movieData = await Promise.all(movies.map((movie) => this.fetchMovieData(language, movie.id))); + const movieData = await Promise.all(movies.map((movie) => this.fetchMovieData(t, movie.id))); for (const movie of movieData) { display.addPage((embed: MessageEmbed) => @@ -78,10 +75,21 @@ export default class extends RichDisplayCommand { .setImage(`https://image.tmdb.org/t/p/original${movie.backdrop_path}`) .setThumbnail(`https://image.tmdb.org/t/p/original${movie.poster_path}`) .setDescription(cutText(movie.overview, 750)) - .addField(titles.runtime, movie.runtime ? language.duration(movie.runtime * 60 * 1000) : fieldsData.movieInProduction, true) + // TODO: i18next formatters in ternaries? + .addField( + titles.runtime, + movie.runtime ? t(LanguageKeys.Globals.DurationValue, { value: movie.runtime * 60 * 1000 }) : fieldsData.movieInProduction, + true + ) .addField(titles.userScore, movie.vote_average ? movie.vote_average : fieldsData.movieInProduction, true) .addField(titles.status, movie.status, true) - .addField(titles.releaseDate, this.releaseDateTimestamp.displayUTC(movie.release_date), true) + .addField( + titles.releaseDate, + movie.release_date + ? t(LanguageKeys.Globals.TimeDateValue, { value: new Date(movie.release_date).getTime() }) + : t(LanguageKeys.Globals.Unknown), + true + ) .addField( titles.imdbPage, movie.imdb_id ? `[${fieldsData.linkClickHere}](http://www.imdb.com/title/${movie.imdb_id})` : fieldsData.none, diff --git a/src/commands/Tools/Websearch/price.ts b/src/commands/Tools/Websearch/price.ts index 95957a3d872..d9d913fe617 100644 --- a/src/commands/Tools/Websearch/price.ts +++ b/src/commands/Tools/Websearch/price.ts @@ -8,30 +8,28 @@ import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { roundNumber } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['currency', 'money', 'exchange'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.PriceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.PriceExtended), + description: LanguageKeys.Commands.Tools.PriceDescription, + extendedHelp: LanguageKeys.Commands.Tools.PriceExtended, requiredPermissions: ['EMBED_LINKS'], usage: '[amount:number] [...]', usageDelim: ' ' }) export default class extends SkyraCommand { public async run(message: GuildMessage, [amount = 1, fromCurrency, ...toCurrencies]: [number, string, string]) { - const language = await message.fetchLanguage(); - await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) - ); + const t = await message.fetchT(); + await message.send(new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary)); - const result = await this.fetchAPI(language, fromCurrency, toCurrencies); + const result = await this.fetchAPI(t, fromCurrency, toCurrencies); - return message.send(await this.buildEmbed(message, language, result, fromCurrency, amount)); + return message.send(await this.buildEmbed(message, t, result, fromCurrency, amount)); } - private async fetchAPI(language: Language, fromCurrency: string, toCurrency: string[]): Promise { + private async fetchAPI(t: TFunction, fromCurrency: string, toCurrency: string[]): Promise { try { const url = new URL('https://min-api.cryptocompare.com/data/price'); url.searchParams.append('fsym', fromCurrency.toUpperCase()); @@ -49,11 +47,11 @@ export default class extends SkyraCommand { if (Reflect.has(body, 'Message')) throw undefined; // Error is handled in the catch return body as CryptoCompareResultOk; } catch { - throw language.get(LanguageKeys.Commands.Tools.PriceCurrencyNotFound); + throw t(LanguageKeys.Commands.Tools.PriceCurrencyNotFound); } } - private async buildEmbed(message: GuildMessage, language: Language, result: CryptoCompareResultOk, fromCurrency: string, fromAmount: number) { + private async buildEmbed(message: GuildMessage, t: TFunction, result: CryptoCompareResultOk, fromCurrency: string, fromAmount: number) { const worths: string[] = []; for (const [currency, toAmount] of Object.entries(result)) { worths.push(`**${roundNumber(fromAmount * toAmount, 2)}** ${currency}`); @@ -61,7 +59,7 @@ export default class extends SkyraCommand { return new MessageEmbed() .setColor(await DbSet.fetchColor(message)) - .setDescription(language.get(LanguageKeys.Commands.Tools.PriceCurrency, { fromCurrency, fromAmount, worths })) + .setDescription(t(LanguageKeys.Commands.Tools.PriceCurrency, { fromCurrency, fromAmount, worths })) .setTimestamp(); } } diff --git a/src/commands/Tools/Websearch/shows.ts b/src/commands/Tools/Websearch/shows.ts index 58c64bb677b..98123d1ac84 100644 --- a/src/commands/Tools/Websearch/shows.ts +++ b/src/commands/Tools/Websearch/shows.ts @@ -8,37 +8,34 @@ import { TOKENS } from '#root/config'; import { BrandingColors } from '#utils/constants'; import { fetch, FetchResultTypes, pickRandom } from '#utils/util'; import { cutText } from '@sapphire/utilities'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['show', 'tvdb', 'tv'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.ShowsDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.ShowsExtended), + description: LanguageKeys.Commands.Tools.ShowsDescription, + extendedHelp: LanguageKeys.Commands.Tools.ShowsExtended, usage: ' [year:str]', usageDelim: 'y:' }) export default class extends RichDisplayCommand { - private releaseDateTimestamp = new Timestamp('MMMM d YYYY'); - public async run(message: GuildMessage, [show, year]: [string, string?]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); - const { results: entries } = await this.fetchAPI(language, show, year); - if (!entries.length) throw language.get(LanguageKeys.System.NoResults); + const { results: entries } = await this.fetchAPI(t, show, year); + if (!entries.length) throw t(LanguageKeys.System.NoResults); - const display = await this.buildDisplay(message, language, entries); + const display = await this.buildDisplay(message, t, entries); await display.start(response, message.author.id); return response; } - private async fetchAPI(language: Language, show: string, year?: string) { + private async fetchAPI(t: TFunction, show: string, year?: string) { try { const url = new URL('https://api.themoviedb.org/3/search/tv'); url.searchParams.append('api_key', TOKENS.THEMOVIEDATABASE_KEY); @@ -48,27 +45,27 @@ export default class extends RichDisplayCommand { return await fetch(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async fetchShowData(language: Language, serieId: number) { + private async fetchShowData(t: TFunction, serieId: number) { try { const url = new URL(`https://api.themoviedb.org/3/tv/${serieId}`); url.searchParams.append('api_key', TOKENS.THEMOVIEDATABASE_KEY); return await fetch(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } - private async buildDisplay(message: GuildMessage, language: Language, shows: Tmdb.TmdbSeriesList['results']) { - const titles = language.get(LanguageKeys.Commands.Tools.ShowsTitles); - const fieldsData = language.get(LanguageKeys.Commands.Tools.ShowsData); + private async buildDisplay(message: GuildMessage, t: TFunction, shows: Tmdb.TmdbSeriesList['results']) { + const titles = t(LanguageKeys.Commands.Tools.ShowsTitles); + const fieldsData = t(LanguageKeys.Commands.Tools.ShowsData); const display = new UserRichDisplay(new MessageEmbed().setColor(await DbSet.fetchColor(message))); - const showData = await Promise.all(shows.map((show) => this.fetchShowData(language, show.id))); + const showData = await Promise.all(shows.map((show) => this.fetchShowData(t, show.id))); for (const show of showData) { display.addPage((embed: MessageEmbed) => @@ -80,12 +77,14 @@ export default class extends RichDisplayCommand { .setDescription(cutText(show.overview, 750)) .addField( titles.episodeRuntime, - show.episode_run_time.length ? `${language.duration(show.episode_run_time[0] * 60 * 1000)}` : fieldsData.variableRuntime, + show.episode_run_time.length + ? `${t(LanguageKeys.Globals.DurationValue, { value: show.episode_run_time[0] * 60 * 1000 })}` + : fieldsData.variableRuntime, true ) .addField(titles.userScore, show.vote_average ? show.vote_average : fieldsData.unknownUserScore, true) .addField(titles.status, show.status, true) - .addField(titles.firstAirDate, this.releaseDateTimestamp.displayUTC(show.first_air_date), true) + .addField(titles.firstAirDate, t(LanguageKeys.Globals.TimeDateValue, { value: new Date(show.first_air_date).getTime() }), true) .addField(titles.genres, show.genres.length ? show.genres.map((genre) => genre.name).join(', ') : fieldsData.noGenres) ); } diff --git a/src/commands/Tools/Websearch/wikipedia.ts b/src/commands/Tools/Websearch/wikipedia.ts index 3ed15bf8bd3..177776ef178 100644 --- a/src/commands/Tools/Websearch/wikipedia.ts +++ b/src/commands/Tools/Websearch/wikipedia.ts @@ -4,31 +4,32 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { fetch, FetchResultTypes, isImageURL } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; @ApplyOptions({ aliases: ['wiki'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.WikipediaDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.WikipediaExtended), + description: LanguageKeys.Commands.Tools.WikipediaDescription, + extendedHelp: LanguageKeys.Commands.Tools.WikipediaExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [input]: [string]) { - const language = await message.fetchLanguage(); - const text = await this.fetchText(input, language); + const t = await message.fetchT(); + const text = await this.fetchText(input, t); // Only fetch images if the channel is NSFW permitted const image = Reflect.get(message.channel, 'nsfw') ? await this.fetchImage(input) : undefined; if (text.query.pageids[0] === '-1') { - throw language.get(LanguageKeys.Commands.Tools.WikipediaNotfound); + throw t(LanguageKeys.Commands.Tools.WikipediaNotFound); } const pageInformation = text.query.pages[text.query.pageids[0]]; const pageUrl = `https://en.wikipedia.org/wiki/${this.parseURL(pageInformation.title)}`; - const definition = this.content(pageInformation.extract, pageUrl, language); + const definition = this.content(pageInformation.extract, pageUrl, t); const embed = new MessageEmbed() .setTitle(pageInformation.title) @@ -51,7 +52,7 @@ export default class extends SkyraCommand { return message.send(embed); } - private async fetchText(input: string, language: Language) { + private async fetchText(input: string, t: TFunction) { try { const url = this.getBaseUrl(input); url.searchParams.append('prop', 'extracts'); @@ -61,7 +62,7 @@ export default class extends SkyraCommand { return await fetch>(url, FetchResultTypes.JSON); } catch { - throw language.get(LanguageKeys.System.QueryFail); + throw t(LanguageKeys.System.QueryFail); } } @@ -94,9 +95,9 @@ export default class extends SkyraCommand { return encodeURIComponent(url.replace(/[ ]/g, '_').replace(/\(/g, '%28').replace(/\)/g, '%29')); } - private content(definition: string, url: string, language: Language) { + private content(definition: string, url: string, t: TFunction) { if (definition.length < 300) return definition; - return language.get(LanguageKeys.Misc.SystemTextTruncated, { definition, url }); + return t(LanguageKeys.Misc.SystemTextTruncated, { definition, url }); } } diff --git a/src/commands/Tools/Websearch/youtube.ts b/src/commands/Tools/Websearch/youtube.ts index e89dfd726d2..684a6d0bcfd 100644 --- a/src/commands/Tools/Websearch/youtube.ts +++ b/src/commands/Tools/Websearch/youtube.ts @@ -21,8 +21,8 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['yt'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.YoutubeDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.YoutubeExtended), + description: LanguageKeys.Commands.Tools.YouTubeDescription, + extendedHelp: LanguageKeys.Commands.Tools.YouTubeExtended, usage: '' }); } @@ -37,7 +37,7 @@ export default class extends SkyraCommand { const data = await fetch(url, FetchResultTypes.JSON); const results = data.items.slice(0, 5); - if (!results.length) throw await message.fetchLocale(LanguageKeys.Commands.Tools.YoutubeNotfound); + if (!results.length) throw await message.resolveKey(LanguageKeys.Commands.Tools.YouTubeNotFound); const sent = await message.send(this.getLink(results[0])); diff --git a/src/commands/Tools/avatar.ts b/src/commands/Tools/avatar.ts index 3e8a24996bd..98e04b2c69e 100644 --- a/src/commands/Tools/avatar.ts +++ b/src/commands/Tools/avatar.ts @@ -10,16 +10,15 @@ const VALID_SIZES = [32, 64, 128, 256, 512, 1024, 2048]; @ApplyOptions({ aliases: ['a', 'av', 'ava'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.AvatarDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.AvatarExtended), + description: LanguageKeys.Commands.Tools.AvatarDescription, + extendedHelp: LanguageKeys.Commands.Tools.AvatarExtended, requiredPermissions: ['EMBED_LINKS'], usage: '[user:username]', flagSupport: true }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [user = message.author]: [User]) { - const language = await message.fetchLanguage(); - if (!user.avatar) throw language.get(LanguageKeys.Commands.Tools.AvatarNone); + if (!user.avatar) throw await message.resolveKey(LanguageKeys.Commands.Tools.AvatarNone); const sizeFlag = Reflect.get(message.flagArgs, 'size'); const size = sizeFlag ? this.resolveSize(sizeFlag) : 2048; diff --git a/src/commands/Tools/color.ts b/src/commands/Tools/color.ts index 4cf9c4960fc..1df022ae3d9 100644 --- a/src/commands/Tools/color.ts +++ b/src/commands/Tools/color.ts @@ -15,8 +15,8 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['colour'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.ColorDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.ColorExtended), + description: LanguageKeys.Commands.Tools.ColorDescription, + extendedHelp: LanguageKeys.Commands.Tools.ColorExtended, requiredPermissions: ['ATTACH_FILES'], usage: ' [separator:integer{0,255}]', usageDelim: ' >' @@ -27,22 +27,20 @@ export default class extends SkyraCommand { const { hex, hsl, rgb } = parse(input); const attachment = await this.showColor(rgb, diff); - return message.sendLocale( - LanguageKeys.Commands.Tools.Color, - [ - { - hex: hex.toString(), - rgb: rgb.toString(), - hsl: hsl.toString() - } - ], + const t = await message.fetchT(); + return message.send( + t(LanguageKeys.Commands.Tools.Color, { + hex: hex.toString(), + rgb: rgb.toString(), + hsl: hsl.toString() + }), { files: [{ attachment, name: 'color.png' }] } ); } - public async showColor(color: RGB, diff: number) { + public showColor(color: RGB, diff: number) { const red = color.r; const green = color.g; const blue = color.b; diff --git a/src/commands/Tools/content.ts b/src/commands/Tools/content.ts index e8aabda8793..5903593bda3 100644 --- a/src/commands/Tools/content.ts +++ b/src/commands/Tools/content.ts @@ -14,8 +14,8 @@ const SNOWFLAKE_REGEXP = Serializer.regex.snowflake; @ApplyOptions({ aliases: ['source', 'msg-source', 'message-source'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.ContentDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.ContentExtended), + description: LanguageKeys.Commands.Tools.ContentDescription, + extendedHelp: LanguageKeys.Commands.Tools.ContentExtended, usage: '[channel:textchannelname] (message:message)', usageDelim: ' ', flagSupport: true @@ -23,10 +23,10 @@ const SNOWFLAKE_REGEXP = Serializer.regex.snowflake; export default class extends SkyraCommand { public async init() { this.createCustomResolver('message', async (arg, _, message, [channel = message.channel as TextChannel]: TextChannel[]) => { - if (!arg || !SNOWFLAKE_REGEXP.test(arg)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidMessage, { name: 'Message' }); + if (!arg || !SNOWFLAKE_REGEXP.test(arg)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidMessage, { name: 'Message' }); const target = await channel.messages.fetch(arg).catch(() => null); if (target) return target; - throw await message.fetchLocale(LanguageKeys.System.MessageNotFound); + throw await message.resolveKey(LanguageKeys.System.MessageNotFound); }); } diff --git a/src/commands/Tools/emoji.ts b/src/commands/Tools/emoji.ts index 54ab5a0d4b0..a726fae7c34 100644 --- a/src/commands/Tools/emoji.ts +++ b/src/commands/Tools/emoji.ts @@ -12,32 +12,32 @@ export default class extends SkyraCommand { super(store, file, directory, { aliases: ['emote'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.EmojiDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.EmojiExtended), + description: LanguageKeys.Commands.Tools.EmojiDescription, + extendedHelp: LanguageKeys.Commands.Tools.EmojiExtended, requiredPermissions: ['ATTACH_FILES'], usage: '' }); } public async run(message: KlasaMessage, [emoji]: [string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (REG_EMOJI.test(emoji)) { const [, animated, emojiName, emojiID] = /^<(a)?:(\w{2,32}):(\d{17,21})>$/.exec(emoji)!; - return message.send(language.get(LanguageKeys.Commands.Tools.EmojiCustom, { emoji: emojiName, id: emojiID }), { + return message.send(t(LanguageKeys.Commands.Tools.EmojiCustom, { emoji: emojiName, id: emojiID }), { files: [{ attachment: `https://cdn.discordapp.com/emojis/${emojiID}.${animated ? 'gif' : 'png'}` }] }); } - if (!REG_TWEMOJI.test(emoji)) throw language.get(LanguageKeys.Commands.Tools.EmojiInvalid); + if (!REG_TWEMOJI.test(emoji)) throw t(LanguageKeys.Commands.Tools.EmojiInvalid); const r = twemoji(emoji); const buffer = await fetch(`https://twemoji.maxcdn.com/72x72/${r}.png`, FetchResultTypes.Buffer).catch(() => { - throw language.get(LanguageKeys.Commands.Tools.EmojiInvalid); + throw t(LanguageKeys.Commands.Tools.EmojiInvalid); }); - if (buffer.byteLength >= MAX_EMOJI_SIZE) throw language.get(LanguageKeys.Commands.Tools.EmojiTooLarge, { emoji }); + if (buffer.byteLength >= MAX_EMOJI_SIZE) throw t(LanguageKeys.Commands.Tools.EmojiTooLarge, { emoji }); - return message.send(language.get(LanguageKeys.Commands.Tools.EmojiTwemoji, { emoji, id: r }), { + return message.send(t(LanguageKeys.Commands.Tools.EmojiTwemoji, { emoji, id: r }), { files: [{ attachment: buffer, name: `${r}.png` }] }); } diff --git a/src/commands/Tools/emotes.ts b/src/commands/Tools/emotes.ts index 250f0584812..04f87cbde34 100644 --- a/src/commands/Tools/emotes.ts +++ b/src/commands/Tools/emotes.ts @@ -8,20 +8,20 @@ import { pickRandom } from '#utils/util'; import { chunk } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['emojis'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.EmotesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.EmotesExtended), + description: LanguageKeys.Commands.Tools.EmotesDescription, + extendedHelp: LanguageKeys.Commands.Tools.EmotesExtended, runIn: ['text'] }) export default class extends RichDisplayCommand { public async run(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const animEmotes: string[] = []; @@ -32,20 +32,18 @@ export default class extends RichDisplayCommand { else staticEmotes.push(`<:${emote.name}:${id}>`); } - const display = await this.buildDisplay(message, language, chunk(animEmotes, 50), chunk(staticEmotes, 50)); + const display = await this.buildDisplay(message, t, chunk(animEmotes, 50), chunk(staticEmotes, 50)); await display.start(response, message.author.id); return response; } - private async buildDisplay(message: GuildMessage, language: Language, animatedEmojis: string[][], staticEmojis: string[][]) { + private async buildDisplay(message: GuildMessage, t: TFunction, animatedEmojis: string[][], staticEmojis: string[][]) { const display = new UserRichDisplay( new MessageEmbed() .setColor(await DbSet.fetchColor(message)) .setAuthor( - [`${message.guild.emojis.cache.size}`, `${language.get(LanguageKeys.Commands.Tools.EmotesTitle)}`, `${message.guild.name}`].join( - ' ' - ), + [`${message.guild.emojis.cache.size}`, `${t(LanguageKeys.Commands.Tools.EmotesTitle)}`, `${message.guild.name}`].join(' '), message.guild.iconURL({ format: 'png' })! ) ); diff --git a/src/commands/Tools/poll.ts b/src/commands/Tools/poll.ts index c8ea7333d46..ab55790b79a 100644 --- a/src/commands/Tools/poll.ts +++ b/src/commands/Tools/poll.ts @@ -11,25 +11,24 @@ const ALPHABET_OPTS = ['🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', ' @ApplyOptions({ aliases: ['spoll'], cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Tools.PollDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.PollExtended), + description: LanguageKeys.Commands.Tools.PollDescription, + extendedHelp: LanguageKeys.Commands.Tools.PollExtended, usage: ' [...]', usageDelim: ',', requiredPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'] }) export default class extends SkyraCommand { public async run(message: KlasaMessage, options: string[]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // since klasa usage is trash - if (options.length < 2 || options.length > 20) - throw language.get(LanguageKeys.Resolvers.MinmaxBothInclusive, { name: 'options', min: 2, max: 20 }); + if (options.length < 2 || options.length > 20) throw t(LanguageKeys.Resolvers.MinmaxBothInclusive, { name: 'options', min: 2, max: 20 }); const emojis = (options.length > 10 ? ALPHABET_OPTS : NUMBER_OPTS).slice(0, options.length); - const loadingMsg = await message.send(pickRandom(language.get(LanguageKeys.System.Loading))); + const loadingMsg = await message.send(pickRandom(t(LanguageKeys.System.Loading))); for (const emoji of emojis) { - if (loadingMsg.reactions.cache.size === 20) throw language.get(LanguageKeys.Commands.Tools.PollReactionLimit); + if (loadingMsg.reactions.cache.size === 20) throw t(LanguageKeys.Commands.Tools.PollReactionLimit); await loadingMsg.react(emoji); } diff --git a/src/commands/Tools/quote.ts b/src/commands/Tools/quote.ts index b192898cbdb..bf699ba42d3 100644 --- a/src/commands/Tools/quote.ts +++ b/src/commands/Tools/quote.ts @@ -13,8 +13,8 @@ const MESSAGE_LINK_REGEXP = /^\/channels\/(\d{17,18})\/(\d{17,18})\/(\d{17,18})$ @ApplyOptions({ cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.QuoteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.QuoteExtended), + description: LanguageKeys.Commands.Tools.QuoteDescription, + extendedHelp: LanguageKeys.Commands.Tools.QuoteExtended, requiredPermissions: ['EMBED_LINKS'], usage: '[channel:textchannelname] (message:message)', usageDelim: ' ' @@ -26,11 +26,11 @@ export default class extends SkyraCommand { const messageUrl = await this.getFromUrl(message as GuildMessage, arg); if (messageUrl) return messageUrl; - if (!isTextBasedChannel(channel)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidChannel, { name: 'Channel' }); - if (!arg || !SNOWFLAKE_REGEXP.test(arg)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidMessage, { name: 'Message' }); + if (!isTextBasedChannel(channel)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidChannel, { name: 'Channel' }); + if (!arg || !SNOWFLAKE_REGEXP.test(arg)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidMessage, { name: 'Message' }); const m = await (channel as TextChannel).messages.fetch(arg).catch(() => null); if (m) return m; - throw await message.fetchLocale(LanguageKeys.System.MessageNotFound); + throw await message.resolveKey(LanguageKeys.System.MessageNotFound); }); } @@ -42,8 +42,7 @@ export default class extends SkyraCommand { .setTimestamp(remoteMessage.createdAt); const content = getContent(remoteMessage); - if (content) - embed.setDescription(`[${await message.fetchLocale(LanguageKeys.Misc.JumpTo)}](${remoteMessage.url})\n${cutText(content, 1800)}`); + if (content) embed.setDescription(`[${await message.resolveKey(LanguageKeys.Misc.JumpTo)}](${remoteMessage.url})\n${cutText(content, 1800)}`); return message.send(embed); } @@ -68,10 +67,10 @@ export default class extends SkyraCommand { const channel = guild.channels.cache.get(_channel); if (!channel) return null; - if (!(channel instanceof TextChannel)) throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidChannel, { name: 'Channel' }); - if (!channel.readable) throw await message.fetchLocale(LanguageKeys.System.MessageNotFound); + if (!(channel instanceof TextChannel)) throw await message.resolveKey(LanguageKeys.Resolvers.InvalidChannel, { name: 'Channel' }); + if (!channel.readable) throw await message.resolveKey(LanguageKeys.System.MessageNotFound); if (!channel.permissionsFor(message.author)?.has(Permissions.FLAGS.VIEW_CHANNEL)) - throw await message.fetchLocale(LanguageKeys.System.CannotAccessChannel); + throw await message.resolveKey(LanguageKeys.System.CannotAccessChannel); return channel.messages.fetch(_message); } diff --git a/src/commands/Tools/topinvites.ts b/src/commands/Tools/topinvites.ts index 50a55f68916..ea863f06247 100644 --- a/src/commands/Tools/topinvites.ts +++ b/src/commands/Tools/topinvites.ts @@ -5,25 +5,22 @@ import { GuildMessage } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { BrandingColors, Emojis } from '#utils/constants'; import { pickRandom } from '#utils/util'; -import { Timestamp } from '@sapphire/time-utilities'; import { ApplyOptions } from '@skyra/decorators'; import { Invite, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import type { TFunction } from 'i18next'; @ApplyOptions({ aliases: ['topinvs'], cooldown: 10, - description: (language) => language.get(LanguageKeys.Commands.Tools.TopInvitesDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.TopInvitesExtended), + description: LanguageKeys.Commands.Tools.TopInvitesDescription, + extendedHelp: LanguageKeys.Commands.Tools.TopInvitesExtended, requiredGuildPermissions: ['MANAGE_GUILD'] }) export default class extends RichDisplayCommand { - private inviteTimestamp = new Timestamp('YYYY/MM/DD HH:mm'); - public async run(message: GuildMessage) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); const invites = await message.guild.fetchInvites(); @@ -32,21 +29,21 @@ export default class extends RichDisplayCommand { .sort((a, b) => b.uses! - a.uses!) .first(10) as NonNullableInvite[]; - if (topTen.length === 0) throw language.get(LanguageKeys.Commands.Tools.TopInvitesNoInvites); + if (topTen.length === 0) throw t(LanguageKeys.Commands.Tools.TopInvitesNoInvites); - const display = await this.buildDisplay(message, language, topTen); + const display = await this.buildDisplay(message, t, topTen); await display.start(response, message.author.id); return response; } - private async buildDisplay(message: GuildMessage, language: Language, invites: NonNullableInvite[]) { + private async buildDisplay(message: GuildMessage, t: TFunction, invites: NonNullableInvite[]) { const display = new UserRichDisplay( new MessageEmbed() - .setTitle(language.get(LanguageKeys.Commands.Tools.TopInvitesTop10InvitesFor, { guild: message.guild })) + .setTitle(t(LanguageKeys.Commands.Tools.TopInvitesTop10InvitesFor, { guild: message.guild })) .setColor(await DbSet.fetchColor(message)) ); - const embedData = language.get(LanguageKeys.Commands.Tools.TopInvitesEmbedData); + const embedData = t(LanguageKeys.Commands.Tools.TopInvitesEmbedData); for (const invite of invites) { display.addPage((embed: MessageEmbed) => @@ -61,8 +58,8 @@ export default class extends RichDisplayCommand { `**${embedData.temporary}**: ${invite.temporary ? Emojis.GreenTick : Emojis.RedCross}` ].join('\n') ) - .addField(embedData.createdAt, this.resolveCreationDate(invite.createdTimestamp, embedData.createdAtUnknown), true) - .addField(embedData.expiresIn, this.resolveExpiryDate(language, invite.expiresTimestamp, embedData.neverExpress), true) + .addField(embedData.createdAt, this.resolveCreationDate(t, invite.createdTimestamp, embedData.createdAtUnknown), true) + .addField(embedData.expiresIn, this.resolveExpiryDate(t, invite.expiresTimestamp, embedData.neverExpress), true) ); } @@ -74,13 +71,13 @@ export default class extends RichDisplayCommand { return uses; } - private resolveExpiryDate(language: Language, expiresTimestamp: Invite['expiresTimestamp'], fallback: string) { - if (expiresTimestamp !== null && expiresTimestamp > 0) return language.duration(expiresTimestamp - Date.now(), 2); + private resolveExpiryDate(t: TFunction, expiresTimestamp: Invite['expiresTimestamp'], fallback: string) { + if (expiresTimestamp !== null && expiresTimestamp > 0) return t(LanguageKeys.Globals.DurationValue, { value: expiresTimestamp - Date.now() }); return fallback; } - private resolveCreationDate(createdTimestamp: Invite['createdTimestamp'], fallback: string) { - if (createdTimestamp !== null) return this.inviteTimestamp.display(createdTimestamp); + private resolveCreationDate(t: TFunction, createdTimestamp: Invite['createdTimestamp'], fallback: string) { + if (createdTimestamp !== null) return t(LanguageKeys.Globals.TimeFullValue, { value: createdTimestamp }); return fallback; } } diff --git a/src/commands/Tools/vote.ts b/src/commands/Tools/vote.ts index 4df562297ad..10aaf1d3e48 100644 --- a/src/commands/Tools/vote.ts +++ b/src/commands/Tools/vote.ts @@ -5,8 +5,8 @@ import { KlasaMessage } from 'klasa'; @ApplyOptions({ cooldown: 5, - description: (language) => language.get(LanguageKeys.Commands.Tools.VoteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.VoteExtended), + description: LanguageKeys.Commands.Tools.VoteDescription, + extendedHelp: LanguageKeys.Commands.Tools.VoteExtended, requiredPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], usage: '' }) diff --git a/src/commands/Tools/whois.ts b/src/commands/Tools/whois.ts index ce25e0b0bd6..31acbd91ae3 100644 --- a/src/commands/Tools/whois.ts +++ b/src/commands/Tools/whois.ts @@ -6,7 +6,7 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Emojis, Time } from '#utils/constants'; import { ApplyOptions, CreateResolvers } from '@skyra/decorators'; import { GuildMember, Permissions, PermissionString, Role, User } from 'discord.js'; -import { Language } from 'klasa'; +import type { TFunction } from 'i18next'; const sortRanks = (x: Role, y: Role) => Number(y.position > x.position) || Number(x.position === y.position) - 1; const { FLAGS } = Permissions; @@ -14,8 +14,8 @@ const { FLAGS } = Permissions; @ApplyOptions({ aliases: ['userinfo', 'uinfo'], cooldown: 15, - description: (language) => language.get(LanguageKeys.Commands.Tools.WhoisDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Tools.WhoisExtended), + description: LanguageKeys.Commands.Tools.WhoisDescription, + extendedHelp: LanguageKeys.Commands.Tools.WhoisExtended, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], usage: '(user:username)' @@ -40,14 +40,14 @@ export default class extends SkyraCommand { public async run(message: GuildMessage, [user]: [User]) { const member = await message.guild.members.fetch(user.id).catch(() => null); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); - return message.send(member ? this.member(language, member) : this.user(language, user)); + return message.send(member ? this.member(t, member) : this.user(t, user)); } - private user(language: Language, user: User) { - const titles = language.get(LanguageKeys.Commands.Tools.WhoisUserTitles); - const fields = language.get(LanguageKeys.Commands.Tools.WhoisUserFields, { user }); + private user(t: TFunction, user: User) { + const titles = t(LanguageKeys.Commands.Tools.WhoisUserTitles); + const fields = t(LanguageKeys.Commands.Tools.WhoisUserFields, { user, createdTimestampOffset: Date.now() - user.createdTimestamp }); return new SkyraEmbed() .setColor(Colors.White) @@ -58,9 +58,13 @@ export default class extends SkyraCommand { .setTimestamp(); } - private member(language: Language, member: GuildMember) { - const titles = language.get(LanguageKeys.Commands.Tools.WhoisMemberTitles); - const fields = language.get(LanguageKeys.Commands.Tools.WhoisMemberFields, { member }); + private member(t: TFunction, member: GuildMember) { + const titles = t(LanguageKeys.Commands.Tools.WhoisMemberTitles); + const fields = t(LanguageKeys.Commands.Tools.WhoisMemberFields, { + member, + createdTimestampOffset: Date.now() - member.user.createdTimestamp, + joinedTimestampOffset: Date.now() - member.joinedTimestamp! + }); const embed = new SkyraEmbed() .setColor(member.displayColor || Colors.White) @@ -71,8 +75,8 @@ export default class extends SkyraCommand { .setFooter(fields.footer, this.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setTimestamp(); - this.applyMemberRoles(language, member, embed); - this.applyMemberKeyPermissions(language, member, embed); + this.applyMemberRoles(t, member, embed); + this.applyMemberKeyPermissions(t, member, embed); return embed; } @@ -82,35 +86,27 @@ export default class extends SkyraCommand { return `**${user.tag}**${bot} - ${user.toString()}${extras} - ${avatar}`; } - private applyMemberRoles(language: Language, member: GuildMember, embed: SkyraEmbed) { + private applyMemberRoles(t: TFunction, member: GuildMember, embed: SkyraEmbed) { if (member.roles.cache.size <= 1) return; const roles = member.roles.cache.sorted(sortRanks); roles.delete(member.guild.id); - embed.splitFields( - language.get(roles.size === 1 ? LanguageKeys.Commands.Tools.WhoisMemberRoles : LanguageKeys.Commands.Tools.WhoisMemberRolesPlural, { - count: roles.size - }), - [...roles.values()].join(' ') - ); + embed.splitFields(t(LanguageKeys.Commands.Tools.WhoisMemberRoles, { count: roles.size }), [...roles.values()].join(' ')); } - private applyMemberKeyPermissions(language: Language, member: GuildMember, embed: SkyraEmbed) { + private applyMemberKeyPermissions(t: TFunction, member: GuildMember, embed: SkyraEmbed) { if (member.permissions.has(this.kAdministratorPermission)) { - embed.addField( - language.get(LanguageKeys.Commands.Tools.WhoisMemberPermissions), - language.get(LanguageKeys.Commands.Tools.WhoisMemberPermissionsAll) - ); + embed.addField(t(LanguageKeys.Commands.Tools.WhoisMemberPermissions), t(LanguageKeys.Commands.Tools.WhoisMemberPermissionsAll)); return; } const permissions: string[] = []; for (const [name, bit] of this.kKeyPermissions) { - if (member.permissions.has(bit)) permissions.push(language.PERMISSIONS[name]); + if (member.permissions.has(bit)) permissions.push(t(`permissions:${name}`)); } if (permissions.length > 0) { - embed.addField(language.get(LanguageKeys.Commands.Tools.WhoisMemberPermissions), permissions.join(', ')); + embed.addField(t(LanguageKeys.Commands.Tools.WhoisMemberPermissions), permissions.join(', ')); } } diff --git a/src/commands/Twitch/followage.ts b/src/commands/Twitch/followage.ts index 712f8e1ed66..7848ba3ab76 100644 --- a/src/commands/Twitch/followage.ts +++ b/src/commands/Twitch/followage.ts @@ -2,26 +2,27 @@ import { SkyraCommand, SkyraCommandOptions } from '#lib/structures/SkyraCommand' import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import type { TFunction } from 'i18next'; +import type { KlasaMessage } from 'klasa'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Twitch.FollowageDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Twitch.FollowageExtended), + description: LanguageKeys.Commands.Twitch.FollowageDescription, + extendedHelp: LanguageKeys.Commands.Twitch.FollowageExtended, requiredPermissions: ['EMBED_LINKS'], usage: ' ', usageDelim: ' ' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [userName, channelName]: [string, string]) { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); // Get the User objects for the user and channel names - const [user, channel] = await this.retrieveResults(language, userName, channelName); + const [user, channel] = await this.retrieveResults(t, userName, channelName); // Check if the user follows that channel const { data } = await this.client.twitch.fetchUserFollowage(user.id, channel.id); // If the user doesn't follow then the data length will be 0 - if (data.length === 0) throw language.get(LanguageKeys.Commands.Twitch.FollowageMissingEntries); + if (data.length === 0) throw t(LanguageKeys.Commands.Twitch.FollowageMissingEntries); // Otherwise we can parse the data const followingSince = new Date(data[0].followed_at).getTime(); @@ -31,7 +32,7 @@ export default class extends SkyraCommand { new MessageEmbed() .setColor(this.client.twitch.BRANDING_COLOUR) .setAuthor( - language.get(LanguageKeys.Commands.Twitch.Followage, { + t(LanguageKeys.Commands.Twitch.Followage, { user: user.display_name, channel: channel.display_name, time: followingFor @@ -42,14 +43,14 @@ export default class extends SkyraCommand { ); } - private async retrieveResults(language: Language, user: string, channel: string) { + private async retrieveResults(t: TFunction, user: string, channel: string) { try { const { data } = await this.client.twitch.fetchUsers([], [user, channel]); - if (!data || data.length < 2) throw language.get(LanguageKeys.Commands.Twitch.FollowageMissingEntries); + if (!data || data.length < 2) throw t(LanguageKeys.Commands.Twitch.FollowageMissingEntries); return data; } catch { - throw language.get(LanguageKeys.Commands.Twitch.FollowageMissingEntries); + throw t(LanguageKeys.Commands.Twitch.FollowageMissingEntries); } } } diff --git a/src/commands/Twitch/twitch.ts b/src/commands/Twitch/twitch.ts index dea3fbcff61..fdf48ccdac8 100644 --- a/src/commands/Twitch/twitch.ts +++ b/src/commands/Twitch/twitch.ts @@ -3,25 +3,26 @@ import { CdnUrls } from '#lib/types/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; import { MessageEmbed } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import type { TFunction } from 'i18next'; +import type { KlasaMessage } from 'klasa'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Twitch.TwitchDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Twitch.TwitchExtended), + description: LanguageKeys.Commands.Twitch.TwitchDescription, + extendedHelp: LanguageKeys.Commands.Twitch.TwitchExtended, requiredPermissions: ['EMBED_LINKS'], usage: '' }) export default class extends SkyraCommand { public async run(message: KlasaMessage, [name]: [string]) { - const language = await message.fetchLanguage(); - const { data: channelData } = await this.fetchUsers(language, [name]); - if (channelData.length === 0) throw language.get(LanguageKeys.Commands.Twitch.TwitchNoEntries); + const t = await message.fetchT(); + const { data: channelData } = await this.fetchUsers(t, [name]); + if (channelData.length === 0) throw t(LanguageKeys.Commands.Twitch.TwitchNoEntries); const channel = channelData[0]; const { total: followersTotal } = await this.client.twitch.fetchUserFollowage('', channel.id); - const titles = language.get(LanguageKeys.Commands.Twitch.TwitchTitles); - const affiliateStatus = this.parseAffiliateProgram(language, channel.broadcaster_type); + const titles = t(LanguageKeys.Commands.Twitch.TwitchTitles); + const affiliateStatus = this.parseAffiliateProgram(t, channel.broadcaster_type); return message.send( new MessageEmbed() @@ -31,17 +32,14 @@ export default class extends SkyraCommand { .setURL(`https://twitch.tv/${channel.login}`) .setDescription(channel.description) .setThumbnail(channel.profile_image_url) - .addField(titles.followers, language.groupDigits(followersTotal), true) - .addField(titles.views, language.groupDigits(channel.view_count), true) - .addField( - titles.partner, - affiliateStatus ? affiliateStatus : language.get(LanguageKeys.Commands.Twitch.TwitchPartnershipWithoutAffiliate) - ) + .addField(titles.followers, t(LanguageKeys.Globals.NumberValue, { value: followersTotal }), true) + .addField(titles.views, t(LanguageKeys.Globals.NumberValue, { value: channel.view_count }), true) + .addField(titles.partner, affiliateStatus ? affiliateStatus : t(LanguageKeys.Commands.Twitch.TwitchPartnershipWithoutAffiliate)) ); } - private parseAffiliateProgram(language: Language, type: 'affiliate' | 'partner' | '') { - const options = language.get(LanguageKeys.Commands.Twitch.TwitchAffiliateStatus); + private parseAffiliateProgram(t: TFunction, type: 'affiliate' | 'partner' | '') { + const options = t(LanguageKeys.Commands.Twitch.TwitchAffiliateStatus); switch (type) { case 'affiliate': return options.affiliated; @@ -53,11 +51,11 @@ export default class extends SkyraCommand { } } - private async fetchUsers(language: Language, usernames: string[]) { + private async fetchUsers(t: TFunction, usernames: string[]) { try { return await this.client.twitch.fetchUsers([], usernames); } catch { - throw language.get(LanguageKeys.Commands.Twitch.TwitchNoEntries); + throw t(LanguageKeys.Commands.Twitch.TwitchNoEntries); } } } diff --git a/src/commands/Twitch/twitchsubscription.ts b/src/commands/Twitch/twitchsubscription.ts index 311653098a2..04e3e77c461 100644 --- a/src/commands/Twitch/twitchsubscription.ts +++ b/src/commands/Twitch/twitchsubscription.ts @@ -18,7 +18,7 @@ import { pickRandom } from '#utils/util'; import { chunk } from '@sapphire/utilities'; import { ApplyOptions, CreateResolvers, requiredPermissions } from '@skyra/decorators'; import { Guild, MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import type { TFunction } from 'i18next'; import { Any } from 'typeorm'; const enum Type { @@ -36,8 +36,8 @@ type Entry = NotificationsStreamsTwitchStreamer; @ApplyOptions({ aliases: ['twitch-subscription', 't-subscription', 't-sub'], - description: (language) => language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionExtended), + description: LanguageKeys.Commands.Twitch.TwitchSubscriptionDescription, + extendedHelp: LanguageKeys.Commands.Twitch.TwitchSubscriptionExtended, permissionLevel: PermissionLevels.Administrator, requiredPermissions: ['EMBED_LINKS'], runIn: ['text'], @@ -50,19 +50,19 @@ type Entry = NotificationsStreamsTwitchStreamer; [ 'streamer', async (argument, _, message, [type]) => { - const language = await message.fetchLanguage(); + const t = await message.fetchT(); if (!argument) { if (type === Type.Show || type === Type.Reset) return undefined; - throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredStreamer); + throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredStreamer); } try { const { data } = await message.client.twitch.fetchUsers([], [argument]); - if (data.length === 0) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound); + if (data.length === 0) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound); return data[0]; } catch { - throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound); + throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound); } } ], @@ -70,7 +70,7 @@ type Entry = NotificationsStreamsTwitchStreamer; 'channel', async (argument, possible, message, [type]) => { if (type === Type.Show || type === Type.Reset) return undefined; - if (!argument) throw await message.fetchLocale(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredChannel); + if (!argument) throw await message.resolveKey(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredChannel); return message.client.arguments.get('textchannelname')!.run(argument, possible, message); } @@ -80,11 +80,11 @@ type Entry = NotificationsStreamsTwitchStreamer; async (argument, _, message, [type]) => { if (type === Type.Show || type === Type.Reset) return undefined; - const language = await message.fetchLanguage(); - if (!argument) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredStatus); + const t = await message.fetchT(); + if (!argument) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredStatus); - const index = language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionStatusValues).indexOf(argument.toLowerCase()); - if (index === -1) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionInvalidStatus); + const index = t(LanguageKeys.Commands.Twitch.TwitchSubscriptionStatusValues).indexOf(argument.toLowerCase()); + if (index === -1) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionInvalidStatus); return index; } ], @@ -100,7 +100,7 @@ type Entry = NotificationsStreamsTwitchStreamer; (type === Type.Add && Boolean(message.flagArgs.embed) && status === 0) ) return undefined; - if (!argument) throw await message.fetchLocale(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredContent); + if (!argument) throw await message.resolveKey(LanguageKeys.Commands.Twitch.TwitchSubscriptionRequiredContent); return message.client.arguments.get('...string')!.run(argument, possible, message); } ] @@ -121,9 +121,9 @@ export default class extends SkyraCommand { status }; - const language = await message.guild.writeSettings(async (settings) => { - const language = settings.getLanguage(); + const t = await message.fetchT(); + await message.guild.writeSettings(async (settings) => { // then retrieve the index of the entry if the guild already subscribed to them. const subscriptionIndex = settings[this.#kSettingsKey].findIndex((sub) => sub[0] === streamer.id); @@ -143,43 +143,39 @@ export default class extends SkyraCommand { // Check if the streamer was already subscribed for the same channel and status. if (raw[1].some((e) => e.channel === entry.channel && e.status === entry.status)) { - throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionAddDuplicated); + throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionAddDuplicated); } // Patch creating a clone of the value. const subscription: NotificationsStreamTwitch = [raw[0], [...raw[1], entry]]; settings[this.#kSettingsKey].splice(subscriptionIndex, 1, subscription); } - - return language; }); - return message.send( - language.get( - status === NotificationsStreamsTwitchEventStatus.Offline - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessOffline - : LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessLive, - { name: streamer.display_name, channel: channel.name } - ) + return message.sendTranslated( + status === NotificationsStreamsTwitchEventStatus.Offline + ? LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessOffline + : LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessLive, + [{ name: streamer.display_name, channel: channel.toString() }] ); } public async remove(message: GuildMessage, [streamer, channel, status]: [Streamer, Channel, Status]) { - const language = await message.guild.writeSettings(async (settings) => { - const language = settings.getLanguage(); + const t = await message.fetchT(); + await message.guild.writeSettings(async (settings) => { // then retrieve the index of the entry if the guild already subscribed to them. const subscriptionIndex = settings[this.#kSettingsKey].findIndex((sub) => sub[0] === streamer.id); // If the subscription could not be found, throw. - if (subscriptionIndex === -1) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveStreamerNotSubscribed); + if (subscriptionIndex === -1) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveStreamerNotSubscribed); // Retrieve the subscription, then find the index for the notification desired to delete. const subscription = settings[this.#kSettingsKey][subscriptionIndex]; const entryIndex = subscription[1].findIndex((entry) => entry.channel === channel.id && entry.status === status); // If there was no entry with the channel and status specified, throw. - if (entryIndex === -1) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveEntryNotExists); + if (entryIndex === -1) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveEntryNotExists); // If it was the only entry for said subscription, remove it completely. if (subscription[1].length === 1) { @@ -193,31 +189,27 @@ export default class extends SkyraCommand { const updated: NotificationsStreamTwitch = [subscription[0], entries]; settings[this.#kSettingsKey].splice(subscriptionIndex, 1, updated); } - - return language; }); - return message.send( - language.get( - status === NotificationsStreamsTwitchEventStatus.Offline - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessOffline - : LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessLive, - { name: streamer.display_name, channel: channel.name } - ) + return message.sendTranslated( + status === NotificationsStreamsTwitchEventStatus.Offline + ? LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessOffline + : LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessLive, + [{ name: streamer.display_name, channel: channel.toString() }] ); } public async reset(message: GuildMessage, [streamer]: [Streamer?]) { + const t = await message.fetchT(); + // If the streamer was not defined, reset all entries and purge all entries. if (typeof streamer === 'undefined') { - const [entries, language] = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); - + const [entries] = await message.guild.writeSettings((settings) => { const entries = settings[this.#kSettingsKey].reduce((accumulator, subscription) => accumulator + subscription[1].length, 0); - if (entries === 0) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetEmpty); + if (entries === 0) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetEmpty); settings[this.#kSettingsKey] = []; - return [entries, language]; + return [entries]; }); // Update all entries that include this guild, then iterate over the empty values and remove the empty ones. @@ -242,55 +234,40 @@ export default class extends SkyraCommand { await em.save(toUpdate); }); - return message.send( - language.get( - entries === 1 - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionResetSuccess - : LanguageKeys.Commands.Twitch.TwitchSubscriptionResetSuccessPlural, - { count: entries } - ) - ); + return message.sendTranslated(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetSuccess, [{ count: entries }]); } /** Remove the subscription for the specified streaming, returning the length of {@link NotificationsStreamsTwitchStreamer} for this entry */ - const [entries, language] = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); - + const entries = await message.guild.writeSettings((settings) => { const subscriptionIndex = settings[this.#kSettingsKey].findIndex((sub) => sub[0] === streamer.id); - if (subscriptionIndex === -1) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetStreamerNotSubscribed); + if (subscriptionIndex === -1) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetStreamerNotSubscribed); const subscription = settings[this.#kSettingsKey][subscriptionIndex]; settings[this.#kSettingsKey].splice(subscriptionIndex, 1); - return [subscription[1].length, language]; + return subscription[1].length; }); await this.removeSubscription(message.guild, streamer); - return message.send( - language.get( - entries === 1 - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionResetChannelSuccess - : LanguageKeys.Commands.Twitch.TwitchSubscriptionResetChannelSuccessPlural, - { name: streamer.display_name, count: entries } - ) - ); + return message.sendTranslated(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetChannelSuccess, [ + { name: streamer.display_name, count: entries } + ]); } @requiredPermissions(['ADD_REACTIONS', 'EMBED_LINKS', 'MANAGE_MESSAGES', 'READ_MESSAGE_HISTORY']) public async show(message: GuildMessage, [streamer]: [Streamer?]) { - const [guildSubscriptions, language] = await message.guild.readSettings((settings) => [settings[this.#kSettingsKey], settings.getLanguage()]); + const [guildSubscriptions, t] = await message.guild.readSettings((settings) => [settings[this.#kSettingsKey], settings.getLanguage()]); + // Create the response message. const response = await message.send( - new MessageEmbed().setDescription(pickRandom(language.get(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) + new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary) ); // Fetch the content. const content = - typeof streamer === 'undefined' - ? await this.showAll(guildSubscriptions, language) - : await this.showSingle(guildSubscriptions, streamer, language); + typeof streamer === 'undefined' ? await this.showAll(guildSubscriptions, t) : await this.showSingle(guildSubscriptions, streamer, t); // Create the pages and the URD to display them. const pages = chunk(content, 10); @@ -306,13 +283,13 @@ export default class extends SkyraCommand { return response; } - private async showSingle(guildSubscriptions: NotificationsStreamTwitch[], streamer: Streamer, language: Language) { + private async showSingle(guildSubscriptions: NotificationsStreamTwitch[], streamer: Streamer, t: TFunction) { // Retrieve all subscriptions for the guild const subscriptions = guildSubscriptions.find((entry) => entry[0] === streamer.id); - if (typeof subscriptions === 'undefined') throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStreamerNotSubscribed); + if (typeof subscriptions === 'undefined') throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStreamerNotSubscribed); // Print all entries for this guild for this streamer. - const statuses = language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); + const statuses = t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); const lines: string[] = []; for (const subscription of subscriptions[1]) { lines.push(`${streamer.display_name} - <#${subscription.channel}> → ${statuses[subscription.status]}`); @@ -321,9 +298,9 @@ export default class extends SkyraCommand { return lines; } - private async showAll(guildSubscriptions: NotificationsStreamTwitch[], language: Language) { + private async showAll(guildSubscriptions: NotificationsStreamTwitch[], t: TFunction) { // Retrieve all subscriptions for the guild - if (guildSubscriptions.length === 0) throw language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowEmpty); + if (guildSubscriptions.length === 0) throw t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowEmpty); // Fetch all usernames and map them by their id. const ids = guildSubscriptions.map((subscriptions) => subscriptions[0]); @@ -332,10 +309,10 @@ export default class extends SkyraCommand { for (const profile of profiles.data) names.set(profile.id, profile.display_name); // Print all entries for this guild. - const statuses = language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); + const statuses = t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); const lines: string[] = []; for (const subscriptions of guildSubscriptions) { - const name = names.get(subscriptions[0]) || language.get(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowUnknownUser); + const name = names.get(subscriptions[0]) || t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowUnknownUser); for (const subscription of subscriptions[1]) { lines.push(`${name} - <#${subscription.channel}> → ${statuses[subscription.status]}`); } diff --git a/src/commands/Weeb/wbang.ts b/src/commands/Weeb/wbang.ts index dae32f822d3..55e1ebcabf7 100644 --- a/src/commands/Weeb/wbang.ts +++ b/src/commands/Weeb/wbang.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.BangDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.BangExtended), + description: LanguageKeys.Commands.Weeb.BangDescription, + extendedHelp: LanguageKeys.Commands.Weeb.BangExtended, queryType: 'bang', responseName: LanguageKeys.Commands.Weeb.Bang, usage: '' diff --git a/src/commands/Weeb/wbanghead.ts b/src/commands/Weeb/wbanghead.ts index e4a89fac033..c2e8b9572f7 100644 --- a/src/commands/Weeb/wbanghead.ts +++ b/src/commands/Weeb/wbanghead.ts @@ -3,9 +3,9 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.BangheadDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.BangheadExtended), + description: LanguageKeys.Commands.Weeb.BangHeadDescription, + extendedHelp: LanguageKeys.Commands.Weeb.BangHeadExtended, queryType: 'banghead', - responseName: LanguageKeys.Commands.Weeb.Banghead + responseName: LanguageKeys.Commands.Weeb.BangHead }) export default class extends WeebCommand {} diff --git a/src/commands/Weeb/wbite.ts b/src/commands/Weeb/wbite.ts index 3baf8865aa3..c07daad596c 100644 --- a/src/commands/Weeb/wbite.ts +++ b/src/commands/Weeb/wbite.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.BiteDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.BiteExtended), + description: LanguageKeys.Commands.Weeb.BiteDescription, + extendedHelp: LanguageKeys.Commands.Weeb.BiteExtended, queryType: 'bite', responseName: LanguageKeys.Commands.Weeb.Bite, usage: '' diff --git a/src/commands/Weeb/wblush.ts b/src/commands/Weeb/wblush.ts index 3bc72f44941..f3a8e9f5da5 100644 --- a/src/commands/Weeb/wblush.ts +++ b/src/commands/Weeb/wblush.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.BlushDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.BlushExtended), + description: LanguageKeys.Commands.Weeb.BlushDescription, + extendedHelp: LanguageKeys.Commands.Weeb.BlushExtended, queryType: 'blush', responseName: LanguageKeys.Commands.Weeb.Blush }) diff --git a/src/commands/Weeb/wcry.ts b/src/commands/Weeb/wcry.ts index a6a73a0abb8..e6b743b2dea 100644 --- a/src/commands/Weeb/wcry.ts +++ b/src/commands/Weeb/wcry.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.CryDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.CryExtended), + description: LanguageKeys.Commands.Weeb.CryDescription, + extendedHelp: LanguageKeys.Commands.Weeb.CryExtended, queryType: 'cry', responseName: LanguageKeys.Commands.Weeb.Cry, usage: '' diff --git a/src/commands/Weeb/wcuddle.ts b/src/commands/Weeb/wcuddle.ts index 09960e2c41b..05b0d93de66 100644 --- a/src/commands/Weeb/wcuddle.ts +++ b/src/commands/Weeb/wcuddle.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.CuddleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.CuddleExtended), + description: LanguageKeys.Commands.Weeb.CuddleDescription, + extendedHelp: LanguageKeys.Commands.Weeb.CuddleExtended, queryType: 'cuddle', responseName: LanguageKeys.Commands.Weeb.Cuddle, usage: '' diff --git a/src/commands/Weeb/wdance.ts b/src/commands/Weeb/wdance.ts index 9658b0cf934..48a27f7db12 100644 --- a/src/commands/Weeb/wdance.ts +++ b/src/commands/Weeb/wdance.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.DanceDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.DanceExtended), + description: LanguageKeys.Commands.Weeb.DanceDescription, + extendedHelp: LanguageKeys.Commands.Weeb.DanceExtended, queryType: 'dance', responseName: LanguageKeys.Commands.Weeb.Dance }) diff --git a/src/commands/Weeb/wgreet.ts b/src/commands/Weeb/wgreet.ts index 7ce60ae9730..4b045d7a585 100644 --- a/src/commands/Weeb/wgreet.ts +++ b/src/commands/Weeb/wgreet.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.GreetDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.GreetExtended), + description: LanguageKeys.Commands.Weeb.GreetDescription, + extendedHelp: LanguageKeys.Commands.Weeb.GreetExtended, queryType: 'greet', responseName: LanguageKeys.Commands.Weeb.Greet, usage: '' diff --git a/src/commands/Weeb/whug.ts b/src/commands/Weeb/whug.ts index 4032171dc70..0260ffcd74b 100644 --- a/src/commands/Weeb/whug.ts +++ b/src/commands/Weeb/whug.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.HugDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.HugExtended), + description: LanguageKeys.Commands.Weeb.HugDescription, + extendedHelp: LanguageKeys.Commands.Weeb.HugExtended, queryType: 'hug', responseName: LanguageKeys.Commands.Weeb.Hug, usage: '' diff --git a/src/commands/Weeb/wkiss.ts b/src/commands/Weeb/wkiss.ts index cf052ee3ce0..e9f52f3534d 100644 --- a/src/commands/Weeb/wkiss.ts +++ b/src/commands/Weeb/wkiss.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.KissDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.KissExtended), + description: LanguageKeys.Commands.Weeb.KissDescription, + extendedHelp: LanguageKeys.Commands.Weeb.KissExtended, queryType: 'kiss', responseName: LanguageKeys.Commands.Weeb.Kiss, usage: '' diff --git a/src/commands/Weeb/wlewd.ts b/src/commands/Weeb/wlewd.ts index 4702ca45006..e7cd7e76756 100644 --- a/src/commands/Weeb/wlewd.ts +++ b/src/commands/Weeb/wlewd.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.LewdDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.LewdExtended), + description: LanguageKeys.Commands.Weeb.LewdDescription, + extendedHelp: LanguageKeys.Commands.Weeb.LewdExtended, queryType: 'lewd', responseName: LanguageKeys.Commands.Weeb.Lewd }) diff --git a/src/commands/Weeb/wlick.ts b/src/commands/Weeb/wlick.ts index d7bb2145018..fa1a22acef1 100644 --- a/src/commands/Weeb/wlick.ts +++ b/src/commands/Weeb/wlick.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.LickDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.LickExtended), + description: LanguageKeys.Commands.Weeb.LickDescription, + extendedHelp: LanguageKeys.Commands.Weeb.LickExtended, queryType: 'lick', responseName: LanguageKeys.Commands.Weeb.Lick, usage: '' diff --git a/src/commands/Weeb/wneko.ts b/src/commands/Weeb/wneko.ts index 76862c51783..08eebc819bb 100644 --- a/src/commands/Weeb/wneko.ts +++ b/src/commands/Weeb/wneko.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.NekoDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.NekoExtended), + description: LanguageKeys.Commands.Weeb.NekoDescription, + extendedHelp: LanguageKeys.Commands.Weeb.NekoExtended, queryType: 'neko', responseName: LanguageKeys.Commands.Weeb.Neko }) diff --git a/src/commands/Weeb/wnom.ts b/src/commands/Weeb/wnom.ts index 13232b5979c..75f38d82ce7 100644 --- a/src/commands/Weeb/wnom.ts +++ b/src/commands/Weeb/wnom.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.NomDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.NomExtended), + description: LanguageKeys.Commands.Weeb.NomDescription, + extendedHelp: LanguageKeys.Commands.Weeb.NomExtended, queryType: 'nom', responseName: LanguageKeys.Commands.Weeb.Nom }) diff --git a/src/commands/Weeb/wpat.ts b/src/commands/Weeb/wpat.ts index e842cb63011..3e111c74f08 100644 --- a/src/commands/Weeb/wpat.ts +++ b/src/commands/Weeb/wpat.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.PatDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.PatExtended), + description: LanguageKeys.Commands.Weeb.PatDescription, + extendedHelp: LanguageKeys.Commands.Weeb.PatExtended, queryType: 'pat', responseName: LanguageKeys.Commands.Weeb.Pat, usage: '' diff --git a/src/commands/Weeb/wpout.ts b/src/commands/Weeb/wpout.ts index c02d34cbbd8..2c92a8f5ecb 100644 --- a/src/commands/Weeb/wpout.ts +++ b/src/commands/Weeb/wpout.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.PoutDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.PoutExtended), + description: LanguageKeys.Commands.Weeb.PoutDescription, + extendedHelp: LanguageKeys.Commands.Weeb.PoutExtended, queryType: 'pout', responseName: LanguageKeys.Commands.Weeb.Pout }) diff --git a/src/commands/Weeb/wpunch.ts b/src/commands/Weeb/wpunch.ts index 5f76fb417bb..c11db2aaf78 100644 --- a/src/commands/Weeb/wpunch.ts +++ b/src/commands/Weeb/wpunch.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.PunchDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.PunchExtended), + description: LanguageKeys.Commands.Weeb.PunchDescription, + extendedHelp: LanguageKeys.Commands.Weeb.PunchExtended, queryType: 'punch', responseName: LanguageKeys.Commands.Weeb.Punch, usage: '' diff --git a/src/commands/Weeb/wslap.ts b/src/commands/Weeb/wslap.ts index c81f632e188..01d42126073 100644 --- a/src/commands/Weeb/wslap.ts +++ b/src/commands/Weeb/wslap.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.SlapDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.SlapExtended), + description: LanguageKeys.Commands.Weeb.SlapDescription, + extendedHelp: LanguageKeys.Commands.Weeb.SlapExtended, queryType: 'slap', responseName: LanguageKeys.Commands.Weeb.Slap, usage: '' diff --git a/src/commands/Weeb/wsleepy.ts b/src/commands/Weeb/wsleepy.ts index 79cf5f9a4ee..187b21f3584 100644 --- a/src/commands/Weeb/wsleepy.ts +++ b/src/commands/Weeb/wsleepy.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.SleepyDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.SleepyExtended), + description: LanguageKeys.Commands.Weeb.SleepyDescription, + extendedHelp: LanguageKeys.Commands.Weeb.SleepyExtended, queryType: 'sleepy', responseName: LanguageKeys.Commands.Weeb.Sleepy }) diff --git a/src/commands/Weeb/wsmile.ts b/src/commands/Weeb/wsmile.ts index 69bb8dab020..472700212a3 100644 --- a/src/commands/Weeb/wsmile.ts +++ b/src/commands/Weeb/wsmile.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.SmileDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.SmileExtended), + description: LanguageKeys.Commands.Weeb.SmileDescription, + extendedHelp: LanguageKeys.Commands.Weeb.SmileExtended, queryType: 'smile', responseName: LanguageKeys.Commands.Weeb.Smile }) diff --git a/src/commands/Weeb/wsmug.ts b/src/commands/Weeb/wsmug.ts index 197450320a1..769bf64fb8d 100644 --- a/src/commands/Weeb/wsmug.ts +++ b/src/commands/Weeb/wsmug.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.SmugDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.SmugExtended), + description: LanguageKeys.Commands.Weeb.SmugDescription, + extendedHelp: LanguageKeys.Commands.Weeb.SmugExtended, queryType: 'smug', responseName: LanguageKeys.Commands.Weeb.Smug }) diff --git a/src/commands/Weeb/wstare.ts b/src/commands/Weeb/wstare.ts index 8a472b96a7c..b928f73302f 100644 --- a/src/commands/Weeb/wstare.ts +++ b/src/commands/Weeb/wstare.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.StareDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.StareExtended), + description: LanguageKeys.Commands.Weeb.StareDescription, + extendedHelp: LanguageKeys.Commands.Weeb.StareExtended, queryType: 'stare', responseName: LanguageKeys.Commands.Weeb.Stare, usage: '' diff --git a/src/commands/Weeb/wthumbsup.ts b/src/commands/Weeb/wthumbsup.ts index 584acb916e1..d97a26e389b 100644 --- a/src/commands/Weeb/wthumbsup.ts +++ b/src/commands/Weeb/wthumbsup.ts @@ -3,9 +3,9 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.ThumbsupDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.ThumbsupExtended), + description: LanguageKeys.Commands.Weeb.ThumbsUpDescription, + extendedHelp: LanguageKeys.Commands.Weeb.ThumbsUpExtended, queryType: 'thumbsup', - responseName: LanguageKeys.Commands.Weeb.Thumbsup + responseName: LanguageKeys.Commands.Weeb.ThumbsUp }) export default class extends WeebCommand {} diff --git a/src/commands/Weeb/wtickle.ts b/src/commands/Weeb/wtickle.ts index bf980a7bd9a..0c11f0b32bf 100644 --- a/src/commands/Weeb/wtickle.ts +++ b/src/commands/Weeb/wtickle.ts @@ -3,8 +3,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; @ApplyOptions({ - description: (language) => language.get(LanguageKeys.Commands.Weeb.TickleDescription), - extendedHelp: (language) => language.get(LanguageKeys.Commands.Weeb.TickleExtended), + description: LanguageKeys.Commands.Weeb.TickleDescription, + extendedHelp: LanguageKeys.Commands.Weeb.TickleExtended, queryType: 'tickle', responseName: LanguageKeys.Commands.Weeb.Tickle, usage: '' diff --git a/src/config.example.ts b/src/config.example.ts index a0a21bebd84..efcb2f53b92 100644 --- a/src/config.example.ts +++ b/src/config.example.ts @@ -177,7 +177,6 @@ export const WEBHOOK_DATABASE: Partial | null = null; export const TOKENS = { // #region secrets - BLIZZARD_KEY: '', BOT_TOKEN: '', BOTLIST_SPACE_KEY: '', BOTS_FOR_DISCORD_KEY: '', @@ -211,7 +210,6 @@ export const TOKENS = { WEBHOOK_B4D: '', WEBHOOK_TOPGG: '', WEEB_SH_KEY: '', - WOLFRAM_KEY: '', XIVAPI_KEY: '' // #endregion }; diff --git a/src/events/errors/commandError.ts b/src/events/errors/commandError.ts index 674fce81ed5..98403f1b985 100644 --- a/src/events/errors/commandError.ts +++ b/src/events/errors/commandError.ts @@ -17,7 +17,7 @@ export default class extends Event { // If the error was a string (message from Skyra to not fire inhibitors), send it: if (typeof error === 'string') { - return message.alert(await message.fetchLocale(LanguageKeys.Events.ErrorString, { mention: message.author.toString(), message: error }), { + return message.alert(await message.resolveKey(LanguageKeys.Events.ErrorString, { mention: message.author.toString(), message: error }), { allowedMentions: { users: [message.author.id], roles: [] } }); } @@ -25,7 +25,7 @@ export default class extends Event { // If the error was an AbortError, tell the user to re-try: if (error.name === 'AbortError') { this.client.emit(Events.Warn, `${this.getWarnError(message)} (${message.author.id}) | ${error.constructor.name}`); - return message.alert(await message.fetchLocale(LanguageKeys.System.DiscordAbortError)); + return message.alert(await message.resolveKey(LanguageKeys.System.DiscordAbortError)); } // Extract useful information about the DiscordAPIError @@ -45,7 +45,7 @@ export default class extends Event { await message.alert( this.client.options.owners.includes(message.author.id) ? codeBlock('js', error.stack!) - : await message.fetchLocale(LanguageKeys.Events.ErrorWtf) + : await message.resolveKey(LanguageKeys.Events.ErrorWtf) ); } catch (err) { this.client.emit(Events.ApiError, err); diff --git a/src/events/guilds/members/guildMemberAdd.ts b/src/events/guilds/members/guildMemberAdd.ts index baaa7ddab0a..af86d0a669c 100644 --- a/src/events/guilds/members/guildMemberAdd.ts +++ b/src/events/guilds/members/guildMemberAdd.ts @@ -22,7 +22,7 @@ export default class extends Event { if (stickyRoles.length === 0) return false; // Handle the case the user is muted - const [roleID, language] = await member.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); + const [roleID, t] = await member.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); if (roleID && stickyRoles.includes(roleID)) { // Handle mute const role = member.guild.roles.cache.get(roleID); @@ -34,12 +34,12 @@ export default class extends Event { .setColor(Colors.Amber) .setAuthor(`${member.user.tag} (${member.user.id})`, member.user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setDescription( - language.get(LanguageKeys.Events.GuildMemberAddDescription, { + t(LanguageKeys.Events.GuildMemberAddDescription, { mention: member.toString(), time: Date.now() - member.user.createdTimestamp }) ) - .setFooter(language.get(LanguageKeys.Events.GuildMemberAddMute)) + .setFooter(t(LanguageKeys.Events.GuildMemberAddMute)) .setTimestamp() ); diff --git a/src/events/guilds/members/guildMemberUpdateNicknameNotify.ts b/src/events/guilds/members/guildMemberUpdateNicknameNotify.ts index eb0e5ac8b9b..bbf2f26e974 100644 --- a/src/events/guilds/members/guildMemberUpdateNicknameNotify.ts +++ b/src/events/guilds/members/guildMemberUpdateNicknameNotify.ts @@ -5,12 +5,13 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { MessageLogsEnum } from '#utils/constants'; import { ApplyOptions } from '@skyra/decorators'; import { GuildMember, MessageEmbed } from 'discord.js'; -import { Event, EventOptions, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event, EventOptions } from 'klasa'; @ApplyOptions({ event: Events.GuildMemberUpdate }) export default class extends Event { public async run(previous: GuildMember, next: GuildMember) { - const [enabled, language] = await next.guild.readSettings((settings) => [ + const [enabled, t] = await next.guild.readSettings((settings) => [ settings[GuildSettings.Events.MemberNickNameUpdate], settings.getLanguage() ]); @@ -27,19 +28,19 @@ export default class extends Event { new MessageEmbed() .setColor(Colors.Yellow) .setAuthor(`${user.tag} (${user.id})`, user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setDescription(this.getNameDescription(language, prevNickname, nextNickname)) - .setFooter(language.get(LanguageKeys.Events.NicknameUpdate)) + .setDescription(this.getNameDescription(t, prevNickname, nextNickname)) + .setFooter(t(LanguageKeys.Events.NicknameUpdate)) .setTimestamp() ); } } - private getNameDescription(i18n: Language, previousName: string | null, nextName: string | null) { + private getNameDescription(t: TFunction, previousName: string | null, nextName: string | null) { return [ - i18n.get(previousName === null ? LanguageKeys.Events.NameUpdatePreviousWasNotSet : LanguageKeys.Events.NameUpdatePreviousWasSet, { + t(previousName === null ? LanguageKeys.Events.NameUpdatePreviousWasNotSet : LanguageKeys.Events.NameUpdatePreviousWasSet, { previousName }), - i18n.get(nextName === null ? LanguageKeys.Events.NameUpdateNextWasNotSet : LanguageKeys.Events.NameUpdateNextWasSet, { nextName }) + t(nextName === null ? LanguageKeys.Events.NameUpdateNextWasNotSet : LanguageKeys.Events.NameUpdateNextWasSet, { nextName }) ].join('\n'); } } diff --git a/src/events/guilds/members/guildMemberUpdateRolesNotify.ts b/src/events/guilds/members/guildMemberUpdateRolesNotify.ts index dd7399da065..228167764a8 100644 --- a/src/events/guilds/members/guildMemberUpdateRolesNotify.ts +++ b/src/events/guilds/members/guildMemberUpdateRolesNotify.ts @@ -5,15 +5,13 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { MessageLogsEnum } from '#utils/constants'; import { ApplyOptions } from '@skyra/decorators'; import { GuildMember, MessageEmbed } from 'discord.js'; -import { Event, EventOptions, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event, EventOptions } from 'klasa'; @ApplyOptions({ event: Events.GuildMemberUpdate }) export default class extends Event { public async run(previous: GuildMember, next: GuildMember) { - const [enabled, language] = await next.guild.readSettings((settings) => [ - settings[GuildSettings.Events.MemberRoleUpdate], - settings.getLanguage() - ]); + const [enabled, t] = await next.guild.readSettings((settings) => [settings[GuildSettings.Events.MemberRoleUpdate], settings.getLanguage()]); if (!enabled) return; @@ -43,31 +41,25 @@ export default class extends Event { new MessageEmbed() .setColor(Colors.Yellow) .setAuthor(`${user.tag} (${user.id})`, user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setDescription(this.getRoleDescription(language, addedRoles, removedRoles) || language.get(LanguageKeys.Events.GuildMemberNoUpdate)) - .setFooter(language.get(LanguageKeys.Events.RoleUpdate)) + .setDescription(this.getRoleDescription(t, addedRoles, removedRoles) || t(LanguageKeys.Events.GuildMemberNoUpdate)) + .setFooter(t(LanguageKeys.Events.RoleUpdate)) .setTimestamp() ); } - private getRoleDescription(i18n: Language, addedRoles: string[], removedRoles: string[]) { + private getRoleDescription(t: TFunction, addedRoles: string[], removedRoles: string[]) { const description = []; if (addedRoles.length) { description.push( - i18n.get(addedRoles.length === 1 ? LanguageKeys.Events.GuildMemberAddedRoles : LanguageKeys.Events.GuildMemberAddedRolesPlural, { - addedRoles: i18n.list(addedRoles, i18n.get(LanguageKeys.Globals.And)) + t(LanguageKeys.Events.GuildMemberAddedRoles, { + addedRoles, + count: addedRoles.length }) ); } if (removedRoles.length) { - description.push( - i18n.get( - removedRoles.length === 1 ? LanguageKeys.Events.GuildMemberRemovedRoles : LanguageKeys.Events.GuildMemberRemovedRolesPlural, - { - removedRoles: i18n.list(removedRoles, i18n.get(LanguageKeys.Globals.And)) - } - ) - ); + description.push(t(LanguageKeys.Events.GuildMemberRemovedRoles, { removedRoles, count: removedRoles.length })); } return description.join('\n'); diff --git a/src/events/guilds/members/notMutedMemberAddGreeting.ts b/src/events/guilds/members/notMutedMemberAddGreeting.ts index 5ab90ddf338..cc4a24985f9 100644 --- a/src/events/guilds/members/notMutedMemberAddGreeting.ts +++ b/src/events/guilds/members/notMutedMemberAddGreeting.ts @@ -1,8 +1,10 @@ import { GuildSettings } from '#lib/database'; import { Events } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { ApplyOptions } from '@skyra/decorators'; import { Guild, GuildMember, TextChannel, User } from 'discord.js'; -import { Event, EventOptions, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event, EventOptions } from 'klasa'; const enum Matches { Guild = '%GUILD%', @@ -18,7 +20,7 @@ export default class extends Event { private readonly kTransformMessageRegExp = /%MEMBER%|%MEMBERNAME%|%MEMBERTAG%|%GUILD%|%POSITION%|%MEMBERCOUNT%/g; public async run(member: GuildMember) { - const [channelID, content, language] = await member.guild.readSettings((settings) => [ + const [channelID, content, t] = await member.guild.readSettings((settings) => [ settings[GuildSettings.Channels.Greeting], settings[GuildSettings.Messages.Greeting], settings.getLanguage() @@ -28,13 +30,13 @@ export default class extends Event { const channel = member.guild.channels.cache.get(channelID) as TextChannel; if (channel && channel.postable) { - return channel.send(this.transformMessage(content, language, member.guild, member.user)); + return channel.send(this.transformMessage(content, t, member.guild, member.user)); } return member.guild.writeSettings([[GuildSettings.Channels.Greeting, null]]); } - private transformMessage(str: string, language: Language, guild: Guild, user: User) { + private transformMessage(str: string, t: TFunction, guild: Guild, user: User) { return str.replace(this.kTransformMessageRegExp, (match) => { switch (match) { case Matches.Member: @@ -46,7 +48,7 @@ export default class extends Event { case Matches.Guild: return guild.name; case Matches.Position: - return language.ordinal(guild.memberCount); + return t(LanguageKeys.Globals.OrdinalValue, { value: guild.memberCount }); case Matches.MemberCount: return guild.memberCount.toString(); default: diff --git a/src/events/guilds/members/notMutedMemberAddJoinDirectMessage.ts b/src/events/guilds/members/notMutedMemberAddJoinDirectMessage.ts index f3a9277e255..d72c302f30f 100644 --- a/src/events/guilds/members/notMutedMemberAddJoinDirectMessage.ts +++ b/src/events/guilds/members/notMutedMemberAddJoinDirectMessage.ts @@ -1,10 +1,12 @@ import { GuildSettings } from '#lib/database'; import { Events } from '#lib/types/Enums'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { resolveOnErrorCodes } from '#utils/util'; import { ApplyOptions } from '@skyra/decorators'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { Guild, GuildMember, User } from 'discord.js'; -import { Event, EventOptions, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event, EventOptions } from 'klasa'; const enum Matches { Guild = '%GUILD%', @@ -32,7 +34,7 @@ export default class extends Event { ); } - private transformMessage(str: string, language: Language, guild: Guild, user: User) { + private transformMessage(str: string, t: TFunction, guild: Guild, user: User) { return str.replace(this.kTransformMessageRegExp, (match) => { switch (match) { case Matches.Member: @@ -44,7 +46,7 @@ export default class extends Event { case Matches.Guild: return guild.name; case Matches.Position: - return language.ordinal(guild.memberCount); + return t(LanguageKeys.Globals.OrdinalValue, { value: guild.memberCount }); case Matches.MemberCount: return guild.memberCount.toString(); default: diff --git a/src/events/guilds/members/notMutedMemberAddNotify.ts b/src/events/guilds/members/notMutedMemberAddNotify.ts index 0c21fdf1f81..cae95b4b07e 100644 --- a/src/events/guilds/members/notMutedMemberAddNotify.ts +++ b/src/events/guilds/members/notMutedMemberAddNotify.ts @@ -10,7 +10,7 @@ import { Event, EventOptions } from 'klasa'; @ApplyOptions({ event: Events.NotMutedMemberAdd }) export default class extends Event { public async run(member: GuildMember) { - const [enabled, language] = await member.guild.readSettings((settings) => [settings[GuildSettings.Events.MemberAdd], settings.getLanguage()]); + const [enabled, t] = await member.guild.readSettings((settings) => [settings[GuildSettings.Events.MemberAdd], settings.getLanguage()]); if (!enabled) return; this.client.emit(Events.GuildMessageLog, MessageLogsEnum.Member, member.guild, () => @@ -18,12 +18,12 @@ export default class extends Event { .setColor(Colors.Green) .setAuthor(`${member.user.tag} (${member.user.id})`, member.user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setDescription( - language.get(LanguageKeys.Events.GuildMemberAddDescription, { + t(LanguageKeys.Events.GuildMemberAddDescription, { mention: member.toString(), time: Date.now() - member.user.createdTimestamp }) ) - .setFooter(language.get(LanguageKeys.Events.GuildMemberAdd)) + .setFooter(t(LanguageKeys.Events.GuildMemberAdd)) .setTimestamp() ); } diff --git a/src/events/guilds/members/rawMemberRemoveNotify.ts b/src/events/guilds/members/rawMemberRemoveNotify.ts index a5c2779fdea..3e14c78734c 100644 --- a/src/events/guilds/members/rawMemberRemoveNotify.ts +++ b/src/events/guilds/members/rawMemberRemoveNotify.ts @@ -12,19 +12,19 @@ import { Event, EventOptions } from 'klasa'; @ApplyOptions({ event: Events.RawMemberRemove }) export default class extends Event { public async run(guild: Guild, { user }: GatewayGuildMemberRemoveDispatch['d']) { - const [enabled, language] = await guild.readSettings((settings) => [settings[GuildSettings.Events.MemberRemove], settings.getLanguage()]); + const [enabled, t] = await guild.readSettings((settings) => [settings[GuildSettings.Events.MemberRemove], settings.getLanguage()]); if (!enabled) return; const member = guild.members.cache.get(user.id); const isModerationAction = await this.isModerationAction(guild, user); const footer = isModerationAction.kicked - ? language.get(LanguageKeys.Events.GuildMemberKicked) + ? t(LanguageKeys.Events.GuildMemberKicked) : isModerationAction.banned - ? language.get(LanguageKeys.Events.GuildMemberBanned) + ? t(LanguageKeys.Events.GuildMemberBanned) : isModerationAction.softbanned - ? language.get(LanguageKeys.Events.GuildMemberSoftBanned) - : language.get(LanguageKeys.Events.GuildMemberRemove); + ? t(LanguageKeys.Events.GuildMemberSoftBanned) + : t(LanguageKeys.Events.GuildMemberRemove); const time = this.processJoinedTimestamp(member); this.client.emit(Events.GuildMessageLog, MessageLogsEnum.Member, guild, () => @@ -32,13 +32,10 @@ export default class extends Event { .setColor(Colors.Red) .setAuthor(`${user.username}#${user.discriminator} (${user.id})`, getDisplayAvatar(user.id, user)) .setDescription( - language.get( - time === -1 ? LanguageKeys.Events.GuildMemberRemoveDescription : LanguageKeys.Events.GuildMemberRemoveDescriptionWithJoinedAt, - { - mention: `<@${user.id}>`, - time - } - ) + t(time === -1 ? LanguageKeys.Events.GuildMemberRemoveDescription : LanguageKeys.Events.GuildMemberRemoveDescriptionWithJoinedAt, { + mention: `<@${user.id}>`, + time + }) ) .setFooter(footer) .setTimestamp() @@ -61,7 +58,7 @@ export default class extends Event { return { kicked: latestLogForUser.isType(Moderation.TypeCodes.Kick), banned: latestLogForUser.isType(Moderation.TypeCodes.Ban), - softbanned: latestLogForUser.isType(Moderation.TypeCodes.Softban) + softbanned: latestLogForUser.isType(Moderation.TypeCodes.SoftBan) }; } diff --git a/src/events/lavalink/rawTrackStuckEvent.ts b/src/events/lavalink/rawTrackStuckEvent.ts index cf9299cd6da..1df80e96893 100644 --- a/src/events/lavalink/rawTrackStuckEvent.ts +++ b/src/events/lavalink/rawTrackStuckEvent.ts @@ -21,7 +21,7 @@ export default class extends Event { if (!channel) return; // Send the message and automatically delete it once the threshold is reached. - const response = await channel.sendLocale(LanguageKeys.MusicManager.Stuck, [{ milliseconds: payload.thresholdMs }]); + const response = await channel.sendTranslated(LanguageKeys.MusicManager.Stuck, [{ milliseconds: payload.thresholdMs }]); await response.nuke(payload.thresholdMs); } } diff --git a/src/events/mentionSpamExceeded.ts b/src/events/mentionSpamExceeded.ts index de940e7eec3..ecde69ebc04 100644 --- a/src/events/mentionSpamExceeded.ts +++ b/src/events/mentionSpamExceeded.ts @@ -8,7 +8,7 @@ import { Event } from 'klasa'; export default class extends Event { public async run(message: GuildMessage) { - const [threshold, nms, language] = await message.guild.readSettings((settings) => [ + const [threshold, nms, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Selfmod.NoMentionSpam.MentionsAllowed], settings.nms, settings.getLanguage() @@ -17,14 +17,14 @@ export default class extends Event { const lock = message.guild.moderation.createLock(); try { await message.guild.members - .ban(message.author.id, { days: 0, reason: language.get(LanguageKeys.Monitors.NmsFooter) }) + .ban(message.author.id, { days: 0, reason: t(LanguageKeys.Monitors.NoMentionSpamFooter) }) .catch((error) => this.client.emit(Events.ApiError, error)); - await message - .sendLocale(LanguageKeys.Monitors.NmsMessage, [{ user: message.author }]) + await message.channel + .send(t(LanguageKeys.Monitors.NoMentionSpamMessage, { user: message.author })) .catch((error) => this.client.emit(Events.ApiError, error)); nms.delete(message.author.id); - const reason = language.get(LanguageKeys.Monitors.NmsModlog, { threshold }); + const reason = t(LanguageKeys.Monitors.NoMentionSpamModerationLog, { threshold }); await message.guild.moderation .create({ userID: message.author.id, diff --git a/src/events/mentionSpamWarning.ts b/src/events/mentionSpamWarning.ts index ed3339f8686..742483b79bf 100644 --- a/src/events/mentionSpamWarning.ts +++ b/src/events/mentionSpamWarning.ts @@ -3,6 +3,6 @@ import { Event, KlasaMessage } from 'klasa'; export default class extends Event { public async run(message: KlasaMessage) { - await message.alert(await message.fetchLocale(LanguageKeys.Monitors.NmsAlert)); + await message.alert(await message.resolveKey(LanguageKeys.Monitors.NoMentionSpamAlert)); } } diff --git a/src/events/messages/guildMessageDeleteNotify.ts b/src/events/messages/guildMessageDeleteNotify.ts index acb408c1d59..846de164b69 100644 --- a/src/events/messages/guildMessageDeleteNotify.ts +++ b/src/events/messages/guildMessageDeleteNotify.ts @@ -13,7 +13,7 @@ import { Event, EventOptions } from 'klasa'; @ApplyOptions({ event: Events.GuildMessageDelete }) export default class extends Event { public async run(message: GuildMessage) { - const [enabled, ignoredChannels, ignoredDeletes, ignoredAll, language] = await message.guild.readSettings((settings) => [ + const [enabled, ignoredChannels, ignoredDeletes, ignoredAll, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Events.MessageDelete], settings[GuildSettings.Messages.IgnoreChannels], settings[GuildSettings.Channels.Ignore.MessageDelete], @@ -35,7 +35,7 @@ export default class extends Event { message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) ) .setDescription(cutText(getContent(message) || '', 1900)) - .setFooter(`${language.get(LanguageKeys.Events.MessageDelete)} • ${channel.name}`) + .setFooter(t(LanguageKeys.Events.MessageDelete, { channel })) .setImage(getImage(message)!) .setTimestamp() ); diff --git a/src/events/messages/messageUpdateNotify.ts b/src/events/messages/messageUpdateNotify.ts index 2711f07ed23..d8399c1c578 100644 --- a/src/events/messages/messageUpdateNotify.ts +++ b/src/events/messages/messageUpdateNotify.ts @@ -15,7 +15,7 @@ export default class extends Event { public async run(old: KlasaMessage, message: GuildMessage) { if (!message.guild || old.content === message.content || message.author.bot) return; - const [enabled, ignoredChannels, ignoredEdits, ignoredAll, language] = await message.guild.readSettings((settings) => [ + const [enabled, ignoredChannels, ignoredEdits, ignoredAll, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Events.MessageEdit], settings[GuildSettings.Messages.IgnoreChannels], settings[GuildSettings.Channels.Ignore.MessageEdit], @@ -41,7 +41,7 @@ export default class extends Event { .map((result) => (result.added ? `**${result.value}**` : result.removed ? `~~${result.value}~~` : result.value)) .join(' ') ) - .setFooter(`${language.get(LanguageKeys.Events.MessageUpdate)} | ${message.channel.name}`) + .setFooter(t(LanguageKeys.Events.MessageUpdate, { message })) .setTimestamp() ); } diff --git a/src/events/music/musicAddNotify.ts b/src/events/music/musicAddNotify.ts index 7fce8da26bf..2da51c38330 100644 --- a/src/events/music/musicAddNotify.ts +++ b/src/events/music/musicAddNotify.ts @@ -11,19 +11,14 @@ export default class extends AudioEvent { } private async getSingleTrackContent(channel: MessageAcknowledgeable, tracks: readonly QueueEntry[]): Promise { - const track = await channel.guild.audio.player.node.decode(tracks[0].track); - return channel.guild.fetchLocale(LanguageKeys.Commands.Music.AddSong, { title: track.title }); + const [track, t] = await Promise.all([channel.guild.audio.player.node.decode(tracks[0].track), channel.guild.fetchT()]); + return t(LanguageKeys.Commands.Music.AddSong, { title: track.title }); } private async getPlayListContent(channel: MessageAcknowledgeable, tracks: readonly QueueEntry[]): Promise { - const language = await channel.guild.fetchLanguage(); - return language.get(LanguageKeys.Commands.Music.AddPlaylist, { - songs: language.get( - tracks.length === 1 ? LanguageKeys.Commands.Music.AddPlaylistSongs : LanguageKeys.Commands.Music.AddPlaylistSongsPlural, - { - count: tracks.length - } - ) + const t = await channel.guild.fetchT(); + return t(LanguageKeys.Commands.Music.AddPlaylist, { + songs: t(LanguageKeys.Commands.Music.AddPlaylistSongs, { count: tracks.length }) }); } } diff --git a/src/events/music/musicFinishNotify.ts b/src/events/music/musicFinishNotify.ts index e6ad3c131ba..709545fc1b7 100644 --- a/src/events/music/musicFinishNotify.ts +++ b/src/events/music/musicFinishNotify.ts @@ -4,6 +4,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable) { - await channel.sendLocale(LanguageKeys.Commands.Music.PlayEnd); + await channel.sendTranslated(LanguageKeys.Commands.Music.PlayEnd); } } diff --git a/src/events/music/musicRemoveNotify.ts b/src/events/music/musicRemoveNotify.ts index b239cce4bba..f51c09c7bf4 100644 --- a/src/events/music/musicRemoveNotify.ts +++ b/src/events/music/musicRemoveNotify.ts @@ -9,6 +9,8 @@ export default class extends AudioEvent { channel.guild.audio.player.node.decode(entry.track).then((data) => data.title), this.client.users.fetch(entry.author).then((data) => data.username) ]); - await channel.sendLocale(LanguageKeys.Commands.Music.RemoveSuccess, [{ title, requester }], { allowedMentions: { users: [], roles: [] } }); + await channel.sendTranslated(LanguageKeys.Commands.Music.RemoveSuccess, [{ title, requester }], { + allowedMentions: { users: [], roles: [] } + }); } } diff --git a/src/events/music/musicReplayUpdateNotify.ts b/src/events/music/musicReplayUpdateNotify.ts index 714927ae27d..b1c63ef01cb 100644 --- a/src/events/music/musicReplayUpdateNotify.ts +++ b/src/events/music/musicReplayUpdateNotify.ts @@ -4,6 +4,8 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable, repeating: boolean) { - await channel.sendLocale(repeating ? LanguageKeys.Commands.Music.RepeatSuccessEnabled : LanguageKeys.Commands.Music.RepeatSuccessDisabled); + await channel.sendTranslated( + repeating ? LanguageKeys.Commands.Music.RepeatSuccessEnabled : LanguageKeys.Commands.Music.RepeatSuccessDisabled + ); } } diff --git a/src/events/music/musicSongPauseNotify.ts b/src/events/music/musicSongPauseNotify.ts index d95bf37257f..14f0db98683 100644 --- a/src/events/music/musicSongPauseNotify.ts +++ b/src/events/music/musicSongPauseNotify.ts @@ -4,6 +4,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable) { - await channel.sendLocale(LanguageKeys.Commands.Music.PauseSuccess); + await channel.sendTranslated(LanguageKeys.Commands.Music.PauseSuccess); } } diff --git a/src/events/music/musicSongPlayNotify.ts b/src/events/music/musicSongPlayNotify.ts index 31a2edc820d..e907e483469 100644 --- a/src/events/music/musicSongPlayNotify.ts +++ b/src/events/music/musicSongPlayNotify.ts @@ -8,7 +8,7 @@ export default class extends AudioEvent { const requester = await this.client.users.fetch(entry.author).then((data) => data.username); const { title } = entry.info; - await channel.sendLocale(LanguageKeys.Commands.Music.PlayNext, [{ title, requester }], { + await channel.sendTranslated(LanguageKeys.Commands.Music.PlayNext, [{ title, requester }], { allowedMentions: { users: [], roles: [] } }); } diff --git a/src/events/music/musicSongResumeNotify.ts b/src/events/music/musicSongResumeNotify.ts index 9cbc6bd7bef..5883939ea90 100644 --- a/src/events/music/musicSongResumeNotify.ts +++ b/src/events/music/musicSongResumeNotify.ts @@ -4,6 +4,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable) { - await channel.sendLocale(LanguageKeys.Commands.Music.ResumeSuccess); + await channel.sendTranslated(LanguageKeys.Commands.Music.ResumeSuccess); } } diff --git a/src/events/music/musicSongSeekUpdateNotify.ts b/src/events/music/musicSongSeekUpdateNotify.ts index 425273b9a2b..45f102f63ae 100644 --- a/src/events/music/musicSongSeekUpdateNotify.ts +++ b/src/events/music/musicSongSeekUpdateNotify.ts @@ -4,6 +4,6 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable, time: number) { - await channel.sendLocale(LanguageKeys.Commands.Music.SeekSuccess, [{ time }]); + await channel.sendTranslated(LanguageKeys.Commands.Music.SeekSuccess, [{ time }]); } } diff --git a/src/events/music/musicSongSkipNotify.ts b/src/events/music/musicSongSkipNotify.ts index d6d2ac6b116..911d44305cc 100644 --- a/src/events/music/musicSongSkipNotify.ts +++ b/src/events/music/musicSongSkipNotify.ts @@ -6,7 +6,7 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class extends AudioEvent { public async run(channel: MessageAcknowledgeable, entry: QueueEntry) { const track = await channel.guild.audio.player.node.decode(entry.track); - await channel.sendLocale(LanguageKeys.Commands.Music.SkipSuccess, [{ title: track.title }], { + await channel.sendTranslated(LanguageKeys.Commands.Music.SkipSuccess, [{ title: track.title }], { allowedMentions: { users: [], roles: [] } }); } diff --git a/src/events/music/musicSongVolumeUpdateNotify.ts b/src/events/music/musicSongVolumeUpdateNotify.ts index 268d1e6c6a0..23972ecfecb 100644 --- a/src/events/music/musicSongVolumeUpdateNotify.ts +++ b/src/events/music/musicSongVolumeUpdateNotify.ts @@ -9,16 +9,17 @@ export default class extends AudioEvent { } private async getExtremeVolume(channel: MessageAcknowledgeable, volume: number): Promise { - const language = await channel.guild.fetchLanguage(); - return language.get(LanguageKeys.Commands.Music.VolumeChangedExtreme, { + const t = await channel.guild.fetchT(); + return t(LanguageKeys.Commands.Music.VolumeChangedExtreme, { emoji: '📢', - text: pickRandom(language.get(LanguageKeys.Commands.Music.VolumeChangedTexts)), + text: pickRandom(t(LanguageKeys.Commands.Music.VolumeChangedTexts)), volume }); } - private getRegularVolume(channel: MessageAcknowledgeable, previous: number, next: number): Promise { - return channel.guild.fetchLocale(LanguageKeys.Commands.Music.VolumeChanged, { + private async getRegularVolume(channel: MessageAcknowledgeable, previous: number, next: number): Promise { + const t = await channel.guild.fetchT(); + return t(LanguageKeys.Commands.Music.VolumeChanged, { emoji: this.getEmoji(previous, next), volume: next }); diff --git a/src/events/reactions/rawReactionAddBlockList.ts b/src/events/reactions/rawReactionAddBlockList.ts index c34d4b9f5e4..9e2c18d2816 100644 --- a/src/events/reactions/rawReactionAddBlockList.ts +++ b/src/events/reactions/rawReactionAddBlockList.ts @@ -75,13 +75,13 @@ export default class extends ModerationEvent { protected onAlert([data]: Readonly) { floatPromise( this, - data.channel.sendLocale(LanguageKeys.Monitors.ReactionsFilter, [{ user: `<@${data.userID}>` }]).then((message) => message.nuke(15000)) + data.channel.sendTranslated(LanguageKeys.Monitors.ReactionsFilter, [{ user: `<@${data.userID}>` }]).then((message) => message.nuke(15000)) ); } protected async onLogMessage([data]: Readonly) { const user = await this.client.users.fetch(data.userID); - const language = await data.guild.fetchLanguage(); + const t = await data.guild.fetchT(); return new MessageEmbed() .setColor(Colors.Red) .setAuthor(`${user.tag} (${user.id})`, user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) @@ -90,10 +90,8 @@ export default class extends ModerationEvent { ? `https://twemoji.maxcdn.com/72x72/${twemoji(data.emoji.name!)}.png` : `https://cdn.discordapp.com/emojis/${data.emoji.id}.${data.emoji.animated ? 'gif' : 'png'}?size=64` ) - .setDescription( - `[${language.get(LanguageKeys.Misc.JumpTo)}](https://discord.com/channels/${data.guild.id}/${data.channel.id}/${data.messageID})` - ) - .setFooter(`${data.channel.name} | ${language.get(LanguageKeys.Monitors.ReactionsFilterFooter)}`) + .setDescription(`[${t(LanguageKeys.Misc.JumpTo)}](https://discord.com/channels/${data.guild.id}/${data.channel.id}/${data.messageID})`) + .setFooter(`${data.channel.name} | ${t(LanguageKeys.Monitors.ReactionsFilterFooter)}`) .setTimestamp(); } diff --git a/src/events/reactions/rawReactionAddNotify.ts b/src/events/reactions/rawReactionAddNotify.ts index 207e6892b71..0f53120258b 100644 --- a/src/events/reactions/rawReactionAddNotify.ts +++ b/src/events/reactions/rawReactionAddNotify.ts @@ -26,7 +26,7 @@ export default class extends Event { ignoreChannels, ignoreReactionAdd, ignoreAllEvents, - language + t ] = await data.guild.readSettings((settings) => [ settings[GuildSettings.Selfmod.Reactions.WhiteList], settings[GuildSettings.Channels.ReactionLogs], @@ -64,12 +64,12 @@ export default class extends Event { [ `**Emoji**: ${data.emoji.name}${data.emoji.id === null ? '' : ` [${data.emoji.id}]`}`, `**Channel**: ${data.channel}`, - `**Message**: [${language.get(LanguageKeys.Misc.JumpTo)}](https://discord.com/channels/${data.guild.id}/${data.channel.id}/${ + `**Message**: [${t(LanguageKeys.Misc.JumpTo)}](https://discord.com/channels/${data.guild.id}/${data.channel.id}/${ data.messageID })` ].join('\n') ) - .setFooter(`${language.get(LanguageKeys.Events.Reaction)} • ${data.channel.name}`) + .setFooter(`${t(LanguageKeys.Events.Reaction)} • ${data.channel.name}`) .setTimestamp() ); } diff --git a/src/events/twitch/twitchStreamOffline.ts b/src/events/twitch/twitchStreamOffline.ts index dc7af6c1407..80edbd5f8fe 100644 --- a/src/events/twitch/twitchStreamOffline.ts +++ b/src/events/twitch/twitchStreamOffline.ts @@ -5,7 +5,8 @@ import { PostStreamBodyData } from '#root/routes/twitch/twitchStreamChange'; import { TWITCH_REPLACEABLES_MATCHES, TWITCH_REPLACEABLES_REGEX } from '#utils/Notifications/Twitch'; import { floatPromise } from '#utils/util'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Event, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event } from 'klasa'; export default class extends Event { public async run(data: PostStreamBodyData, response: ApiResponse) { @@ -21,7 +22,7 @@ export default class extends Event { if (typeof guild === 'undefined') continue; // Synchronize the settings, then retrieve to all of its subscriptions - const [allSubscriptions, language] = await guild.readSettings((settings) => [ + const [allSubscriptions, t] = await guild.readSettings((settings) => [ settings[GuildSettings.Notifications.Stream.Twitch.Streamers], settings.getLanguage() ]); @@ -44,7 +45,7 @@ export default class extends Event { const message = this.transformText(subscription.message, data); if (subscription.embed) { - floatPromise(this, channel.send(this.buildEmbed(message, language))); + floatPromise(this, channel.send(this.buildEmbed(message, t))); } else { floatPromise(this, channel.send(message)); } @@ -68,11 +69,11 @@ export default class extends Event { }); } - private buildEmbed(message: string, i18n: Language) { + private buildEmbed(message: string, t: TFunction) { return new MessageEmbed() .setColor(this.client.twitch.BRANDING_COLOUR) .setDescription(message) - .setFooter(i18n.get(LanguageKeys.Notifications.TwitchEmbedFooter)) + .setFooter(t(LanguageKeys.Notifications.TwitchEmbedFooter)) .setTimestamp(); } } diff --git a/src/events/twitch/twitchStreamOnline.ts b/src/events/twitch/twitchStreamOnline.ts index 0b5fe1efe3f..29b3c8522fa 100644 --- a/src/events/twitch/twitchStreamOnline.ts +++ b/src/events/twitch/twitchStreamOnline.ts @@ -7,7 +7,8 @@ import { escapeMarkdown } from '#utils/External/escapeMarkdown'; import { TWITCH_REPLACEABLES_MATCHES, TWITCH_REPLACEABLES_REGEX } from '#utils/Notifications/Twitch'; import { floatPromise } from '#utils/util'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Event, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event } from 'klasa'; export default class extends Event { private readonly kTwitchImageReplacerRegex = /({width}|{height})/gi; @@ -31,7 +32,7 @@ export default class extends Event { if (typeof guild === 'undefined') continue; // Synchronize the settings, then retrieve to all of its subscriptions - const [allSubscriptions, language] = await guild.readSettings((settings) => [ + const [allSubscriptions, t] = await guild.readSettings((settings) => [ settings[GuildSettings.Notifications.Stream.Twitch.Streamers], settings.getLanguage() ]); @@ -62,9 +63,9 @@ export default class extends Event { const embedData = this.transformTextToObject(data, game); // Construct a message embed and send it. - floatPromise(this, channel.send(this.buildEmbed(embedData, language))); + floatPromise(this, channel.send(this.buildEmbed(embedData, t))); } else { - const message = this.transformTextToString(subscription.message, data, language, game); + const message = this.transformTextToString(subscription.message, data, t, game); floatPromise(this, channel.send(message)); } } @@ -76,7 +77,7 @@ export default class extends Event { return response.ok(); } - private transformTextToString(source: string, notification: PostStreamBodyData, i18n: Language, game?: TwitchHelixGameSearchResult) { + private transformTextToString(source: string, notification: PostStreamBodyData, t: TFunction, game?: TwitchHelixGameSearchResult) { return source.replace(TWITCH_REPLACEABLES_REGEX, (match) => { switch (match) { case TWITCH_REPLACEABLES_MATCHES.ID: @@ -86,7 +87,7 @@ export default class extends Event { case TWITCH_REPLACEABLES_MATCHES.VIEWER_COUNT: return notification.viewer_count.toString(); case TWITCH_REPLACEABLES_MATCHES.GAME_NAME: - return game?.name ?? i18n.get(LanguageKeys.Notifications.TwitchNoGameName); + return game?.name ?? t(LanguageKeys.Notifications.TwitchNoGameName); case TWITCH_REPLACEABLES_MATCHES.LANGUAGE: return notification.language; case TWITCH_REPLACEABLES_MATCHES.GAME_ID: @@ -117,17 +118,17 @@ export default class extends Event { }; } - private buildEmbed(data: TwitchOnlineEmbedData, i18n: Language) { + private buildEmbed(data: TwitchOnlineEmbedData, t: TFunction) { return new MessageEmbed() .setThumbnail(data.thumbnail_url) .setTitle(data.title) .setURL(`https://twitch.tv/${data.user_name}`) .setDescription( data.game_name - ? i18n.get(LanguageKeys.Notifications.TwitchEmbedDescriptionWithGame, { userName: data.user_name, gameName: data.game_name }) - : i18n.get(LanguageKeys.Notifications.TwitchEmbedDescription, { userName: data.user_name }) + ? t(LanguageKeys.Notifications.TwitchEmbedDescriptionWithGame, { userName: data.user_name, gameName: data.game_name }) + : t(LanguageKeys.Notifications.TwitchEmbedDescription, { userName: data.user_name }) ) - .setFooter(i18n.get(LanguageKeys.Notifications.TwitchEmbedFooter)) + .setFooter(t(LanguageKeys.Notifications.TwitchEmbedFooter)) .setTimestamp(data.started_at) .setColor(this.client.twitch.BRANDING_COLOUR) .setImage(data.box_art_url ?? ''); diff --git a/src/events/userUpdate.ts b/src/events/userUpdate.ts index 1b5f2f9a4d3..513c884bd2f 100644 --- a/src/events/userUpdate.ts +++ b/src/events/userUpdate.ts @@ -6,7 +6,8 @@ import { Events } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { MessageLogsEnum } from '#utils/constants'; import { Guild, MessageEmbed, User } from 'discord.js'; -import { Event, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { Event } from 'klasa'; export default class extends Event { public async run(previous: User, user: User) { @@ -37,18 +38,18 @@ export default class extends Event { } } - private getNameDescription(i18n: Language, previousName: string | null, nextName: string | null) { + private getNameDescription(t: TFunction, previousName: string | null, nextName: string | null) { const previous = previousName === null ? LanguageKeys.Events.NameUpdatePreviousWasNotSet : LanguageKeys.Events.NameUpdatePreviousWasSet; const next = nextName === null ? LanguageKeys.Events.NameUpdateNextWasNotSet : LanguageKeys.Events.NameUpdateNextWasSet; - return [i18n.get(previous, { previousName }), i18n.get(next, { nextName })].join('\n'); + return [t(previous, { previousName }), t(next, { nextName })].join('\n'); } - private buildEmbed(user: User, i18n: Language, description: string, footerKey: CustomGet) { + private buildEmbed(user: User, t: TFunction, description: string, footerKey: CustomGet) { return new MessageEmbed() .setColor(Colors.Yellow) .setAuthor(`${user.tag} (${user.id})`, user.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setDescription(description) - .setFooter(i18n.get(footerKey)) + .setFooter(t(footerKey)) .setTimestamp(); } } diff --git a/src/inhibitors/cooldown.ts b/src/inhibitors/cooldown.ts index 2dd073e7b79..c5781612749 100644 --- a/src/inhibitors/cooldown.ts +++ b/src/inhibitors/cooldown.ts @@ -22,8 +22,8 @@ export default class extends Inhibitor { } if (existing && existing.limited) { - const language = await message.fetchLanguage(); - throw language.get(LanguageKeys.Inhibitors.Cooldown, { remaining: language.duration(existing.remainingTime) }); + const t = await message.fetchT(); + throw t(LanguageKeys.Inhibitors.Cooldown, { remaining: existing.remainingTime }); } } } diff --git a/src/inhibitors/disableCommand.ts b/src/inhibitors/disableCommand.ts index f4510475cd2..4650bb46e80 100644 --- a/src/inhibitors/disableCommand.ts +++ b/src/inhibitors/disableCommand.ts @@ -12,11 +12,11 @@ export default class extends Inhibitor { } private async runDM(message: KlasaMessage, command: SkyraCommand) { - if (!command.enabled) throw await message.fetchLocale(LanguageKeys.Inhibitors.DisabledGlobal); + if (!command.enabled) throw await message.resolveKey(LanguageKeys.Inhibitors.DisabledGlobal); } private async runGuild(message: GuildMessage, command: SkyraCommand) { - const [disabled, language] = await message.guild.readSettings((settings) => [ + const [disabled, t] = await message.guild.readSettings((settings) => [ this.checkGuildDisabled(settings, message, command), settings.getLanguage() ]); @@ -25,7 +25,7 @@ export default class extends Inhibitor { if (!(await message.hasAtLeastPermissionLevel(PermissionLevels.Moderator))) throw true; } - if (!command.enabled) throw language.get(LanguageKeys.Inhibitors.DisabledGlobal); + if (!command.enabled) throw t(LanguageKeys.Inhibitors.DisabledGlobal); } private checkGuildDisabled(settings: GuildEntity, message: GuildMessage, command: SkyraCommand) { diff --git a/src/inhibitors/missingBotPermissions.ts b/src/inhibitors/missingBotPermissions.ts index c23057bccb5..1679711a634 100644 --- a/src/inhibitors/missingBotPermissions.ts +++ b/src/inhibitors/missingBotPermissions.ts @@ -31,13 +31,9 @@ export default class extends Inhibitor { } if (missing.length) { - const language = await message.fetchLanguage(); - const permissions = language.PERMISSIONS; - throw language.get(LanguageKeys.Inhibitors.MissingBotPerms, { - missing: language.list( - missing.map((permission) => permissions[permission]), - language.get(LanguageKeys.Globals.And) - ) + const t = await message.fetchT(); + throw t(LanguageKeys.Inhibitors.MissingBotPerms, { + missing: missing.map((permission) => t(`permissions:${permission}`)) }); } } diff --git a/src/inhibitors/permissions.ts b/src/inhibitors/permissions.ts index 3903d91d69e..21704d0d50c 100644 --- a/src/inhibitors/permissions.ts +++ b/src/inhibitors/permissions.ts @@ -6,16 +6,16 @@ export default class extends Inhibitor { // If the message was sent in a guild, the command isn't guarded (they are all 0, and // cannot be denied), and the permission level is lower than 9, run the permission nodes. if (message.guild && message.member && message.author.id !== message.guild.ownerID && !command.guarded && command.permissionLevel < 9) { - const [pnodes, language] = await message.guild.readSettings((settings) => [settings.permissionNodes, settings.getLanguage()]); + const [pnodes, t] = await message.guild.readSettings((settings) => [settings.permissionNodes, settings.getLanguage()]); const result = pnodes.run(message.member, command.name); if (result) return; - if (result === false) throw language.get(LanguageKeys.Inhibitors.Permissions); + if (result === false) throw t(LanguageKeys.Inhibitors.Permissions); } const { broke, permission } = await this.client.permissionLevels.run(message, command.permissionLevel); if (permission) return; - throw broke ? await message.fetchLocale(LanguageKeys.Inhibitors.Permissions) : true; + throw broke ? await message.resolveKey(LanguageKeys.Inhibitors.Permissions) : true; } } diff --git a/src/inhibitors/spam.ts b/src/inhibitors/spam.ts index 7f2a16be820..5bdfa49c88a 100644 --- a/src/inhibitors/spam.ts +++ b/src/inhibitors/spam.ts @@ -12,7 +12,7 @@ export default class extends Inhibitor { public async run(message: KlasaMessage, command: SkyraCommand) { if (!command.spam || !message.guild) return; - const [channelID, language] = await message.guild.readSettings((settings) => [settings[GuildSettings.Channels.Spam], settings.getLanguage()]); + const [channelID, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Channels.Spam], settings.getLanguage()]); if (!channelID) return; if (channelID === message.channel.id) return; @@ -27,7 +27,7 @@ export default class extends Inhibitor { try { this.ratelimit.acquire(message.channel.id).drip(); } catch { - throw language.get(LanguageKeys.Inhibitors.Spam, { channel: channel.toString() }); + throw t(LanguageKeys.Inhibitors.Spam, { channel: channel.toString() }); } } } diff --git a/src/languages/ckb-IR/arguments/range.json b/src/languages/ckb-IR/arguments/range.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/arguments/range.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/commands/admin.json b/src/languages/ckb-IR/commands/admin.json new file mode 100644 index 00000000000..f4b2ba18e0c --- /dev/null +++ b/src/languages/ckb-IR/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "", + "confNoValue": "", + "confGuarded": "", + "confUpdated": "", + "confKeyNotArray": "", + "confGetNoExt": "", + "confGet": "", + "confReset": "", + "confNochange": "", + "confServerDescription": "", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "", + "confUserDescription": "", + "confDashboardOnlyKey": "", + "confUser": "", + "confSettingNotSet": "", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ckb-IR/commands/animal.json b/src/languages/ckb-IR/commands/animal.json new file mode 100644 index 00000000000..1853c9a0440 --- /dev/null +++ b/src/languages/ckb-IR/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ckb-IR/commands/anime.json b/src/languages/ckb-IR/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/ckb-IR/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/ckb-IR/commands/announcement.json b/src/languages/ckb-IR/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/ckb-IR/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/ckb-IR/commands/developer.json b/src/languages/ckb-IR/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/ckb-IR/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/ckb-IR/commands/fun.json b/src/languages/ckb-IR/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/ckb-IR/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/ckb-IR/commands/game.json b/src/languages/ckb-IR/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/ckb-IR/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/ckb-IR/commands/gameIntegration.json b/src/languages/ckb-IR/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/ckb-IR/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/ckb-IR/commands/general.json b/src/languages/ckb-IR/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/ckb-IR/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/ckb-IR/commands/giveaway.json b/src/languages/ckb-IR/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/ckb-IR/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/ckb-IR/commands/google.json b/src/languages/ckb-IR/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/ckb-IR/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/ckb-IR/commands/management.json b/src/languages/ckb-IR/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/ckb-IR/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/ckb-IR/commands/misc.json b/src/languages/ckb-IR/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/ckb-IR/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/ckb-IR/commands/moderation.json b/src/languages/ckb-IR/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/ckb-IR/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/ckb-IR/commands/music.json b/src/languages/ckb-IR/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/ckb-IR/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/ckb-IR/commands/pokemon.json b/src/languages/ckb-IR/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/ckb-IR/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/ckb-IR/commands/social.json b/src/languages/ckb-IR/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/ckb-IR/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/ckb-IR/commands/starboard.json b/src/languages/ckb-IR/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/ckb-IR/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/ckb-IR/commands/suggestion.json b/src/languages/ckb-IR/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/ckb-IR/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/ckb-IR/commands/system.json b/src/languages/ckb-IR/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/ckb-IR/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ckb-IR/commands/tags.json b/src/languages/ckb-IR/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/ckb-IR/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/ckb-IR/commands/tools.json b/src/languages/ckb-IR/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/ckb-IR/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/ckb-IR/commands/twitch.json b/src/languages/ckb-IR/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/ckb-IR/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/ckb-IR/commands/weeb.json b/src/languages/ckb-IR/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/ckb-IR/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/ckb-IR/errors.json b/src/languages/ckb-IR/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/events.json b/src/languages/ckb-IR/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/fuzzySearch.json b/src/languages/ckb-IR/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/giveaway.json b/src/languages/ckb-IR/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/globals.json b/src/languages/ckb-IR/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/humanLevels.json b/src/languages/ckb-IR/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/inhibitors.json b/src/languages/ckb-IR/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/klasa.json b/src/languages/ckb-IR/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/ckb-IR/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/ckb-IR/moderation.json b/src/languages/ckb-IR/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/moderationActions.json b/src/languages/ckb-IR/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/ckb-IR/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/ckb-IR/monitors.json b/src/languages/ckb-IR/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/musicManager.json b/src/languages/ckb-IR/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/notifications.json b/src/languages/ckb-IR/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/permissions.json b/src/languages/ckb-IR/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/promptList.json b/src/languages/ckb-IR/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/resolvers.json b/src/languages/ckb-IR/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/ckb-IR/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/ckb-IR/selfModeration.json b/src/languages/ckb-IR/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/serializers.json b/src/languages/ckb-IR/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/settings.json b/src/languages/ckb-IR/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ckb-IR/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ckb-IR/system.json b/src/languages/ckb-IR/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/ckb-IR/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/en-GB/arguments/range.json b/src/languages/en-GB/arguments/range.json new file mode 100644 index 00000000000..9e8e6828450 --- /dev/null +++ b/src/languages/en-GB/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} must be a number or a range of numbers.", + "max_plural": "{{name}} accepts a range of maximum {{maximum}} numbers.", + "max": "{{name}} accepts a range of maximum {{maximum}} number" +} diff --git a/src/languages/en-GB/commands/admin.json b/src/languages/en-GB/commands/admin.json new file mode 100644 index 00000000000..4f6c6bd5198 --- /dev/null +++ b/src/languages/en-GB/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "You must provide a key", + "confNoValue": "You must provide a value", + "confGuarded": "{{name, toTitleCase}} may not be disabled.", + "confUpdated": "Successfully updated the key **{{key}}**: `{{response}}`", + "confKeyNotArray": "This key is not array type. Use the action 'reset' instead.", + "confGetNoExt": "The key **{{key}}** does not seem to exist.", + "confGet": "The value for the key **{{key}}** is: `{{value}}`", + "confReset": "The key **{{key}}** has been reset to: `{{value}}`", + "confNochange": "The value for **{{key}}** was already that value.", + "confServerDescription": "Define per-server settings.", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**Server Setting {{key}}**\n{{list}}", + "confUserDescription": "Define per-user settings.", + "confDashboardOnlyKey": "`{{key}}` can only be configured through the web dashboard ()", + "confUser": "", + "confSettingNotSet": "Not Set", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "Manage unique role sets.", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "add", + "Create a new roleset or add a role to an existing one." + ], + [ + "remove", + "Remove a role from an existing roleset." + ], + [ + "reset", + "Removes all roles from a roleset or, if not specified, all existing rolesets." + ], + [ + "list", + "Lists all rolesets." + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/en-GB/commands/animal.json b/src/languages/en-GB/commands/animal.json new file mode 100644 index 00000000000..535319a8084 --- /dev/null +++ b/src/languages/en-GB/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "Let me tell you a mysterious cat fact.", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "Cat Fact", + "dogDescription": "Cute doggos! ❤", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "Let me show you an image of a fox!", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "KITTENS!", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "Cute shibas!", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/en-GB/commands/anime.json b/src/languages/en-GB/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/en-GB/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/en-GB/commands/announcement.json b/src/languages/en-GB/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/en-GB/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/en-GB/commands/developer.json b/src/languages/en-GB/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/en-GB/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/en-GB/commands/fun.json b/src/languages/en-GB/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/en-GB/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/en-GB/commands/game.json b/src/languages/en-GB/commands/game.json new file mode 100644 index 00000000000..9409eb1222d --- /dev/null +++ b/src/languages/en-GB/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "Play Connect Four with somebody.", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "This column is full. Please try another. ", + "c4GameDraw": "This match concluded in a **draw**!", + "c4GameNext": "Turn for: {{user}} (red).", + "c4GameNextTurn0": "Turn for: {{user}} (blue).", + "c4GameWin": "{{user}} (red) won!", + "c4GameWinTurn0": "{{user}} (blue) won!", + "c4Prompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a Connect Four match. Reply with **yes** to accept!", + "c4Start": "Let's play! Turn for: **{{player}}**.", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "Heads", + "Tails" + ], + "coinFlipDescription": "Flip a coin!", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "heads 50", + "tails 200" + ] + }, + "coinFlipInvalidCoinname": "Excuse me, but {{arg}} is not a coin face!", + "coinFlipLoseDescription": "The coin was flipped, and it showed {{result}}. You didn't guess correctly.", + "coinFlipLoseDescriptionWithWager": "The coin was flipped, and it showed {{result}}. You didn't guess correctly and lost {{wager}} {{SHINY}}.", + "coinFlipLoseTitle": "You lost.", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "Play noughts and crosses with somebody.", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a noughts and crosses match. Reply with **yes** to accept!", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/en-GB/commands/gameIntegration.json b/src/languages/en-GB/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/en-GB/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/en-GB/commands/general.json b/src/languages/en-GB/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/en-GB/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/en-GB/commands/giveaway.json b/src/languages/en-GB/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/en-GB/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/en-GB/commands/google.json b/src/languages/en-GB/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/en-GB/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/en-GB/commands/management.json b/src/languages/en-GB/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/en-GB/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/en-GB/commands/misc.json b/src/languages/en-GB/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/en-GB/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/en-GB/commands/moderation.json b/src/languages/en-GB/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/en-GB/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/en-GB/commands/music.json b/src/languages/en-GB/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/en-GB/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/en-GB/commands/pokemon.json b/src/languages/en-GB/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/en-GB/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/en-GB/commands/social.json b/src/languages/en-GB/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/en-GB/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/en-GB/commands/starboard.json b/src/languages/en-GB/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/en-GB/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/en-GB/commands/suggestion.json b/src/languages/en-GB/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/en-GB/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/en-GB/commands/system.json b/src/languages/en-GB/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/en-GB/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/en-GB/commands/tags.json b/src/languages/en-GB/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/en-GB/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/en-GB/commands/tools.json b/src/languages/en-GB/commands/tools.json new file mode 100644 index 00000000000..0cfe2d3f021 --- /dev/null +++ b/src/languages/en-GB/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "View somebody's avatar at full size.", + "avatarExtended": { + "extendedHelp": "As this command's name says, it shows somebody's avatar.", + "explainedUsage": [ + [ + "user", + "(Optional) A user mention. Defaults to the author if the input is invalid or not given." + ] + ], + "reminder": "Use the --size flag to change the avatar's size." + }, + "avatarNone": "That user has not set an avatar.", + "color": "", + "colorDescription": "Displays some awesome colours.", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "colour", + "A colour resolvable." + ] + ], + "examples": [ + "#dfdfdf >25", + "rgb(200, 130, 75)" + ], + "possibleFormats": [ + [ + "HEX", + "#dfdfdf" + ], + [ + "RGB", + "rgb(200, 200, 200)" + ], + [ + "HSL", + "hsl(350, 100, 100)" + ], + [ + "B10", + "14671839" + ] + ] + }, + "contentDescription": "Get a message's raw content.", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "channel", + "" + ], + [ + "message", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/en-GB/commands/twitch.json b/src/languages/en-GB/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/en-GB/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/en-GB/commands/weeb.json b/src/languages/en-GB/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/en-GB/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/en-GB/constants.ts b/src/languages/en-GB/constants.ts new file mode 100644 index 00000000000..70ec75b72c9 --- /dev/null +++ b/src/languages/en-GB/constants.ts @@ -0,0 +1,60 @@ +import { Handler } from '#lib/structures/i18n/Handler'; +import { TimeTypes } from '@sapphire/time-utilities'; + +export class ExtendedHandler extends Handler { + public constructor() { + super({ + name: 'en-GB', + duration: { + [TimeTypes.Year]: { + 1: 'year', + DEFAULT: 'years' + }, + [TimeTypes.Month]: { + 1: 'month', + DEFAULT: 'months' + }, + [TimeTypes.Week]: { + 1: 'week', + DEFAULT: 'weeks' + }, + [TimeTypes.Day]: { + 1: 'day', + DEFAULT: 'days' + }, + [TimeTypes.Hour]: { + 1: 'hour', + DEFAULT: 'hours' + }, + [TimeTypes.Minute]: { + 1: 'minute', + DEFAULT: 'minutes' + }, + [TimeTypes.Second]: { + 1: 'second', + DEFAULT: 'seconds' + } + } + }); + } + + public ordinal(cardinal: number): string { + const cent = cardinal % 100; + const dec = cardinal % 10; + + if (cent >= 10 && cent <= 20) { + return `${cardinal}th`; + } + + switch (dec) { + case 1: + return `${cardinal}st`; + case 2: + return `${cardinal}nd`; + case 3: + return `${cardinal}rd`; + default: + return `${cardinal}th`; + } + } +} diff --git a/src/languages/en-GB/errors.json b/src/languages/en-GB/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/events.json b/src/languages/en-GB/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/fuzzySearch.json b/src/languages/en-GB/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/giveaway.json b/src/languages/en-GB/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/globals.json b/src/languages/en-GB/globals.json new file mode 100644 index 00000000000..9f8a82e0af2 --- /dev/null +++ b/src/languages/en-GB/globals.json @@ -0,0 +1,19 @@ +{ + "and": "and", + "default": "{{key}} has not been localised for en-GB yet.", + "defaultLanguage": "Default Language", + "is": "is", + "no": "No", + "none": "None", + "or": "or", + "unknown": "unknown", + "yes": "Yes", + "ordinalValue": "{{value, ordinal}}", + "durationValue": "{{value, duration}}", + "numberValue": "{{value, number}}", + "numberCompactValue": "{{value, numberCompact}}", + "timeDateValue": "{{value, timeDate}}", + "timeFullValue": "{{value, timeFull}}", + "andListValue": "{{value, andList}}", + "orListValue": "{{value, orList}}" +} diff --git a/src/languages/en-GB/humanLevels.json b/src/languages/en-GB/humanLevels.json new file mode 100644 index 00000000000..a35c4b3c8dd --- /dev/null +++ b/src/languages/en-GB/humanLevels.json @@ -0,0 +1,7 @@ +{ + "NONE": "None", + "LOW": "Low", + "MEDIUM": "Medium", + "HIGH": "High", + "VERY_HIGH": "Highest" +} diff --git a/src/languages/en-GB/inhibitors.json b/src/languages/en-GB/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/klasa.json b/src/languages/en-GB/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/en-GB/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/en-GB/moderation.json b/src/languages/en-GB/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/moderationActions.json b/src/languages/en-GB/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/en-GB/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/en-GB/monitors.json b/src/languages/en-GB/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/musicManager.json b/src/languages/en-GB/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/notifications.json b/src/languages/en-GB/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/permissions.json b/src/languages/en-GB/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/promptList.json b/src/languages/en-GB/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/resolvers.json b/src/languages/en-GB/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/en-GB/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/en-GB/selfModeration.json b/src/languages/en-GB/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/serializers.json b/src/languages/en-GB/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/settings.json b/src/languages/en-GB/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/en-GB/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/en-GB/system.json b/src/languages/en-GB/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/en-GB/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/en-US.ts b/src/languages/en-US.ts deleted file mode 100644 index 744bde13c75..00000000000 --- a/src/languages/en-US.ts +++ /dev/null @@ -1,5005 +0,0 @@ -/* eslint-disable @typescript-eslint/no-invalid-this, @typescript-eslint/member-ordering */ -import { VERSION } from '#root/config'; -import { Emojis } from '#utils/constants'; -import { CATEGORIES } from '#utils/Games/TriviaManager'; -import { random } from '#utils/util'; -import { DurationFormatter, TimeTypes } from '@sapphire/time-utilities'; -import { codeBlock, inlineCodeBlock, toTitleCase } from '@sapphire/utilities'; -import { Language, LanguageKeys, Timestamp, version as klasaVersion } from 'klasa'; - -const LOADING = Emojis.Loading; -const SHINY = Emojis.Shiny; -const GREENTICK = Emojis.GreenTick; -const REDCROSS = Emojis.RedCross; - -const timestamp = new Timestamp('YYYY/MM/DD [at] HH:mm:ss'); - -const duration = new DurationFormatter({ - [TimeTypes.Year]: { - 1: 'year', - DEFAULT: 'years' - }, - [TimeTypes.Month]: { - 1: 'month', - DEFAULT: 'months' - }, - [TimeTypes.Week]: { - 1: 'week', - DEFAULT: 'weeks' - }, - [TimeTypes.Day]: { - 1: 'day', - DEFAULT: 'days' - }, - [TimeTypes.Hour]: { - 1: 'hour', - DEFAULT: 'hours' - }, - [TimeTypes.Minute]: { - 1: 'minute', - DEFAULT: 'minutes' - }, - [TimeTypes.Second]: { - 1: 'second', - DEFAULT: 'seconds' - } -}); - -export default class extends Language { - public PERMISSIONS = { - ADMINISTRATOR: 'Administrator', - VIEW_AUDIT_LOG: 'View Audit Log', - MANAGE_GUILD: 'Manage Server', - MANAGE_ROLES: 'Manage Roles', - MANAGE_CHANNELS: 'Manage Channels', - KICK_MEMBERS: 'Kick Members', - BAN_MEMBERS: 'Ban Members', - CREATE_INSTANT_INVITE: 'Create Instant Invite', - CHANGE_NICKNAME: 'Change Nickname', - MANAGE_NICKNAMES: 'Manage Nicknames', - MANAGE_EMOJIS: 'Manage Emojis', - MANAGE_WEBHOOKS: 'Manage Webhooks', - VIEW_CHANNEL: 'Read Messages', - SEND_MESSAGES: 'Send Messages', - SEND_TTS_MESSAGES: 'Send TTS Messages', - MANAGE_MESSAGES: 'Manage Messages', - EMBED_LINKS: 'Embed Links', - ATTACH_FILES: 'Attach Files', - READ_MESSAGE_HISTORY: 'Read Message History', - MENTION_EVERYONE: 'Mention Everyone', - USE_EXTERNAL_EMOJIS: 'Use External Emojis', - ADD_REACTIONS: 'Add Reactions', - CONNECT: 'Connect', - SPEAK: 'Speak', - STREAM: 'Stream', - MUTE_MEMBERS: 'Mute Members', - DEAFEN_MEMBERS: 'Deafen Members', - MOVE_MEMBERS: 'Move Members', - USE_VAD: 'Use Voice Activity', - PRIORITY_SPEAKER: 'Priority Speaker', - VIEW_GUILD_INSIGHTS: 'View Guild Insights' - }; - - public HUMAN_LEVELS = { - NONE: 'None', - LOW: 'Low', - MEDIUM: 'Medium', - HIGH: 'High', - VERY_HIGH: 'Highest' - }; - - public duration(time: number, precision?: number) { - return duration.format(time, precision); - } - - /** Parses cardinal numbers to the ordinal counterparts */ - public ordinal(cardinal: number) { - const cent = cardinal % 100; - const dec = cardinal % 10; - - if (cent >= 10 && cent <= 20) { - return `${cardinal}th`; - } - - switch (dec) { - case 1: - return `${cardinal}st`; - case 2: - return `${cardinal}nd`; - case 3: - return `${cardinal}rd`; - default: - return `${cardinal}th`; - } - } - - public list(values: readonly string[], conjunction: 'or' | 'and') { - switch (values.length) { - case 0: - return ''; - case 1: - return values[0]; - case 2: - return `${values[0]} ${conjunction} ${values[1]}`; - default: { - const trail = values.slice(0, -1); - const head = values[values.length - 1]; - return `${trail.join(', ')}, ${conjunction} ${head}`; - } - } - } - - public groupDigits(number: number) { - return number.toLocaleString(this.name, { useGrouping: true }); - } - - public language: LanguageKeys = { - /** - * ################################ - * # FRAMEWORK MESSAGES # - * # KLASA 0.5.0d # - * ################################ - */ - - default: ({ key }) => `${key} has not been localized for en-US yet.`, - defaultLanguage: 'Default Language', - globalYes: 'Yes', - globalNo: 'No', - globalNone: 'None', - globalIs: 'is', - globalAnd: 'and', - globalOr: 'or', - globalUnknown: 'Unknown', - settingGatewayKeyNoext: ({ key }) => `The key "${key}" does not exist in the data schema.`, - settingGatewayChooseKey: ({ keys }) => `You cannot edit a settings group, pick any of the following: "${keys}"`, - settingGatewayUnconfigurableFolder: 'This settings group does not have any configurable sub-key.', - settingGatewayUnconfigurableKey: ({ key }) => `The settings key "${key}" has been marked as non-configurable by the bot owner.`, - settingGatewayMissingValue: ({ path, value }) => `The value "${value}" cannot be removed from the key "${path}" because it does not exist.`, - settingGatewayDuplicateValue: ({ path, value }) => `The value "${value}" cannot be added to the key "${path}" because it was already set.`, - settingGatewayInvalidFilteredValue: ({ path, value }) => `The settings key "${path}" does not accept the value "${value}".`, - resolverBoolFalseOptions: ['false', 'f', 'no', 'n', 'off', 'disable', 'disabled', '0', '-'], - resolverBoolTrueOptions: ['true', 't', 'yes', 'y', 'on', 'enable', 'enabled', '1', '+'], - resolverBoolEnabled: 'Enabled', - resolverBoolDisabled: 'Disabled', - resolverMultiTooFew: ({ name, min, conjunctionWord }) => `Provided too few ${name}s. At least ${min} ${conjunctionWord} required.`, - resolverInvalidBool: ({ name }) => `${name} must be true or false.`, - resolverInvalidChannel: ({ name }) => `${name} must be a channel tag or valid channel id.`, - resolverInvalidCustom: ({ name, type }) => `${name} must be a valid ${type}.`, - resolverInvalidDate: ({ name }) => `${name} must be a valid date.`, - resolverInvalidDuration: ({ name }) => `${name} must be a valid duration string.`, - resolverInvalidEmoji: ({ name }) => `${name} must be a custom emoji tag or valid emoji id.`, - resolverInvalidFloat: ({ name }) => `${name} must be a valid number.`, - resolverInvalidGuild: ({ name }) => `${name} must be a valid guild id.`, - resolverInvalidInt: ({ name }) => `${name} must be an integer.`, - resolverInvalidInvite: ({ name }) => `${name} must be a valid invite link.`, - resolverInvalidWager: ({ bet, validAmounts }) => - `I am sorry, but ${bet} ${SHINY} is an invalid amount to bet. You can bet one of ${validAmounts}`, - resolverInvalidLiteral: ({ name }) => `Your option did not match the only possibility: ${name}`, - resolverInvalidMember: ({ name }) => `${name} must be a mention or valid user id.`, - resolverInvalidMessage: ({ name }) => `${name} must be a valid message id.`, - resolverInvalidPiece: ({ name, piece }) => `${name} must be a valid ${piece} name.`, - resolverInvalidRegexMatch: ({ name, pattern }) => `${name} must follow this regex pattern \`${pattern}\`.`, - resolverInvalidRole: ({ name }) => `${name} must be a role mention or role id.`, - resolverInvalidString: ({ name }) => `${name} must be a valid string.`, - resolverInvalidTime: ({ name }) => `${name} must be a valid duration or date string.`, - resolverInvalidUrl: ({ name }) => `${name} must be a valid url.`, - resolverInvalidUser: ({ name }) => `${name} must be a mention or valid user id.`, - resolverInvalidSnowflake: ({ name }) => `${name} must be a valid Discord snowflake.`, - resolverInvalidStore: ({ store }) => `${store} must be a valid Store.`, - resolverStringSuffix: ' characters', - resolverMinmaxExactlyInclusive: ({ name, min }) => `${name} must be exactly ${min}.`, - resolverMinmaxExactlyExclusive: ({ name, min }) => `${name} must be exactly ${min}.`, - resolverMinmaxBothInclusive: ({ name, min, max }) => `${name} must be between ${min} and ${max} inclusively.`, - resolverMinmaxBothExclusive: ({ name, min, max }) => `${name} must be between ${min} and ${max} exclusively.`, - resolverMinmaxMinInclusive: ({ name, min }) => `${name} must be greater than ${min} inclusively.`, - resolverMinmaxMinExclusive: ({ name, min }) => `${name} must be greater than ${min} exclusively.`, - resolverMinmaxMaxInclusive: ({ name, max }) => `${name} must be less than ${max} inclusively`, - resolverMinmaxMaxExclusive: ({ name, max }) => `${name} must be less than ${max} exclusively.`, - reactionhandlerPrompt: 'Which page would you like to jump to?', - // used for help command - systemHelpTitles: { - explainedUsage: '⚙ | ***Explained usage***', - possibleFormats: '🔢 | ***Possible formats***', - examples: '🔗 | ***Examples***', - reminders: '⏰ | ***Reminder***' - }, - commandmessageMissing: 'Missing one or more required arguments after end of input.', - commandmessageMissingRequired: ({ name }) => `${name} is a required argument.`, - commandmessageMissingOptionals: ({ possibles }) => `Missing a required option: (${possibles})`, - commandmessageNomatch: ({ possibles }) => `Your option didn't match any of the possibilities: (${possibles})`, - monitorCommandHandlerReprompt: ({ tag, name, time, cancelOptions }) => - `${tag} | **${name}** | You have **${time}** seconds to respond to this prompt with a valid argument. Type **${cancelOptions}** to abort this prompt.`, - monitorCommandHandlerRepeatingReprompt: ({ tag, name, time, cancelOptions }) => - `${tag} | **${name}** is a repeating argument | You have **${time}** seconds to respond to this prompt with additional valid arguments. Type **${cancelOptions}** to cancel this prompt.`, - monitorCommandHandlerAborted: 'Aborted', - inhibitorCooldown: ({ remaining }) => `You have just used this command. You can use this command again in ${remaining}.`, - inhibitorMissingBotPerms: ({ missing }) => `I don't have sufficient permissions! I'm missing: ${missing}`, - inhibitorNsfw: 'You may not use NSFW commands in this channel!', - inhibitorPermissions: 'You do not have permission to use this command!', - inhibitorRequiredSettings: ({ settings }) => `The guild is missing the **${settings}** guild setting and thus the command cannot run.`, - inhibitorRequiredSettingsPlural: ({ settings }) => `The guild is missing the **${settings}** guild settings and thus the command cannot run.`, - inhibitorRunin: ({ type }) => `This command is only available in ${type} channels.`, - inhibitorRuninNone: ({ name }) => `The ${name} command is not configured to run in any channel.`, - inhibitorDisabledGuild: 'This command has been disabled by an admin in this guild!', - inhibitorDisabledGlobal: - 'This command has been globally disabled by the bot owners. Want to know why and find out when it will be back? Join the official Skyra server: ', - commandBlocklistDescription: 'Block or allow users and guilds from using my functionalities.', - commandBlocklistSaveSuccess: `${GREENTICK} Successfully updated blocked users and/or guilds`, - commandBlocklistResetSuccess: `${GREENTICK} Successfully reset blocked users and guilds`, - commandUnload: ({ type, name }) => `${GREENTICK} Unloaded ${type}: ${name}`, - commandUnloadDescription: 'Unloads the klasa piece.', - commandTransferError: `${REDCROSS} That file has been transferred already or never existed.`, - commandTransferSuccess: ({ type, name }) => `${GREENTICK} Successfully transferred ${type}: ${name}`, - commandTransferFailed: ({ type, name }) => `Transfer of ${type}: ${name} to Client has failed. Please check your Console.`, - commandTransferDescription: 'Transfers a core piece to its respective folder', - commandReload: ({ type, name, time }) => `${GREENTICK} Reloaded ${type}: ${name}. (Took: ${time})`, - commandReloadFailed: ({ type, name }) => `${REDCROSS} Failed to reload ${type}: ${name}. Please check your Console.`, - commandReloadAll: ({ type, time }) => `${GREENTICK} Reloaded all ${type}. (Took: ${time})`, - commandReloadEverything: ({ time }) => `${GREENTICK} Reloaded everything. (Took: ${time})`, - commandReloadDescription: 'Reloads a klasa piece, or all pieces of a klasa store.', - commandReboot: `${LOADING} Rebooting...`, - commandRebootDescription: 'Reboots the bot.', - commandPing: `${LOADING} Ping?`, - commandPingDescription: 'Runs a connection test to Discord.', - commandPingPong: ({ diff, ping }) => `Pong! (Roundtrip took: ${diff}ms. Heartbeat: ${ping}ms.)`, - commandInfoDescription: 'Provides some information about this bot.', - commandHelpDescription: 'Display help for a command.', - commandHelpNoExtended: 'No extended help available.', - commandHelpDm: '📥 | The list of commands you have access to has been sent to your DMs.', - commandHelpNodm: `${REDCROSS} | You have DMs disabled so I couldn't send you the list of commands.`, - commandHelpAllFlag: ({ prefix }) => - `Displaying one category per page. Have issues with the embed? Run \`${prefix}help --all\` for a full list in DMs.`, - commandHelpCommandCount: ({ count }) => `${count} command`, - commandHelpCommandCountPlural: ({ count }) => `${count} commands`, - commandEnable: ({ type, name }) => `+ Successfully enabled ${type}: ${name}`, - commandEnableDescription: 'Re-enables or temporarily enables a command/inhibitor/monitor/finalizer. Default state restored on reboot.', - commandDisable: ({ type, name }) => `+ Successfully disabled ${type}: ${name}`, - commandDisableDescription: - 'Re-disables or temporarily disables a command/inhibitor/monitor/finalizer/event. Default state restored on reboot.', - commandDisableWarn: "You probably don't want to disable that, since you wouldn't be able to run any command to enable it again", - commandConfNoKey: 'You must provide a key', - commandConfNoValue: 'You must provide a value', - commandConfGuarded: ({ name }) => `${toTitleCase(name)} may not be disabled.`, - commandConfUpdated: ({ key, response }) => `Successfully updated the key **${key}**: \`${response}\``, - commandConfKeyNotArray: "This key is not array type. Use the action 'reset' instead.", - commandConfGetNoExt: ({ key }) => `The key **${key}** does not seem to exist.`, - commandConfGet: ({ key, value }) => `The value for the key **${key}** is: \`${value}\``, - commandConfReset: ({ key, value }) => `The key **${key}** has been reset to: \`${value}\``, - commandConfNochange: ({ key }) => `The value for **${key}** was already that value.`, - commandConfServerDescription: 'Define per-server settings.', - commandConfServer: ({ key, list }) => `**Server Setting ${key}**\n${list}`, - commandConfUserDescription: 'Define per-user settings.', - commandConfDashboardOnlyKey: ({ key }) => `\`${key}\` can only be configured through the web dashboard ()`, - commandConfUser: ({ key, list }) => `**User Setting ${key}**\n${list}`, - commandConfSettingNotSet: 'Not Set', - messagePromptTimeout: 'The prompt has timed out.', - textPromptAbortOptions: ['abort', 'stop', 'cancel'], - commandLoad: ({ time, type, name }) => `${GREENTICK} Successfully loaded ${type}: ${name}. (Took: ${time})`, - commandLoadFail: 'The file does not exist, or an error occurred while loading your file. Please check your console.', - commandLoadError: ({ type, name, error }) => `${REDCROSS} Failed to load ${type}: ${name}. Reason:${codeBlock('js', error)}`, - commandLoadDescription: 'Load a piece from your bot.', - - /** - * ################################ - * # COMMAND DESCRIPTIONS # - * ################################ - */ - - argumentRangeInvalid: ({ name }) => `${name} must be a number or a range of numbers.`, - argumentRangeMax: ({ name, maximum }) => `${name} accepts a range of maximum ${maximum} 'number'`, - argumentRangeMaxPlural: ({ name, maximum }) => `${name} accepts a range of maximum ${maximum} 'numbers'`, - - commandAddDescription: 'Adds a song the the queue.', - commandAddExtended: { - extendedHelp: [ - `Add songs to the playing queue and prepare for musical enjoyment! - I can play music from YouTube, Bandcamp, SoundCloud, Twitch, or Vimeo.`, - '- To play from YouTube either give me something to search for, a video link, or a playlist link.', - '- To play from SoundCloud give me a SoundCloud link, or if you want me to search include either `--sc` or `--soundcloud` in your message.', - '- To play from Bandcamp, Twitch, or Vimeo just give me a URL to a video or playlist on those sources.', - '- To play a previously exported queue, include `--import` and attach the queue file to your message or give me a URL to it.' - ], - explainedUsage: [['song', 'The song to queue. Can be either a URL or a video/song title.']], - examples: [ - 'The Pokémon Theme song', - 'https://youtu.be/fJ9rUzIMcZQ', - '--sc Imagine Dragons Believer', - 'https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix', - 'https://vimeo.com/channels/music/239029778', - 'https://thedisappointed.bandcamp.com/album/escapism-2', - 'https://cdn.discordapp.com/attachments/642137151626018818/746716958627725402/Skyra_Development_Suite-1598101595077.squeue', - '--import https://cdn.skyra.pw/favsongs.squeue' - ], - multiline: true - }, - commandAddPlaylist: ({ songs }) => `${GREENTICK} Added ${songs} to the queue 🎶`, - commandAddPlaylistSongs: ({ count }) => `**${count}** song`, - commandAddPlaylistSongsPlural: ({ count }) => `**${count}** songs`, - commandAddSong: ({ title }) => `${GREENTICK} Added **${title}** to the queue 🎶`, - commandClearDescription: 'Clears the queue list.', - commandClearDenied: `${REDCROSS} You can't execute this command when there are over 4 members! You must be a dee-jay or a moderator!`, - commandClearSuccess: ({ count }) => `${REDCROSS} Pruned ${count} song.`, - commandClearSuccessPlural: ({ count }) => `${REDCROSS} Pruned ${count} songs.`, - commandExportQueueDescription: 'Exports your queue to a `.squeue` file.', - commandExportQueueExtended: { - extendedHelp: [ - "Have a queue you liked and want to replay later? Or maybe you want to send your friends what you're listening right now", - "Use `exportqueue` and I'll pack the music in your queue into a neat file you can either save or share with your friends!", - 'When you want to play it back, just use it with `play`, `add` or `importqueue`!' - ], - reminder: 'If your queue is longer than 100 words, I will only include the first 100, to prevent abuse of my systems', - multiline: true - }, - commandExportQueueSuccess: ({ guildName }) => `${GREENTICK} Here's the current queue for ${guildName}!`, - commandImportQueueDescription: 'Imports a queue saved as a `.squeue` file.', - commandImportQueueExtended: { - extendedHelp: [ - 'Did a friend send you a queue? Or maybe you want to play a queue you saved earlier?', - 'With `importqueue`, I can load the queue for you, and then you can jam to your favorite tracks!' - ], - reminder: 'You can either give me a link to the `.squeue` file, or attach it to your message!', - multiline: true - }, - commandJoinDescription: "Joins the message author's voice channel.", - commandJoinNoMember: `${REDCROSS} I'm sorry, but Discord did not give me the information I need, so I don't know which voice channel you're connected to...`, - commandJoinNoVoicechannel: `${REDCROSS} You are not connected in a voice channel.`, - commandJoinSuccess: ({ channel }) => `${GREENTICK} Successfully joined the voice channel ${channel}`, - commandJoinVoiceDifferent: `${REDCROSS} I think you confused the channels! Earth to Moon, we are in another voice channel!`, - commandJoinVoiceFull: `${REDCROSS} I cannot join your voice channel, it's full... kick somebody or make room for me!`, - commandJoinVoiceNoConnect: `${REDCROSS} I do not have enough permissions to connect to your voice channel. I am missing the **${this.PERMISSIONS.CONNECT}** permission.`, - commandJoinVoiceNoSpeak: `${REDCROSS} I can connect... but not speak. Please turn on this permission so I can emit music.`, - commandJoinVoiceSame: `${REDCROSS} Turn on your volume! I am playing music there!`, - commandJoinFailed: `${REDCROSS} I could not join your voice channel because there is something wrong with my music player. Please join the support server by using \`@Skyra support\` and alert my developers.`, - commandLeaveDescription: 'Leaves the voice channel.', - commandLeaveExtended: { - extendedHelp: [ - `Use this command to make me leave the current voice channel.`, - `By default I will leave the channel, forget about the currently playing song, but leave the queue intact.`, - 'This means that if you use `Skyra, play` after the leave command, I will continue playing with the first song that was on the queue before I left.', - '', - `This default behavior can be modified with flags:`, - '`--removeall` or `--ra` to follow the default behavior as well clear the queue, next time you want me to start playing you will have build a new queue' - ], - examples: ['leave', 'leave --removeall', 'leave --ra', 'leave --soft'], - multiline: true - }, - commandLeaveSuccess: ({ channel }) => `${GREENTICK} Successfully left the voice channel ${channel}`, - commandPauseDescription: 'Pauses the current song.', - commandPauseSuccess: `${GREENTICK} Paused`, - commandPlayDescription: 'Let me be your DJ and play you some tunes!', - commandPlayExtended: { - extendedHelp: [ - `Queue some music and allow me to start jamming out to your enjoyment. - When using this command I will automatically join your voice channel and start playing the first song in my queue. - I can play from YouTube, Bandcamp, SoundCloud, Twitch, Vimeo, Mixer, or a queue someone else exported earlier`, - '- To play from YouTube either give me something to search, a video link, or a playlist link.', - '- To play from SoundCloud give me a SoundCloud link, or if you want me to search include either `--sc` or `--soundcloud` in your message.', - "- To play from Mixer give me the URL of a Mixer streamer, I'm sorry but I cannot (yet) play Mixer VOD's.", - '- To play from Bandcamp, Twitch, or Vimeo just give me a URL to a video or playlist on those sources.', - '- To play from a previously-exported queue, include `--import` and attach it to your message or give me a URL to it' - ], - explainedUsage: [['song', 'The song to play. Can be either a URL or a video/song title.']], - examples: [ - 'The Pokémon Theme song', - 'https://youtu.be/fJ9rUzIMcZQ', - '--sc Imagine Dragons Believer', - 'https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix', - 'https://vimeo.com/channels/music/239029778', - 'https://mixer.com/Ninja', - 'https://thedisappointed.bandcamp.com/album/escapism-2', - '--import https://cdn.skyra.pw/favsongs.squeue' - ], - reminder: 'Before you can use this command you should join a voice channel!', - multiline: true - }, - commandPlayEnd: 'It looks like the queue ended here. I hope you enjoyed the session!', - commandPlayNext: ({ title, requester }) => `🎧 Playing: **${title}** as requested by: **${requester}**`, - commandPlayQueuePaused: ({ song }) => `There was a track going on! Playing it back! Now playing: ${song}!`, - commandPlayQueuePlaying: `${REDCROSS} Hey! The disk is already spinning!`, - commandPlayQueueEmpty: - 'The session is over, add some songs to the queue, you can for example do `Skyra, add Imperial March`, and... *dumbrolls*!', - commandPlayingDescription: 'Get information from the current song.', - commandPlayingDuration: ({ duration }) => `**Duration**: ${duration}`, - commandPlayingQueueEmpty: `${REDCROSS} Are you speaking to me? Because my deck is empty...`, - commandPlayingQueueNotPlaying: `${REDCROSS} I think you're listening to background noise, I'm not playing anything.`, - commandRepeatDescription: 'Toggle repeating the current song.', - commandRepeatSuccessEnabled: "This is your JAM isn't it? Don't you worry, we will repeat this on and on and on!", - commandRepeatSuccessDisabled: "I was actually getting tired of this too, but I didn't want to say anything.", - commandQueueDescription: 'Check the queue list.', - commandQueueLast: 'There are no more songs! After the one playing is over, the session will end!', - commandQueueTitle: ({ guildname }) => `Music queue for ${guildname}`, - commandQueueLine: ({ position, duration, title, url, requester }) => - `**[\`${position}\`]** │ \`${duration}\` │ [${title}](${url}) │ Requester: **${requester}**.`, - commandQueueNowplaying: ({ title, url, requester }) => `[${title}](${url})\nRequester: **${requester}**`, - commandQueueNowplayingLiveStream: 'Live Stream', - commandQueueNowplayingTimeRemaining: ({ timeRemaining }) => `🕰 Time remaining: ${timeRemaining}.`, - commandQueueNowplayingTitle: 'Now Playing:', - commandQueueTotalTitle: 'Total songs:', - commandQueueTotal: ({ songs, remainingTime }) => `${songs} in the queue, with a total duration of ${remainingTime}`, - commandQueueEmpty: "looks like nothing is playing right now and the queue is empty, why don't you start the disc?", - commandQueueDashboardInfo: ({ guild }) => - `Did you know that you can also manage your music using a fancy webapp? [Click here to go there](https://skyra.pw/music/${guild.id})`, - commandRemoveDescription: 'Remove a song from the queue list.', - commandRemoveIndexInvalid: `I'm good with maths, unlike my sister, but I need you to give me a number equal or bigger than 1.`, - commandRemoveIndexOutOfBounds: ({ songs }) => `maybe time happened too fast for you, there are ${songs} in the queue!`, - commandRemoveDenied: `${REDCROSS} Let's play it nicely, don't remove other's songs if you're not a moderator nor a deejay.`, - commandRemoveSuccess: ({ title, requester }) => `${GREENTICK} Removed the song **${title}** requested by <@${requester}>.`, - commandSeekDescription: 'Change the player time for the current song.', - commandSeekSuccess: ({ time }) => `${GREENTICK} Successfully changed the time! Now at ${this.duration(time)}!`, - commandResumeDescription: 'Resumes the current song.', - commandResumeSuccess: '▶ Resumed.', - commandRolesetDescription: 'Manage unique role sets.', - commandRolesetExtended: { - extendedHelp: [ - 'A role set is a group of roles Skyra identifies as unique for all members in the server, i.e. a roleset named "region" could have the roles `Africa`, `America`, `Asia`, and `Europe`, and members will only be able to have one of them. This is like a kind of "rule" that is applied in the three following situations:', - '', - '- When somebody claims a role via the `Skyra, roles`.', - '- When somebody claims a role via reaction roles.', - '- When somebody receives a role either manually or from another bot.' - ], - explainedUsage: [ - ['add', 'Create a new roleset or add a role to an existing one.'], - ['remove', 'Remove a role from an existing roleset.'], - ['reset', 'Removes all roles from a roleset or, if not specified, all existing rolesets.'], - ['list', 'Lists all rolesets.'], - ['auto', 'Adds or removes a roleset.'] - ], - examples: [ - 'add regions America', - 'add regions Africa America Asia Europe', - 'remove regions America', - 'reset', - 'reset regions', - 'list', - 'regions America', - 'regions Africa America Asia Europe' - ], - reminder: 'This command can add and/or remove multiple roles at the same time.', - multiline: true - }, - commandRolesetCreated: ({ name, roles }) => `The ${name} unique role set has been created with the following roles: ${roles}`, - commandRolesetAdded: ({ name, roles }) => `The ${name} unique role set now has the following roles as well: ${roles}.`, - commandRolesetInvalidName: ({ name }) => `You can not remove the ${name} unique role set because it does not exist.`, - commandRolesetRemoved: ({ name, roles }) => `The ${name} unique role set will no longer include the following roles: ${roles}`, - commandRolesetResetEmpty: `${REDCROSS} There are no rolesets configured in this groupo.`, - commandRolesetResetAll: `${GREENTICK} Successfully removed all rolesets.`, - commandRolesetResetNotExists: ({ name }) => `${REDCROSS} The roleset \`${name}\` does not exist in this server.`, - commandRolesetResetGroup: ({ name }) => `${GREENTICK} Successfully removed the roleset \`${name}\` from this server.`, - commandRolesetUpdated: ({ name }) => `The ${name} unique role set has been updated.`, - commandRolesetNoRolesets: 'You have no rolesets.', - commandShuffleDescription: 'Randomize the order of the songs in the queue.', - commandShuffleSuccess: ({ amount }) => `${GREENTICK} Successfully randomized ${amount} songs.`, - commandSkipDescription: 'Skip the current song.', - commandSkipPermissions: `${REDCROSS} You can't execute this command, you must be a DJ or a Moderator.`, - commandSkipVotesVoted: `${REDCROSS} You have already voted.`, - commandSkipVotesTotal: ({ amount, needed }) => `🔸 | Votes: ${amount} of ${needed}`, - commandSkipSuccess: ({ title }) => `⏭ Skipped **${title}**.`, - commandPlayingTimeDescription: 'Check how much time is left for the song to end.', - commandPlayingTimeQueueEmpty: 'Are you speaking to me? Because my deck is empty...', - commandPromoteDescription: 'Promote a song to the front of the queue', - commandPromoteExtended: { - explainedUsage: [['number', 'The index in the queue to promote to the front. Use `Skyra, queue` to find the index of a song']], - examples: ['5'], - reminder: 'This command requires that you are a DJ or a Moderator to use it' - }, - commandPromoteSuccess: ({ title, url }) => `${GREENTICK} Successfully promoted **${title}** (<${url}>) to the top of the queue`, - commandVolumeDescription: 'Manage the volume for current song.', - commandVolumeSuccess: ({ volume }) => `📢 Volume: ${volume}%`, - commandVolumeChanged: ({ emoji, volume }) => `${emoji} Volume set to: ${volume}%`, - commandVolumeChangedExtreme: ({ emoji, text, volume }) => `${emoji} ${text} set to: ${volume}%`, - commandVolumeChangedTexts: ['**EXTREME VOLUME**', '**AIRPLANE NACELLE-LIKE VOLUME**', '**FALCON HEAVY LAUNCH-LIKE VOLUME**'], - - inhibitorMusicQueueEmpty: `${REDCROSS} The queue\'s empty! The session will start as soon as we have some songs queued.`, - inhibitorMusicNotPlaying: `${REDCROSS} Hmm, doesn't look like I'm playing anything right now.`, - inhibitorMusicPaused: `${REDCROSS} The queue's playing and the session is still up 'till the night ends!`, - inhibitorMusicDjMember: `${REDCROSS} I believe this is something only a moderator or a deejay of this session is supposed to do!`, - inhibitorMusicUserVoiceChannel: `${REDCROSS} Hey, I need you to join a voice channel before I can run this command!`, - inhibitorMusicBotVoiceChannel: `${REDCROSS} I am afraid I need to be in a voice channel to operate this command, please show me the way!`, - inhibitorMusicBothVoiceChannel: `${REDCROSS} Hey! It looks like you\'re not in the same voice channel as me! Please come join me!`, - inhibitorMusicNothingPlaying: `${REDCROSS} Looks like nothing is playing right now, how about you start the party 🎉?`, - - musicManagerFetchNoArguments: 'I need you to give me the name of a song!', - musicManagerFetchNoMatches: "I'm sorry but I wasn't able to find the track!", - musicManagerFetchLoadFailed: "I'm sorry but I couldn't load this song! Maybe try other song!", - musicManagerImportQueueError: `${REDCROSS} Sorry, but I'm having issues trying to import that playlist. Are you sure it's from my own DJ deck?`, - musicManagerImportQueueNotFound: `${REDCROSS} I need a queue to import!`, - musicManagerTooManySongs: `${REDCROSS} Woah there, you are adding more songs than allowed!`, - musicManagerSetvolumeSilent: 'Woah, you can just leave the voice channel if you want silence!', - musicManagerSetvolumeLoud: "I'll be honest, an airplane's nacelle would be less noisy than this!", - musicManagerPlayNoSongs: 'There are no songs left in the queue!', - musicManagerPlayPlaying: "The deck's spinning, can't you hear it?", - musicManagerStuck: ({ milliseconds }) => `${LOADING} Hold on, I got a little problem, I'll be back in: ${this.duration(milliseconds)}!`, - - commandConfMenuNopermissions: `I need the ${this.PERMISSIONS.ADD_REACTIONS} and ${this.PERMISSIONS.MANAGE_MESSAGES} permissions to be able to run the menu.`, - commandConfMenuRenderAtFolder: ({ path }) => `Currently at: 📁 ${path}`, - commandConfMenuRenderAtPiece: ({ path }) => `Currently at: ⚙️ ${path}`, - commandConfMenuRenderNokeys: 'There are no configurable keys for this folder', - commandConfMenuRenderSelect: "Please type in any of the following entries' names", - commandConfMenuRenderTctitle: 'Text Commands:', - commandConfMenuRenderUpdate: '• Update Value → `set `', - commandConfMenuRenderRemove: '• Remove Value → `remove `', - commandConfMenuRenderReset: '• Reset Value → `reset`', - commandConfMenuRenderUndo: '• Undo Update → `undo`', - commandConfMenuRenderCvalue: ({ value }) => `Current Value: **\`\`${value}\`\`**`, - commandConfMenuRenderBack: 'Press ◀ to go back', - commandConfMenuInvalidKey: 'Invalid Key, please try again with any of the following options.', - commandConfMenuInvalidAction: 'Invalid Action, please try again with any of the following options.', - commandConfMenuSaved: 'Successfully saved all changes.', - - settingsPrefix: - 'A prefix is an affix that is added in front of the word, in this case, the message. It allows bots to distinguish between a regular message and a command.', - settingsLanguage: 'The language I will use for your server. It may not be available in the language you want.', - settingsDisablenaturalprefix: 'Whether or not I should listen for my natural prefix, `Skyra,`', - settingsDisabledcommands: - 'The disabled commands, core commands may not be disabled, and moderators will override this. All commands must be in lower case.', - settingsChannelsAnnouncements: - 'The channel for announcements. This (alongside the `roles.subscriber` key) is required for the announce command.', - settingsChannelsFarewell: - 'The channel I will use to send farewells, you must enable the events and set up the messages, in other categories.', - settingsChannelsGreeting: - 'The channel I will use to send greetings, you must enable the events and set up the messages, in other categories.', - settingsChannelsImageLogs: 'The channel I will use to re-upload all images I see.', - settingsChannelsMemberLogs: - 'The channel for member logs, you must enable the events (`events.memberAdd` for new members, `events.memberRemove` for members who left).', - settingsChannelsMessageLogs: - 'The channel for (non-NSFW) message logs, you must enable the events (`events.messageDelete` for deleted messages, `events.messageEdit` for edited messages).', - settingsChannelsModerationLogs: - 'The channel for moderation logs, once enabled, I will post all my moderation cases there. If `events.banRemove` and/or `events.banRemove` are enabled, I will automatically post anonymous logs.', - settingsChannelsNsfwMessageLogs: - 'The channel for NSFW message logs, same requirement as normal message logs, but will only send NSFW messages.', - settingsChannelsPruneLogs: 'The channel for prune logs, same requirement as normal mesasge logs, but will only send prune messages.', - settingsChannelsReactionLogs: - "The channel for the reaction logs, same requirement as normal message logs, but will only send message reactions. If you don't want twemojis to be logged you can toggle `events.twemoji-reactions`.", - settingsChannelsRoles: 'The channel for the reaction roles.', - settingsChannelsSpam: 'The channel for me to redirect users to when they use commands I consider spammy.', - settingsChannelsIgnoreMessageDelete: 'Channels I should ignore when checking for deleted messages to log.', - settingsChannelsIgnoreMessageEdit: 'Channels I should ignore when checking for edited messags to log.', - settingsChannelsIgnoreReactionAdd: 'Channels I should ignore when checking for added reactions.', - settingsChannelsIgnoreAll: 'Channels I should ignore for all types of logging.', - settingsDisabledchannels: - 'A list of channels for disabled commands, for example, setting up a channel called general will forbid all users from using my commands there. Moderators+ override this purposely to allow them to moderate without switching channels.', - settingsEventsBanadd: 'This event posts anonymous moderation logs when a user gets banned. You must set up `channels.moderation-logs`.', - settingsEventsBanremove: 'This event posts anonymous moderation logs when a user gets unbanned. You must set up `channels.moderation-logs`.', - settingsEventsMemberadd: 'This event posts member logs when a user joins. They will be posted in `channels.member-logs`.', - settingsEventsMemberNickNameUpdate: 'Whether member nickname updates should be logged or not.', - settingsEventsMemberUserNameUpdate: 'Whether member username updates should be logged or not.', - settingsEventsMemberroleupdate: 'Whether memner role changes should be logged or not.', - settingsEventsMemberremove: 'This event posts member logs when a user leaves. They will be posted in `channels.member-logs`.', - settingsEventsMessagedelete: - 'This event posts message logs when a message is deleted. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).', - settingsEventsMessageedit: - 'This event posts message logs when a message is edited. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).', - settingsEventsTwemojiReactions: 'Whether or not twemoji reactions are posted in the reaction logs channel.', - settingsMessagesFarewell: 'The message I shall send to when a user leaves. You must set up `channels.farewell` and `events.memberRemove`', - settingsMessagesGreeting: 'The message I shall send to when a user joins. You must set up `channels.greeting` and `events.memberAdd`', - settingsMessagesIgnorechannels: 'The channels configured to not increase the point counter for users.', - settingsMessagesJoinDm: 'The message I shall send to when a user joins in DMs.', - settingsMessagesModerationAutoDelete: 'Whether or not moderation commands should be auto-deleted or not.', - settingsMessagesModerationDm: 'Whether or not I should send a direct message to the target user on moderation actions.', - settingsMessagesModerationMessageDisplay: 'Whether or not a response should be sent for moderation commands.', - settingsMessagesModerationReasonDisplay: 'Whether the reason will be displayed in moderation commands.', - settingsMessagesModeratorNameDisplay: - 'Whether or not I should display the name of the moderator who took the action whne sending the target user a moderation message. Requires `messages.moderation-dm` to be enabled.', - settingsMessagesWarnings: 'Whether or not I should send warnings to the user when they receive one.', - settingsMessagesAnnouncementEmbed: 'Whether to send announcements in embeds or not', - settingsMusicAllowStreams: 'Whether livestreams should be allowed to be played.', - settingsMusicDefaultVolume: 'The default music volume to start playing at for this server.', - settingsMusicMaximumDuration: 'The maximum length any playable single track can have.', - settingsMusicMaximumEntriesPerUser: 'The maximum amount of entries one user can have in the queue.', - settingsNoMentionSpamAlerts: 'Whether or not users should be alerted when they are about to get the ban hammer.', - settingsNoMentionSpamEnabled: 'Whether or not I should have the ban hammer ready for mention spammers.', - settingsNoMentionSpamMentionsallowed: - 'The minimum amount of "points" a user must accumulate before landing the hammer. A user mention will count as 1 point, a role mention as 2 points, and an everyone/here mention as 5 points.', - settingsNoMentionSpamTimeperiod: - 'The amount of time in seconds in which the mention bucket should refresh. For example, if this is set to `8` and you mentioned two users 7 seconds apart, the bucket would run from start with the accumulated amount of points.', - settingsRolesAdmin: `The administrator roles. Administrators have access to all moderation and management commands. Defaults to anyone with the ${this.PERMISSIONS.MANAGE_GUILD} permission.`, - settingsRolesDj: "The DJ roles for this server. DJs have more advanced control over Skyra's music commands.", - settingsRolesInitial: 'The initial role, if configured, I will give it to users as soon as they join.', - settingsRolesModerator: - 'The moderator roles. Moderators have access to almost all moderation commands. Defaults to anyone who can ban members.', - settingsRolesMuted: 'The muted role, if configured, I will give new muted users this role. Otherwise I will prompt you the creation of one.', - settingsRolesPublic: 'The public roles. These can be claimed by any user using the `roles` command.', - settingsRolesRemoveinitial: 'Whether claiming a public role should remove the initial role at the same time.', - settingsRolesRestrictedAttachment: 'The role that is used for the restrictAttachment moderation command', - settingsRolesRestrictedEmbed: 'The role that is used for the restrictEmbed moderation command.', - settingsRolesRestrictedEmoji: 'The role that is used for the restrictEmoji moderation command.', - settingsRolesRestrictedReaction: 'The role that is used for the restrictReaction moderation command.', - settingsRolesRestrictedVoice: 'The role that is used for the restrictVoice moderation command.', - settingsRolesSubscriber: - "The subscriber role. This role will be mentioned every time you use the `announce` command. I will always keep it non-mentionable so people don't mention it abusively.", - settingsSelfmodAttachmentsEnabled: 'Whether or not the attachment filter is enabled.', - settingsSelfmodAttachmentsIgnoredChannels: 'The channels that will be ignored by the attachments filter sub-system', - settingsSelfmodAttachmentsIgnoredRoles: 'The roles that will be ignored by the attachments afilters sub-system', - settingsSelfmodCapitalsEnabled: 'Whether the capitals filter selfmod sub-system is enabled or not.', - settingsSelfmodCapitalsIgnoredchannels: 'The channels that will be ignored by the capitals filter sub-system', - settingsSelfmodCapitalsIgnoredroles: 'The roles that will be ignored by the capitals afilters sub-system', - settingsSelfmodCapitalsMaximum: - 'The maximum amount of characters the messages must have before trying to delete it. You must enable it with the `capitalsMode` command.', - settingsSelfmodCapitalsMinimum: - 'The minimum amount of characters the message must have before trying to delete it. You must enable it with the `capitalsMode` command.', - settingsSelfmodFilterEnabled: 'Whether the word filter selfmod sub-system is enabled or not.', - settingsSelfmodFilterIgnoredchannels: 'The channels that will be ignored by the filters sub-system', - settingsSelfmodFilterIgnoredroles: 'The roles that will be ignored by the filters sub-system', - settingsSelfmodIgnorechannels: - 'The channels I will ignore, be careful any channel configured will have all auto-moderation systems (CapsFilter, InviteLinks, and NoMentionSpam) deactivated.', - settingsSelfmodInvitesEnabled: 'Whether the invites filter selfmod sub-system is enabled or not.', - settingsSelfmodInvitesIgnoredchannels: 'The channels that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredroles: 'The roles that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredcodes: 'The Discord invite codes that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredguilds: 'The Discord servers that will be ignored by the invites sub-system', - settingsSelfmodLinksEnabled: 'Whether the links filter selfmod sub-system is enabled or not.', - settingsSelfmodLinksIgnoredchannels: 'The channels that will be ignored by the links filter sub-system', - settingsSelfmodLinksIgnoredroles: 'The roles that will be ignored by the links filters sub-system', - settingsSelfmodLinksWhitelist: 'The whitelisted links that are allowed', - settingsSelfmodMessagesEnabled: 'Whether Skyra should attempt to remove duplicated messages or not.', - settingsSelfmodMessagesIgnoredchannels: 'The channels that will be ignored by the duplicate messages sub-system', - settingsSelfmodMessagesIgnoredroles: 'The roles that will be ignored by the duplicate messages sub-system', - settingsSelfmodMessagesMaximum: - 'The amount of duplicated messages required in the queue before taking action The queue size is configurable in `selfmod.messages.queue-size`.', - settingsSelfmodMessagesQueueSize: 'The amount of messages Skyra will keep track of for the message duplication detection.', - settingsSelfmodNewlinesEnabled: 'Whether the new lines filter selfmod sub-system is enabled or not.', - settingsSelfmodNewlinesIgnoredchannels: 'The channels that will be ignored by the new lines sub-system', - settingsSelfmodNewlinesIgnoredroles: 'The roles that will be ignored by the new lines sub-system', - settingsSelfmodNewlinesMaximum: 'The maximum amount of new lines before Skyra will start applying penalties', - settingsSelfmodReactionsMaximum: 'The maximum amount of reactions before I will start applying penalties', - settingsSelfmodReactionsBlacklist: 'The reactions that are blacklisted', - settingsSelfmodReactionsEnabled: 'Whether the reactions filter selfmod sub-system is enabled or not.', - settingsSelfmodReactionsIgnoredchannels: 'The channels that will be ignored by the reactions sub-system', - settingsSelfmodReactionsIgnoredroles: 'The roles that will be ignored by the reactons sub-system', - settingsSelfmodReactionsWhitelist: 'The reactions that are whitelisted', - settingsSocialEnabled: 'Whether the social module should be enabled or not', - settingsSocialMultiplier: 'The multiplier to apply to the gain of points for users', - settingsSocialAchieve: 'Whether or not I should congratulate people who get a new leveled role.', - settingsSocialAchievemessage: - 'The congratulation message for people when they get a new leveled role. Requires `social.achieve` to be enabled.', - settingsSocialIgnorechannels: 'The channels I should ignore when adding points.', - settingsStarboardChannel: - 'The starboard channel. If you star a message, it will be posted there. Using the `setStarboardEmoji` command allows the emoji customization.', - settingsStarboardIgnorechannels: 'The channels I should ignore when listening for new stars.', - settingsStarboardMinimum: 'The minimum amount of stars required before a message is posted to the starboard channel.', - settingsStarboardSelfstar: "Whether the author's reaction should be included in the total star count", - settingsSuggestionsChannel: 'The channel where suggestions will be sent.', - settingsSuggestionsEmojisUpvote: 'The upvote emoji Skyra reacts with on every suggestion.', - settingsSuggestionsEmojisDownvote: 'The downvote emoji Skyra reacts with on every suggestion.', - settingsSuggestionsOnActionDm: "If this setting is enabled, Skyra will DM the suggestion's author every time it is updated.", - settingsSuggestionsOnActionRepost: - "If this setting is enabled, Skyra will repost the suggestion's message every time it is updated. If it is disabled, it will edit the original message.", - settingsSuggestionsOnActionHideAuthor: - "This setting allows you to update suggestions anonymously. It will substitute the updater's name with either `An administrator` or `A moderator`, according to their permission level.", - settingsDashboardOnlyKey: 'This key can only be configured through [the web dashboard](https://skyra.pw)', - - /** - * ################ - * ANIMALS COMMANDS - */ - - commandCatfactDescription: 'Let me tell you a mysterious cat fact.', - commandCatfactExtended: { - extendedHelp: `Do **you** know cats are very curious, right? They certainly have a lot of fun and weird facts. - This command queries catfact.ninja and retrieves a fact so you can read it.` - }, - commandDogDescription: 'Cute doggos! ❤', - commandDogExtended: { - extendedHelp: [ - 'Do **you** know how cute dogs are? They are so beautiful!', - 'This command uses [dog.ceo](https://dog.ceo) to show pictures of the cuttest doggos!' - ] - }, - commandFoxDescription: 'Let me show you an image of a fox!', - commandFoxExtended: { - extendedHelp: 'This command gives a random image from [randomfox.ca](https://randomfox.ca/)' - }, - commandKittyDescription: 'KITTENS!', - commandKittyExtended: { - extendedHelp: [ - 'Do **you** know how cute are kittens? They are so beautiful!', - 'This command uses [cataas.com](https://cataas.com/) to show pictures of the cuttest cats!' - ] - }, - commandShibeDescription: 'Cute shibas!', - commandShibeExtended: { - extendedHelp: "Everyone loves shibas, I shall love them aswell! They're so adorable ❤." - }, - - /** - * ############## - * ANIME COMMANDS - */ - - commandAnimeDescription: 'Search your favourite anime by title with this command.', - commandAnimeExtended: { - extendedHelp: 'This command queries Kitsu.io to show data for the anime you request.', - explainedUsage: [['query', "The anime's name you are looking for."]], - examples: ['One Piece'] - }, - commandMangaDescription: 'Search your favourite manga by title with this command.', - commandMangaExtended: { - extendedHelp: 'This command queries Kitsu.io to show data for the manga you request.', - explainedUsage: [['query', "The manga's name you are looking for."]], - examples: ['Stone Ocean', 'One Piece'] - }, - commandWaifuDescription: 'Posts a randomly generated waifu image.', - commandWaifuExtended: { - extendedHelp: 'This commands posts a random waifu generated by ' - }, - - /** - * ##################### - * ANNOUNCEMENT COMMANDS - */ - - commandAnnouncementDescription: 'Send new announcements, mentioning the announcement role.', - commandAnnouncementExtended: { - extendedHelp: [ - 'This command requires an announcement channel (**channels.announcement** in the configuration command) which tells Skyra where she should post the announcement messages.', - '', - 'Question is, is this command needed? Well, nothing stops you from making your announcements by yourself, however, there are many people who hate being mentioned by at everyone/here.', - '', - 'To avoid this, Skyra gives you the option of creating a subscriber role, which is unmentionable (to avoid people spam mentioning the role), and once you run this command, Skyra will set the role to be mentionable, post the message, and back to unmentionable.', - '', - 'Furthermore, you can configure Skyra to send the announcement as a message embed by setting the **messages.announcement-embed** option in the configuration command. When sending the message as an an embed you can exclude the mentions of any users, @here or @everyone by providing the `--excludeMentions` flag to the announcement.' - ], - explainedUsage: [['announcement', 'The announcement text to post.']], - examples: ['I am glad to announce that we have a bot able to safely send announcements for our subscribers!'], - reminder: - 'If you want to edit the message you send in an announcement, just edit the message you used to have Skyra send that announcement. Skyra will then edit the message she sent previously. She can do this up to 15 minutes after the initial announcement, so be sure to not wait long!', - multiline: true - }, - commandSubscribeDescription: "Subscribe to this server's announcements.", - commandSubscribeExtended: { - extendedHelp: - "This command serves the purpose of **giving** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." - }, - commandUnsubscribeDescription: "Unsubscribe from this server's announcements.", - commandUnsubscribeExtended: { - extendedHelp: - "This command serves the purpose of **removing** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will **not longer** be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." - }, - - /** - * ############ - * FUN COMMANDS - */ - - command8ballDescription: 'Skyra will read the Holy Bible to find the correct answer for your question.', - command8ballExtended: { - extendedHelp: "This command provides you a random question based on your questions' type. Be careful, it may be too smart.", - explainedUsage: [['question', 'The Holy Question']], - examples: ['Why did the chicken cross the road?'] - }, - commandChoiceDescription: 'Eeny, meeny, miny, moe, catch a tiger by the toe...', - commandChoiceExtended: { - extendedHelp: - 'I have an existencial doubt... should I wash the dishes or throw them through the window? The search continues. List me items separated by comma and I will choose one them. On a side note, I am not responsible of what happens next.', - explainedUsage: [['words', 'A list of words separated by comma.']], - examples: ['Should Wash the dishes, Throw the dishes out the window', 'Cat, Dog'] - }, - commandChangemymindDescription: 'Skyra is the best, change my mind.', - commandChangemymindExtended: { - extendedHelp: "I still think I'm the best, change my mind. I make a photo with your avatar and some text in some paper.", - explainedUsage: [['text', 'The phrase you want.']], - examples: ['Skyra is the best bot in this server'] - }, - commandDiceDescription: 'Roll the dice using d20 syntax.', - commandDiceExtended: { - extendedHelp: - "The mechanics of this command are easy. You have a dice, then you roll it __x__ times, but the dice can also be configured to have __y__ sides. By default, this command rolls a dice with 6 sides once. However, you can change the amount of rolls for the dice, and this command will 'roll' (get a random number between 1 and the amount of sides). For example, rolling a dice with 6 sides 3 times will leave a random sequence of three random numbers between 1 and 6, for example: 3, 1, 6; And this command will return 10 as output.", - examples: ['370d24', '100d6', '6'] - }, - commandEscaperopeDescription: 'Use the escape rope from Pokemon.', - commandEscaperopeExtended: { - extendedHelp: '**Skyra** used **Escape Rope**.' - }, - commandHowToFlirtDescription: 'Captain America, you do not know how to flirt.', - commandHowToFlirtExtended: { - extendedHelp: - "Let me show you how to effectively flirt with somebody using the Tony Stark's style for Captain America, I can guarantee that you'll get him.", - explainedUsage: [['user', 'The user to flirt with.']], - examples: ['Skyra'] - }, - commandLoveDescription: 'Lovemeter, online!', - commandLoveExtended: { - extendedHelp: "Hey! Wanna check the lovemeter? I know it's a ridiculous machine, but many humans love it! Don't be shy and try it!", - explainedUsage: [['user', 'The user to rate.']], - examples: ['Skyra'] - }, - commandMarkovDescription: 'Generate a Markov Chain from the text channel.', - commandMarkovExtended: { - extendedHelp: - 'A Markov chain is a stocha... what? Okay, something something a probability theory made by a Russian mathematician, check Wikipedia for more information. **In short**: I will generate a random message given the content of the messages in the channel.' - }, - commandNorrisDescription: "Enjoy your day reading Chuck Norris' jokes.", - commandNorrisExtended: { - extendedHelp: - "Did you know that Chuck norris does **not** call the wrong number, but you **answer** the wrong phone? Woah, mindblow. He also threw a carton of milk and created the Milky Way. This command queries chucknorris.io and retrieves a fact (do not assume they're false, not in front of him) so you can read it" - }, - commandRateDescription: 'Let bots have opinions and rate somebody.', - commandRateExtended: { - extendedHelp: - "Just because I am a bot doesn't mean I cannot rate you properly. I can grade you with a random number generator to ease the process. Okay okay, it's not fair, but I mean... I can also give you a 💯.", - explainedUsage: [['user', 'The user to rate.']], - examples: ['Skyra', 'me'] - }, - commandXkcdDescription: 'Read comics from XKCD.', - commandXkcdExtended: { - extendedHelp: - "**xkcd** is an archive for nerd comics filled with math, science, sarcasm and languages. If you don't provide any argument, I will get a random comic from xkcd. If you provide a number, I will retrieve the comic with said number. But if you provide a title/text/topic, I will fetch a comic that matches with your input and display it. For example, `Skyra, xkcd Curiosity` will show the comic number 1091.", - explainedUsage: [['query', 'Either the number of the comic, or a title to search for.']], - examples: ['1091', 'Curiosity'] - }, - commandPunDescription: 'Shows you a random pun.', - commandPunExtended: { - extendedHelp: [ - 'A steak pun is a rare medium well done.', - 'Get your daily doses of dad jokes from icanhazdadjoke.com and laugh at witty wisecracks.' - ], - multiline: true - }, - commandWakandaDescription: "Helpful descriptions? We don't do that here", - commandWakandaExtended: { - extendedHelp: - "Creates an image macro using the [We Don't Do That Here Meme](https://knowyourmeme.com/memes/we-dont-do-that-here) using the given user." - }, - /** - * ################ - * GAME INTEGRATION COMMANDS - */ - - commandBrawlstarsDescription: "Get data on a player or club from Supercell's newest game, Brawl Stars.", - commandBrawlstarsExtended: { - extendedHelp: 'Use this command with --save to save your player/club tag.', - explainedUsage: [ - ['category', 'The category of data to get: **club** to get data on a club, or **player** to get data on a player (default).'], - ['query', 'The tag of the player or club, depending on which category you choose.'] - ], - examples: ['player #RJQLQ999', 'club #228JVRQC9'] - }, - commandBrawlstarsPlayerEmbedTitles: { - trophies: 'Trophies', - events: 'Events', - exp: 'Experience', - gamesModes: 'Game Modes', - other: 'Other' - }, - commandBrawlstarsPlayerEmbedFields: { - total: 'Total', - personalBest: 'Personal Best', - events: 'Events', - roboRumble: 'Best Robo Rumble Rank', - qualifiedForChamps: 'Qualified for Championship', - experienceLevel: 'Experience Level', - victories3v3: '3v3 Victories', - victoriesSolo: 'Solo Victories', - victoriesDuo: 'Duo Victories', - club: 'Club', - brawlersUnlocked: 'Brawlers Unlocked' - }, - commandBrawlstarsClubEmbedTitles: { - totalTrophies: 'Total Trophies', - averageTrophies: 'Average Trophies', - requiredTrophies: 'Required Trophies', - members: 'Members', - type: 'Type', - top5Members: 'Top 5 Members', - president: 'President' - }, - commandBrawlstarsClubEmbedFields: { - noPresident: 'No President' - }, - commandClashofclansDescription: 'Get data on a player or clan in the popular mobile game Clash of Clans', - commandClashofclansExtended: { - extendedHelp: 'The request for clans will try to return multiple possible responses.', - explainedUsage: [ - ['category', 'The category of data to get: **clan** to get data on a clan or **player** to get data on a player.'], - ['query', 'Either a clan name or player tag depending on the category you chose.'] - ], - examples: ['player #8GQPJG2CL', 'clan Hog Raiders Swe'] - }, - commandClashofclansPlayerEmbedTitles: { - xpLevel: 'XP level', - builderHallLevel: 'Builder Hall level', - townhallLevel: 'Town Hall level', - townhallWeaponLevel: 'Town Hall weapon level', - - trophies: 'Current trophies', - bestTrophies: 'Best trophies', - warStars: 'War stars', - - attackWins: 'Wins attacking', - defenseWins: 'Wins defending', - amountOfAchievements: 'Amount of achievements', - - versusTrophies: 'Current versus trophies', - bestVersusTrophies: 'Best versus trophies', - versusBattleWins: 'Versus battle wins', - - clanRole: 'Clan role', - clanName: 'Clan name', - leagueName: 'League name', - noTownhallWeaponLevel: 'Town Hall has no weapon level', - noRole: 'This player has no clan role', - noClan: 'This player is not in a clan', - noLeague: 'This user is not in any league' - }, - commandClashofclansClanEmbedTitles: { - clanLevel: 'Clan level', - clanPoints: 'Clan points', - clanVersusPoints: 'Clan versus points', - amountOfMembers: 'Amount of members', - description: 'Description', - locationName: 'Location name', - warFrequency: 'War frequency', - warWinStreak: 'War win streak', - warWins: 'Total war wins', - warTies: 'Total war ties', - warLosses: 'Total war losses', - warLogPublic: 'War log is public?', - unknown: 'Unknown', - warFrequencyDescr: { - moreThanOncePerWeek: 'More than once per week', - always: 'Always', - lessThanOncePerWeek: 'Less than once per week', - oncePerWeek: 'Once per week', - unknown: 'Unknown' - } - }, - commandBrawlStarsInvalidPlayerTag: ({ playertag }) => - `I am sorry, \`${playertag}\` is not a valid Clash of Clans player tag. Player tags have to start with a \`#\` followed by the ID.`, - commandBrawlStarsClansQueryFail: ({ clan }) => `I am sorry, but I was unable to get data on the clan \`${clan}\`.`, - commandBrawlStarsPlayersQueryFail: ({ playertag }) => - `I am sorry, but I was unable to get data on the player with player tag \`${playertag}\`.`, - commandClashofclansInvalidPlayerTag: ({ playertag }) => - `I am sorry, \`${playertag}\` is not a valid Clash of Clans player tag. Player tags have to start with a \`#\` followed by the ID.`, - commandClashOfClansClansQueryFail: ({ clan }) => `I am sorry, but I was unable to get data on the clan \`${clan}\`.`, - commandClashofclansPlayersQueryFail: ({ playertag }) => - `I am sorry, but I was unable to get data on the player with player tag \`${playertag}\`.`, - commandFFXIVDescription: 'Queries the Final Fantasy 14 API for game data', - commandFFXIVExtended: { - extendedHelp: [ - 'This command allows you to character and item data for FFXIV.', - 'For item a wildcard search is performed so if your term is in the middle of the name it can still match.' - ], - explainedUsage: [ - ['search type', '(optional, defaults to `character`) `character` or `item`'], - ['query', 'The player or thing to search.'] - ], - examples: ['character Laytlan Ardevon', 'Laytlan Ardevon', 'item potion'], - multiline: true - }, - commandFFXIVCharacterFields: { - serverAndDc: 'Server - Datacenter', - tribe: 'Tribe', - characterGender: 'Character gender', - nameday: 'Nameday', - guardian: 'Guardian', - cityState: 'City-State', - grandCompany: 'Grand Company', - rank: 'Rank', - none: 'None', - male: 'Male', - female: 'Female', - dowDomClasses: '***__Disciple of War and Magic classes__***:', - tank: 'Tank', - healer: 'Healer', - meleeDps: 'Melee DPS', - physicalRangedDps: 'Physical Ranged DPS', - magicalRangedDps: 'Magical Ranged DPS', - dohClasses: '***__Disciple of the Hand jobs__***:', - dolClasses: '***__Disciple of the Land jobs__***:' - }, - commandFFXIVItemFields: { - kind: 'Kind', - category: 'Category', - levelEquip: 'Level equippable', - none: 'None' - }, - commandFFXIVNoCharacterFound: `${REDCROSS} I am sorry, but I was unable to find a character with that name.`, - commandFFXIVInvalidServer: `${REDCROSS} I am sorry, but an invalid server name was passed.`, - commandFFXIVNoItemFound: `${REDCROSS} I am sorry, but I was unable to find an item with that query.`, - commandFortniteDescription: 'Gets player statistics for a Fortnite player', - commandFortniteExtended: { - extendedHelp: 'This command retrieves statistics for any Fortnite player that plays on PC, Xbox or Playstation', - explainedUsage: [ - ['platform', '(optional, defaults to `pc`) Platform the player plays on, one of `pc`, `xbox`, or `psn`.'], - ['player', 'The Epic Games username of the player.'] - ], - examples: ['ninja', 'pc ninja', 'xbox TTV R1xbox', 'psn TTV IllusionOG'] - }, - commandFortniteNoUser: - 'I am sorry, but I was unable to find a user with that name.\nAre you sure that they play on the provided platform? (PC [default], Xbox or PSN are supported)', - commandFortniteEmbedTitle: ({ epicUserHandle }) => `Fortnite player statistics for ${epicUserHandle}`, - commandFortniteEmbedSectionTitles: { - lifetimeStats: '**_Lifetime Stats_**', - solos: '**_Solos_**', - duos: '**_Duos_**', - squads: '**_Squads_**' - }, - commandFortniteEmbedStats: ({ - winCount, - killCount, - kdrCount, - matchesPlayedCount, - top1Count, - top3Count, - top5Count, - top6Count, - top10Count, - top12Count, - top25Count - }) => ({ - wins: `Wins: **\`${winCount}\`**`, - kills: `Kills: **\`${killCount}\`**`, - kdr: `KDR: **\`${kdrCount}%\`**`, - matchesPlayed: `Matches played: **\`${matchesPlayedCount}\`**`, - top1s: `Top 1s: **\`${top1Count}\`**`, - top3s: `Top 3s: **\`${top3Count}\`**`, - top5s: `Top 5s: **\`${top5Count}\`**`, - top6s: `Top 6s: **\`${top6Count}\`**`, - top10s: `Top 10s: **\`${top10Count}\`**`, - top12s: `Top 12s: **\`${top12Count}\`**`, - top25s: `Top 25s: **\`${top25Count}\`**` - }), - commandOverwatchDescription: 'Gets player statistics for an Overwatch player', - commandOverwatchExtended: { - extendedHelp: [ - 'This command retrieves statistics for any Overwatch player that plays on PC, Xbox or Playstation.', - 'By default it will look at PC players, if you want to check for Xbox or Playstation players then set the platform to `xbl` or `psn` respectively.' - ], - explainedUsage: [ - ['platform', '(optional, defaults to `pc`) Platform the player plays on, one of `pc`, `xbl`, or `psn`'], - ['player', 'For PC the full blizzard tag, for console the username. Case sensitive!'] - ], - examples: ['bame#1784', 'xbl Dorus NL gamer', 'psn decoda_24'], - reminder: '**Player names are case sensitive!**', - multiline: true - }, - commandOverwatchInvalidPlayerName: ({ playerTag }) => - `\`${playerTag}\` is an invalid player name\nFor PC it has to be their full Blizzard BattleTag, for example \`bame#1784\`.\nFor Xbox and Playstation it just has to be their username.`, - commandOverwatchQueryFail: ({ player, platform }) => - `Failed to get data for \`${player}\`, are you sure they play on \`${platform}\`?\nAlso make sure to get the casing right, names are case sensitive.`, - commandOverwatchNoStats: ({ player }) => `I found a player with the tag \`${player}\` but no stats were available for them.`, - commandOverwatchNoAverage: 'Not enough data to determine average.', - commandOverwatchEmbedDataStats: ({ - finalBlows, - deaths, - damageDone, - healing, - objectiveKills, - soloKills, - playTime, - gamesWon, - goldenMedals, - silverMedals, - bronzeMedals - }) => ({ - finalBlows: `**Final blows:** ${this.groupDigits(finalBlows)}`, - deaths: `**Deaths:** ${this.groupDigits(deaths)}`, - damageDealt: `**Damage dealt:** ${this.groupDigits(damageDone)}`, - healing: `**Healing:** ${this.groupDigits(healing)}`, - objectiveKills: `**Objective kills:** ${this.groupDigits(objectiveKills)}`, - soloKills: `**Solo kills:** ${this.groupDigits(soloKills)}`, - playTime: `**Playtime:** ${this.duration(playTime, 2)}`, - gamesWon: `**Games won:** ${this.groupDigits(gamesWon)}`, - goldenMedals: `**Gold medals earned:** ${this.groupDigits(goldenMedals)}`, - silverMedals: `**Silver medals earned:** ${this.groupDigits(silverMedals)}`, - bronzeMedals: `**Bronze medals earned:** ${this.groupDigits(bronzeMedals)}` - }), - commandOverwatchEmbedDataTopHero: ({ name, playTime }) => `**${toTitleCase(name)}** (${playTime})`, - commandOverwatchEmbedData: ({ authorName, playerLevel, prestigeLevel, totalGamesWon }) => ({ - title: 'Click here for more details on overwatchtracker.com', - ratingsTitle: 'Ratings', - author: `Overwatch Player Statistics for ${authorName}`, - playerLevel: `**Player level:** ${this.groupDigits(playerLevel)}`, - prestigeLevel: `**Prestige level:** ${this.groupDigits(prestigeLevel)}`, - totalGamesWon: `**Total games won:** ${this.groupDigits(totalGamesWon)}`, - noGamesWon: `**Total games won:** ${this.language.globalNone}`, - headers: { - account: '__Account Stats__', - quickplay: '__Quickplay Stats__', - competitive: '__Competitive Stats__', - topHeroesQuickplay: '__Top Heroes Quickplay__', - topHeroesCompetitive: '__Top Heroes Competitive__' - } - }), - - /** - * ################ - * GENERAL COMMANDS - */ - - commandSupportDescription: 'Show support instructions', - commandSupportExtended: { - extendedHelp: "This command gives you a link to *Skyra's Lounge*, the best place for everything related to me." - }, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandCreateMuteDescription: 'Prepare the mute system.', - commandCreateMuteExtended: { - extendedHelp: `This command prepares the mute system by creating a role called 'muted', and configuring it to the guild settings. This command also modifies all channels (where possible) permissions and disables the permission **${this.PERMISSIONS.SEND_MESSAGES}** in text channels and **${this.PERMISSIONS.CONNECT}** in voice channels for said role.` - }, - commandGiveawayDescription: 'Start a new giveaway.', - commandGiveawayExtended: { - extendedHelp: [ - 'This command is designed to manage giveaways. You can start them with this command by giving it the time and a title.', - '', - 'When a giveaway has been created, I will send a giveaway message and react to it with 🎉 so the members of the server can participate on it.', - '', - 'You can pass a flag of `--winners=Xw`, wherein X is a number (for example 2w for 2 winners) to allow multiple people to win a giveaway.', - 'Please note that there is a maximum of 25 winners.' - ], - explainedUsage: [ - ['channel', '(Optional) The channel in which to start the giveaway'], - ['time', 'The time the giveaway should last.'], - ['title', 'The title of the giveaway.'] - ], - examples: ['6h A hug from Skyra.', '60m 5w A mysterious Steam game', '1d Free Discord Nitro! --winners=2w'], - multiline: true - }, - commandGiveawayRerollDescription: 'Re-roll the winners from a giveaway.', - commandGiveawayRerollExtended: { - extendedHelp: `This command is designed to re-roll finished giveaways. Please check \`Skyra, help gstart\` for more information about creating one.`, - explainedUsage: [ - ['winners', 'The amount of winners to pick.'], - ['message', 'The message to target. Defaults to last giveaway message.'] - ], - examples: ['', '633939404745998346', '5', '5 633939404745998346'] - }, - commandGiveawayScheduleDescription: 'Schedule a giveaway to start at a certain time.', - commandGiveawayScheduleExtended: { - extendedHelp: [ - 'This command prepares a giveaway to start at a certain time if you do not wish to start it immediately.', - 'You can pass a flag of `--winners=X`, wherein X is a number, to allow multiple people to win this giveaway.', - 'Please note that there is a maximum of 25 winners.' - ], - explainedUsage: [ - ['channel', '(Optional) The channel in which to start the giveaway'], - ['schedule', 'The time to wait before starting the giveaway.'], - ['time', 'The time the giveaway should last.'], - ['title', 'The title of the giveaway.'] - ], - examples: ['30m 6h A hug from Skyra.'], - multiline: true - }, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandNickDescription: "Change Skyra's nickname for this server.", - commandNickExtended: { - extendedHelp: "This command allows you to change Skyra's nickname easily for the server.", - reminder: `This command requires the **${this.PERMISSIONS.CHANGE_NICKNAME}** permission. Make sure Skyra has it.`, - explainedUsage: [['nick', "The new nickname. If you don't put any, it'll reset it instead."]], - examples: ['SkyNET', 'Assistant', ''] - }, - commandPermissionNodesDescription: 'Configure the permission nodes for this server.', - commandPermissionNodesExtended: { - extendedHelp: [ - 'Permission nodes are per-user and per-role overrides. They are used when the built-in permissions system is not enough.', - 'For example, in some servers they want to give a staff role the permissions to use mute and warn, but not ban and others (reserved to moderators), and only warn is available for the configurable staff-level permission, so you can tell me to allow the mute command for the staff role now.' - ], - explainedUsage: [ - ['action', 'Either `add`, `remove`, `reset`, or `show`. Defaults to `show`.'], - ['target', 'Either a role name or a user name, allowing IDs and mentions for either.'], - ['type', 'Either `allow` or `deny`. This is ignored when `action` is not `add` nor `remove`.'], - ['command', 'The name of the command to allow or deny. This is ignored when `action` is not `add` nor `remove`.'] - ], - examples: ['add staff allow warn', 'add moderators deny ban', 'remove staff allow warn', 'reset staff', 'show staff'], - reminder: 'The server owner cannot have any actions, nor the `everyone` role can have allowed commands.', - multiline: true - }, - commandTriggersDescription: 'Set custom triggers for your guild!.', - commandTriggersExtended: { - extendedHelp: [ - 'This command allows administrators to go further with the personalization of Skyra in the guild!.', - 'A trigger is a piece that can active other functions.', - 'For example, the aliases are triggers that get executed when the command does not exist in bot, triggering the unknown command event.', - 'When this happens, the alias system executes and tries to find an entry that matches with the input.' - ], - reminder: `This command requires the **${this.PERMISSIONS.ADD_REACTIONS}** permission so it can test reactions. Make sure Skyra has it.`, - explainedUsage: [ - ['list', 'List all current triggers.'], - ['add ', 'Add a new trigger given a type, input and output.'], - ['remove ', 'Remove a trigger given the type and input.'] - ], - examples: ['', 'list', 'add reaction "good night" 🌛', 'remove reaction "good night"'], - multiline: true - }, - - /** - * ################################# - * MANAGEMENT/CONFIGURATION COMMANDS - */ - - commandManagecommandautodeleteDescription: 'Manage per-channel autodelete timer.', - commandManagecommandautodeleteExtended: { - extendedHelp: - "This command manages this guild's per-channel command autodelete timer, it serves well to leave a channel clean from commands.", - explainedUsage: [ - ['show', 'Show the autodelete timer for all channels.'], - ['add [channel] ', 'Add an autodelete timer for the specified channel.'], - ['remove [channel]', 'Remove the autotimer from the specified channel.'], - ['reset', 'Clear all autodelete timers.'] - ], - reminder: "The channel argument is optional, defaulting to the message's channel, but it uses fuzzy search when possible.", - examples: ['show', 'add #general 4s', 'remove #general', 'reset'] - }, - commandManageCommandChannelDescription: 'Manage per-channel command blacklist.', - commandManageCommandChannelExtended: { - extendedHelp: - "This command manages this guild's per-channel command blacklist, it serves well to disable certain commands you do not want to be used in certain channels (to disable a command globally, use the `disabledCommands` settings key to disable in all channels.", - explainedUsage: [ - ['show [channel]', 'Show the command blacklist for the selected channel.'], - ['add [channel] ', "Add a command to the specified channel's command blacklist."], - ['remove [channel] ', "Remove a command to the specified channel's command blacklist."], - ['reset [channel]', 'Clear the command blacklist for the specified channel.'] - ], - reminder: 'The channel argument is optional, but it uses fuzzy search when possible.', - examples: ['show', 'add #general profile', 'remove #general profile', 'reset #general'] - }, - commandManageReactionRolesDescription: 'Manage the reaction roles for this server.', - commandManageReactionRolesExtended: { - extendedHelp: [ - 'Seamlessly set up reaction roles in your server! When adding reaction roles, I listen to your reactions for 5 minutes and I bind the first reaction from you alongside the channel and the message, with the specified role.', - "Otherwise, if a channel is specified, a prompt will not be created, and the reaction role will be bound to all of the channel's messages.", - '', - 'The best way to add new reaction roles is by using `add @role`. If you prefer not binding the reaction to a specific message then use `add @role #channel emoji`' - ], - explainedUsage: [ - ['show', 'Retrieve the list of all reaction roles.'], - ['add ', 'Adds a reaction role binding the first reacted message since the execution with the role.'], - ['remove ', 'Removes a reaction role, use `show` to get a list of them.'], - ['reset', 'Removes all reaction roles.'] - ], - multiline: true, - examples: ['show', 'add @role', 'add @role #channel emoji', 'remove @role 123456789012345678', 'reset'] - }, - commandSetIgnoreChannelsDescription: 'Set a channel to the ignore channel list.', - commandSetIgnoreChannelsExtended: { - extendedHelp: [ - "This command helps you setting up ignored channels. An ignored channel is a channel where nobody but moderators can use Skyra's commands.", - `Unlike removing the **${this.PERMISSIONS.SEND_MESSAGES}** permission, Skyra is still able to send (and therefore execute commands) messages, which allows moderators to use moderation commands in the channel.`, - 'Use this if you want to ban any command usage from the bot in a specific channel.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: 'You cannot set the same channel twice, instead, Skyra will remove it.', - examples: ['#general', 'here'], - multiline: true - }, - commandSetImageLogsDescription: 'Set the image logs channel.', - commandSetImageLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the image log channel. Whenever a member sends an image attachment, it will send an embed message with the attachment re-uploaded.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.` - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - examples: ['#image-logs', 'here'], - multiline: true - }, - commandSetMemberLogsDescription: 'Set the member logs channel.', - commandSetMemberLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the member log channel. A member log channel only sends two kinds of logs: "Member Join" and "Member Leave".', - 'If a muted user joins, it will send a special "Muted Member Join" event.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - `You also need to individually set the "events" you want to listen: "events.memberAdd" and "events.memberRemove".`, - 'For roles, you would enable "events.memberNicknameChange" and/or "events.memberRoleUpdate" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - examples: ['#member-logs', 'here'], - multiline: true - }, - commandSetMessageLogsDescription: 'Set the message logs channel.', - commandSetMessageLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the message log channel. A message log channel only sends three kinds of logs: "Message Delete", "Message Edit", and "Message Prune".', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - 'You also need to individually set the "events" you want to listen: "events.messageDelete" and "events.messageEdit" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: `Due to Discord limitations, Skyra cannot know who deleted a message. The only way to know is by fetching audit logs, requiring the permission **${this.PERMISSIONS.VIEW_AUDIT_LOG}** which access is limited in the majority of guilds and the amount of times I can fetch them in a period of time.`, - examples: ['#message-logs', 'here'], - multiline: true - }, - commandSetmodlogsDescription: 'Set the mod logs channel.', - commandSetmodlogsExtended: { - extendedHelp: [ - 'This command helps you setting up the mod log channel. A mod log channel only sends case reports indexed by a number case and with "claimable" reasons and moderators.', - 'This channel is not a must and you can always retrieve specific modlogs with the "case" command.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - 'For auto-detection, you need to individually set the "events" you want to listen: "events.banAdd", "events.banRemove" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: `Due to Discord limitations, the auto-detection does not detect kicks. You need to use the "kick" command if you want to document them as - a formal moderation log case.`, - examples: ['#mod-logs', 'here'], - multiline: true - }, - commandSetprefixDescription: "Set Skyra's prefix.", - commandSetprefixExtended: { - extendedHelp: [ - "This command helps you setting up Skyra's prefix. A prefix is an affix that is added in front of the word, in this case, the message.", - 'It allows bots to distinguish between a regular message and a command. By nature, the prefix between should be different to avoid conflicts.', - "If you forget Skyra's prefix, simply mention her with nothing else and she will tell you the current prefix.", - 'Alternatively, you can prefix the commands with her name and a comma (for example `Skyra, ping`).' - ], - explainedUsage: [['prefix', `The prefix to set. Default one in Skyra is "${this.client.options.prefix}".`]], - reminder: 'Your prefix should only contain characters everyone can write and type.', - examples: ['&', '='], - multiline: true - }, - commandSetrolechannelDescription: 'Set the role channel for role reactions.', - commandSetrolechannelExtended: { - extendedHelp: - 'This command sets up the role channel to lock the reactions to, it is a requirement to set up before setting up the **role message**, and if none is given, the role reactions module will not run.', - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: 'You cannot set the same channel twice, instead, Skyra will remove it.', - examples: ['#roles', 'here'] - }, - commandSetrolemessageDescription: 'Set the role message for role reactions.', - commandSetrolemessageExtended: { - extendedHelp: [ - 'This command sets up the role message to lock the reactions to, it requires a **role channel** to be set up first.', - 'If none is given, Skyra will listen to any reaction in the channel.', - `Additionally, Skyra requires **${this.PERMISSIONS.READ_MESSAGE_HISTORY}** in order to fetch the message for validation.` - ], - explainedUsage: [['message', 'An ID, they are 17-18 characters long and numeric.']], - reminder: 'You must execute this command in the role channel.', - examples: ['434096799847022598'], - multiline: true - }, - commandSetStarboardEmojiDescription: 'Set the emoji reaction for starboard.', - commandSetStarboardEmojiExtended: { - extendedHelp: - 'This command sets up the starboard emoji for the starboard, which is, by default, ⭐. Once this is changed, Skyra will ignore any star and will count users who reacted to said emoji.', - explainedUsage: [['emoji', 'The emoji to set.']], - reminder: 'Use this wisely, not everyone expects the starboard to listen to a custom emoji.', - examples: ['⭐'] - }, - - /** - * ################# - * GIVEAWAY COMMANDS - */ - - commandGiveawayRerollInvalid: 'The message ID does not exist or there is no finished giveaway.', - - /** - * ########################### - * MANAGEMENT/HELPERS COMMANDS - */ - - commandRoleInfoDescription: 'Check the information for a role.', - commandRoleInfoExtended: { - extendedHelp: [ - "The roleinfo command displays information for a role, such as its id, name, color, whether it's hoisted (displays separately) or not, it's role hierarchy position, whether it's mentionable or not, how many members have said role, and its permissions.", - 'It sends an embedded message with the color of the role.' - ], - explainedUsage: [['role', 'The role name, partial name, mention or id.']], - examples: ['Administrator', 'Moderator', ''], - multiline: true - }, - commandGuildInfoDescription: 'Check the information of the guild!.', - commandGuildInfoExtended: { - extendedHelp: [ - 'The serverinfo command displays information for the guild the message got sent.', - 'It shows the amount of channels, with the count for each category, the amount of members (given from the API), the owner with their user id, the amount of roles, region, creation date, verification level... between others.' - ], - multiline: true - }, - - /** - * ########################### - * MANAGEMENT/MEMBERS COMMANDS - */ - - commandStickyRolesDescription: 'Manage sticky roles for users.', - commandStickyRolesExtended: { - extendedHelp: - "The stickyRoles command allows you to manage per-member's sticky roles, they are roles that are kept even when you leave, and are applied back as soon as they join.", - explainedUsage: [ - ['action', 'Either you want to check the sticky roles, add one, remove one, or remove all of them.'], - ['user', 'The user target for all the actions.'], - ['role', 'The role to add or remove.'] - ], - examples: ['add Skyra Goddess', 'show Skyra', 'remove Skyra Goddess', 'reset Skyra'], - reminder: "The member's roles will not be modified by this command, you need to add or remove them." - }, - - /** - * ################################## - * MANAGEMENT/MESSAGE FILTER COMMANDS - */ - - commandAttachmentsModeDescription: "Manage this guild's flags for the attachments filter.", - commandAttachmentsModeExtended: { - extendedHelp: ['The attachmentsMode command manages the behavior of the attachments system.'], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandCapitalsModeDescription: "Manage this guild's flags for the caps filter.", - commandCapitalsModeExtended: { - extendedHelp: [ - 'The capitalsMode command manages the behavior of the caps system.', - 'The minimum amount of characters before filtering can be set with `Skyra, settings set selfmod.capitals.minimum `.', - 'The percentage of uppercase letters can be set with `Skyra, settings set selfmod.capitals.maximum `.' - ], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandFilterDescription: "Manage this guild's word blacklist.", - commandFilterExtended: { - extendedHelp: [ - 'The filter command manages the word blacklist for this server and must have a filter mode set up, check `Skyra, help filterMode`.', - "Skyra's word filter can find matches even with special characters or spaces between the letters of a blacklisted word, as well as it filters duplicated characters for enhanced filtering." - ], - multiline: true - }, - commandFilterModeDescription: "Manage this server's word filter modes.", - commandFilterModeExtended: { - extendedHelp: 'The filterMode command manages the behavior of the word filter system. Run `Skyra, help filter` for how to add words.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandInviteModeDescription: 'Manage the behavior for the invite link filter.', - commandInviteModeExtended: { - extendedHelp: 'The inviteMode command manages the behavior of the word filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandLinkModeDescription: 'Manage the behavior for the link filter.', - commandLinkModeExtended: { - extendedHelp: 'The linkMode command manages the behavior of the link system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandMessageModeDescription: 'Manage the behavior for the message filter system.', - commandMessageModeExtended: { - extendedHelp: 'The messageMode command manages the behavior of the message filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandNewlineModeDescription: 'Manage the behavior for the new line filter system.', - commandNewlineModeExtended: { - extendedHelp: [ - 'The newLineMode command manages the behavior of the new line filter system.', - 'The maximum amount of lines allowed can be set with `Skyra, settings set selfmod.newlines.maximum `' - ], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandReactionModeDescription: 'Manage the behavior for the reaction filter system.', - commandReactionModeExtended: { - extendedHelp: 'The reactionMode command manages the behavior of the reaction filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - - /** - * ############# - * MISC COMMANDS - */ - - commandCuddleDescription: 'Cuddle somebody!', - commandCuddleExtended: { - extendedHelp: - "Do you know something that I envy from humans? The warm feeling when somebody cuddles you. It's so cute ❤! I can imagine and draw a image of you cuddling somebody in the bed, I hope you like it!", - explainedUsage: [['user', 'The user to cuddle with.']], - examples: ['Skyra'] - }, - commandDeletthisDescription: '*Sees offensive post* DELETTHIS!', - commandDeletthisExtended: { - extendedHelp: - "I see it! I see the hammer directly from your hand going directly to the user you want! Unless... unless it's me! If you try to tell me this, I'm going to take the MJOLNIR! Same if you do with my creator!", - explainedUsage: [['user', 'The user that should start deleting his post.']], - examples: ['John Doe'] - }, - commandFDescription: 'Press F to pay respects.', - commandFExtended: { - extendedHelp: - 'This command generates an image... to pay respects reacting with 🇫. This command also makes Skyra react the image if she has permissions to react messages.', - explainedUsage: [['user', 'The user to pray respects to.']], - examples: ['John Doe', 'Jake'] - }, - commandGoodnightDescription: 'Give somebody a nice Good Night!', - commandGoodnightExtended: { - extendedHelp: "Let me draw you giving a goodnight kiss to the person who is going to sleep! Who doesn't like goodnight kisses?", - explainedUsage: [['user', 'The user to give the goodnight kiss.']], - examples: ['Jake', 'DefinitivelyNotSleeping'] - }, - commandGoofytimeDescription: "It's Goofy time!", - commandGoofytimeExtended: { - extendedHelp: - "IT'S GOOFY TIME! *Screams loudly in the background* NO, DAD! NO! This is a command based on the Goofy Time meme, what else would it be?", - explainedUsage: [['user', "The user who will say IT'S GOOFY TIME!"]], - examples: ['TotallyNotADaddy'] - }, - commandHugDescription: 'Hugs!', - commandHugExtended: { - extendedHelp: - "What would be two people in the middle of the snow with coats and hugging each other? Wait! I get it! Mention somebody you want to hug with, and I'll try my best to draw it in a canvas!", - explainedUsage: [['user', 'The user to hug with.']], - examples: ['Bear'] - }, - commandIneedhealingDescription: "*Genji's voice* I NEED HEALING!", - commandIneedhealingExtended: { - extendedHelp: [ - 'Do you know the worst nightmare for every single healer in Overwatch, specially for Mercy? YES!', - 'You know it, it\'s a cool cyborg ninja that looks like a XBOX and is always yelling "I NEED HEALING" loudly during the entire match.', - "Well, don't expect so much, this command actually shows a medic with some tool in your chest." - ], - explainedUsage: [['healer', 'The healer you need to heal you.']], - examples: ['Mercy'], - multiline: true - }, - commandRandRedditDescription: 'Retrieve a random Reddit post.', - commandRandRedditExtended: { - extendedHelp: 'This is actually something like a Russian Roulette, you can get a good meme, but you can also get a terrible meme.', - explainedUsage: [['reddit', 'The reddit to look at.']], - examples: ['discordapp'] - }, - commandRedditUserDescription: 'Retrieve statistics for a Reddit user.', - commandRedditUserExtended: { - extendedHelp: 'Gets statistics of any given Reddit user', - explainedUsage: [['user', 'The reddit user to look at.']], - examples: ['GloriousGe0rge'] - }, - commandShipDescription: 'Ships 2 members', - commandShipExtended: { - extendedHelp: [ - 'This commands generates a ship name between two users and creates more love in the world.', - 'Users are optional, you can provide none, just one or both users. For any non-provided users I will pick a random guild member.' - ], - explainedUsage: [ - ['firstUser', 'The first user to ship'], - ['secondUser', 'The second user to ship'] - ], - examples: ['romeo juliet'], - reminder: 'If I cannot find either given user then I will pick someone randomly.', - multiline: true - }, - commandShipData: ({ romeoUsername, julietUsername, shipName }) => ({ - title: `**Shipping \`${romeoUsername}\` and \`${julietUsername}\`**`, - description: `I call it... ${shipName}` - }), - commandChaseDescription: 'Get in here!', - commandChaseExtended: { - extendedHelp: 'Do you love chasing? Start chasing people now for free! Just mention or write their ID and done!', - explainedUsage: [['pinger', 'The user who you want to chase.']], - examples: ['IAmInnocent'] - }, - commandShindeiruDescription: 'Omae wa mou shindeiru.', - commandShindeiruExtended: { - extendedHelp: [ - '"You are already dead" Japanese: お前はもう死んでいる; Omae Wa Mou Shindeiru, is an expression from the manga and anime series Fist of the North Star.', - 'This shows a comic strip of the character pronouncing the aforementioned words, which makes the opponent reply with "nani?" (what?).' - ], - explainedUsage: [['user', "The person you're telling that phrase to."]], - examples: ['Jack'], - multiline: true - }, - commandPeepoloveDescription: "Generates a peepoLove image from a users' avatar.", - commandPeepoloveExtended: { - extendedHelp: `Allows you to generate a peepoLove image from a user's avatar.`, - explainedUsage: [['user', 'The user that peepo should hug.']], - examples: ['Joe'], - reminder: 'Custom image support has been temporarily disabled, ETA on it being back is roughly November 2020' - }, - commandSlapDescription: 'Slap another user using the Batman & Robin Meme.', - commandSlapExtended: { - extendedHelp: 'The hell are you saying? *Slaps*. This meme is based on a comic from Batman and Robin.', - explainedUsage: [['user', 'The user you wish to slap.']], - examples: ['Jake'], - reminder: "You try to slap me and I'll slap you instead." - }, - commandSnipeDescription: 'Retrieve the last deleted message from a channel', - commandSnipeExtended: { - extendedHelp: 'This just sends the last deleted message from this channel, somebody is misbehaving? This will catch them.' - }, - commandThesearchDescription: 'Are we the only one in the universe, this man on earth probably knows.', - commandThesearchExtended: { - extendedHelp: 'One man on Earth probably knows if there is intelligent life, ask and you shall receive an answer.', - explainedUsage: [['answer', 'The sentence that will reveal the truth.']], - examples: ['Your waifu is not real.'] - }, - commandTriggeredDescription: 'I am getting TRIGGERED!', - commandTriggeredExtended: { - extendedHelp: - "What? My commands are not userfriendly enough?! (╯°□°)╯︵ ┻━┻. This command generates a GIF image your avatar wiggling fast, with a TRIGGERED footer, probably going faster than I thought, I don't know.", - explainedUsage: [['user', 'The user that is triggered.']], - examples: ['kyra'] - }, - commandUpvoteDescription: 'Get a link to upvote Skyra in **Bots For Discord**', - commandUpvoteExtended: { - extendedHelp: - 'Bots For Discord is a website where you can find amazing bots for your website. If you really love me, you can help me a lot by upvoting me every 24 hours, so more users will be able to find me!' - }, - commandVaporwaveDescription: 'Vapowave characters!', - commandVaporwaveExtended: { - extendedHelp: - "Well, what can I tell you? This command turns your messages into unicode monospaced characters. That is, what humans call 'A E S T H E T I C'. I wonder what it means...", - explainedUsage: [['phrase', 'The phrase to convert']], - examples: ['A E S T H E T I C'] - }, - - /** - * ############################## - * MODERATION/MANAGEMENT COMMANDS - */ - - commandHistoryDescription: 'Display the count of moderation cases from this guild or from a user.', - commandHistoryExtended: { - extendedHelp: 'This command shows the amount of bans, mutes, kicks, and warnings, including temporary, that have not been appealed.', - examples: ['', '@Pete'] - }, - commandHistoryFooterNew: ({ warnings, mutes, kicks, bans, warningsText, mutesText, kicksText, bansText }) => - `This user has ${warnings} ${warningsText}, ${mutes} ${mutesText}, ${kicks} ${kicksText}, and ${bans} ${bansText}`, - commandHistoryFooterWarning: () => 'warning', - commandHistoryFooterWarningPlural: () => 'warnings', - commandHistoryFooterMutes: () => 'mute', - commandHistoryFooterMutesPlural: () => 'mutes', - commandHistoryFooterKicks: () => 'kick', - commandHistoryFooterKicksPlural: () => 'kicks', - commandHistoryFooterBans: () => 'ban', - commandHistoryFooterBansPlural: () => 'bans', - commandModerationsDescription: 'List all running moderation logs from this guild.', - commandModerationsExtended: { - extendedHelp: `This command shows you all the temporary moderation actions that are still running. This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.`, - examples: ['', '@Pete', 'mutes @Pete', 'warnings'] - }, - commandModerationsEmpty: 'Nobody has behaved badly yet, who will be the first user to be listed here?', - commandModerationsAmount: () => 'There is 1 entry.', - commandModerationsAmountPlural: ({ count }) => `There are ${count} entries.`, - commandMutesDescription: 'List all mutes from this guild or from a user.', - commandMutesExtended: { - extendedHelp: [ - 'This command shows either all mutes filed in this guild, or all mutes filed in this guild for a specific user.', - `This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.` - ], - examples: ['', '@Pete'], - multiline: true - }, - commandWarningsDescription: 'List all warnings from this guild or from a user.', - commandWarningsExtended: { - extendedHelp: [ - 'This command shows either all warnings filed in this guild, or all warnings filed in this guild for a specific user.', - `This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.` - ], - examples: ['', '@Pete'], - multiline: true - }, - - /** - * ############################# - * MODERATION/UTILITIES COMMANDS - */ - - commandSlowmodeDescription: "Set the channel's slowmode value in seconds.", - commandSlowmodeExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_CHANNELS}** and will modify the channel's ratelimit per user to any value between 0 and 120 seconds.`, - examples: ['0', 'reset', '4'], - reminder: "To reset a channel's ratelimit per user, you can use either 0 or 'reset'." - }, - - /** - * ################### - * MODERATION COMMANDS - */ - - commandBanDescription: 'Hit somebody with the ban hammer.', - commandBanExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**, and only members with lower role hierarchy position can be banned by me.`, - "No, the guild's owner cannot be banned.", - 'This action can be optionally timed to create a temporary ban.' - ], - examples: ['@Pete', '@Pete Spamming all channels.', '@Pete 24h Spamming all channels'], - multiline: true - }, - commandDehoistDescription: 'Shoot everyone with the Dehoistinator 3000', - commandDehoistExtended: { - extendedHelp: [ - 'The act of hoisting involves adding special characters in front of your nickname in order to appear higher in the members list.', - "This command replaces any member's nickname that includes those special characters with a special character that drags them to the bottom of the list." - ], - reminder: `This command requires **${this.PERMISSIONS.MANAGE_NICKNAMES}**, and only members with lower role hierarchy position can be dehoisted.`, - multiline: true - }, - commandKickDescription: 'Hit somebody with the 👢.', - commandKickExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.KICK_MEMBERS}**, and only members with lower role hierarchy position can be kicked by me. No, the guild's owner cannot be kicked.`, - examples: ['@Sarah', '@Sarah Spamming general chat.'] - }, - commandLockdownDescription: 'Close the gates for this channel!', - commandLockdownExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_CHANNELS}** in order to be able to manage the permissions for a channel.`, - `This command removes the permission **${this.PERMISSIONS.SEND_MESSAGES}** to the \`@everyone\` role so nobody but the members with roles that have their own overrides (besides administrators, who bypass channel overrides) can send messages.`, - 'Optionally, you can pass time as second argument.' - ], - examples: ['', '#general', '#general 5m'], - multiline: true - }, - commandMuteDescription: 'Mute a user in all text and voice channels.', - commandMuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be muted.", - "This action can be optionally timed to create a temporary mute. This action saves a member's roles temporarily and will be granted to the user after the unmute.", - 'The muted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Alphonse', '@Alphonse Spamming all channels', '@Alphonse 24h Spamming all channels'], - multiline: true - }, - commandSetNicknameDescription: 'Change the nickname of a user.', - commandSetNicknameExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_NICKNAMES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner nickname cannot be changed." - ], - examples: ['@Pete peeehteeerrr', '@ꓑ𝗲੮ẻ Pete Unmentionable name'], - multiline: true - }, - commandAddRoleDescription: 'Adds a role to a user.', - commandAddRoleExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner roles cannot be changed." - ], - examples: ['@John member', '@John member Make John a member'], - multiline: true - }, - commandRemoveroleDescription: 'Removes a role from a user', - commandRemoveroleExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner roles cannot be changed." - ], - examples: ['@Paula member', '@Paula member Remove member permissions from Paula'], - multiline: true - }, - commandPruneDescription: 'Prunes a certain amount of messages w/o filter.', - commandPruneExtended: { - extendedHelp: [ - 'This command deletes the given amount of messages given a filter within the last 100 messages sent in the channel the command has been run.', - 'Optionally, you can add `--silent` to tell Skyra not to send a response message.' - ], - explainedUsage: [ - ['Messages', 'The amount of messages to prune.'], - ['Filter', 'The filter to apply.'], - ['(Filter) Link', 'Filters messages that have links on the content.'], - ['(Filter) Invite', 'Filters messages that have invite links on the content.'], - ['(Filter) Bots', 'Filters messages sent by bots.'], - ['(Filter) You', 'Filters messages sent by Skyra.'], - ['(Filter) Me', 'Filters your messages.'], - ['(Filter) Upload', 'Filters messages that have attachments.'], - ['(Filter) User', 'Filters messages sent by the specified user.'], - ['(Filter) Human', 'Filters messages sent by humans.'], - ['Position', 'Lets you delete messages before or after a specific message.'], - ['(Position) Before', 'Deletes all messages before the given message.'], - ['(Position) After', 'Deletes all messages after the given message.'] - ], - examples: ['50 me', '75 @kyra', '20 bots', '60 humans before 629992398700675082'], - reminder: 'Due to a Discord limitation, bots cannot delete messages older than 14 days.', - multiline: true - }, - commandCaseDescription: 'Get the information from a case by its index.', - commandCaseExtended: { - extendedHelp: 'You can also get the latest moderation case by specifying the case ID as "latest"', - explainedUsage: [['Case', 'Number of the case ID to get or "latest"']], - examples: ['5', 'latest'] - }, - commandPermissionsDescription: 'Check the permission for a member, or yours.', - commandPermissionsExtended: { - extendedHelp: 'Ideal if you want to know the what permissions are granted to a member when they have a certain set of roles.' - }, - commandFlowDescription: 'Shows the amount of messages per minute in a channel.', - commandFlowExtended: { - extendedHelp: 'This helps you determine the overall activity of a channel', - explainedUsage: [['channel', '(Optional): The channel to check, if omitted current channel is used']] - }, - commandReasonDescription: 'Edit the reason field from a moderation log case.', - commandReasonExtended: { - extendedHelp: [ - 'This command allows moderation log case management, it allows moderators to update the reason.', - 'If you want to modify multiple cases at once you provide a range.', - 'For example `1..3` for the `` will edit cases 1, 2, and 3.', - 'Alternatively you can also give ranges with commas:', - '`1,3..6` will result in cases 1, 3, 4, 5, and 6', - '`1,2,3` will result in cases 1, 2, and 3' - ], - examples: ['420 Spamming all channels', '419..421 Bad memes', '1..3,4,7..9 Posting NSFW', 'latest Woops, I did a mistake!'], - multiline: true - }, - commandRestrictAttachmentDescription: 'Restrict a user from sending attachments in all channels.', - commandRestrictAttachmentExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Sending weird images', '@Pete 24h Sending NSFW images'], - multiline: true - }, - commandRestrictEmbedDescription: 'Restrict a user from attaching embeds in all channels.', - commandRestrictEmbedExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Sending weird links', '@Pete 24h Posted a spam link'], - multiline: true - }, - commandRestrictEmojiDescription: 'Restrict a user from using external emojis in all channels.', - commandRestrictEmojiExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Spamming external emojis', '@Pete 24h Posted cringe'], - reminder: `This will only prevent the usage of external emojis and so will have no effect for non-nitro users, your own server's emojis and regular build in twemojis can still be used by members with this role.`, - multiline: true - }, - commandRestrictReactionDescription: 'Restrict a user from reacting to messages in all channels.', - commandRestrictReactionExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Spamming reactions', '@Pete 24h Posting weird reactions'], - multiline: true - }, - commandRestrictVoiceDescription: 'Restrict a user from joining any voice channel.', - commandRestrictVoiceExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Earraping in general voice channels', '@Pete 24h Making weird noises'], - multiline: true - }, - commandSoftBanDescription: 'Hit somebody with the ban hammer, destroying all their messages for some days, and unban it.', - commandSoftBanExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**, and only members with lower role hierarchy position can be banned by me.`, - "No, the guild's owner cannot be banned.", - "The ban feature from Discord has a feature that allows the moderator to remove all messages from all channels that have been sent in the last 'x' days, being a number between 0 (no days) and 7.", - 'The user gets unbanned right after the ban, so it is like a kick, but that can prune many many messages.' - ], - examples: ['@Pete', '@Pete Spamming all channels', '@Pete 7 All messages sent in 7 are gone now, YEE HAH!'], - multiline: true - }, - commandToggleModerationDmDescription: 'Toggle moderation DMs.', - commandToggleModerationDmExtended: { - extendedHelp: `This command allows you to toggle moderation DMs. By default, they are on, meaning that any moderation action (automatic or manual) will DM you, but you can disable them with this command.` - }, - commandUnbanDescription: 'Unban somebody from this guild!.', - commandUnbanExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**. It literally gets somebody from the rubbish bin, cleans them up, and allows the pass to this guild's gates.`, - examples: ['@Pete', '@Pete Turns out he was not the one who spammed all channels ¯\\_(ツ)_/¯'] - }, - commandUnmuteDescription: 'Remove the scotch tape from a user.', - commandUnmuteExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the muted people's list, and gives the old roles back if the user had them.`, - examples: ['@Pete', '@Pete (Insert random joke here).'] - }, - commandUnrestrictAttachmentDescription: 'Remove the attachment restriction from one or more users.', - commandUnrestrictAttachmentExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictEmbedDescription: 'Remove the embed restriction from one or more users.', - commandUnrestrictEmbedExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictEmojiDescription: 'Remove the external emoji restriction from one or more users.', - commandUnrestrictEmojiExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictReactionDescription: 'Remove the reaction restriction from one or more users.', - commandUnrestrictReactionExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictVoiceDescription: 'Remove the voice restriction from one or more users.', - commandUnrestrictVoiceExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnwarnDescription: 'Appeal a warning moderation log case.', - commandUnwarnExtended: { - extendedHelp: `This command appeals a warning, it requires no permissions, you only give me the moderation log case to appeal and the reason.`, - examples: ['0 Whoops, wrong dude.', '42 Turns out this was the definition of life.'] - }, - commandVmuteDescription: "Throw somebody's microphone out the window.", - commandVmuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MUTE_MEMBERS}**, and only members with lower role hierarchy position can be silenced by me.`, - "No, the guild's owner cannot be silenced.", - 'This action can be optionally timed to create a temporary voice mute.' - ], - examples: ['@Pete', '@Pete Singing too loud', '@Pete 24h Literally sang ear rape'], - multiline: true - }, - commandVoiceKickDescription: 'Hit somebody with the 👢 for singing so bad and loud.', - commandVoiceKickExtended: { - extendedHelp: [ - `This command requires the permissions **${this.PERMISSIONS.MANAGE_CHANNELS}** to create a temporary (hidden) voice channel, and **${this.PERMISSIONS.MOVE_MEMBERS}** to move the user to the temporary channel.`, - 'After this, the channel is quickly deleted, making the user leave the voice channel.', - 'For scared moderators, this command has almost no impact in the average user, as the channel is created in a way only me and the selected user can see and join, then quickly deleted.' - ], - examples: ['@Pete', '@Pete Spamming all channels'], - multiline: true - }, - commandVunmuteDescription: "Get somebody's microphone back so they can talk.", - commandVunmuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MUTE_MEMBERS}**, and only members with lower role hierarchy position can be un-silenced by me.`, - "No, the guild's owner cannot be un-silenced." - ], - examples: ['@Pete', '@Pete Appealed his times signing hear rape.'], - multiline: true - }, - commandWarnDescription: 'File a warning to somebody.', - commandWarnExtended: { - extendedHelp: [ - 'This command files a warning to a user.', - "This kind of warning is meant to be **formal warnings**, as they will be shown in the 'warnings' command.", - 'It is a good practise to do an informal warning before using this command.' - ], - examples: ['@Pete Attempted to mention everyone.'], - multiline: true - }, - - /** - * ################## - * POKÉMON COMMANDS - */ - commandAbilityDescription: 'Gets data for any given Pokémon ability using my Pokémon dataset.', - commandAbilityExtended: { - extendedHelp: 'Uses a fuzzy search to also match against near-matches.', - explainedUsage: [['ability', 'The ability for which you want to find data']], - examples: ['multiscale', 'pressure'] - }, - commandAbilityEmbedTitles: { - authorTitle: 'Ability', - fieldEffectTitle: 'Effect outside of battle' - }, - commandAbilityQueryFail: ({ ability }) => `I am sorry, but that query failed. Are you sure \`${ability}\` is actually an ability in Pokémon?`, - commandFlavorsDescription: 'Gets the dex entries across various games for a Pokémon.', - commandFlavorsExtended: { - extendedHelp: ['Uses a fuzzy search to also match against near-matches.', 'You can provide a flag of `--shiny` to get the shiny sprite.'], - explainedUsage: [['pokemon', 'The Pokémon for which you want to get flavour texts']], - examples: ['dragonite', 'pikachu', 'pikachu --shiny'], - multiline: true - }, - commandFlavorsQueryFail: ({ pokemon }) => `I am sorry, but that query failed. Are you sure \`${pokemon}\` is actually a Pokémon?`, - commandItemDescription: 'Gets data for any given Pokémon item using my Pokémon dataset.', - commandItemExtended: { - extendedHelp: 'Uses a fuzzy search to also match against near-matches.', - explainedUsage: [['item', 'The item for which you want to find data']], - examples: ['life orb', 'choice specs'] - }, - commandItemEmbedData: ({ availableInGen8 }) => ({ - ITEM: 'Item', - generationIntroduced: 'Generation introduced', - availableInGeneration8Title: 'Available in generation 8', - availableInGeneration8Data: availableInGen8 - }), - commandItemQueryFail: ({ item }) => `I am sorry, but that query failed. Are you sure \`${item}\` is actually a item in Pokémon?`, - commandLearnDescription: 'Retrieves whether a given Pokémon can learn one or more given moves using my Pokémon dataset.', - commandLearnExtended: { - extendedHelp: [ - 'Uses a fuzzy search to also match against near-matches.', - 'Moves split on every `, ` (comma space) and you can provide as many moves as you wish.', - 'You can provide a flag of `--shiny` to get the shiny sprite.' - ], - explainedUsage: [ - ['generation', '(Optional), The generation for which to check the data'], - ['pokemon', 'The Pokémon whose learnset you want to check'], - ['move', 'The move(s) you want to check for'] - ], - examples: ['7 dragonite dragon dance', 'pikachu thunder bolt', 'pikachu thunder bolt --shiny', 'pikachu thunder bolt, thunder'], - multiline: true - }, - commandLearnMethodTypes: ({ level }) => ({ - levelUpMoves: `by level up at level ${level}`, - eventMoves: 'through an event', - tutorMoves: 'from a move tutor', - eggMoves: 'as an eggmove', - virtualTransferMoves: 'by transfering from virtual console games', - tmMoves: 'by using a technical machine or technical record', - dreamworldMoves: 'through a Dream World capture' - }), - commandLearnInvalidGeneration: ({ generation }) => `I am sorry, but ${generation} is not a supported Pokémon Generation`, - commandLearnMethod: ({ generation, pokemon, move, method }) => - `In generation ${generation} ${pokemon} __**can**__ learn **${move}** ${method}`, - commandLearnQueryFailed: ({ pokemon, moves }) => - `I am sorry, but that query failed. Are you sure you \`${toTitleCase(pokemon)}\` is actually a Pokémon and ${moves} are actually moves?`, - commandLearnCannotLearn: ({ pokemon, moves }) => `Looks like ${toTitleCase(pokemon)} cannot learn ${moves}`, - commandLearnTitle: ({ pokemon, generation }) => `Learnset data for ${toTitleCase(pokemon)} in generation ${generation}`, - commandMoveDescription: 'Gets data for any given Pokémon move using my Pokémon dataset', - commandMoveExtended: { - extendedHelp: 'Uses a fuzzy search to also match against near-matches.', - explainedUsage: [['move', 'The move for which you want to find data']], - examples: ['dragon dance', 'GMax Wildfire', 'Genesis Supernova'], - reminder: [ - 'Z-Move power may be shown for Generation 8 moves because it is calculated with a conversion table.', - 'If Pokémon ever returns Z-Moves to the game this would be their theoretical power, however as it stands', - 'Z-Moves are **NOT** in Generation 8.' - ], - multiline: true - }, - commandMoveEmbedData: ({ availableInGen8 }) => ({ - move: 'Move', - types: 'Type', - basePower: 'Base Power', - pp: 'PP', - category: 'Category', - accuracy: 'Accuracy', - priority: 'Priority', - target: 'Target', - contestCondition: 'Contest Condition', - zCrystal: 'Z-Crystal', - gmaxPokemon: 'G-MAX Pokémon', - availableInGeneration8Title: 'Available in Generation 8', - availableInGeneration8Data: availableInGen8, - none: 'None', - maxMovePower: 'Base power as MAX move (Dynamax)', - zMovePower: 'Base power as Z-Move (Z-Crystal)', - fieldMoveEffectTitle: 'Effect outside of battle' - }), - commandMoveQueryFail: ({ move }) => `I am sorry, but that query failed. Are you sure \`${move}\` is actually a move in Pokémon?`, - commandPokedexDescription: 'Gets data for any given Pokémon using my Pokémon dataset.', - commandPokedexExtended: { - extendedHelp: ['Uses a fuzzy search to also match against near-matches.', 'You can provide a flag of `--shiny` to get the shiny sprite.'], - explainedUsage: [['pokemon', 'The Pokémon for which you want to find data']], - examples: ['dragonite', 'pikachu', 'pikachu --shiny'], - reminder: [ - 'If there are any "Other forme(s)" on the optional fourth page, those can be requested as well.', - 'Cosmetic Formes on that page list purely cosmetic changes and these do not have seperate entries in the Pokédex.' - ], - multiline: true - }, - commandPokedexEmbedData: ({ otherFormes, cosmeticFormes }) => ({ - types: 'Type(s)', - abilities: 'Abilities', - genderRatio: 'Gender Ratio', - smogonTier: 'Smogon Tier', - uknownSmogonTier: 'Unknown / Alt form', - height: 'Height', - weight: 'Weight', - eggGroups: 'Egg group(s)', - evolutionaryLine: 'Evolutionary line', - baseStats: 'Base stats', - baseStatsTotal: 'BST', - flavourText: 'Pokdex entry', - otherFormesTitle: 'Other forme(s)', - cosmeticFormesTitle: 'Cosmetic Formes', - otherFormesList: this.list(otherFormes, 'and'), - cosmeticFormesList: this.list(cosmeticFormes, 'and') - }), - commandPokedexQueryFail: ({ pokemon }) => `I am sorry, but that query failed. Are you sure \`${pokemon}\` is actually a Pokémon?`, - commandTypeDescription: 'Gives the type matchups for one or two Pokémon types', - commandTypeExtended: { - extendedHelp: 'Types have to be exact matches to pokemon types (upper/lowercase can be ignored)', - explainedUsage: [['type', 'The type(s) to look up']], - examples: ['dragon', 'fire flying'] - }, - commandTypeEmbedData: ({ types }) => ({ - offensive: 'Offensive', - defensive: 'Defensive', - superEffectiveAgainst: 'Supereffective against', - dealsNormalDamageTo: 'Deals normal damage to', - doesNotAffect: "Doesn't affect", - notVeryEffectiveAgainst: 'Not very effective against', - vulnerableTo: 'Vulnerable to', - takesNormalDamageFrom: 'Takes normal damage from', - resists: 'Resists', - notAffectedBy: 'Not affected by', - typeEffectivenessFor: `Type effectiveness for ${this.list(types, 'and')}` - }), - commandTypeTooManyTypes: 'I am sorry, but you can get the matchup for at most 2 types', - commandTypeNotAType: ({ type }) => `${type} is not a valid Pokémon type`, - commandTypeQueryFail: ({ types }) => `I am sorry, but that query failed. Are you sure ${types} are actually types in Pokémon?`, - - /** - * ############### - * SOCIAL COMMANDS - */ - - commandSocialDescription: "Configure this guild's member points.", - commandSocialExtended: { - extendedHelp: "This command allows for updating other members' points.", - explainedUsage: [ - ['set ', 'Sets an amount of points to the user.'], - ['add ', 'Adds an amount of points to the user.'], - ['remove ', 'Removes an amount of points from the user.'], - ['reset ', 'Resets all pointss from the user.'] - ], - examples: ['set @kyra 40000', 'add @kyra 2400', 'remove @kyra 3000', 'reset @kyra'] - }, - commandBannerDescription: 'Configure the banner for your profile.', - commandBannerExtended: { - extendedHelp: 'Banners are vertical in Skyra, they decorate your profile card.', - explainedUsage: [ - ['list', '(Default) Lists all available banners.'], - ['reset', 'Set your displayed banner to default.'], - ['buy ', 'Buy a banner, must be an ID.'], - ['set ', 'Set your displayed banner, must be an ID.'] - ], - examples: ['list', 'buy 0w1p06', 'set 0w1p06', 'reset'] - }, - commandToggleDarkModeDescription: 'Toggle between light and dark templates for your profile and rank cards.', - commandToggleDarkModeExtended: { - extendedHelp: 'This command lets you toggle the template used to generate your profile.' - }, - - commandAutoRoleDescription: 'List or configure the autoroles for a guild.', - commandAutoRoleExtended: { - extendedHelp: [ - 'Autoroles are roles that are available for everyone, and automatically given when they reach a configured', - 'amount of (local) points, an administrator must configure them through a setting command.', - "Note that if the role name has spaces in the name you need to put `'quotes'` around the name!" - ], - explainedUsage: [ - ['list', 'Lists all the current autoroles.'], - ['add ', 'Add a new autorole.'], - ['remove ', 'Remove an autorole from the list.'], - ['update ', 'Change the required amount of points for an existing autorole.'] - ], - reminder: 'The current system grants a random amount of points between 4 and 8 points, for each post with a 1 minute cooldown.', - examples: ['list', "add 'Trusted Member' 20000", "update 'Trusted Member' 15000", "remove 'Trusted Member'"], - multiline: true - }, - - commandBalanceDescription: 'Check your current balance.', - commandBalanceExtended: { - extendedHelp: `The balance command retrieves your amount of ${SHINY}.` - }, - commandDailyDescription: `Get your semi-daily ${SHINY}'s.`, - commandDailyExtended: { - extendedHelp: 'Shiiiiny!', - reminder: [ - 'Skyra uses a virtual currency called Shiny, and it is used to buy stuff such as banners or bet it on slotmachines.', - 'You can claim dailies once every 12 hours.', - "If you use the --reminder flag, I will remind you when it's time to collect dailies again." - ], - multiline: true - }, - commandLeaderboardDescription: 'Check the leaderboards.', - commandLeaderboardExtended: { - extendedHelp: [ - 'The leaderboard command shows a list of users sorted by their local or global amount of points, by default, when using no arguments, it will show the local leaderboard.', - 'The leaderboards refresh every 10 minutes.' - ], - reminder: '"Local" leaderboards refer to the guild\'s top list. "Global" refers to all scores from all guilds.', - multiline: true - }, - commandLevelDescription: 'Check your global level.', - commandLevelExtended: { - extendedHelp: 'How much until the next level?', - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]] - }, - commandDivorceDescription: 'Break up with your couple!', - commandDivorceExtended: { - extendedHelp: - 'Sniff... This command is used to break up with your couple, hopefully in this virtual world, you are allowed to marry the user again.' - }, - commandMarryDescription: 'Marry somebody!', - commandMarryExtended: { - extendedHelp: 'Marry your waifu!', - explainedUsage: [['user', '(Optional) The user to marry with. If not given, the command will tell you who are you married with.']], - examples: ['', '@love'] - }, - commandMarriedDescription: 'Check who you are married with.', - commandMarriedExtended: { - extendedHelp: 'This command will tell you who are you married with.' - }, - commandMylevelDescription: 'Check your local level.', - commandMylevelExtended: { - extendedHelp: 'How much until next auto role? How many points do I have in this guild?', - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]] - }, - commandPayDescription: `Pay somebody with your ${SHINY}'s.`, - commandPayExtended: { - extendedHelp: 'Businessmen! Today is payday!', - explainedUsage: [ - ['money', `Amount of ${SHINY} to pay, you must have the amount you are going to pay.`], - ['user', 'The targeted user to pay. (Must be mention/id)'] - ], - examples: ['200 @kyra'] - }, - commandProfileDescription: 'Check your user profile.', - commandProfileExtended: { - extendedHelp: [ - 'This command sends a card image with some of your user profile such as your global rank, experience...', - "Additionally, you are able to customize your colours with the 'setColor' command." - ], - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]], - multiline: true - }, - commandRemindmeDescription: 'Manage your reminders.', - commandRemindmeExtended: { - extendedHelp: 'This command allows you to set, delete and list reminders.', - explainedUsage: [ - ['action', 'The action, one of "list", "show", "delete", or "create"/"me". Defaults to "list".'], - ['idOrDuration', 'Dependent of action; "list" → ignored; "delete"/"show" → reminder ID; else → duration.'], - ['description', '(Optional) Dependent of action, this is only read when creating a new reminder.'] - ], - examples: ['me 6h to fix this command.', 'list', 'show 1234', 'delete 1234'] - }, - commandReputationDescription: 'Give somebody a reputation point.', - commandReputationExtended: { - extendedHelp: [ - "This guy is so helpful... I'll give him a reputation point!", - "Additionally, you can check how many reputation points a user has by writing 'check' before the mention." - ], - explainedUsage: [ - ['check', '(Optional) Whether you want to check somebody (or yours) amount of reputation.'], - ['user', 'The user to give a reputation point.'] - ], - reminder: 'You can give a reputation point once every 24 hours.', - examples: ['check @kyra', 'check', '@kyra', 'check "User With Spaces"', '"User With Spaces"'], - multiline: true - }, - commandSetColorDescription: "Change your user profile's color.", - commandSetColorExtended: { - extendedHelp: 'The setColor command sets a color for your profile.', - explainedUsage: [['color', 'A color resolvable.']], - possibleFormats: [ - ['HEX', '#dfdfdf'], - ['RGB', 'rgb(200, 200, 200)'], - ['HSL', 'hsl(350, 100, 100)'], - ['B10', '14671839'] - ] - }, - - /** - * ################## - * STARBOARD COMMANDS - */ - - commandStarDescription: 'Get a random starred message from the database or the star leaderboard.', - commandStarExtended: { - extendedHelp: 'This command shows a random starred message or the starboard usage and leaderboard for this server.' - }, - - /** - * ############### - * SYSTEM COMMANDS - */ - - commandDmDescription: 'Sends a Direct Message.', - commandDmExtended: { - extendedHelp: `The DM command is reserved for bot owners, and it's only used for very certain purposes, such as replying feedback messages sent by users.`, - reminder: 'Reserved for bot owners for replying purposes.' - }, - commandEvalDescription: 'Evaluates arbitrary Javascript.', - commandEvalExtended: { - extendedHelp: [ - 'The eval command evaluates code as-in, any error thrown from it will be handled.', - 'It also uses the flags feature. Write --silent, --depth=number or --async to customize the output.', - 'The --wait flag changes the time the eval will run. Defaults to 10 seconds. Accepts time in milliseconds.', - "The --output and --output-to flag accept either 'file', 'log', 'haste' or 'hastebin'.", - 'The --delete flag makes the command delete the message that executed the message after evaluation.', - 'The --silent flag will make it output nothing.', - "The --depth flag accepts a number, for example, --depth=2, to customize util.inspect's depth.", - 'The --async flag will wrap the code into an async function where you can enjoy the use of await, however, if you want to return something, you will need the return keyword', - 'The --showHidden flag will enable the showHidden option in util.inspect.', - 'The --lang and --language flags allow different syntax highlight for the output.', - 'The --json flag converts the output to json', - 'The --no-timeout flag disables the timeout', - `If the output is too large, it'll send the output as a file, or in the console if the bot does not have the ${this.PERMISSIONS.ATTACH_FILES} permission.` - ], - examples: ['msg.author!.username;', '1 + 1;'], - reminder: 'Reserved for bot owners.', - multiline: true - }, - commandExecDescription: 'Execute Order 66.', - commandExecExtended: { - extendedHelp: 'You better not know about this.' - }, - commandSetAvatarDescription: "Set Skyra's avatar.", - commandSetAvatarExtended: { - extendedHelp: "This command changes Skyra's avatar. You can send a URL or upload an image attachment to the channel.", - reminder: 'Reserved for bot owners.' - }, - commandDonateDescription: 'Get information about how to donate to keep Skyra alive longer.', - commandDonateExtended: { - extendedHelp: [ - 'Skyra Project started on 24th October 2016, if you are reading this, you are', - `using version ${VERSION}. The development team improves a lot in every iteration of Skyra.`, - '', - 'However, not everything is free and we need your help to keep Skyra alive.', - 'We will be very thankful if you help us.', - 'We have been working on a lot of things, and Skyra is precious to us. Take care of her ❤', - '', - 'Do you want to support this amazing project? Feel free to do so! https://donate.skyra.pw/patreon or https://donate.skyra.pw/kofi' - ], - multiline: true - }, - commandEchoDescription: 'Make Skyra send a message to this (or another) channel.', - commandEchoExtended: { - extendedHelp: 'This should be very obvious...', - reminder: 'Reserved for bot owners.' - }, - commandFeedbackDescription: "Send a feedback message to the bot's s.", - commandFeedbackExtended: { - extendedHelp: `This command sends a message to a feedback channel which the bot's owners can read. You'll get a reply from me in your DMs when one of the owners has an update for you.` - }, - commandStatsDescription: 'Provides some details about the bot and stats.', - commandStatsExtended: { - extendedHelp: 'This should be very obvious...' - }, - - /** - * ############## - * TOOLS COMMANDS - */ - - commandAvatarDescription: "View somebody's avatar in full size.", - commandAvatarExtended: { - extendedHelp: "As this command's name says, it shows somebody's avatar.", - explainedUsage: [['user', '(Optional) A user mention. Defaults to the author if the input is invalid or not given.']], - reminder: "Use the --size flag to change the avatar's size." - }, - commandColorDescription: 'Display some awesome colours.', - commandColorExtended: { - extendedHelp: 'The color command displays a set of colours with nearest tones given a difference between 1 and 255..', - explainedUsage: [['color', 'A color resolvable.']], - possibleFormats: [ - ['HEX', '#dfdfdf'], - ['RGB', 'rgb(200, 200, 200)'], - ['HSL', 'hsl(350, 100, 100)'], - ['B10', '14671839'] - ], - examples: ['#dfdfdf >25', 'rgb(200, 130, 75)'] - }, - commandContentDescription: "Get messages' raw content.", - commandContentExtended: { - extendedHelp: 'Raw content will help you better copy-paste message content as you will not have to reproduce all the formatting', - explainedUsage: [ - ['channel', '(optional) The channel in which the message is to get the content from'], - ['message', 'ID of the message to get the raw content for'] - ] - }, - commandEmojiDescription: 'Get info on an emoji.', - commandEmojiExtended: { - extendedHelp: "I'll give you the emoji name, whether it is a custom emoji or not, the emoji ID and a large image preview of the emoji.", - explainedUsage: [['emoji', 'The emoji to get information about']], - reminder: "It doesn't matter whether I share a server with a custom emoji or not!" - }, - commandEmotesDescription: 'Shows all custom emotes available on this server', - commandEmotesExtended: { - extendedHelp: 'The list of emotes is split per 50 emotes' - }, - commandEmotesTitle: 'Emotes in', - commandPriceDescription: 'Convert between currencies with this command.', - commandPriceExtended: { - extendedHelp: 'Convert between any two currencies, even if they are cryptocurrencies.', - explainedUsage: [ - ['from', 'The currency to convert from'], - ['to', 'The currency to convert to'], - ['amount', 'The amount to convert, will default to 1'] - ], - examples: ['EUR USD', 'USD EUR 5', 'USD BAT 10'] - }, - commandQuoteDescription: "Quote another person's message.", - commandQuoteExtended: { - extendedHelp: "Quotes also include the message's image, if any", - explainedUsage: [ - ['channel', '(optional) The channel in which the message is to quote'], - ['message', 'ID of the message to quote'] - ] - }, - commandRolesDescription: 'List, claim or unclaim public roles in this server.', - commandRolesExtended: { - extendedHelp: [ - 'Public roles are roles that are available for everyone.', - 'An administrator must configure them with the configuration command.' - ], - explainedUsage: [['roles', 'The list of roles to claim or unclaim. Leave this empty to get a list of available roles.']], - reminder: [ - 'When claiming or unclaiming roles you can provide a single or multiple role(s).', - 'To claim multiple roles, you must separate them by a comma, for example `red,green`.', - 'You can specify which roles you want by providing the role ID, name, or a sub-section of the name.', - '', - 'Administrators can add public roles using `Skyra, conf set roles.public ExamplePublicRole`.' - ], - examples: ['', 'Designer,Programmer', 'Designer'], - multiline: true - }, - commandDuckDuckGoDescription: 'Search the Internet with DuckDuckGo.', - commandDuckDuckGoExtended: { - extendedHelp: 'This uses the alternative search enginge DuckDuckGo to search the web', - reminder: 'If you want to search google use `Skyra, google`' - }, - commandPollDescription: 'Simplifies reaction-based polls.', - commandPollExtended: { - extendedHelp: 'Separate your options using commas.', - examples: ['Make an anime channel, Make a gaming channel, Make a serious-discussion channel'] - }, - commandPollReactionLimit: "Please don't add emojis while I am reacting!", - commandVoteDescription: 'Simplified reaction-based vote.', - commandVoteExtended: { - examples: ['Should I implement the #anime channel?'] - }, - commandTopInvitesDescription: 'Shows the top 10 most used invites for this server', - commandTopInvitesExtended: { - extendedHelp: "Use this to get some server insights if your server doesn't have access to Discord's official server insights." - }, - commandTopInvitesNoInvites: 'There are no invites, or none of them have been used!', - commandTopInvitesTop10InvitesFor: ({ guild }) => `Top 10 invites for ${guild}`, - commandTopInvitesEmbedData: { - channel: 'Channel', - link: 'Link', - createdAt: 'Date Created', - createdAtUnknown: 'Creation date unknown', - expiresIn: 'Expires in', - neverExpress: 'Never', - temporary: 'Temporary invite', - uses: 'Uses' - }, - commandUrbanDescription: 'Check the definition of a word on UrbanDictionary.', - commandUrbanExtended: { - extendedHelp: 'What does "spam" mean?', - explainedUsage: [ - ['Word', 'The word or phrase you want to get the definition from.'], - ['Page', 'Defaults to 1, the page you wish to read.'] - ], - examples: ['spam'] - }, - commandWhoisDescription: 'Who are you?', - commandWhoisExtended: { - extendedHelp: 'Gets information on any server member. Also known as `userinfo` in many other bots.' - }, - commandFollowageDescription: 'Check how long a Twitch user has been following a channel.', - commandFollowageExtended: { - extendedHelp: 'Just... that.', - examples: ['dallas cohhcarnage'] - }, - commandTwitchDescription: 'Check the information about a Twitch profile.', - commandTwitchExtended: { - extendedHelp: 'Really, just that.', - examples: ['riotgames'] - }, - commandTwitchSubscriptionDescription: 'Manage the subscriptions for your server.', - commandTwitchSubscriptionExtended: { - extendedHelp: [ - 'Manage the subscriptions for this server.', - '__Online Notifications__', - 'For content, the best way is writing `--embed`, the notifications will then show up in MessageEmbeds with all available data.', - 'Alternatively you can set your own content and it will post as a regular message.', - 'This content can contain some parameters that will be replaced with Twitch data:', - "- `%TITLE%` for the stream's title", - '- `%VIEWER_COUNT%` for the amount of current viewers,', - '- `%GAME_NAME%` for the title being streamed', - "- `%GAME_ID%` for the game's ID as seen by Twitch", - '- `%LANGUAGE%` for the language the stream is in', - "- `%USER_ID%` for the streamer's ID as seen by Twitch", - "- and `%USER_NAME%` for the Streamer's twitch username.", - '', - '__Offline Notifications__', - "For offline events none of the variables above are available and you'll have to write your own content.", - 'You can still use the `--embed` flag for the notification to show in a nice Twitch-purple MessageEmbed.' - ], - explainedUsage: [ - ['streamer', 'The Twitch username of the streamer to get notifications for.'], - ['channel', 'A Discord channel where to post the notifications in.'], - ['status', `The status that the Twitch streamer should get for an notification, one of online or offline.`], - ['content', 'The message to send in Discord chat. Refer to extended help above for more information.'] - ], - examples: [ - 'add favna #twitch online --embed', - 'add favna #twitch online %USER_NAME% went live | %TITLE%', - 'remove kyranet #twitch online', - 'reset kyranet', - 'reset', - 'show kyranet', - 'show' - ], - multiline: true - }, - commandWikipediaDescription: 'Search something through Wikipedia.', - commandWikipediaExtended: { - extendedHelp: - 'In NSFW channels I will also add the page image. This restriction is in place because Wikipedia has NSFW images for NSFW pages as they have to be accurate (i.e. diseases or human body parts).', - reminder: 'Most Wikipedia page titles are case sensitive. Some celeberties will have lowercase redirects, but not many.' - }, - commandYoutubeDescription: 'Search something through YouTube.', - commandYoutubeExtended: { - extendedHelp: `If I have the ${this.PERMISSIONS.MANAGE_MESSAGES} ${this.PERMISSIONS.ADD_REACTIONS} permissions then I will provide the option to navigate through the top 10 results.` - }, - - /** - * ################ - * GOOGLE COMMANDS - */ - - commandCurrentTimeDescription: 'Gets the current time in any location on the world', - commandCurrentTimeExtended: { - extendedHelp: [ - 'This command uses Google Maps to get the coordinates of the place.', - 'Once this command has the coordinates, it queries TimezoneDB to get the time data.' - ], - explainedUsage: [['location', 'The locality, governing, country or continent to check the time for.']], - examples: ['Antarctica', 'Arizona'], - multiline: true - }, - commandCurrentTimeLocationNotFound: 'I am sorry, but I could not find time data for that location.', - commandCurrentTimeTitles: ({ dst }) => ({ - currentTime: 'Current Time', - currentDate: 'Current Date', - country: 'Country', - gmsOffset: 'GMT Offset', - dst: `**DST**: ${dst}` - }), - commandCurrentTimeDst: 'Does not observe DST right now', - commandCurrentTimeNoDst: 'Observes DST right now', - commandGsearchDescription: 'Find your favourite things on Google', - commandGsearchExtended: { - extendedHelp: `This command queries the powerful Google Search engine to find websites for your query. For images please use the \`gimage\` command.`, - explainedUsage: [['query', 'The thing you want to find on Google']], - examples: ['Discord', 'Skyra'] - }, - commandGimageDescription: 'Find your favourite images on Google', - commandGimageExtended: { - extendedHelp: `This command queries the powerful Google Search engine to find images for your query. For regular web results please use the \`gsearch\` command.`, - explainedUsage: [['query', 'The image you want to find on Google']], - examples: ['Discord', 'Skyra'], - reminder: - 'This command has been marked as NSFW because it is unavoidable that when you query explicit content, you will get explicit results.' - }, - commandLmgtfyDescription: 'Annoy another user by sending them a LMGTFY (Let Me Google That For You) link.', - commandLmgtfyExtended: { - explainedUsage: [['query', 'The query to google']] - }, - commandWeatherDescription: 'Check the weather status in a location.', - commandWeatherExtended: { - extendedHelp: [ - 'This command uses Google Maps to get the coordinates of the place.', - 'Once this command got the coordinates, it queries DarkSky to retrieve information about the weather.' - ], - explainedUsage: [['city', 'The locality, governing, country or continent to check the weather from.']], - examples: ['Antarctica', 'Arizona'], - reminder: 'Temperature is in **Celsius** by default. Use the --imperial or --fahrenheit flag to view it in **Fahrenheit**.', - multiline: true - }, - googleErrorZeroResults: 'Your request returned no results.', - googleErrorRequestDenied: 'The GeoCode API Request was denied.', - googleErrorInvalidRequest: 'Invalid request.', - googleErrorOverQueryLimit: 'Query Limit exceeded. Try again tomorrow.', - googleErrorUnknown: 'I am sorry, but I failed to get a result from Google.', - - /** - * ############# - * WEEB COMMANDS - */ - - commandWblushDescription: 'Blush with a weeb picture!', - commandWblushExtended: { - extendedHelp: 'Blush with a random weeb image!' - }, - commandWcryDescription: 'Cry to somebody with a weeb picture!', - commandWcryExtended: { - extendedHelp: 'Cry with a random weeb image!', - explainedUsage: [['user', 'The user to cry to.']], - examples: ['@Skyra'] - }, - commandWcuddleDescription: 'Cuddle somebody with a weeb picture!', - commandWcuddleExtended: { - extendedHelp: 'Unlike the original cuddle command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to cuddle with.']], - examples: ['@Skyra'] - }, - commandWdanceDescription: 'Dance with a weeb picture!', - commandWdanceExtended: { - extendedHelp: 'Dance with a random weeb image!' - }, - commandWhugDescription: 'Hug somebody with a weeb picture!', - commandWhugExtended: { - extendedHelp: 'Unlike the original hug command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to give the hug.']], - examples: ['@Skyra'] - }, - commandWkissDescription: 'Kiss somebody with a weeb picture!', - commandWkissExtended: { - extendedHelp: 'Kiss somebody with a random weeb image!', - explainedUsage: [['user', 'The user to give the kiss to.']], - examples: ['@Skyra'] - }, - commandWlickDescription: 'Lick somebody with a weeb picture!', - commandWlickExtended: { - extendedHelp: 'Lick somebody with a random weeb image!', - explainedUsage: [['user', 'The user to lick.']], - examples: ['@Skyra'] - }, - commandWnomDescription: 'Nom nom with a 🍞!', - commandWnomExtended: { - extendedHelp: "Nom nom nom! Wha~... I'm busy eating!" - }, - commandWnekoDescription: 'Human kittens!', - commandWnekoExtended: { - extendedHelp: `Unlike the original kitten command, this one displays random weeb images, the difference is that they're weebs... and humans, enjoy!` - }, - commandWpatDescription: "Pats somebody's head!", - commandWpatExtended: { - extendedHelp: "Pat somebody's head with a random weeb image!", - explainedUsage: [['user', 'The user to pat with.']], - examples: ['@Skyra'] - }, - commandWpoutDescription: 'I feel somebody... mad', - commandWpoutExtended: { - extendedHelp: 'Show your expression with a random weeb image!' - }, - commandWslapDescription: 'Slap somebody with a weeb picture!', - commandWslapExtended: { - extendedHelp: 'Unlike the original slap command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to slap.']], - examples: ['@Pete'] - }, - commandWsmugDescription: 'Smug', - commandWsmugExtended: { - extendedHelp: 'Just an anime smug face!' - }, - commandWstareDescription: '*Stares*', - commandWstareExtended: { - extendedHelp: '*Still stares at you*', - explainedUsage: [['user', 'The user to stare at.']], - examples: ['@Pete'] - }, - commandWtickleDescription: 'Give tickles to somebody with a weeb picture!', - commandWtickleExtended: { - extendedHelp: 'Tickle somebody!', - explainedUsage: [['user', 'The user to tickle.']], - examples: ['@Skyra'] - }, - commandWeebUnavailableError: 'I am sorry, but the source of all my weeb images is not available at the moment. Please try again later!', - commandWeebUnexpectedError: 'Weird! I encountered an error I should have never received!', - commandWbangDescription: 'Bang 💥🔫!', - commandWbangExtended: { - extendedHelp: 'Shoot a user with a random weeb image!', - explainedUsage: [['user', 'The user to shoot.']], - examples: ['@Skyra'] - }, - commandWbangheadDescription: "STAHP! I'm banging my head here!", - commandWbangheadExtended: { - extendedHelp: 'Bang your head with a random weeb image!' - }, - commandWbiteDescription: '*nom nom* you are delicious!', - commandWbiteExtended: { - extendedHelp: 'Bite a user with a random weeb image!', - explainedUsage: [['user', 'The user to bite.']], - examples: ['@Skyra'] - }, - commandWgreetDescription: 'Say hi! to another user', - commandWgreetExtended: { - extendedHelp: 'Greet a user with a random weeb image!', - explainedUsage: [['user', 'The user to greet.']], - examples: ['@Skyra'] - }, - commandWlewdDescription: 'Lewds! Lewds! Lewds!', - commandWlewdExtended: { - extendedHelp: 'Random lewd weeb image!' - }, - commandWpunchDescription: '*pow* 👊👊', - commandWpunchExtended: { - extendedHelp: 'Punch that annoying user with a random weeb image!', - explainedUsage: [['user', 'The user to punch.']], - examples: ['@Skyra'] - }, - commandWsleepyDescription: "I'm so sleeeeepy... *yawn*", - commandWsleepyExtended: { - extendedHelp: 'Show how sleepy you are with a random weeb image!' - }, - commandWsmileDescription: "Huh, because I'm happy. Clap along if you feel like a room without a roof", - commandWsmileExtended: { - extendedHelp: 'Show just how happy you are with a random weeb image!' - }, - commandWthumbsupDescription: 'Raise your thumb into the air in a magnificent show of approval', - commandWthumbsupExtended: { - extendedHelp: 'Raise your thumb with a random weeb image!' - }, - - /** - * ############## - * ANIME COMMANDS - */ - - commandAnimeTypes: { - tv: '📺 TV', - movie: '🎥 Movie', - ova: '📼 Original Video Animation', - special: '🎴 Special' - }, - commandAnimeInvalidChoice: "That's an invalid choice! Please try with another option.", - commandAnimeOutputDescription: ({ englishTitle, japaneseTitle, canonicalTitle, synopsis }) => - `**English title:** ${englishTitle}\n**Japanese title:** ${japaneseTitle}\n**Canonical title:** ${canonicalTitle}\n${synopsis}`, - commandAnimeNoSynopsis: 'No synopsis available for this title.', - commandAnimeEmbedData: { - type: 'Type', - score: 'Score', - episodes: 'Episode(s)', - episodeLength: 'Episode length', - ageRating: 'Age rating', - firstAirDate: 'First air date', - watchIt: 'Watch it here:', - stillAiring: 'Still airing' - }, - commandMangaOutputDescription: ({ englishTitle, japaneseTitle, canonicalTitle, synopsis }) => - `**English title:** ${englishTitle}\n**Japanese title:** ${japaneseTitle}\n**Canonical title:** ${canonicalTitle}\n${synopsis}`, - commandMangaTypes: { - manga: '📘 Manga', - novel: '📕 Novel', - manhwa: '🇰🇷 Manhwa', - oneShot: '☄ One Shot', - special: '🎴 Special' - }, - commandMangaEmbedData: { - ageRating: 'Age Rating', - firstPublishDate: 'First published on', - readIt: 'Read it here:', - score: 'Score', - type: 'Subtype', - none: 'None' - }, - commandWaifuFooter: 'Powered by thiswaifudoesnotexist.net', - - /** - * ##################### - * ANNOUNCEMENT COMMANDS - */ - - commandSubscribeNoRole: 'This server does not have a configured announcement role.', - commandSubscribeSuccess: ({ role }) => `Successfully granted the role: **${role}**`, - commandUnsubscribeSuccess: ({ role }) => `Successfully removed the role: **${role}**`, - commandSubscribeNoChannel: 'This server does not have a configured announcement channel.', - commandAnnouncement: ({ role }) => `**New announcement for** ${role}`, - commandAnnouncementSuccess: 'Successfully posted a new announcement.', - commandAnnouncementCancelled: 'Cancelled the message.', - commandAnnouncementPrompt: 'This will be the message sent in the announcement channel. Are you OK with this?', - commandAnnouncementEmbedMentions: ({ header }) => `${header}:`, - commandAnnouncementEmbedMentionsWithMentions: ({ header, mentions }) => `${header}, and mentioning: ${mentions}:`, - - /** - * ################ - * GENERAL COMMANDS - */ - - commandInviteDescription: 'Shows the invite link to add Skyra to your server.', - commandInviteExtended: { - extendedHelp: - 'If you would like to get a link where Skyra will not ask for any permissions add either `noperms`, `--noperms` or `--nopermissions` to the command.', - examples: ['', 'noperms', '--noperms', '--nopermissions'] - }, - commandInvitePermissionInviteText: 'Invite Skyra to your server', - commandInvitePermissionSupportServerText: 'Join Support Server', - commandInvitePermissionsDescription: - "Don't be afraid to uncheck some permissions, I will let you know if you're trying to run a command without permissions.", - commandInfoBody: [ - `Skyra ${VERSION} is a multi-purpose Discord Bot designed to run the majority of tasks with a great performance and constant 24/7 uptime.`, - "She is built on top of Klasa, a 'plug-and-play' framework built on top of the Discord.js library.", - '', - 'Skyra features:', - '• Advanced Moderation with temporary actions included', - '• Announcement management', - '• Fully configurable', - '• Message logs, member logs, and mod logs', - '• Multilingual', - '• Profiles and levels, with leaderboards and social management', - '• Role management', - '• Weeb commands (+10)!', - 'And more!' - ], - commandHelpData: ({ titleDescription, usage, extendedHelp, footerName }) => ({ - title: `${titleDescription}`, - usage: `📝 | ***Command Usage***\n\`${usage}\`\n`, - extended: `🔍 | ***Extended Help***\n${extendedHelp}`, - footer: `Command help for ${footerName}` - }), - commandSupportEmbedTitle: ({ username }) => `Looking for help, ${username}?`, - commandSupportEmbedDescription: - "Then you should probably join [Skyra's Lounge](https://join.skyra.pw)! There, you can receive support by the developers and other members of the community!", - - /** - * ##################### - * DEVELOPERS COMMANDS - */ - - commandYarnDescription: 'Responds with information on a NodeJS package using the Yarn package registry', - commandYarnExtended: { - extendedHelp: `This is for NodeJS developers who want to quickly find information on a package published to [npm](https://npmjs.com)`, - explainedUsage: [['package', 'The name of the package to search for, has to be an exact match']], - examples: ['@skyra/char', '@skyra/saelem', '@skyra/eslint-config'] - }, - commandYarnNoPackage: `${REDCROSS} I am sorry, but you have to give me the name of a package to look up.`, - commandYarnUnpublishedPackage: ({ pkg }) => `What a silly developer who made ${pkg}! They unpublished it!`, - commandYarnPackageNotFound: ({ pkg }) => `I'm sorry, but I could not find any package by the name of \`${pkg}\` in the registry.`, - commandYarnEmbedDescriptionAuthor: ({ author }) => `❯ Author: ${author}`, - commandYarnEmbedDescriptionMaintainers: `❯ Maintainers: `, - commandYarnEmbedDescriptionLatestVersion: ({ latestVersionNumber }) => `❯ Latest version: **${latestVersionNumber}**`, - commandYarnEmbedDescriptionLicense: ({ license }) => `❯ License: **${license}**`, - commandYarnEmbedDescriptionMainFile: ({ mainFile }) => `❯ Main File: **${mainFile}**`, - commandYarnEmbedDescriptionDateCreated: ({ dateCreated }) => `❯ Date Created: **${dateCreated}**`, - commandYarnEmbedDescriptionDateModified: ({ dateModified }) => `❯ Date Modified: **${dateModified}**`, - commandYarnEmbedDescriptionDeprecated: ({ deprecated }) => `❯ Deprecation Notice: **${deprecated}**`, - commandYarnEmbedDescriptionDependenciesLabel: '__*Dependencies:*__', - commandYarnEmbedDescriptionDependenciesNoDeps: `No dependencies ${GREENTICK}!`, - commandYarnEmbedMoreText: 'more...', - - /** - * ############## - * FUN COMMANDS - */ - - command8ballOutput: ({ author, question, response }) => `🎱 Question by ${author}: *${question}*\n${response}`, - command8ballQuestions: { - When: 'when', - What: 'what', - HowMuch: 'how much', - HowMany: 'how many', - Why: 'why', - Who: 'who' - }, - command8ballWhen: ['Soon™', 'Maybe tomorrow.', 'Maybe next year...', 'Right now.', 'In a few months.'], - command8ballWhat: ['A plane.', 'What? Ask again.', 'A gift.', 'Nothing.', 'A ring.', 'I do not know, maybe something.'], - command8ballHowMuch: [ - 'A lot.', - 'A bit.', - 'A few.', - 'Ask me tomorrow.', - 'I do not know, ask a physicist.', - 'Nothing.', - `Within ${random(10)} and ${random(1000)}L.`, - `${random(10)}e${random(1000)}L.`, - "2 or 3 liters, I don't remember.", - 'Infinity.', - '1010 liters.' - ], - command8ballHowMany: [ - 'A lot.', - 'A bit.', - 'A few.', - 'Ask me tomorrow.', - "I don't know, ask a physicist.", - 'Nothing.', - `Within ${random(10)} and ${random(1000)}.`, - `${random(10)}e${random(1000)}.`, - '2 or 3, I do not remember.', - 'Infinity', - '1010.' - ], - command8ballWhy: [ - 'Maybe genetics.', - 'Because somebody decided it.', - 'For the glory of satan, of course!', - 'I do not know, maybe destiny.', - 'Because I said so.', - 'I have no idea.', - 'Ask the owner of this server.', - 'Ask again.', - 'To get to the other side.', - 'It says so in the Bible.' - ], - command8ballWho: [ - 'A human.', - 'A robot.', - 'An airplane.', - 'A bird.', - 'A carbon composition.', - 'A bunch of zeroes and ones.', - 'I have no clue, is it material?', - 'That is not logical.' - ], - command8ballElse: [ - 'Most likely.', - 'Nope.', - 'YES!', - 'Maybe.', - 'As I see it, yes', - 'Ask me tomorrow.', - "I don't know, ask a physicist.", - 'Better not tell you now.', - 'Don’t count on it.', - 'It is certain.', - 'It is decidedly so.', - 'My sources say no.', - 'Outlook not so good.', - 'Outlook good.', - 'Reply hazy, try again.', - 'Signs point to yes.', - 'Very doubtful.', - 'Without a doubt.', - 'Yes – definitely.', - 'You may rely on it.' - ], - - commandCatfactTitle: 'Cat Fact', - commandChoiceOutput: ({ user, word }) => `🕺 *Eeny, meeny, miny, moe, catch a tiger by the toe...* ${user}, I choose:${codeBlock('', word)}`, - commandChoiceMissing: 'Please write at least two options separated by comma.', - commandChoiceDuplicates: ({ words }) => `Why would I accept duplicated words? '${words}'.`, - commandDiceOutput: ({ result }) => `You rolled the dice! You got: **${result}**`, - commandDiceRollsError: 'Amount of rolls must be a number between 1 and 1024.', - commandDiceSidesError: 'Amount of sides must be a number between 3 and 1024.', - commandEscaperopeOutput: ({ user }) => `**${user}** used **Escape Rope**`, - commandLoveLess45: 'Try again next time...', - commandLoveLess75: 'Good enough!', - commandLoveLess100: 'Good match!', - commandLove100: 'Perfect match!', - commandLoveItself: 'You are a special creature and you should love yourself more than anyone <3', - commandLoveResult: 'Result', - commandMarkovTimer: ({ timer }) => `Processed in ${timer}.`, - commandMarkovNoMessages: 'The channel or user has no messages.', - commandNorrisOutput: 'Chuck Norris', - commandRateOutput: ({ author, userToRate, rate, emoji }) => `**${author}**, I would give **${userToRate}** a **${rate}**/100 ${emoji}`, - commandRateMyself: ['. I love myself a lot 😊', 'myself'], - commandRateOwners: ['. I love my developers a lot 🥰', 'my developers'], - commandPunError: 'Something went wrong. Try again later.', - commandXkcdComics: ({ amount }) => `There are only ${amount} comics.`, - commandXkcdNotfound: 'I have searched far and wide, but I got no luck finding this comic, try again later or try another!', - - /** - * ############## - * GAMES COMMANDS - */ - - commandGamesSkyra: 'I am sorry, I know you want to play with me, but if I do, I will not be able to help other people! 💔', - commandGamesBot: 'I am sorry, but I do not think they would like to stop doing what they are doing and play with humans.', - commandGamesSelf: 'You must be so sad to play against yourself. Try again with another user.', - commandGamesProgress: 'I am sorry, but there is a game in progress in this channel, try again when it finishes.', - commandGamesNoPlayers: ({ prefix }) => `Please specify some tributes to play the Hunger Games, like so: \`${prefix}hg Bob, Mark, Jim, Kyra\``, - commandGamesTooManyOrFew: ({ min, max }) => `I am sorry but the amount of players is less than ${min} or greater than ${max}.`, - commandGamesRepeat: 'I am sorry, but a user cannot play twice.', - commandGamesPromptTimeout: 'I am sorry, but the challengee did not reply on time.', - commandGamesPromptDeny: 'I am sorry, but the challengee refused to play.', - commandGamesTimeout: '**The match concluded in a draw due to lack of a response (60 seconds)**', - commandC4Prompt: ({ challenger, challengee }) => - `Dear ${challengee}, you have been challenged by ${challenger} in a Connect-Four match. Reply with **yes** to accept!`, - commandC4Start: ({ player }) => `Let's play! Turn for: **${player}**.`, - commandC4GameColumnFull: 'This column is full. Please try another. ', - commandC4GameWin: ({ user }) => `${user} (red) won!`, - commandC4GameWinTurn0: ({ user }) => `${user} (blue) won!`, - commandC4GameDraw: 'This match concluded in a **draw**!', - commandC4GameNext: ({ user }) => `Turn for: ${user} (red).`, - commandC4GameNextTurn0: ({ user }) => `Turn for: ${user} (blue).`, - commandC4Description: 'Play Connect-Four with somebody.', - commandC4Extended: { - extendedHelp: [ - 'This game is best played on PC.', - 'Connect Four is a two-player connection game in which the players first choose a color and then take turns dropping colored discs from the top into a seven-column, six-row vertically suspended grid.' - ], - multiline: true - }, - commandCoinFlipDescription: 'Flip a coin!', - commandCoinFlipExtended: { - extendedHelp: [ - 'Flip a coin. If you guess the side that shows up, you get back your wager, doubled.', - "If you don't, you lose your wager.", - "You can also run a cashless flip, which doesn't cost anything, but also doesn't reward you with anything.", - "Now get those coins flippin'." - ], - examples: ['heads 50', 'tails 200'], - multiline: true - }, - commandCoinFlipInvalidCoinname: ({ arg }) => `Excuse me, but ${arg} is not a coin face!`, - commandCoinFlipCoinnames: ['Heads', 'Tails'], - commandCoinFlipWinTitle: 'You won!', - commandCoinFlipLoseTitle: 'You lost.', - commandCoinFlipNoguessTitle: 'You flipped a coin.', - commandCoinFlipWinDescription: ({ result }) => `The coin was flipped, and it showed ${result}. You got it right!`, - commandCoinFlipWinDescriptionWithWager: ({ result, wager }) => - `The coin was flipped, and it showed ${result}. You guessed correctly and won ${wager} ${SHINY}!`, - commandCoinFlipLoseDescription: ({ result }) => `The coin was flipped, and it showed ${result}. You didn\'t guess corectly.`, - commandCoinFlipLoseDescriptionWithWager: ({ result, wager }) => - `The coin was flipped, and it showed ${result}. You didn\'t guess corectly and lost ${wager} ${SHINY}.`, - commandCoinFlipNoguessDescription: ({ result }) => `The coin was flipped, and it showed ${result}.`, - commandHigherLowerDescription: 'Play a game of Higher/Lower', - commandHigherLowerExtended: { - extendedHelp: [ - 'Higher/Lower is a game of luck.', - "I will pick a number and you'll have to guess if the next number I pick will be **higher** or **lower** than the current one, using the ⬆ or ⬇ emojis.", - 'Your winnings increase as you progress through the rounds, and you can cashout any time by pressing the 💰 emoji.', - 'Be warned though! The further you go, the more chances you have to lose the winnings.' - ], - multiline: true - }, - commandHigherLowerLoading: `${LOADING} Starting a new game of Higher/Lower.`, - commandHigherLowerNewround: 'Alright. Starting new round.', - commandHigherLowerEmbed: ({ turn, number }) => ({ - title: `Higher or Lower? | Turn ${turn}`, - description: `Your number is ${number}. Will the next number be higher or lower?`, - footer: 'The game will expire in 3 minutes, so act fast!' - }), - commandHigherLowerLose: ({ number, losses }) => ({ - title: 'You lost!', - description: `You didn't quite get it. The number was ${number}. You lost ${losses} ${SHINY}.`, - footer: 'Better luck next time!' - }), - commandHigherLowerWin: ({ potentials, number }) => ({ - title: 'You won!', - description: `The number was ${number}. Want to continue? With another attempt, you can win ${potentials} ${SHINY}!`, - footer: "Act fast! You don't have much time." - }), - commandHigherLowerCancel: ({ username }) => ({ - title: 'Game cancelled by choice', - description: `Thanks for playing, ${username}! I'll be here when you want to play again.` - }), - commandHigherLowerCashout: ({ amount }) => `Paid out ${amount} ${SHINY} to your account. Hope you had fun!`, - commandHungerGamesResultHeaderBloodbath: () => 'Bloodbath', - commandHungerGamesResultHeaderSun: ({ game }) => `Day ${game.turn}`, - commandHungerGamesResultHeaderMoon: ({ game }) => `Night ${game.turn}`, - commandHungerGamesResultDeaths: ({ deaths }) => `**${deaths} cannon shot can be heard in the distance.**`, - commandHungerGamesResultDeathsPlural: ({ deaths }) => `**${deaths} cannon shots can be heard in the distance.**`, - commandHungerGamesResultProceed: 'Proceed?', - commandHungerGamesStop: 'Game finished by choice! See you later!', - commandHungerGamesWinner: ({ winner }) => `And the winner is... ${winner}!`, - commandHungerGamesDescription: 'Play Hunger Games with your friends!', - commandHungerGamesExtended: { - extendedHelp: 'Enough discussion, let the games begin!', - examples: ['Skyra, Katniss, Peeta, Clove, Cato, Johanna, Brutus, Blight'] - }, - commandSlotmachineDescription: `I bet 100 ${SHINY}'s you ain't winning this round.`, - commandSlotmachineExtended: { - extendedHelp: `Spin a slot machine of 3 reels and gamble your shinies for larger rewards.`, - explainedUsage: [['Amount', `Either 50, 100, 200, 500, or even, 1000 ${SHINY} to bet.`]], - reminder: 'You will receive at least 5 times the amount (cherries/tada) at win, and up to 24 times (seven, diamond without skin).' - }, - commandSlotmachinesWin: ({ roll, winnings }) => `**You rolled:**\n${roll}\n**Congratulations!**\nYou won ${winnings}${SHINY}!`, - commandSlotmachinesLoss: ({ roll }) => `**You rolled:**\n${roll}\n**Mission failed!**\nWe'll get em next time!`, - commandSlotmachineCanvasTextWon: 'You won', - commandSlotmachineCanvasTextLost: 'You lost', - commandSlotmachineTitles: { - previous: 'Previous', - new: 'New' - }, - commandTicTacToeDescription: 'Play Tic-Tac-Toe with somebody.', - commandTicTacToeExtended: { - extendedHelp: [ - 'Tic-tac-toe (also known as noughts and crosses or Xs and Os) is a paper-and-pencil game for two players, X and O, who take turns marking the spaces in a 3×3 grid.', - 'The player who succeeds in placing three of their marks in a horizontal, vertical, or diagonal row wins the game.' - ], - multiline: true - }, - commandTicTacToePrompt: ({ challenger, challengee }) => - `Dear ${challengee}, you have been challenged by ${challenger} in a Tic-Tac-Toe match. Reply with **yes** to accept!`, - commandTicTacToeTurn: ({ icon, player, board }) => `(${icon}) Turn for ${player}!\n${board}`, - commandTicTacToeWinner: ({ winner, board }) => `Winner is... ${winner}!\n${board}`, - commandTicTacToeDraw: ({ board }) => `This match concluded in a **draw**!\n${board}`, - commandTriviaDescription: 'Play a game of Trivia.', - commandTriviaExtended: { - extendedHelp: [ - 'Answer questions of trivia here, with categories ranging from books to mythology! (powered by OpenTDB)', - '', - `**Categories**: ${Object.keys(CATEGORIES).join(', ')}` - ], - explainedUsage: [ - ['category', 'The category questions are asked from.'], - ['type', 'The type of question asked: can be boolean (true/false) or multiple choice.'], - ['difficulty', 'The difficulty level of the questions asked.'], - ['duration', 'The amount of time you get to answer.'] - ], - examples: ['trivia history.', 'trivia books multiple easy.', 'trivia videogames 45.'], - multiline: true - }, - commandTriviaInvalidCategory: 'Invalid category: Please use `Skyra, help trivia` for a list of categories.', - commandTriviaActiveGame: 'A game of trivia is already being played in this channel', - commandTriviaIncorrect: ({ attempt }) => `I am sorry, but **${attempt}** is not the correct answer. Better luck next time!`, - commandTriviaNoAnswer: ({ correctAnswer }) => `Looks like nobody got it! The right answer was **${correctAnswer}**.`, - commandTriviaEmbedTitles: { - trivia: 'Trivia', - difficulty: 'Difficulty' - }, - commandTriviaWinner: ({ winner, correctAnswer }) => `We have a winner! ${winner} had a right answer with **${correctAnswer}**!`, - commandVaultDescription: `Store your ${SHINY}'s securily in a vault so you cannot accidentally spend them gambling.`, - commandVaultExtended: { - extendedHelp: [ - 'This is for the greedy spenders among us that tend to play a bit too much at the slot machine or spin the wheel of fortune.', - `You need to actively withdraw ${SHINY}'s from your vault before they can be spend gambling.` - ], - explainedUsage: [ - ['action', 'The action to perform: **withdraw** to withdraw from your vault or **deposit** to deposit into your vault.'], - ['money', `The amount of ${SHINY}'s to withdraw or deposit.`] - ], - examples: ['deposit 10000.', 'withdraw 10000.'], - multiline: true - }, - commandVaultEmbedData: ({ coins }) => ({ - depositedDescription: `Deposited ${coins} ${SHINY} from your account balance into your vault.`, - withdrewDescription: `Withdrew ${coins} ${SHINY}\ from your vault.`, - showDescription: 'Your current account and vault balance are:', - accountMoney: 'Account Money', - accountVault: 'Account Vault' - }), - commandVaultInvalidCoins: 'I am sorry, but that is an invalid amount of coins. Be sure it is a positive number!', - commandVaultNotEnoughMoney: ({ money }) => - `I am sorry, but you do not have enough money to make that deposit! Your current money balance is ${money} ${SHINY}`, - commandVaultNotEnoughInVault: ({ vault }) => - `I am sorry, but you do not have enough money in your vault to make that withdrawal! Your current vault balance is ${vault} ${SHINY}`, - commandWheelOfFortuneDescription: 'Gamble your shinies by spinning a wheel of fortune', - commandWheelOfFortuneExtended: { - extendedHelp: `You can lose 0.1, 0.2, 0.3 or 0.5 times your input or win 1.2, 1.5, 1.7 or 2.4 times your input` - }, - commandWheelOfFortuneTitles: { - previous: 'Previous', - new: 'New' - }, - commandWheelOfFortuneCanvasTextWon: 'You won', - commandWheelOfFortuneCanvasTextLost: 'You lost', - gamesNotEnoughMoney: ({ money }) => - `I am sorry, but you do not have enough money to pay your bet! Your current account balance is ${money} ${SHINY}`, - gamesCannotHaveNegativeMoney: `You cannot have a negative amount of ${SHINY}s`, - - /** - * ################# - * GIVEAWAY COMMANDS - */ - - giveawayTime: 'A giveaway must last at least 10 seconds.', - giveawayTimeTooLong: "Hey! That's an incredibly long time to keep track of!", - giveawayEndsAt: 'Ends at:', - giveawayDuration: ({ time }) => `This giveaway ends in **${this.duration(time)}**! React to this message with 🎉 to join.`, - giveawayTitle: '🎉 **GIVEAWAY** 🎉', - giveawayLastchance: ({ time }) => `**LAST CHANCE**! Remaining time: **${this.duration(time)}**. React to this message with 🎉 to join.`, - giveawayLastchanceTitle: '🎉 **LAST CHANCE GIVEAWAY** 🎉', - giveawayEnded: ({ winners }) => `Winner: ${winners}`, - giveawayEndedPlural: ({ winners }) => `Winners: ${winners}`, - giveawayEndedNoWinner: 'No winner...', - giveawayEndedAt: 'Ended at:', - giveawayEndedTitle: '🎉 **GIVEAWAY ENDED** 🎉', - giveawayEndedMessage: ({ winners, title }) => `Congratulations ${winners.join(' ')}! You won the giveaway **${title}**`, - giveawayEndedMessageNoWinner: ({ title }) => `The giveaway **${title}** ended without enough participants.`, - giveawayScheduled: ({ scheduledTime }) => `The giveaway will start in ${this.duration(scheduledTime)}.`, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandNickSet: ({ nickname }) => `Changed the nickname to **${nickname}**.`, - commandNickCleared: 'Nickname cleared.', - commandPermissionNodesHigher: `${REDCROSS} You cannot modify nor preview the permission nodes for this target.`, - commandPermissionNodesInvalidType: `${REDCROSS} Invalid type, expected either of \`allow\` or \`deny\`.`, - commandPermissionNodesAdd: `${GREENTICK} Successfully added the command to the permission node.`, - commandPermissionNodesNodeNotExists: `${REDCROSS} The selected permission node does not exist.`, - commandPermissionNodesCommandNotExists: `${REDCROSS} The selected command does not exist in the permision node.`, - commandPermissionNodesRemove: `${GREENTICK} Successfully removed the command from the permission node.`, - commandPermissionNodesReset: `${GREENTICK} Successfully removed all commands from the permission node.`, - commandPermissionNodesShowName: ({ name }) => `Permissions for: __${name}__`, - commandPermissionNodesShowAllow: ({ allow }) => `**Allow**: ${allow}`, - commandPermissionNodesShowDeny: ({ deny }) => `**Deny**: ${deny}`, - commandTriggersNotype: 'You need to insert a trigger type (**alias**|**reaction**)', - commandTriggersNooutput: 'You need to insert the trigger output.', - commandTriggersInvalidreaction: 'This reaction does not seem valid for me, either it is not valid unicode or I do not have access to it.', - commandTriggersInvalidalias: 'There is no command like this.', - commandTriggersRemoveNottaken: 'There is no trigger with this input.', - commandTriggersRemove: 'Successfully removed this trigger.', - commandTriggersAddTaken: 'There is already a trigger with this input.', - commandTriggersAdd: 'Successfully added the trigger.', - commandTriggersListEmpty: 'The trigger list for this guild is empty.', - commandGuildInfoTitles: { - CHANNELS: 'Channels', - MEMBERS: 'Members', - OTHER: 'Other' - }, - commandGuildInfoRoles: ({ roles }) => `**Roles**\n\n${roles}`, - commandGuildInfoNoroles: 'Roles? Where? There is no other than the `@everyone` role!', - commandGuildInfoChannels: ({ text, voice, categories, afkChannelText }) => [ - `• **${text}** Text, **${voice}** Voice, **${categories}** categories.`, - `• AFK: ${afkChannelText}` - ], - commandGuildInfoChannelsAfkChannelText: ({ afkChannel, afkTime }) => `**<#${afkChannel}>** after **${afkTime / 60}**min`, - commandGuildInfoMembers: ({ count, owner }) => [`• **${count}** members`, `• Owner: **${owner.tag}**`, ` (ID: **${owner.id}**)`], - commandGuildInfoOther: ({ size, region, createdAt, verificationLevel }) => [ - `• Roles: **${size}**`, - `• Region: **${region}**`, - `• Created at: **${timestamp.displayUTC(createdAt)}** (UTC - YYYY/MM/DD)`, - `• Verification Level: **${this.HUMAN_LEVELS[verificationLevel]}**` - ], - commandRoleInfoTitles: { PERMISSIONS: 'Permissions' }, - commandRoleInfoData: ({ role, hoisted, mentionable }) => [ - `ID: **${role.id}**`, - `Name: **${role.name}**`, - `Color: **${role.hexColor}**`, - `Hoisted: **${hoisted}**`, - `Position: **${role.rawPosition}**`, - `Mentionable: **${mentionable}**` - ], - commandRoleInfoAll: 'All Permissions granted.', - commandRoleInfoNoPermissions: 'Permissions not granted.', - commandFilterUndefinedWord: 'You must write what you want me to filter.', - commandFilterAlreadyFiltered: `This word is already filtered.`, - commandFilterNotFiltered: `This word is not filtered.`, - commandFilterAdded: ({ word }) => `${GREENTICK} Success! Added the word ${word} to the filter.`, - commandFilterRemoved: ({ word }) => `${GREENTICK} Success! Removed the word ${word} from the filter.`, - commandFilterReset: `${GREENTICK} Success! The filter has been reset.`, - commandFilterShowEmpty: 'The list of filtered words is empty!', - commandFilterShow: ({ words }) => `Filtered words in this server: ${words}`, - - /** - * ################################# - * MANAGEMENT/CONFIGURATION COMMANDS - */ - - commandManageCommandAutoDeleteTextChannel: - 'You must input a valid text channel, people cannot use commands in a voice or a category channel!', - commandManageCommandAutoDeleteRequiredDuration: 'You must specify an amount of seconds for the command to be automatically deleted.', - commandManageCommandAutoDeleteShowEmpty: 'There are no command autodelete configured right now.', - commandManageCommandAutoDeleteShow: ({ codeblock }) => `All command autodeletes configured:${codeblock}`, - commandManageCommandAutoDeleteAdd: ({ channel, time }) => - `${GREENTICK} Success! All successful commands in ${channel} will be deleted after ${this.duration(time)}!`, - commandManageCommandAutoDeleteRemove: ({ channel }) => - `${GREENTICK} Success! Commands will not be automatically deleted in ${channel} anymore!`, - commandManageCommandAutoDeleteRemoveNotset: ({ channel }) => - `${REDCROSS} The channel ${channel} was not configured to automatically delete messages!`, - commandManageCommandAutoDeleteReset: 'All the command autodeletes have been reset.', - commandManageCommandChannelTextChannel: 'You must input a valid text channel, people cannot use commands in a voice or a category channel!', - commandManageCommandChannelRequiredCommand: "You must specify what command do you want to add or remove from the channel's filter.", - commandManageCommandChannelShow: ({ channel, commands }) => `List of disabled commands in ${channel}: ${commands}`, - commandManageCommandChannelShowEmpty: 'The list of disabled commands for the specified channel is empty!', - commandManageCommandChannelAddAlreadyset: 'The command you are trying to disable is already disabled!', - commandManageCommandChannelAdd: ({ channel, command }) => `Successfully disabled the command ${command} for the channel ${channel}!`, - commandManageCommandChannelRemoveNotset: ({ channel }) => `The command you are trying to enable was not disabled for ${channel}.`, - commandManageCommandChannelRemove: ({ channel, command }) => `Successfully enabled the command ${command} for the channel ${channel}!`, - commandManageCommandChannelResetEmpty: 'This channel had no disabled command, so I decided to do nothing.', - commandManageCommandChannelReset: ({ channel }) => `Successfully enabled all disabled commands in ${channel}, enjoy!`, - commandManageReactionRolesShowEmpty: 'There are no reaction roles set up in this server.', - commandManageReactionRolesAddChannel: ({ emoji, channel }) => - `${GREENTICK} Success! I will now give the role when people react with ${emoji} to any message from ${channel}!`, - commandManageReactionRolesAddPrompt: 'Listening now! Please react to a message and I will bind the reaction with the role!', - commandManageReactionRolesAddMissing: 'I waited, but you did not seem to have reacted to a message.', - commandManageReactionRolesAdd: ({ emoji, url }) => - `${GREENTICK} Success! I will now give the role when people react with ${emoji} at ${url}!`, - commandManageReactionRolesRemoveNotExists: 'The reaction role you specified does not exist.', - commandManageReactionRolesRemove: ({ emoji, url }) => - `${GREENTICK} Success! I will not longer give the role when people react with ${emoji} at ${url}!`, - commandManageReactionRolesResetEmpty: 'There were no reaction roles set up.', - commandManageReactionRolesReset: `${GREENTICK} Successfully removed all reaction roles.`, - commandSetStarboardEmojiSet: ({ emoji }) => `Successfully set a new emoji for the next star messages: ${emoji}`, - configurationTextChannelRequired: 'The selected channel is not a valid text channel, try again with another.', - configurationEquals: 'Successfully configured: no changes were made.', - commandSetIgnoreChannelsSet: ({ channel }) => `Ignoring all command input from ${channel} now.`, - commandSetIgnoreChannelsRemoved: ({ channel }) => `Listening all command input from ${channel} now.`, - commandSetImageLogsSet: ({ channel }) => `Successfully set the image logs channel to ${channel}.`, - commandSetMemberLogsSet: ({ channel }) => `Successfully set the member logs channel to ${channel}.`, - commandSetMessageLogsSet: ({ channel }) => `Successfully set the message logs channel to ${channel}.`, - commandSetModLogsSet: ({ channel }) => `Successfully set the mod logs channel to ${channel}.`, - commandSetPrefixSet: ({ prefix }) => `Successfully set the prefix to ${prefix}. Use ${prefix}setPrefix to change it again.`, - - /** - * ########################### - * MANAGEMENT/MEMBERS COMMANDS - */ - - commandStickyRolesRequiredUser: 'A user target is required for this command to work.', - commandStickyRolesRequiredRole: 'A role name is required when adding or removing a role.', - commandStickyRolesNotExists: ({ user }) => `The user ${user} does not have any sticky roles or does not have the specified one.`, - commandStickyRolesReset: ({ user }) => `Successfully removed all sticky roles from ${user}.`, - commandStickyRolesRemove: ({ user }) => `Successfully removed the specified role from ${user}.`, - commandStickyRolesAddExists: ({ user }) => `The user ${user} already had the specified role as sticky.`, - commandStickyRolesAdd: ({ user }) => `Successfully added the specified role as sticky to ${user}.`, - commandStickyRolesShowEmpty: 'There are no sticky roles to show.', - commandStickyRolesShowSingle: ({ user, roles }) => `Sticky Role(s) for **${user}**: ${roles}.`, - - /** - * ############# - * MISC COMMANDS - */ - - commandRandRedditRequiredReddit: 'You must give the name of a reddit.', - commandRandRedditInvalidArgument: `${REDCROSS} The name you gave was not a valid name for a subreddit.`, - commandRandRedditBanned: 'This reddit is banned and should not be used.', - commandRandRedditFail: 'I failed to retrieve data, are you sure you wrote the reddit correctly?', - commandRandRedditAllNsfw: 'Nothing could be posted as all retrieved posts are NSFW.', - commandRandRedditAllNsfl: 'Nothing could be posted as all retrieved posts are NSFL. You do not want to see that.', - commandRandRedditMessage: ({ title, author, url }) => `**${title}** submitted by ${author}\n${url}`, - commandRandRedditErrorPrivate: `${REDCROSS} No data could be downloaded as the subreddit is marked as private.`, - commandRandRedditErrorQuarantined: `${REDCROSS} No data could be downloaded as the subreddit is marked as quarantined.`, - commandRandRedditErrorNotFound: `${REDCROSS} No data could be downloaded as the subreddit does not exist.`, - commandRandRedditErrorBanned: `${REDCROSS} No data could be downloaded as the subreddit is marked as banned.`, - commandRedditUserComplexityLevels: ['very low', 'low', 'medium', 'high', 'very high', 'very high'], - commandRedditUserInvalidUser: ({ user }) => `\`${user}\` is not a valid Reddit username`, - commandRedditUserQueryFailed: "Couldn't find any data for that reddit user", - commandRedditUserTitles: { - linkKarma: 'Link Karma', - commentKarma: 'Comment Karma', - totalComments: 'Total Comments', - totalSubmissions: 'Total Submissions', - commentControversiality: 'Comment Controversiality', - textComplexity: 'Text Complexity', - top5Subreddits: 'Top 5 Subreddits', - bySubmissions: 'by submission', - byComments: 'by comments', - bestComment: 'Best Comment', - worstComment: 'Worst Comment' - }, - commandRedditUserData: ({ user, timestamp }) => ({ - overviewFor: `Overview for /u/${user}`, - permalink: 'Permalink', - dataAvailableFor: 'Data is available for the past 1000 comments and submissions (Reddit API limitation)', - joinedReddit: `Joined Reddit ${timestamp}` - }), - commandSnipeEmpty: 'There are no sniped messages in this channel.', - commandSnipeTitle: 'Sniped Message', - commandUpvoteMessage: - 'Upvote me on **https://top.gg/bot/266624760782258186**, **https://botsfordiscord.com/bot/266624760782258186**, or **https://botlist.space/bot/266624760782258186** for free shinies! Remember, you can vote every 24 hours.', - commandVaporwaveOutput: ({ str }) => `Here is your converted message:\n${str}`, - - /** - * ############################# - * MODERATION/UTILITIES COMMANDS - */ - - commandPermissions: ({ username, id }) => `Permissions for ${username} (${id})`, - commandPermissionsAll: 'All Permissions', - commandFlow: ({ amount }) => `${amount} messages have been sent within the last minute.`, - commandTimeTimed: 'The selected moderation case has already been timed.', - commandTimeUndefinedTime: 'You must specify a time.', - commandTimeUnsupportedType: 'The type of action for the selected case cannot be reverse, therefore this action is unsupported.', - commandTimeNotScheduled: 'This task is not scheduled.', - commandTimeAborted: ({ title }) => `Successfully aborted the schedule for ${title}`, - commandTimeScheduled: ({ title, user, time }) => - `${GREENTICK} Successfully scheduled a moderation action type **${title}** for the user ${user.tag} (${ - user.id - }) with a duration of ${this.duration(time)}`, - - /** - * ################### - * MODERATION COMMANDS - */ - - commandSlowmodeSet: ({ cooldown }) => `The cooldown for this channel has been set to ${this.duration(cooldown)}.`, - commandSlowmodeReset: 'The cooldown for this channel has been reset.', - commandSlowmodeTooLong: `${REDCROSS} The maximum amount of time you can set is 6 hours.`, - commandTimeDescription: 'Set the timer.', - commandTimeExtended: { - extendedHelp: 'Updates the timer for a moderation case..', - explainedUsage: [ - ['cancel', 'Whether or not you want to cancel the timer.'], - ['case', 'The case you want to update'], - ['timer', 'The timer, ignored if `cancel` was defined.'] - ], - examples: ['cancel 1234', '1234 6h'] - }, - commandBanNotBannable: 'The target is not bannable for me.', - commandDehoistStarting: ({ count }) => `I will start dehoisting ${count} members...`, - commandDehoistProgress: ({ count, percentage }) => `Dehoisted ${count} members so far! (${percentage}%)`, - commandDehoistEmbed: ({ users, dehoistedMemberCount, dehoistedWithErrorsCount, errored }) => ({ - title: `Finished dehoisting ${users} members`, - descriptionNoone: 'No members were dehoisted. A round of applause for your law-abiding users!', - descriptionWithError: `${dehoistedWithErrorsCount} member was dehoisted. We also tried to dehoist an additional ${errored} member, but they errored out`, - descriptionWithMultipleErrors: `${dehoistedWithErrorsCount} members were dehoisted. We also tried to dehoist an additional ${errored} members, but they errored out`, - description: `${dehoistedMemberCount} member was dehoisted`, - descriptionMultipleMembers: `${dehoistedMemberCount} members were dehoisted`, - fieldErrorTitle: 'The users we encountered an error for:' - }), - commandKickNotKickable: 'The target is not kickable for me.', - commandLockdownLock: ({ channel }) => `The channel ${channel} is now locked.`, - commandLockdownLocking: ({ channel }) => `${LOADING} Locking the channel ${channel}... I might not be able to reply after this.`, - commandLockdownLocked: ({ channel }) => `The channel ${channel} was already locked.`, - commandLockdownUnlocked: ({ channel }) => `The channel ${channel} was not locked.`, - commandLockdownOpen: ({ channel }) => `The lockdown for the channel ${channel} has been released.`, - commandMuteLowlevel: 'I am sorry, there is no Mute role configured. Please ask an Administrator or the Guild Owner to set it up.', - commandMuteConfigureCancelled: 'Prompt aborted, the Mute role creation has been cancelled.', - commandMuteConfigure: 'Do you want me to create and configure the Mute role now?', - commandMuteConfigureToomanyRoles: 'There are too many roles (250). Please delete a role before proceeding.', - commandMuteMuted: 'The target user is already muted.', - commandMuteUserNotMuted: 'This user is not muted.', - commandMuteUnconfigured: 'This guild does not have a **Muted** role. Aborting command execution.', - commandMutecreateMissingPermission: `I need the **${this.PERMISSIONS.MANAGE_ROLES}** permission to create the role and **${this.PERMISSIONS.MANAGE_CHANNELS}** to edit the channels permissions.`, - commandRestrictLowlevel: `${REDCROSS} I'm sorry, there is no restriction role configured. Please ask an Administrator or the server owner to set it up.`, - commandPruneInvalid: `${REDCROSS} You did not specify the arguments correctly, please make sure you gave a correct limit or filter.`, - commandPruneAlert: ({ count, total }) => `Successfully deleted ${count} message from ${total}.`, - commandPruneAlertPlural: ({ count, total }) => `Successfully deleted ${count} messages from ${total}.`, - commandPruneInvalidPosition: `${REDCROSS} Position must be one of "before" or "after".`, - commandPruneInvalidFilter: `${REDCROSS} Filter must be one of "file", "author", "bot", "human", "invite", "link", or "skyra".`, - commandPruneNoDeletes: 'No message has been deleted, either no message match the filter or they are over 14 days old.', - commandPruneLogHeader: - 'The following messages have been generated by request of a moderator.\nThe date formatting is of `YYYY/MM/DD hh:mm:ss`.', - commandPruneLogMessage: ({ channel, author, count }) => `${count} message deleted in ${channel} by ${author}.`, - commandPruneLogMessagePlural: ({ channel, author, count }) => `${count} messages deleted in ${channel} by ${author}.`, - commandReasonMissingCase: 'You need to provide a case or a case range.', - commandReasonNotExists: `The selected modlog doesn't seem to exist.`, - commandReasonUpdated: ({ newReason }) => [`${GREENTICK} Updated 1 case`, ` └─ **Set its reason to:** ${newReason}`], - commandReasonUpdatedPlural: ({ entries, newReason }) => [ - `${GREENTICK} Updated ${entries.length} cases`, - ` └─ **Set their reasons to:** ${newReason}` - ], - commandToggleModerationDmToggledEnabled: `${GREENTICK} Successfully enabled moderation DMs.`, - commandToggleModerationDmToggledDisabled: `${GREENTICK} Successfully disabled moderation DMs`, - commandUnbanMissingPermission: `I will need the **${this.PERMISSIONS.BAN_MEMBERS}** permission to be able to unban.`, - commandUnmuteMissingPermission: `I will need the **${this.PERMISSIONS.MANAGE_ROLES}** permission to be able to unmute.`, - commandVmuteMissingPermission: `I will need the **${this.PERMISSIONS.MUTE_MEMBERS}** permission to be able to voice unmute.`, - commandVmuteUserNotMuted: 'This user is not voice muted.', - commandWarnDm: ({ moderator, guild, reason }) => `You have been warned by ${moderator} in ${guild} for the reason: ${reason}`, - commandWarnMessage: ({ user, log }) => `|\`🔨\`| [Case::${log}] **WARNED**: ${user.tag} (${user.id})`, - commandModerationOutput: ({ range, users }) => `${GREENTICK} Created case ${range} | ${users}.`, - commandModerationOutputPlural: ({ range, users }) => `${GREENTICK} Created cases ${range} | ${users}.`, - commandModerationOutputWithReason: ({ range, users, reason }) => - `${GREENTICK} Created case ${range} | ${users}.\nWith the reason of: ${reason}`, - commandModerationOutputWithReasonPlural: ({ range, users, reason }) => - `${GREENTICK} Created cases ${range} | ${users}.\nWith the reason of: ${reason}`, - commandModerationFailed: ({ users }) => `${REDCROSS} Failed to moderate user:\n${users}`, - commandModerationFailedPlural: ({ users }) => `${REDCROSS} Failed to moderate users:\n${users}`, - commandModerationDmFooter: 'To disable moderation DMs, write `toggleModerationDM`.', - commandModerationDmDescription: ({ guild, title }) => [ - `**❯ Server**: ${guild}`, // - `**❯ Type**: ${title}`, - `**❯ Reason**: None specified` - ], - commandModerationDmDescriptionWithReason: ({ guild, title, reason }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Reason**: ${reason}` - ], - commandModerationDmDescriptionWithDuration: ({ guild, title, duration: pDuration }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Duration**: ${this.duration(pDuration!)}`, - `**❯ Reason**: None specified` - ], - commandModerationDmDescriptionWithReasonWithDuration: ({ guild, title, reason, duration: pDuration }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Duration**: ${this.duration(pDuration!)}`, - `**❯ Reason**: ${reason}` - ], - commandModerationDays: 'days?', - - /** - * ############### - * SOCIAL COMMANDS - */ - - commandAutoRolePointsRequired: 'You must input a valid amount of points.', - commandAutoRoleUpdateConfigured: 'This role is already configured as an autorole. Use the remove type instead.', - commandAutoRoleUpdateUnconfigured: 'This role is not configured as an autorole. Use the add type instead.', - commandAutoRoleUpdate: ({ role, points, before }) => - `Updated autorole: ${role.name} (${role.id}). Points required: ${points} (before: ${before})`, - commandAutoRoleRemove: ({ role, before }) => `Removed the autorole: ${role.name} (${role.id}), which required ${before} points.`, - commandAutoRoleAdd: ({ role, points }) => `Added new autorole: ${role.name} (${role.id}). Points required: ${points}`, - commandAutoRoleListEmpty: 'There is no role configured as an autorole in this server.', - commandAutoRoleUnknownRole: ({ role }) => `Unknown role: ${role}`, - commandBalance: ({ user, amount }) => `The user ${user} has a total of ${amount}${SHINY}`, - commandBalanceSelf: ({ amount }) => `You have a total of ${amount}${SHINY}`, - commandBalanceBots: `I think they have 5 gears as much, bots don't have ${SHINY}`, - commandSocialMemberNotexists: `${REDCROSS} The member is not in this server, and is not in my database either.`, - commandSocialAdd: ({ user, amount, count }) => `${GREENTICK} Successfully added ${count} point to ${user}. Current amount: ${amount}.`, - commandSocialAddPlural: ({ user, amount, count }) => `${GREENTICK} Successfully added ${count} points to ${user}. Current amount: ${amount}.`, - commandSocialRemove: ({ user, amount, count }) => `${GREENTICK} Successfully removed ${count} point from ${user}. Current amount: ${amount}.`, - commandSocialRemovePlural: ({ user, amount, count }) => - `${GREENTICK} Successfully removed ${count} points from ${user}. Current amount: ${amount}.`, - commandSocialUnchanged: ({ user }) => `${REDCROSS} The user ${user} already had the given amount of points, no update was needed.`, - commandSocialReset: ({ user }) => `${GREENTICK} The user ${user} got his points removed.`, - commandBannerMissing: ({ type }) => `You must specify a banner id to ${type}.`, - commandBannerNotexists: ({ prefix }) => - `This banner id does not exist. Please check \`${prefix}banner list\` for a list of banners you can buy.`, - commandBannerUserlistEmpty: ({ prefix }) => `You did not buy a banner yet. Check \`${prefix}banner list\` for a list of banners you can buy.`, - commandBannerResetDefault: 'You are already using the default banner.', - commandBannerReset: 'Your banner has been reset to the default.', - commandBannerSetNotBought: 'You did not buy this banner yet.', - commandBannerSet: ({ banner }) => `|\`✅\`| **Success**. You have set your banner to: __${banner}__`, - commandBannerBought: ({ prefix, banner }) => - `You already have this banner, you may want to use \`${prefix}banner set ${banner}\` to make it visible in your profile.`, - commandBannerMoney: ({ money, cost }) => - `You do not have enough money to buy this banner. You have ${money}${SHINY}, the banner costs ${cost}${SHINY}`, - commandBannerPaymentCancelled: '|`❌`| The payment has been cancelled.', - commandBannerBuy: ({ banner }) => `|\`✅\`| **Success**. You have bought the banner: __${banner}__`, - commandBannerPrompt: - 'Reply to this message choosing an option:\n`all` to check a list of all available banners.\n`user` to check a list of all bought banners.', - commandToggleDarkModeEnabled: `${GREENTICK} Successfully enabled the dark mode.`, - commandToggleDarkModeDisabled: `${GREENTICK} Successfully disabled the dark mode.`, - commandDailyTime: ({ time }) => `Next dailies are available in ${this.duration(time)}`, - commandDailyTimeSuccess: ({ amount }) => `Yay! You earned ${amount}${SHINY}! Next dailies in: 12 hours.`, - commandDailyGrace: ({ remaining }) => [ - 'Would you like to claim the dailies early? The remaining time will be added up to a normal 12h wait period.', - `Remaining time: ${this.duration(remaining)}` - ], - commandDailyGraceAccepted: ({ amount, remaining }) => `Successfully claimed ${amount}${SHINY}! Next dailies in: ${this.duration(remaining)}`, - commandDailyGraceDenied: 'Got it! Come back soon!', - commandDailyCollect: 'Collect dailies', - commandLevel: { - level: 'Level', - experience: 'Experience', - nextIn: 'Next level in' - }, - commandDivorceSelf: 'I am sorry, but you cannot divorce yourself.', - commandDivorceNotTaken: 'Who would you divorce? You are not even taken!', - commandDivorcePrompt: 'Ooh... that sounds quite bad 💔... are you 100% sure about this?', - commandDivorceCancel: 'Oh lord. I am very glad you will continue with your partner!', - commandDivorceDm: ({ user }) => `Pardon... but... do you remember ${user}? They decided to break up with you 💔!`, - commandDivorceSuccess: ({ user }) => `Successful divorce 💔... You are no longer married to ${user}!`, - commandMarryWith: ({ users }) => `Dear, how could you forget it... You are currently married to ${this.list(users, 'and')}!`, - commandMarryNotTaken: 'Uh... I am sorry, but I am not aware of you being married... have you tried proposing to somebody?', - commandMarrySkyra: 'I am sorry, I know you love me, but I am already taken by a brave man I love 💞!', - commandMarryAelia: 'In your dreams. She is my sister, I am not letting somebody harm her!', - commandMarryBots: 'Oh no! You should not be marrying bots! They still do not understand what true love is, and they are not warm!', - commandMarrySelf: 'No! This is not how this works! You cannot marry yourself, who would you spend your life with? 💔', - commandMarryAuthorTaken: ({ author }) => - `You are already married. Is your love big enough for two people? <@${author.id}>, reply with **yes** to confirm!`, - commandMarryAuthorMultipleCancel: ({ user }) => `Cancelling. Your commitment to ${user} is admirable.`, - commandMarryTaken: () => `This user is already married to someone. Would you like to join their harem?`, - commandMarryTakenPlural: ({ count: spousesCount }) => - `This user is already married to ${spousesCount} people. Would you like to join their harem?`, - commandMarryAlreadyMarried: ({ user }) => `You are already married with ${user}, did you forget it?`, - commandMarryAuthorTooMany: ({ limit }) => `${REDCROSS} You are married to too many people, your maximum is ${limit}!`, - commandMarryTargetTooMany: ({ limit }) => - `${REDCROSS} The user you are trying to marry to is already married to too many people, their maximum is ${limit}!`, - commandMarryMultipleCancel: "Cancelling. Don't worry, you'll find someone you don't have to share!", - commandMarryPetition: ({ author, user }) => - `Fresh pair of eyes! ${author.username} is proposing to ${user.username}! 💞 <@${user.id}>, reply with **yes** to accept!`, - commandMarryNoreply: 'The user did not reply on time... Maybe it was a hard decision?', - commandMarryDenied: 'O-oh... The user rejected your proposal! 💔', - commandMarryAccepted: ({ author, user }) => `Congratulations dear ${author}! You're now officially married with ${user}! ❤`, - commandMylevel: ({ points, next, user }) => `The user ${user} has a total of ${points} points.${next}`, - commandMylevelSelf: ({ points, next }) => `You have a total of ${points} points.${next}`, - commandMylevelNext: ({ remaining, next }) => `Points for next rank: **${remaining}** (at ${next} points).`, - commandPayMissingMoney: ({ needed, has }) => `I am sorry, but you need ${needed}${SHINY} and you have ${has}${SHINY}`, - commandPayPrompt: ({ user, amount }) => `You are about to pay ${user} ${amount}${SHINY}, are you sure you want to proceed?`, - commandPayPromptAccept: ({ user, amount }) => `Payment accepted, ${amount}${SHINY} has been sent to ${user}'s profile.`, - commandPayPromptDeny: 'Payment denied.', - commandPaySelf: 'If I taxed this, you would lose money, therefore, do not try to pay yourself.', - commandSocialPayBot: 'Oh, sorry, but money is meaningless for bots, I am pretty sure a human would take advantage of it better.', - commandProfile: { - globalRank: 'Global Rank', - credits: 'Credits | Vault', - reputation: 'Reputation', - experience: 'Experience', - level: 'Level' - }, - commandRemindmeCreate: ({ id }) => `A reminder with ID \`${id}\` has been created.`, - commandRemindmeCreateNoDuration: 'You must tell me what you want me to remind you and when.', - commandRemindmeCreateNoDescription: 'Something, you did not tell me what.', - commandRemindmeDeleteNoId: 'You must give a valid ID, you can get them using the `list` sub-command.', - commandRemindmeDelete: ({ task, id }) => - `The reminder with ID \`${id}\` and with a remaining time of **${this.duration( - task.time.getTime() - Date.now() - )}** has been successfully deleted.`, - commandRemindmeListEmpty: 'You do not have any active reminder', - commandRemindmeShowFooter: ({ id }) => `ID: ${id} | Ends at:`, - commandRemindmeInvalidId: 'I am sorry, but the ID provided does not seem to be valid.', - commandRemindmeNotfound: 'I cannot find something here. The reminder either never existed or it ended.', - - commandReputationTime: ({ remaining }) => `You can give a reputation point in ${this.duration(remaining)}`, - commandReputationUsable: 'You can give a reputation point now.', - commandReputationUserNotfound: 'You must mention a user to give a reputation point.', - commandReputationSelf: 'You cannot give a reputation point to yourself.', - commandReputationBots: 'You cannot give a reputation point to bots.', - commandReputationGive: ({ user }) => `You have given a reputation point to **${user}**!`, - commandReputationsBots: 'Bots cannot have reputation points...', - commandReputationsSelf: ({ points }) => `You have a total of ${points} reputation points.`, - commandReputation: ({ count }) => `${count} reputation point`, - commandReputationPlural: ({ count }) => `${count} reputation points`, - commandReputations: ({ user, points }) => `The user ${user} has a total of ${points}.`, - commandRequireRole: 'I am sorry, but you must provide a role for this command.', - commandScoreboardPosition: ({ position }) => `Your placing position is: ${position}`, - commandSetColor: ({ color }) => `Color changed to ${color}`, - - /** - * ################## - * STARBOARD COMMANDS - */ - - commandStarNostars: 'There is no starred message.', - commandStarNoChannel: `I'm sorry, but a starboard channel hasn't been set up.`, - commandStarStats: 'Starboard Stats', - commandStarMessages: ({ count }) => `${count} message`, - commandStarMessagesPlural: ({ count }) => `${count} messages`, - commandStars: ({ count }) => `${count} star`, - commandStarsPlural: ({ count }) => `${count} stars`, - commandStarStatsDescription: ({ messages, stars }) => `${messages} starred with a total of ${stars}`, - commandStarTopstarred: 'Top Starred Posts', - commandStarTopstarredDescription: ({ medal, id, count }) => `${medal}: ${id} (${count} star)`, - commandStarTopstarredDescriptionPlural: ({ medal, id, count }) => `${medal}: ${id} (${count} stars)`, - commandStarTopreceivers: 'Top Star Receivers', - commandStarTopreceiversDescription: ({ medal, id, count }) => `${medal}: <@${id}> (${count} star)`, - commandStarTopreceiversDescriptionPlural: ({ medal, id, count }) => `${medal}: <@${id}> (${count} stars)`, - - /** - * #################### - * SUGGESTIONS COMMANDS - */ - commandSuggestDescription: 'Posts a suggestion for the server.', - commandSuggestExtended: { - extendedHelp: "Posts a suggestion to the server's suggestion channel, if configured.", - explainedUsage: [['suggestion', 'Your suggestion']], - examples: ["Let's make a music channel!"], - reminder: - 'You need to have a suggestions channel setup for this command to work. If you are an administrator, you will be given the chance to do so upon invoking the command.' - }, - commandSuggestNoSetup: ({ username }) => `I'm sorry ${username}, but a suggestions channel hasn't been set up.`, - commandSuggestNoSetupAsk: ({ username }) => - `I'm sorry ${username}, but a suggestions channel hasn't been set up. Would you like to set up a channel now?`, - commandSuggestNoSetupAbort: 'Alright then. Aborted creating a new suggestion.', - commandSuggestNopermissions: ({ username, channel }) => - `I'm sorry ${username}, but the administrators didn't give me permission to send messages in ${channel}!`, - commandSuggestChannelPrompt: 'Please mention the channel you want to set as the suggestions channel.', - commandSuggestTitle: ({ id }) => `Suggestion #${id}`, - commandSuggestSuccess: ({ channel }) => `Thank you for your suggestion! It has been successfully posted to ${channel}!`, - commandResolveSuggestionDescription: "Set the suggestion's status.", - commandResolveSuggestionExtended: { - extendedHelp: "This command allows you to update a suggestion's status, marking it either as accepted, considered or denied.", - examples: [ - '1 accept Thank you for your suggestion!', - '1 a Thank you for your suggestion!', - "1 consider Hmm... we may do this, but it's really low priority", - "1 c Hmm... we may do this, but it's really low priority", - '1 deny There is no way this is going to happen.', - '1 d There is no way this is going to happen.' - ], - reminder: [ - 'Suggestions also can be configured to DM the author regarding the status of their suggestion, with the `suggestions.on-action.dm` setting.', - 'Furthermore, in case you wish to preserve anonymity, you can hide your name using the `suggestions.on-action` setting, which can be overridden with the `--hide-author` and `--show-author` flags.' - ], - multiline: true - }, - commandResolveSuggestionInvalidId: `${REDCROSS} That\'s not a valid suggestion ID!`, - commandResolveSuggestionMessageNotFound: `${REDCROSS} I was not able to retrieve the suggestion as its message has been deleted.`, - commandResolveSuggestionIdNotFound: `${REDCROSS} Couldn\'t find a suggestion with that ID`, - commandResolveSuggestionDefaultComment: 'No comment was provided.', - commandResolveSuggestionAuthorAdmin: 'An administrator', - commandResolveSuggestionAuthorModerator: 'A moderator', - commandResolveSuggestionActions: ({ author }) => ({ - accept: `${author} accepted this suggestion:`, - consider: `${author} considered this suggestion:`, - deny: `${author} denied this suggestion:` - }), - commandResolveSuggestionActionsDms: ({ author, guild }) => ({ - accept: `${author} accepted this suggestion in ${guild}:`, - consider: `${author} considered this suggestion in ${guild}:`, - deny: `${author} denied this suggestion in ${guild}:` - }), - commandResolveSuggestionDmFail: `${REDCROSS} I wasn\'t able to send the author a DM. Are their DMs closed?`, - commandResolveSuggestionSuccess: ({ id, actionText }) => `${GREENTICK} Successfully ${actionText} suggestion \`${id}\`!`, - commandResolveSuggestionSuccessAcceptedText: 'accepted', - commandResolveSuggestionSuccessDeniedText: 'denied', - commandResolveSuggestionSuccessConsideredText: 'considered', - - /** - * ############### - * SYSTEM COMMANDS - */ - - commandEvalTimeout: ({ seconds }) => `TIMEOUT: Took longer than ${seconds} seconds.`, - commandEvalError: ({ time, output, type }) => `**Error**:${output}\n**Type**:${type}\n${time}`, - - commandStatsTitles: { - stats: 'Statistics', - uptime: 'Uptime', - serverUsage: 'Server Usage' - }, - commandStatsFields: ({ stats, uptime, usage }) => ({ - stats: [ - `• **Users**: ${stats.users}`, - `• **Guilds**: ${stats.guilds}`, - `• **Channels**: ${stats.channels}`, - `• **Discord.js**: ${stats.version}`, - `• **Node.js**: ${stats.nodeJs}`, - `• **Klasa**: ${klasaVersion}` - ], - uptime: [ - `• **Host**: ${this.duration(uptime.host, 2)}`, - `• **Total**: ${this.duration(uptime.total, 2)}`, - `• **Client**: ${this.duration(uptime.client, 2)}` - ], - serverUsage: [`• **CPU Load**: ${usage.cpuLoad.join('% | ')}%`, `• **Heap**: ${usage.ramUsed} (Total: ${usage.ramTotal})`] - }), - - /** - * ############# - * TAGS COMMANDS - */ - - commandTagDescription: "Manage this guilds' tags.", - commandTagExtended: { - extendedHelp: [ - 'Tags, also known as custom commands, can give you a chunk of text stored under a specific name.', - 'For example after adding a tag with `Skyra, tag add rule1 ` you can use it with `Skyra, rule1` or `Skyra, tag rule1`', - "When adding tags you can customize the final look by adding flags to the tag content (these won't show up in the tag itself!):", - '❯ Add `--embed` to have Skyra send the tag embedded.', - 'The content will be in the description, so you can use all the markdown you wish. for example, adding [masked links](https://skyra.pw).', - '❯ Add `--color=` or `--colour=` to have Skyra colourize the embed. Does nothing unless also specifying `--embed`.', - 'Colours can be RGB, HSL, HEX or Decimal.' - ], - explainedUsage: [ - [ - 'action', - `The action to perform: ${this.list( - [ - '`add` to add new tags', - '`remove` to delete a tag', - '`edit` to edit a tag', - '`source` to get the source of a tag', - '`list` to list all known tags', - '`show` to show a tag' - ], - 'or' - )}.` - ], - ['tag', "The tag's name."], - ['contents', 'Required for the actions `add` and `edit`, specifies the content for the tag.'] - ], - examples: [ - 'add rule1 Respect other users. Harassment, hatespeech, etc... will not be tolerated.', - 'add rule1 --embed --color=#1E88E5 Respect other users. Harassment, hatespeech, etc... will not be tolerated.', - 'edit rule1 Just be respectful with the others.', - 'rule1', - 'source rule1', - 'remove rule1', - 'list' - ], - multiline: true - }, - commandTagPermissionlevel: 'You must be a staff member, moderator, or admin, to be able to manage tags.', - commandTagNameNotAllowed: 'A tag name may not have a grave accent nor invisible characters.', - commandTagNameTooLong: 'A tag name must be 50 or less characters long.', - commandTagExists: ({ tag }) => `The tag '${tag}' already exists.`, - commandTagContentRequired: 'You must provide a content for this tag.', - commandTagAdded: ({ name, content }) => `Successfully added a new tag: **${name}** with a content of:\n${content}`, - commandTagRemoved: ({ name }) => `Successfully removed the tag **${name}**.`, - commandTagNotexists: ({ tag }) => `The tag '${tag}' does not exist.`, - commandTagEdited: ({ name, content }) => `Successfully edited the tag **${name}** with a content of:\n${content}`, - commandTagListEmpty: 'The tag list for this server is empty.', - commandTagReset: 'All tags have been successfully removed from this server.', - - /** - * ############## - * TOOLS COMMANDS - */ - - commandAvatarNone: 'The user does not have an avatar set.', - commandColor: ({ hex, rgb, hsl }) => [`HEX: **${hex}**`, `RGB: **${rgb}**`, `HSL: **${hsl}**`], - commandEmojiCustom: ({ emoji, id }) => [ - `→ ${inlineCodeBlock('Emoji ::')} **${emoji}**`, - `→ ${inlineCodeBlock('Type ::')} **Custom**`, - `→ ${inlineCodeBlock('ID ::')} **${id}**` - ], - commandEmojiTwemoji: ({ emoji, id }) => [ - `→ ${inlineCodeBlock('Emoji ::')} \`${emoji}\``, - `→ ${inlineCodeBlock('Type ::')} **Twemoji**`, - `→ ${inlineCodeBlock('ID ::')} **${id}**` - ], - commandEmojiInvalid: `The argument you provided is not a valid emoji.`, - commandEmojiTooLarge: ({ emoji }) => `'${emoji}' is so heavy the hamsters couldn't keep with its size. Maybe try one that is smaller?`, - commandCountryDescription: 'Shows information about a country.', - commandCountryExtended: { - extendedHelp: 'This command uses https://restcountries.eu to get information on the provided country.', - explainedUsage: [['country', 'The name of the country.']], - examples: ['United Kingdom'] - }, - commandCountryTitles: { - OVERVIEW: 'Overview', - LANGUAGES: 'Languages', - OTHER: 'Other' - }, - commandCountryFields: { - overview: { - officialName: 'Official Name', - capital: 'Capital', - population: 'Population' - }, - other: { - demonym: 'Demonym', - area: 'Area', - currencies: 'Currencies' - } - }, - commandEshopDescription: 'Request information for any American Nintendo Digital Store', - commandEshopExtended: { - extendedHelp: 'This command queries Nintendo of America to show data for the game you request.', - explainedUsage: [['query', "The name of the game you're looking for."]], - examples: ['Breath of the Wild', 'Pokemon', 'Splatoon'] - }, - commandEshopNotInDatabase: 'None available', - commandEshopTitles: { - price: 'Price', - availability: 'Availability', - releaseDate: 'Release Date', - numberOfPlayers: 'Number of Players', - platform: 'Platform', - categories: 'Categories', - noCategories: 'This game has not been sorted into any categories', - nsuid: 'NSUID', - esrb: 'ESRB' - }, - commandEshopPricePaid: ({ price }) => `$${price} USD`, - commandEshopPriceFree: 'Free', - commandHoroscopeDescription: 'Get your latest horoscope', - commandHoroscopeExtended: { - extendedHelp: "Gets the horoscope for a given sun sign from Kelli Fox's The Astrologer.", - explainedUsage: [ - ['sunsign', 'The sun sign you want to get the horoscope for'], - [ - 'today|tomorrow|yesterday', - '(Optional, defaults to "today") If you want to get the horoscope of yesterday or tomorrow you can specify that.' - ] - ], - examples: ['pisces', 'virgo tomorrow', 'gemini yesterday', 'aries today'] - }, - commandHoroscopeInvalidSunsign: ({ sign, maybe }) => `${sign} is an invalid sun sign, maybe try ${maybe}`, - commandHoroscopeTitles: ({ sign, intensity, keywords, mood, rating }) => ({ - dailyHoroscope: `Daily horoscope for ${sign}`, - metadataTitle: 'Metadata', - metadata: [`**Intensity:** ${intensity}`, `**Keywords:** ${this.list(keywords, 'and')}`, `**Mood:** ${mood}`, `**Rating:** ${rating}`] - }), - commandIgdbDescription: 'Searches IGDB (Internet Game Database) for your favourite games', - commandIgdbExtended: { - extendedHelp: 'This command queries the IGDB API to show data on your favourite games.', - explainedUsage: [['query', 'The name of the game']], - examples: ['Breath of the Wild', 'Borderlands 3'] - }, - commandIgdbTitles: { - userScore: 'User score', - ageRating: 'Age rating(s)', - releaseDate: 'Release date', - genres: 'Genre(s)', - developers: 'Developer(s)', - platform: 'Platform(s)' - }, - commandIgdbData: { - noDevelopers: 'Developer(s) unknown', - noPlatforms: 'Platform(s) unknown', - noReleaseDate: 'Release date unknown', - noRating: 'No user rating', - noSummary: 'No game summary available', - noGenres: 'No known genres', - noAgeRatings: 'No age ratings available' - }, - commandItunesDescription: 'Searches iTunes API for music tracks', - commandItunesExtended: { - extendedHelp: 'This command queries the Apple iTunes API to show data on a music you request.', - explainedUsage: [['query', 'The name of the song']], - examples: ['Apocalyptica feat. Brent Smith', "You're Gonna Go Far, Kid"] - }, - commandItunesTitles: { - artist: 'Artist', - collection: 'Collection', - collectionPrice: 'Collection price (USD)', - trackPrice: 'Track price (USD)', - trackReleaseDate: 'Track Release Date', - numberOfTracksInCollection: '# Tracks in collection', - primaryGenre: 'Primary genre', - preview: 'Preview', - previewLabel: 'Click here' - }, - commandLmgtfyClick: 'Click me to search', - commandMoviesDescription: 'Searches TheMovieDatabase for any movie', - commandMoviesExtended: { - extendedHelp: [ - 'This command queries TheMovieDatabase API for data on your favourite movies', - "Tip: You can use the 'y:' filter to narrow your results by year. Example: 'star wars y:1977'." - ], - explainedUsage: [['query', 'The name of the movie']], - examples: ["Ocean's Eleven y:2001", 'Star Wars Revenge of the Sith', 'Spirited Away'], - multiline: true - }, - commandMoviesTitles: { - runtime: 'Runtime', - userScore: 'User score', - status: 'Status', - releaseDate: 'Release date', - imdbPage: 'IMDB Page', - homePage: 'Home Page', - collection: 'Collection', - genres: 'Genres' - }, - commandMoviesData: { - variableRuntime: 'Variable', - movieInProduction: 'Movie in production', - linkClickHere: 'Click here', - none: 'None', - notPartOfCollection: 'Not part of a collection', - noGenres: 'None on TheMovieDB' - }, - commandShowsDescription: 'Searches The Movie Database for any show', - commandShowsExtended: { - extendedHelp: 'This command queries TheMovieDatabase for data on your favorite shows', - explainedUsage: [['query', 'The name of the show']], - examples: ['Final Space', 'Gravity Falls', 'Rick and Morty'] - }, - commandShowsTitles: { - episodeRuntime: 'Episode runtime', - userScore: 'User score', - status: 'Status', - firstAirDate: 'First air date', - genres: 'Genres' - }, - commandShowsData: { - variableRuntime: 'Variable', - unknownUserScore: 'No user score', - noGenres: 'None on TheMovieDB' - }, - commandPriceCurrency: ({ fromCurrency, fromAmount, worths }) => - `**${fromAmount}** ${fromCurrency.toUpperCase()} is worth ${this.list(worths, 'and')}.`, - commandPriceCurrencyNotFound: 'There was an error, please make sure you specified an appropriate coin and currency.', - commandQuoteMessage: 'It is very weird, but said message does not have a content nor a image.', - commandRolesListEmpty: 'This server does not have a role listed as a public role.', - commandRolesAbort: ({ prefix }) => - `I looked far and wide, but I seem to not have found what you were looking for. Please run \`${prefix}roles\` for the full list!`, - commandRolesListTitle: 'List of public roles', - commandRolesAdded: ({ roles }) => `The following roles have been added to your profile: \`${roles}\``, - commandRolesRemoved: ({ roles }) => `The following roles have been removed from your profile: \`${roles}\``, - commandRolesNotPublic: ({ roles }) => `The following roles are not public: \`${roles}\``, - commandRolesNotManageable: ({ roles }) => `The following roles cannot be given by me due to their hierarchy role position: \`${roles}\``, - commandRolesAuditlog: "Authorized: Public Role Management | 'Roles' Command.", - commandDuckDuckGoNotfound: 'I am sorry, but DuckDuckGo API returned a blank response. Try again with different keywords.', - commandDuckDuckGoLookalso: 'Related to this topic:', - - commandUrbanNotFound: 'I am sorry, the word you are looking for does not seem to be defined in UrbanDictionary. Try another word?', - commandUrbanIndexNotfound: 'You may want to try a lower page number.', - systemTextTruncated: ({ definition, url }) => `${definition}... [continue reading](${url})`, - commandWhoisMemberTitles: { - joined: 'Joined', - createdAt: 'Created At' - }, - commandWhoisMemberFields: ({ member }) => ({ - joinedWithTimestamp: `${timestamp.displayUTC(member.joinedTimestamp!)}\n${this.duration(Date.now() - member.joinedTimestamp!, 2)} ago`, - joinedUnknown: 'Unknown', - createdAt: `${timestamp.displayUTC(member.user.createdAt)}\n${this.duration(Date.now() - member.user.createdTimestamp, 2)} ago`, - footer: `ID: ${member.id}` - }), - commandWhoisMemberRoles: () => 'Role [1]', - commandWhoisMemberRolesPlural: ({ count }) => `Roles [${count}]`, - commandWhoisMemberPermissions: 'Key Permissions', - commandWhoisMemberPermissionsAll: 'All Permissions', - commandWhoisUserTitles: { - createdAt: 'Created At' - }, - commandWhoisUserFields: ({ user }) => ({ - createdAt: `${timestamp.displayUTC(user.createdAt)}\n${this.duration(Date.now() - user.createdTimestamp, 2)} ago`, - footer: `ID: ${user.id}` - }), - commandFollowage: ({ user, channel, time }) => `${user} has been following ${channel} for ${this.duration(time, 2)}.`, - commandFollowageMissingEntries: 'Either the user or the channel do not exist. Make sure you wrote their names correctly.', - commandFollowageNotFollowing: 'That user is not following the specified channel.', - commandTwitchNoEntries: 'There are no entries. Are you sure you wrote the user name correctly?', - commandTwitchTitles: { - followers: 'Followers', - views: 'Views', - clickToVisit: "Click to go to streamer's channel", - partner: 'Partner' - }, - commandTwitchPartnershipWithoutAffiliate: 'This channel is not part of the Twitch affiliate program.', - commandTwitchAffiliateStatus: { - affiliated: 'This is an affiliated channel.', - partnered: 'This is a partnered channel.' - }, - commandTwitchCreatedAt: 'Created At:', - commandTwitchSubscriptionRequiredStreamer: `${REDCROSS} You must specify which streamer you want to subscribe to.`, - commandTwitchSubscriptionStreamerNotFound: `${REDCROSS} Sorry, I could not find the streamer. Are you sure you wrote their name correctly?`, - commandTwitchSubscriptionRequiredChannel: `${REDCROSS} You must tell me where do you want the messages to be sent.`, - commandTwitchSubscriptionRequiredStatus: `${REDCROSS} You must tell me which type of notification do you want, the options are "online" and "offline".`, - commandTwitchSubscriptionStatusValues: ['online', 'offline'], - commandTwitchSubscriptionInvalidStatus: `${REDCROSS} Woah there! I expected "online" or "offline", but I cannot understand what you gave me instead.`, - commandTwitchSubscriptionRequiredContent: `${REDCROSS} Mhmm, I wonder what you want me to send when the user goes live or something. Can you give me a hint please?`, - commandTwitchSubscriptionAddDuplicated: `${REDCROSS} You're already subscribed to that streamer in this channel for that status.`, - commandTwitchSubscriptionAddSuccessOffline: ({ name, channel }) => - `${GREENTICK} Success! Whenever ${name} goes offline, I will post a new message in ${channel}.`, - commandTwitchSubscriptionAddSuccessLive: ({ name, channel }) => - `${GREENTICK} Success! Whenever ${name} goes live, I will post a new message in ${channel}.`, - commandTwitchSubscriptionRemoveStreamerNotSubscribed: `${REDCROSS} I'm sorry, you cannot unsubscribe from a channel you're not subscribed to. Please subscribe to be able to unsubscribe.`, - commandTwitchSubscriptionRemoveEntryNotExists: `${REDCROSS} I'm sorry; while you're subscribed to this user, their subscriptions are not posted in that channel.`, - commandTwitchSubscriptionRemoveSuccessOffline: ({ name, channel }) => - `${GREENTICK} Success! I will not longer post messages to ${channel} whenever ${name} goes offline.`, - commandTwitchSubscriptionRemoveSuccessLive: ({ name, channel }) => - `${GREENTICK} Success! I will not longer post messages to ${channel} whenever ${name} goes live.`, - commandTwitchSubscriptionResetEmpty: `${REDCROSS} You were not subscribed to any streamer, mission abort!`, - commandTwitchSubscriptionResetSuccess: ({ count }) => `${GREENTICK} Success! ${count} subscription has been removed from this server.`, - commandTwitchSubscriptionResetSuccessPlural: ({ count }) => - `${GREENTICK} Success! ${count} subscriptions have been removed from this server.`, - commandTwitchSubscriptionResetStreamerNotSubscribed: `${REDCROSS} You were not subscribed to this streamer. Are you sure you specified the right one?`, - commandTwitchSubscriptionResetChannelSuccess: ({ name, count }) => - `${GREENTICK} Success! Removed ${count} subscription from the streamer ${name}.`, - commandTwitchSubscriptionResetChannelSuccessPlural: ({ name, count }) => - `${GREENTICK} Success! Removed ${count} subscriptions from the streamer ${name}.`, - commandTwitchSubscriptionShowStreamerNotSubscribed: `${REDCROSS} You wanted to see all subscriptions from this streamer, but there are none!`, - commandTwitchSubscriptionShowStatus: ['Online', 'Offline'], - commandTwitchSubscriptionShowEmpty: `${REDCROSS} There are no subscriptions, who will be the first?`, - commandTwitchSubscriptionShowUnknownUser: 'Unknown', - commandWikipediaNotfound: 'I am sorry, I could not find something that could match your input in Wikipedia.', - commandYoutubeNotfound: 'I am sorry, I could not find something that could match your input in YouTube.', - commandYoutubeIndexNotfound: 'You may want to try a lower page number, because I am unable to find something at this index.', - commandDefineDescription: 'Check the definition of a word.', - commandDefineExtended: { - extendedHelp: `What does "heel" mean?`, - explainedUsage: [['Word', 'The word or phrase you want to get the definition from.']], - examples: ['heel'] - }, - commandDefineNotfound: 'I could not find a definition for this word.', - commandDefinePronounciation: 'Pronunciation', - commandDefineUnknown: 'Unknown', - - /** - * ############# - * WEEB COMMANDS - */ - - commandWbang: ({ user }) => `Hey ${user}... bang!`, - commandWbanghead: 'Head bang in progress!', - commandWbite: ({ user }) => `Biting ${user}!`, - commandWblush: 'You made them blush! 😊', - commandWcry: ({ user }) => `Dear ${user}, did you make them cry? 💔`, - commandWcuddle: ({ user }) => `Here is a cuddle for you, ${user} 💞`, - commandWdance: 'Dancing! 💃', - commandWgreet: ({ user }) => `Hello there ${user}!`, - commandWhug: ({ user }) => `Here is a nice hug for you, ${user} ❤`, - commandWkiss: ({ user }) => `Here is a kiss for you, ${user} 💜`, - commandWlewd: 'Too lewd for my tastes!', - commandWlick: ({ user }) => `Licking ${user} 👅`, - commandWnom: 'Nom, nom, nom! 😊', - commandWneko: 'Nya! 🐱', - commandWpat: ({ user }) => `Gently pats ${user}'s head ❤`, - commandWpout: 'Uh?', - commandWpunch: ({ user }) => `Punching ${user}!`, - commandWslap: ({ user }) => `Slapping ${user}!`, - commandWsleepy: 'Falling asleep...', - commandWsmile: 'Showing a radiant smile!', - commandWsmug: "There's a smug face!", - commandWstare: ({ user }) => `Dear ${user}, somebody is staring at you 👀`, - commandWthumbsup: 'You have their thumbs up!', - commandWtickle: ({ user }) => `Tickles for you, ${user}!`, - - /** - * ################################# - * # MONITORS # - * ################################# - */ - - constMonitorInvitelink: 'Invite link', - constMonitorLink: 'Filtered Link', - constMonitorNms: '[NOMENTIONSPAM]', - constMonitorWordfilter: 'Filtered Word', - constMonitorCapsfilter: 'Too Many UpperCases', - constMonitorAttachmentfilter: 'Too Many Attachments', - constMonitorMessagefilter: 'Too Many Message Duplicates', - constMonitorNewlinefilter: 'Too Many Lines', - constMonitorReactionfilter: 'Filtered Reaction', - moderationMonitorAttachments: '[Auto-Moderation] Triggered attachment filter, no threshold.', - moderationMonitorAttachmentsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered attachment filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorCapitals: '[Auto-Moderation] Triggered capital filter, no threshold.', - moderationMonitorCapitalsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered capital filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorInvites: '[Auto-Moderation] Triggered invite filter, no threshold.', - moderationMonitorInvitesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered invite filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorLinks: '[Auto-Moderation] Triggered link filter, no threshold.', - moderationMonitorLinksWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered link filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorMessages: '[Auto-Moderation] Triggered duplicated message filter, no threshold.', - moderationMonitorMessagesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered duplicated message filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorNewlines: '[Auto-Moderation] Triggered newline filter, no threshold.', - moderationMonitorNewlinesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered newline filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorWords: '[Auto-Moderation] Triggered word filter, no threshold.', - moderationMonitorWordsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered word filter, reached ${amount} out of ${maximum} infractions.`, - monitorAttachmentFilter: ({ user }) => `${REDCROSS} Dear ${user}, file attachments aren't allowed here.`, - monitorInviteFilterAlert: ({ user }) => `${REDCROSS} Dear ${user}, invite links aren't allowed here.`, - monitorInviteFilterLog: ({ links }) => `**Link**: ${this.list(links, 'and')}`, - monitorInviteFilterLogPlural: ({ links }) => `**Links**: ${this.list(links, 'and')}`, - monitorNolink: ({ user }) => `${REDCROSS} Hey ${user}, you are not allowed to post links here!`, - monitorWordFilterDm: ({ filtered }) => - `Shush! You said some words that are not allowed in the server! But since you took a moment to write the message, I will post it here:\n${filtered}`, - monitorCapsFilterDm: ({ message }) => `Speak lower! I know you need to express your thoughts. There is the message I deleted:${message}`, - monitorWordFilter: ({ user }) => `${REDCROSS} Pardon, dear ${user}, you said something that is not allowed in this server.`, - monitorCapsFilter: ({ user }) => `${REDCROSS} EEEOOO ${user}! PLEASE DO NOT SHOUT IN THIS PLACE! YOU HAVE HIT THE CAPS LIMIT!`, - monitorMessageFilter: ({ user }) => `${REDCROSS} Woah woah woah, please stop re-posting so much ${user}!`, - monitorNewlineFilter: ({ user }) => `${REDCROSS} Wall of text incoming from ${user}, wall of text taken down!`, - monitorReactionsFilter: ({ user }) => `${REDCROSS} Hey ${user}, please do not add that reaction!`, - monitorNmsMessage: ({ user }) => [ - `The banhammer has landed and now the user ${user.tag} with id ${user.id} is banned for mention spam.`, - "Do not worry! I'm here to help you! 😄" - ], - monitorNmsModlog: ({ threshold }) => `[NOMENTIONSPAM] Automatic: Mention Spam threshold exceeded.\nThreshold: ${threshold}.`, - monitorNmsAlert: "Be careful mentioning any more, as you are about to be banned for exceeding this server's mention threshold.", - monitorSocialAchievement: 'Congratulations dear %MEMBER%, you achieved the role %ROLE%', - - /** - * ################################# - * # INHIBITORS # - * ################################# - */ - - inhibitorSpam: ({ channel }) => - `Can we move to ${channel} please? This command might be too spammy and can ruin other people's conversations.`, - - /** - * ################################# - * # GAMES # - * ################################# - */ - - hgBloodbath: [ - '{1} grabs a shovel.', - '{1} grabs a backpack and retreats.', - '{1} and {2} fight for a bag. {1} gives up and retreats.', - '{1} and {2} fight for a bag. {2} gives up and retreats.', - '{1} finds a bow, some arrows, and a quiver.', - '{1} runs into the cornucopia and hides.', - '{1} takes a handful of throwing knives.', - "{1} rips a mace out of {2}'s hands.", - '{1} finds a canteen full of water.', - '{1} stays at the cornucopia for resources.', - '{1} gathers as much food as they can.', - '{1} grabs a sword.', - '{1} takes a spear from inside the cornucopia.', - '{1} finds a bag full of explosives.', - '{1} clutches a first aid kit and runs away.', - '{1} takes a sickle from inside the cornucopia.', - '{1}, {2}, and {3} work together to get as many supplies as possible.', - '{1} runs away with a lighter and some rope.', - '{1} snatches a bottle of alcohol and a rag.', - '{1} finds a backpack full of camping equipment.', - '{1} grabs a backpack, not realizing it is empty.', - "{1} breaks {2}'s nose for a basket of bread.", - '{1}, {2}, {3}, and {4} share everything they gathered before running.', - '{1} retrieves a trident from inside the cornucopia.', - '{1} grabs a jar of fishing bait while {2} gets fishing gear.', - '{1} scares {2} away from the cornucopia.', - '{1} grabs a shield leaning on the cornucopia.', - '{1} snatches a pair of sais.', - '{1} grabs a lone pair of pants.', - '{1T} steps off their podium too soon and blows up.', - "{1} throws a knife into {2T}'s head.", - '{1T} accidently steps on a landmine.', - '{1} catches {2T} off guard and kills them.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - "{1} snaps {2T}'s neck.", - '{1} decapitates {2T} with a sword.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1} stabs {2T} with a tree branch.', - '{1} stabs {2T} in the back with a trident.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} finds {2T} hiding in the cornucopia and kills them.', - '{1T} finds {2} hiding in the cornucopia, but {2} kills them.', - '{1} kills {2T} with a sickle.', - '{1} and {2T} fight for a bag. {1} strangles {2T} with the straps and runs.', - '{1T} and {2} fight for a bag. {2} strangles {1T} with the straps and runs.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1T} trips over while running from the cornucopia, and is killed by {2}.', - '{1} trips over while running from the cornucopia, {2} picks them up, they run off together.', - "{1} aims an arrow at {2}'s head and shoots, {3T} jumps in the way and sacrifies their life to save them." - ], - hgDay: [ - '{1} goes hunting.', - '{1} injures themself.', - '{1} explores the arena.', - '{1} scares {2} off.', - "{1} diverts {2}'s attention and runs away.", - '{1} stalks {2}.', - '{1} fishes.', - '{1} camouflauges themself in the bushes.', - "{1} steals from {2} while they aren't looking.", - '{1} makes a wooden spear.', - '{1} discovers a cave.', - '{1} attacks {2}, but they manage to escape.', - '{1} chases {2}.', - '{1} runs away from {2}.', - '{1} collects fruit from a tree.', - '{1} receives a hatchet from an unknown sponsor.', - '{1} receives clean water from an unknown sponsor.', - '{1} receives medical supplies from an unknown sponsor.', - '{1} receives fresh food from an unknown sponsor.', - '{1} searches for a water source.', - '{1} defeats {2} in a fight, but spares their life.', - '{1} and {2} work together for the day.', - '{1} begs for {2} to kill them. They refuse, keeping {1} alive.', - '{1} tries to sleep through the entire day.', - "{1}, {2}, {3}, and {4} raid {5}'s camp while they are hunting.", - '{1} constructs a shack.', - '{1} overhears {2} and {3} talking in the distance.', - '{1} practices their archery.', - '{1} thinks about home.', - '{1} is pricked by thorns while picking berries.', - '{1} tries to spear fish with a trident.', - '{1} searches for firewood.', - '{1} and {2} split up to search for resources.', - '{1} picks flowers.', - "{1} tends to {2}'s wounds.", - '{1} sees smoke rising in the distance, but decides not to investigate.', - '{1} sprains their ankle while running away from {2}.', - '{1} makes a slingshot.', - '{1} travels to higher ground.', - '{1} discovers a river.', - '{1} hunts for other tributes.', - '{1} and {2} hunt for other tributes.', - '{1}, {2}, and {3} hunt for other tributes.', - '{1}, {2}, {3}, and {4} hunt for other tributes.', - '{1}, {2}, {3}, {4}, and {5} hunt for other tributes.', - '{1} receives an explosive from an unknown sponsor.', - '{1} questions their sanity.', - '{1} forces {2} to eat pant.', - '{1} forces {2T} to eat pant. {2T} chokes and dies.', - '{1} catches {2T} off guard and kills them.', - "{1} throws a knife into {2T}'s head.", - '{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} bleeds out due to untreated injuries.', - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - '{1T} unknowingly eats toxic berries.', - "{1} silently snaps {2T}'s neck.", - "{1} taints {2T}'s food, killing them.", - '{1} decapitates {2T} with a sword.', - '{1T} dies from an infection.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1T} attempts to climb a tree, but falls to their death.', - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - "{1}'s trap kills {2T}.", - '{1} kills {2T} while they are resting.', - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1T} dies from hypothermia.', - '{1T} dies from hunger.', - '{1T} dies from thirst.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} dies trying to escape the arena.', - '{1T} dies of dysentery.', - '{1T} accidently detonates a land mine while trying to arm it.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} ambushes {2T} and kills them.', - '{1T} accidently steps on a landmine.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.', - '{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.', - '{1} stabs {2T} with a tree branch.', - '{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.', - '{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.', - '{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.', - "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", - "{1} poisons {2T}'s drink. They drink it and die.", - '{1} stabs {2T} in the back with a trident.', - '{1T} attempts to climb a tree, but falls on {2T}, killing them both.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} kills {2T} with a sickle.', - '{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.', - '{1}, {2}, {3}, and {4} track down and kill {5T}.', - '{1}, {2}, and {3} track down and kill {4T}.', - '{1} and {2} track down and kill {3T}.', - '{1} tracks down and kills {2T}.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1} doodles in the dirt.', - '{1} chases a butterfly.', - '{1T} falls off a cliff, and is impaled by a stick.', - '{1} runs into {2}, they decide to team up.', - '{1} sees {2} through the trees, and plans on killing them.', - '{1} sneaks up behind {2T}, and snaps their neck.', - '{1T} challenges {2} to a fight, and promptly dies.', - '{1} murders their partner, {2T}, to have more supplies for themself.' - ], - hgNight: [ - '{1} starts a fire.', - '{1} sets up camp for the night.', - '{1} loses sight of where they are.', - '{1} climbs a tree to rest.', - '{1} goes to sleep.', - '{1} and {2} tell stories about themselves to each other.', - '{1}, {2}, {3}, and {4} sleep in shifts.', - '{1}, {2}, and {3} sleep in shifts.', - '{1} and {2} sleep in shifts.', - '{1} tends to their wounds.', - '{1} sees a fire, but stays hidden.', - '{1} screams for help.', - '{1} stays awake all night.', - '{1} passes out from exhaustion.', - '{1} cooks their food before putting their fire out.', - '{1} and {2} run into each other and decide to truce for the night.', - '{1} fends {2}, {3}, and {4} away from their fire.', - '{1}, {2}, and {3} discuss the games and what might happen in the morning.', - '{1} cries themself to sleep.', - '{1} tries to treat their infection.', - '{1} and {2} talk about the tributes still alive.', - '{1} is awoken by nightmares.', - '{1} and {2} huddle for warmth.', - '{1} thinks about winning.', - '{1}, {2}, {3}, and {4} tell each other ghost stories to lighten the mood.', - '{1} looks at the night sky.', - '{1} defeats {2} in a fight, but spares their life.', - '{1} begs for {2} to kill them. They refuse, keeping {1} alive.', - "{1} destroys {2}'s supplies while they are asleep.", - '{1}, {2}, {3}, {4}, and {5} sleep in shifts.', - '{1} lets {2} into their shelter.', - '{1} receives a hatchet from an unknown sponsor.', - '{1} receives clean water from an unknown sponsor.', - '{1} receives medical supplies from an unknown sponsor.', - '{1} receives fresh food from an unknown sponsor.', - '{1} tries to sing themself to sleep.', - '{1} attempts to start a fire, but is unsuccessful.', - '{1} thinks about home.', - "{1} tends to {2}'s wounds.", - '{1} quietly hums.', - '{1}, {2}, and {3} cheerfully sing songs together.', - '{1} is unable to start a fire and sleeps without warmth.', - '{1} and {2} hold hands.', - '{1} convinces {2} to snuggle with them.', - '{1} receives an explosive from an unknown sponsor.', - '{1} questions their sanity.', - '{1} forces {2} to eat pant.', - '{1} forces {2T} to eat pant. {2T} chokes and dies.', - '{1} catches {2T} off guard and kills them.', - "{1} throws a knife into {2T}'s head.", - '{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} bleeds out due to untreated injuries.', - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - '{1T} unknowingly eats toxic berries.', - "{1} silently snaps {2T}'s neck.", - "{1} taints {2T}'s food, killing them.", - '{1} decapitates {2T} with a sword.', - '{1T} dies from an infection.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1T} attempts to climb a tree, but falls to their death.', - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - "{1}'s trap kills {2T}.", - '{1} kills {2T} while they are sleeping.', - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1T} dies from hypothermia.', - '{1T} dies from hunger.', - '{1T} dies from thirst.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} dies trying to escape the arena.', - '{1T} dies of dysentery.', - '{1T} accidently detonates a land mine while trying to arm it.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} ambushes {2T} and kills them.', - '{1T} accidently steps on a landmine.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.', - '{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.', - '{1} stabs {2T} with a tree branch.', - '{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.', - '{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.', - '{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.', - "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", - "{1} poisons {2T}'s drink. They drink it and die.", - '{1} stabs {2T} in the back with a trident.', - '{1T} attempts to climb a tree, but falls on {2T}, killing them both.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} kills {2T} with a sickle.', - '{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.', - '{1}, {2}, {3}, and {4} track down and kill {5T}.', - '{1}, {2}, and {3} track down and kill {4T}.', - '{1} and {2} track down and kill {3T}.', - '{1} tracks down and kills {2T}.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1} writes in their journal.', - '{1} watches {2} sitting at their campfire, and considers killing them.' - ], - - /** - * ################################# - * # SERIALIZERS # - * ################################# - */ - - serializerAutoRoleInvalid: 'Invalid autorole data.', - serializerCommandAutoDeleteInvalid: 'Invalid command auto-delete data.', - serializerPermissionNodeDuplicatedCommand: ({ command }) => `You have set \`${command}\` twice, either allow it, or deny it.`, - serializerPermissionNodeInvalidCommand: ({ command }) => `The command \`${command}\` does not exist or is invalid.`, - serializerPermissionNodeInvalidTarget: 'No data could be found from the ID.', - serializerPermissionNodeInvalid: 'Invalid data.', - serializerPermissionNodeSecurityEveryoneAllows: 'For security, the everyone role cannot have allows.', - serializerPermissionNodeSecurityGuarded: ({ command }) => - `For security and for me to work properly, you cannot deny the usage for the command \`${command}\`.`, - serializerPermissionNodeSecurityOwner: 'You cannot set permission overrides on the server owner.', - serializerReactionRoleInvalid: 'Invalid reaction role data.', - serializerStickyRoleInvalid: 'Invalid sticky role data.', - serializerTriggerAliasInvalid: 'Invalid trigger alias data.', - serializerTriggerIncludeInvalid: 'Invalid trigger includes data.', - serializerTriggerIncludeInvalidAction: 'Invalid trigger action.', - serializerTwitchSubscriptionInvalidStreamer: 'Invalid data streamer.', - serializerTwitchSubscriptionInvalid: 'Invalid data.', - serializerUniqueRoleSetInvalid: 'Invalid unique role set data.', - serializerUnsupported: 'This configuration key cannot be updated via Discord at the moment, please use the dashboard at !', - serializerCustomCommandInvalidId: 'The property "id" must be a string.', - serializerCustomCommandInvalidEmbed: 'The property "embed" must be a boolean.', - serializerCustomCommandInvalidColor: 'The property "color" must be a number.', - serializerCustomCommandInvalidContent: 'The property "content" must be a string.', - serializerCustomCommandInvalidArgs: 'The property "args" must be an array of strings.', - serializerDisabledCommandChannelsChannelsDoesNotExist: 'The channel does not exist.', - serializerDisabledCommandChannelsChannelsCommandDoesNotExist: ({ name }) => `The command \`${name}\` does not exist.`, - - /** - * ################################# - * # NOTIFICATIONS # - * ################################# - */ - notificationsTwitchNoGameName: '*Game name not set*', - notificationsTwitchEmbedDescription: ({ userName }) => `${userName} is now live!`, - notificationsTwitchEmbedDescriptionWithGame: ({ userName, gameName }) => `${userName} is now live - Streaming ${gameName}!`, - notificationTwitchEmbedFooter: 'Skyra Twitch Notifications', - - /** - * ################################# - * # UTILS # - * ################################# - */ - - selfModerationCommandInvalidMissingAction: ({ name }) => - `${REDCROSS} Action must be any of the following: \`enable\`, \`disable\`, \`action\`, \`punish\`, \`punish-duration\`, \`threshold-maximum\`, \`threshold-duration\`, or \`show\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidMissingArguments: ({ name }) => - `${REDCROSS} The specified action requires an extra argument to be passed. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidSoftaction: ({ name }) => - `${REDCROSS} Value must be any of the following: \`alert\`, \`log\`, or \`delete\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidHardaction: ({ name }) => - `${REDCROSS} Value must be any of the following: \`none\`, \`warn\`, \`mute\`, \`kick\`, \`softban\`, or \`ban\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandEnabled: `${GREENTICK} Successfully enabled sub-system.`, - selfModerationCommandDisabled: `${GREENTICK} Successfully disabled sub-system.`, - selfModerationCommandSoftAction: `${GREENTICK} Successfully disabled actions.`, - selfModerationCommandSoftActionWithValue: ({ value }) => `${GREENTICK} Successfully set actions to: \`${value}\``, - selfModerationCommandHardAction: ({ value }) => `${GREENTICK} Successfully set punishment: ${value}`, - selfModerationCommandHardActionDuration: `${GREENTICK} Successfully removed the punishment appeal timer.`, - selfModerationCommandHardActionDurationWithValue: ({ value }) => - `${GREENTICK} Successfully set the punishment appeal timer to: ${this.duration(value)}`, - selfModerationCommandThresholdMaximum: `${GREENTICK} Successfully removed the threshold maximum, punishment will take place instantly if set.`, - selfModerationCommandThresholdMaximumWithValue: ({ value }) => `${GREENTICK} Successfully set the threshold maximum to: ${value}`, - selfModerationCommandThresholdDuration: `${GREENTICK} Successfully removed the threshold duration, punishments will take place instantly if set.`, - selfModerationCommandThresholdDurationWithValue: ({ value }) => - `${GREENTICK} Successfully set the threshold duration to: ${this.duration(value)}`, - selfModerationCommandShow: ({ - kEnabled, - kAlert, - kLog, - kDelete, - kHardAction, - hardActionDurationText, - thresholdMaximumText, - thresholdDurationText - }) => [ - `Enabled : ${kEnabled}`, - 'Action', - ` - Alert : ${kAlert}`, - ` - Log : ${kLog}`, - ` - Delete : ${kDelete}`, - 'Punishment', - ` - Type : ${kHardAction}`, - ` - Duration : ${hardActionDurationText}`, - 'Threshold', - ` - Maximum : ${thresholdMaximumText}`, - ` - Duration : ${thresholdDurationText}` - ], - selfModerationCommandShowDurationPermanent: 'Permanent', - selfModerationCommandShowUnset: 'Unset', - selfModerationSoftActionAlert: 'Alert', - selfModerationSoftActionLog: 'Log', - selfModerationSoftActionDelete: 'Delete', - selfModerationHardActionBan: 'Ban', - selfModerationHardActionKick: 'Kick', - selfModerationHardActionMute: 'Mute', - selfModerationHardActionSoftban: 'SoftBan', - selfModerationHardActionWarning: 'Warning', - selfModerationHardActionNone: 'None', - selfModerationEnabled: 'Yes', - selfModerationDisabled: 'No', - selfModerationMaximumTooShort: ({ minimum, value }) => `${REDCROSS} The value (${value}) was too short, expected at least ${minimum}.`, - selfModerationMaximumTooLong: ({ maximum, value }) => `${REDCROSS} The value (${value}) was too long, expected maximum ${maximum}.`, - selfModerationDurationTooShort: ({ minimum, value }) => - `${REDCROSS} The value (${this.duration(value)}) was too short, expected at least ${this.duration(minimum)}.`, - selfModerationDurationTooLong: ({ maximum, value }) => - `${REDCROSS} The value (${this.duration(value)}) was too long, expected maximum ${this.duration(maximum)}.`, - moderationActions: { - addRole: 'Added Role', - mute: 'Mute', - ban: 'Ban', - kick: 'Kick', - softban: 'Softban', - vkick: 'Voice Kick', - vmute: 'Voice Mute', - restrictedReact: 'Reaction Restriction', - restrictedEmbed: 'Embed Restriction', - restrictedAttachment: 'Attachment Restriction', - restrictedVoice: 'Voice Restriction', - setNickname: 'Set Nickname', - removeRole: 'Remove Role' - }, - actionApplyReason: ({ action, reason }) => `[Action] Applied ${action} | Reason: ${reason}`, - actionApplyNoReason: ({ action }) => `[Action] Applied ${action}`, - actionRevokeReason: ({ action, reason }) => `[Action] Revoked ${action} | Reason: ${reason}`, - actionRevokeNoReason: ({ action }) => `[Action] Revoked ${action}`, - actionSetNicknameSet: ({ reason }) => `[Action] Set Nickname | Reason: ${reason}`, - actionSetNicknameRemoved: ({ reason }) => `[Action] Removed Nickname | Reason: ${reason}`, - actionSetNicknameNoReasonSet: `[Action] Set Nickname.`, - actionSetNicknameNoReasonRemoved: `[Action] Removed Nickname.`, - actionSoftbanNoReason: '[Action] Applying Softban.', - actionSoftbanReason: ({ reason }) => `[Action] Applying Softban | Reason: ${reason}`, - actionUnSoftbanNoReason: '[Action] Applied Softban.', - actionUnSoftbanReason: ({ reason }) => `[Action] Applied Softban | Reason: ${reason}`, - actionRequiredMember: 'The user does not exist or is not in this server.', - actionSetupMuteExists: '**Aborting mute role creation**: There is already one that exists.', - actionSetupRestrictionExists: '**Aborting restriction role creation**: There is already one that exists.', - actionSetupTooManyRoles: '**Aborting role creation**: There are 250 roles in this guild, you need to delete one role.', - actionSharedRoleSetupExisting: 'I could not find a configured role. Do you want to configure an existing one?', - actionSharedRoleSetupExistingName: 'Please give me the name of the role you want to use for further actions of this type.', - actionSharedRoleSetupNew: 'Do you want me to create a new role and configure it automatically?', - actionSharedRoleSetupAsk: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channel to apply the role ${role} the following permission: ${permissions}?`, - actionSharedRoleSetupAskMultipleChannels: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channels to apply the role ${role} the following permission: ${permissions}?`, - actionSharedRoleSetupAskMultiplePermissions: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channel to apply the role ${role} the following permissions: ${permissions}?`, - actionSharedRoleSetupAskMultipleChannelsMultiplePermissions: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channels to apply the role ${role} the following permissions: ${permissions}?`, - muteNotConfigured: 'The muted role must be configured for this action to happen.', - restrictionNotConfigured: 'The restriction role must be configured for this action to happen', - muteNotInMember: 'The muted role is not set in the member.', - muteLowHierarchy: 'I cannot mute a user which higher role hierarchy than me.', - muteCannotManageRoles: `I must have **${this.PERMISSIONS.MANAGE_ROLES}** permissions to be able to mute.`, - muteNotExists: 'The specified user is not muted.', - - resolverDateSuffix: ' seconds', - resolverPositiveAmount: 'You must give me a positive number.', - systemPoweredByWeebsh: 'Powered by weeb.sh', - prefixReminder: ({ prefix }) => `The prefix in this guild is set to: \`${prefix}\``, - - unexpectedIssue: 'An unexpected error popped up! Safely aborting this command...', - - commandDmNotSent: 'I cannot send you a message in DMs, did you block me?', - commandDmSent: 'I have sent you the message in DMs.', - commandRoleHigherSkyra: 'The selected member has a role position that is higher than or equal to mine.', - commandRoleHigher: 'The selected member has a role position that is higher than or equal to yours.', - commandSuccess: 'Successfully executed the command.', - commandToskyra: 'Why... I thought you loved me! 💔', - commandUserself: 'Why would you do that to yourself?', - - systemParseError: `${REDCROSS} I failed to process the data I was given, sorry~!`, - systemHighestRole: "This role's hierarchy position is higher or equal than me, I am not able to grant it to anyone.", - systemChannelNotPostable: 'I am not allowed to send messages to this channel.', - systemFetchbansFail: `Failed to fetch bans. Do I have the **${this.PERMISSIONS.BAN_MEMBERS}** permission?`, - systemLoading: [ - `${LOADING} Watching hamsters run...`, - `${LOADING} Finding people at hide-and-seek...`, - `${LOADING} Trying to figure out this command...`, - `${LOADING} Fetching data from the cloud...`, - `${LOADING} Calibrating lenses...`, - `${LOADING} Playing rock, paper, scissors...`, - `${LOADING} Tuning in to the right frequencies...`, - `${LOADING} Reticulating splines...` - ], - systemError: `Something bad happened! Please try again, or if the issue keeps happening join the support server (hint: use \`Skyra, support\`)`, - systemDatabaseError: `I wasn't able get that in my database! Please try again, or if the issue keeps happening join the support server (hint: use \`Skyra, support\`)`, - systemDiscordAborterror: 'I had a small network error when messaging Discord, please run this command again!', - systemMessageNotFound: 'I am sorry, but either you wrote the message ID incorrectly, or it got deleted.', - systemNotenoughParameters: 'I am sorry, but you did not provide enough parameters...', - systemQueryFail: 'I am sorry, but the application could not resolve your request. Are you sure you wrote the name correctly?', - systemNoResults: "I wasn't able to find any results for that query", - systemCannotAccessChannel: 'I am sorry, but you do not have permission to see that channel.', - systemExceededLengthOutput: ({ output }) => `**Output**:${output}`, - systemExceededLengthOutputWithTypeAndTime: ({ output, time, type }) => `**Output**:${output}\n**Type**:${type}\n${time}`, - systemExceededLengthOutputConsole: () => `Sent the result to console.`, - systemExceededLengthOutputConsoleWithTypeAndTime: ({ time, type }) => `Sent the result to console.\n**Type**:${type}\n${time}`, - systemExceededLengthOutputFile: () => `Sent the result as a file.`, - systemExceededLengthOutputFileWithTypeAndTime: ({ time, type }) => `Sent the result as a file.\n**Type**:${type}\n${time}`, - systemExceededLengthOutputHastebin: ({ url }) => `Sent the result to hastebin: ${url}`, - systemExceededLengthOutputHastebinWithTypeAndTime: ({ url, time, type }) => `Sent the result to hastebin: ${url}\n**Type**:${type}\n${time}`, - systemExceededLengthChooseOutput: ({ output }) => `Choose one of the following options: ${this.list(output, 'or')}`, - systemExternalServerError: 'The external service we use could not process our message. Please try again later.', - systemPokedexExternalResource: 'External Resources', - jumpTo: 'Jump to Message ►', - - resolverInvalidChannelName: ({ name }) => `${name} must be a valid channel name, id, or tag.`, - resolverInvalidRoleName: ({ name }) => `${name} must be a valid role name, id, or mention.`, - resolverInvalidUsername: ({ name }) => `${name} must be a valid user name, id, or mention.`, - resolverChannelNotInGuild: 'I am sorry, but that command can only be ran in a server.', - resolverChannelNotInGuildSubcommand: ({ command, subcommand }) => - `${REDCROSS} I am sorry, but the subcommand \`${subcommand}\` for the command \`${command}\` can only be used in a server.`, - resolverMembernameUserLeftDuringPrompt: 'User left during prompt.', - - listifyPage: ({ page, pageCount, results }) => `Page ${page} / ${pageCount} | ${results} Total`, - - moderationLogAppealed: `${REDCROSS} I am sorry, but the selected moderation log has expired or cannot be cannot be made temporary.`, - moderationLogExpiresIn: ({ duration }) => `\n❯ **Expires In**: ${this.duration(duration)}`, - moderationLogDescription: ({ data: { caseID, formattedDuration, prefix, reason, type, userDiscriminator, userID, userName } }) => - [ - `❯ **Type**: ${type}`, - `❯ **User:** ${userName}#${userDiscriminator} (${userID})`, - `❯ **Reason:** ${reason || `Please use \`${prefix}reason ${caseID} \` to set the reason.`}${formattedDuration}` - ].join('\n'), - moderationLogFooter: ({ caseID }) => `Case ${caseID}`, - moderationCaseNotExists: () => `${REDCROSS} I am sorry, but the selected moderation log case does not exist.`, - ModerationCaseNotExistsPlural: () => `${REDCROSS} I am sorry, but none of the selected moderation log cases exist.`, - - guildSettingsChannelsMod: 'You need to configure a modlog channel. Use `Skyra, conf set channels.moderation-logs #modlogs`.', - guildSettingsRolesRestricted: ({ prefix, path }) => - `${REDCROSS} You need to configure a role for this action, use \`${prefix}settings set ${path} \` to set it up.`, - guildMuteNotFound: - 'I failed to fetch the modlog that sets this user as muted. Either you did not mute this user or all the mutes are appealed.', - guildBansEmpty: 'There are no bans registered in this server.', - guildBansNotFound: 'I tried and failed to find this user from the ban list. Are you certain this user is banned?', - channelNotReadable: `I am sorry, but I need the permissions **${this.PERMISSIONS.VIEW_CHANNEL}** and **${this.PERMISSIONS.READ_MESSAGE_HISTORY}**`, - - userNotInGuild: 'This user is not in this server.', - userNotExistent: 'This user does not exist. Are you sure you used a valid user ID?', - - eventsGuildMemberAdd: 'User Joined', - eventsGuildMemberAddMute: 'Muted User joined', - eventsGuildMemberAddDescription: ({ mention, time }) => `${mention} | **Joined Discord**: ${this.duration(time, 2)} ago.`, - eventsGuildMemberRemove: 'User Left', - eventsGuildMemberKicked: 'User Kicked', - eventsGuildMemberBanned: 'User Banned', - eventsGuildMemberSoftBanned: 'User Softbanned', - eventsGuildMemberRemoveDescription: ({ mention }) => `${mention} | **Joined Server**: Unknown.`, - eventsGuildMemberRemoveDescriptionWithJoinedAt: ({ mention, time }) => `${mention} | **Joined Server**: ${this.duration(time, 2)} ago.`, - eventsGuildMemberUpdateNickname: ({ previous, current }) => `Updated the nickname from **${previous}** to **${current}**`, - eventsGuildMemberAddedNickname: ({ current }) => `Added a new nickname **${current}**`, - eventsGuildMemberRemovedNickname: ({ previous }) => `Removed the nickname **${previous}**`, - eventsNicknameUpdate: 'Nickname Edited', - eventsUsernameUpdate: 'Username Edited', - eventsNameUpdatePreviousWasSet: ({ previousName }) => `**Previous**: \`${previousName}\``, - eventsNameUpdatePreviousWasNotSet: () => `**Previous**: Unset`, - eventsNameUpdateNextWasSet: ({ nextName }) => `**Next**: \`${nextName}\``, - eventsNameUpdateNextWasNotSet: () => `**Next**: Unset`, - eventsGuildMemberNoUpdate: 'No update detected', - eventsGuildMemberAddedRoles: ({ addedRoles }) => `**Added role**: ${addedRoles}`, - eventsGuildMemberAddedRolesPlural: ({ addedRoles }) => `**Added roles**: ${addedRoles}`, - eventsGuildMemberRemovedRoles: ({ removedRoles }) => `**Removed role**: ${removedRoles}`, - eventsGuildMemberRemovedRolesPlural: ({ removedRoles }) => `**Removed roles**: ${removedRoles}`, - eventsRoleUpdate: 'Roles Edited', - eventsMessageUpdate: 'Message Edited', - eventsMessageDelete: 'Message Deleted', - eventsReaction: 'Reaction Added', - eventsCommand: ({ command }) => `Command Used: ${command}`, - - settingsDeleteChannelsDefault: 'Reseated the value for `channels.default`', - settingsDeleteRolesInitial: 'Reseated the value for `roles.initial`', - settingsDeleteRolesMute: 'Reseated the value for `roles.muted`', - - modlogTimed: ({ remaining }) => `This moderation log is already timed. Expires in ${this.duration(remaining)}`, - - guildWarnNotFound: 'I failed to fetch the modlog for appealing. Either it does not exist, is not type of warning, or it is appealed.', - guildMemberNotVoicechannel: 'I cannot execute this action in a member that is not connected to a voice channel.', - - promptlistMultipleChoice: ({ list, count }) => - `There are ${count} result. Please choose a number between 1 and ${count}, or write **"CANCEL"** to cancel the prompt.\n${list}`, - promptlistMultipleChoicePlural: ({ list, count }) => - `There are ${count} results. Please choose a number between 1 and ${count}, or write **"CANCEL"** to cancel the prompt.\n${list}`, - promptlistAttemptFailed: ({ list, attempt, maxAttempts }) => `Invalid input. Attempt **${attempt}** out of **${maxAttempts}**\n${list}`, - promptlistAborted: 'Successfully aborted the prompt.', - - fuzzySearchMatches: ({ matches, codeblock }) => - `I found multiple matches! **Please select a number within 0 and ${matches}**:\n${codeblock}\nWrite **ABORT** if you want to exit the prompt.`, - fuzzySearchAborted: 'Successfully aborted the prompt.', - fuzzySearchInvalidNumber: 'I expected you to give me a (single digit) number, got a potato.', - fuzzySearchInvalidIndex: 'That number was out of range, aborting prompt.', - - eventsErrorWtf: `${REDCROSS} What a Terrible Failure! I am very sorry!`, - eventsErrorString: ({ mention, message }) => `${REDCROSS} Dear ${mention}, ${message}`, - - constUsers: 'Users', - unknownChannel: 'Unknown channel', - unknownRole: 'Unknown role', - unknownUser: 'Unknown user' - }; - - public async init() { - // noop - } -} diff --git a/src/languages/en-US/arguments/range.json b/src/languages/en-US/arguments/range.json new file mode 100644 index 00000000000..7adac57316c --- /dev/null +++ b/src/languages/en-US/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} must be a number or a range of numbers.", + "max_plural": "{{name}} accepts a range of maximum {{maximum}} numbers", + "max": "{{name}} accepts a range of maximum {{maximum}} number" +} diff --git a/src/languages/en-US/commands/admin.json b/src/languages/en-US/commands/admin.json new file mode 100644 index 00000000000..f854deba4c6 --- /dev/null +++ b/src/languages/en-US/commands/admin.json @@ -0,0 +1,81 @@ +{ + "blocklistDescription": "Block or allow users and guilds from using my functionalities.", + "blocklistExtended": { + "extendedHelp": "Block users that abuse my functions from using me in the future, naughty naughty people!" + }, + "blocklistResetSuccess": "{{GREENTICK}} Successfully reset blocked users and guilds", + "blocklistSaveSuccess": "{{GREENTICK}} Successfully updated blocked users and/or guilds", + "confNoKey": "You must provide a key", + "confNoValue": "You must provide a value", + "confGuarded": "{{name, toTitleCase}} may not be disabled.", + "confUpdated": "Successfully updated the key **{{key}}**: `{{response}}`", + "confKeyNotArray": "This key is not array type. Use the action 'reset' instead.", + "confGetNoExt": "The key **{{key}}** does not seem to exist.", + "confGet": "The value for the key **{{key}}** is: `{{value}}`", + "confReset": "The key **{{key}}** has been reset to: `{{value}}`", + "confNochange": "The value for **{{key}}** was already that value.", + "confServerDescription": "Define per-server settings.", + "confServerExtended": { + "extendedHelp": "Allows you to configure Skyra from Discord, as a quick alternative to the web dashboard ()." + }, + "confServer": "**Server Setting {{key}}**\n{{list}}", + "confUserDescription": "Define per-user settings.", + "confDashboardOnlyKey": "`{{key}}` can only be configured through the web dashboard ()", + "confUser": "**User Setting {{key}}**\n{{list}}", + "confSettingNotSet": "Not Set", + "heapSnapshotDescription": "Creates a heapdump for finding memory leaks.", + "heapSnapshotExtended": { + "extendedHelp": "The heapsnapshot command is very useful for bots that have memory issues, it uses the heapdump library which freezes the entire process for a moment to analyze all elements from the process' HEAP, NEVER share heapsnapshot files with anybody, as everything your bot holds is included in that file.\n\nTo open heapsnapshot files, open Google Chrome, open Developer Tools, go to the tab Memory, and in Profiles, click on the bottom \"load\". Finally, open the profile and you will be given a table of all objects in your process, have fun!\n\n\n\nP.S: heapsnapshot files are as big as the amount of RAM you use, in big bots, the snapshots can freeze the bot much longer and the files can be much heavier." + }, + "rolesetDescription": "Manage unique role sets.", + "rolesetExtended": { + "extendedHelp": "A role set is a group of roles Skyra identifies as unique for all members in the server, i.e. a roleset named `region` could have the roles `Africa`, `America`, `Asia`, and `Europe`, and members will only be able to have one of them. This is like a kind of \"rule\" that is applied in the three following situations:\n\n- When somebody claims a role via the `roles` command.\n- When somebody claims a role via reaction roles.\n- When somebody receives a role either manually or from another bot.", + "explainedUsage": [ + ["add", "Create a new roleset or add a role to an existing one."], + ["remove", "Remove a role from an existing roleset."], + ["reset", "Removes all roles from a roleset or, if not specified, all existing rolesets."], + ["list", "Lists all rolesets."], + ["auto", "Adds or removes a roleset."] + ], + "examples": [ + "add regions America", + "add regions Africa America Asia Europe", + "remove regions America", + "reset", + "reset regions", + "list", + "regions America", + "regions Africa America Asia Europe" + ], + "reminder": "This command can add and/or remove multiple roles at the same time." + }, + "rolesetCreated": "The {{name}} unique role set has been created with the following roles: {{roles, andList}}", + "rolesetAdded": "The {{name}} unique role set now has the following roles as well: {{roles, andList}}.", + "rolesetInvalidName": "You can not remove the {{name}} unique role set because it does not exist.", + "rolesetRemoved": "The {{name}} unique role set will no longer include the following roles: {{roles, andList}}", + "rolesetResetEmpty": "{{REDCROSS}} There are no rolesets configured in this groupo.", + "rolesetResetAll": "{{GREENTICK}} Successfully removed all rolesets.", + "rolesetResetNotExists": "{{REDCROSS}} The roleset `{{name}}` does not exist in this server.", + "rolesetResetGroup": "{{GREENTICK}} Successfully removed the roleset `{{name}}` from this server.", + "rolesetUpdated": "The {{name}} unique role set has been updated.", + "rolesetNoRolesets": "You have no rolesets.", + "confMenuNopermissions": "I need the {{ADD_REACTIONS, permissions}} and {{MANAGE_MESSAGES, permissions}} permissions to be able to run the menu.", + "confMenuRenderAtFolder": "Currently at: 📁 {{path}}", + "confMenuRenderAtPiece": "Currently at: ⚙️ {{path}}", + "confMenuRenderNokeys": "There are no configurable keys for this folder", + "confMenuRenderSelect": "Please type in any of the following entries' names", + "confMenuRenderTctitle": "Text s:", + "confMenuRenderUpdate": "• Update Value → `set `", + "confMenuRenderRemove": "• Remove Value → `remove `", + "confMenuRenderReset": "• Reset Value → `reset`", + "confMenuRenderUndo": "• Undo Update → `undo`", + "confMenuRenderCvalue": "Current Value: **``{{value}}``**", + "confMenuRenderBack": "Press ◀ to go back", + "confMenuInvalidKey": "Invalid Key, please try again with any of the following options.", + "confMenuInvalidAction": "Invalid Action, please try again with any of the following options.", + "confMenuSaved": "Successfully saved all changes.", + "updateDescription": "Update the bot", + "updateExtended": { + "extendedHelp": "Some polish here, some cleanup there, and whatyaknow, I'm suddenly a whole new android!" + } +} diff --git a/src/languages/en-US/commands/animal.json b/src/languages/en-US/commands/animal.json new file mode 100644 index 00000000000..b582843005e --- /dev/null +++ b/src/languages/en-US/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "Let me tell you a mysterious cat fact.", + "catfactExtended": { + "extendedHelp": "You know cats are very curious, right? They certainly have a lot of fun and weird facts.\nWith this command you will get a random fact." + }, + "catfactTitle": "Cat Fact", + "dogDescription": "Cute doggos! ❤", + "dogExtended": { + "extendedHelp": "Do **you** know how cute dogs are? They are so beautiful!\nThis command uses [dog.ceo](https://dog.ceo) to show pictures of the cuttest doggos!" + }, + "foxDescription": "Let me show you an image of a fox!", + "foxExtended": { + "extendedHelp": "This command gives a random image from [randomfox.ca](https://randomfox.ca/)." + }, + "kittyDescription": "KITTENS!", + "kittyExtended": { + "extendedHelp": "Do **you** know how cute are kittens? They are so beautiful!\nThis command uses [cataas.com](https://cataas.com/) to show pictures of the cuttest cats!" + }, + "shibeDescription": "Cute shibas!", + "shibeExtended": { + "extendedHelp": "Everyone loves shibas, I shall love them aswell! They're so adorable ❤" + } +} diff --git a/src/languages/en-US/commands/anime.json b/src/languages/en-US/commands/anime.json new file mode 100644 index 00000000000..0fb26cfdb5e --- /dev/null +++ b/src/languages/en-US/commands/anime.json @@ -0,0 +1,54 @@ +{ + "animeDescription": "Search your favourite anime by title with this command.", + "animeExtended": { + "extendedHelp": "This command queries Kitsu.io to show data for the anime you request.", + "explainedUsage": [["query", "The anime's name you are looking for."]], + "examples": ["One Piece"] + }, + "mangaDescription": "Search your favourite manga by title with this command.", + "mangaExtended": { + "extendedHelp": "This command queries Kitsu.io to show data for the manga you request.", + "explainedUsage": [["query", "The manga's name you are looking for."]], + "examples": ["Stone Ocean", "One Piece"] + }, + "waifuDescription": "Posts a randomly generated waifu image.", + "waifuExtended": { + "extendedHelp": "This commands posts a random waifu generated by " + }, + "animeTypes": { + "tv": "📺 TV", + "movie": "🎥 Movie", + "ova": "📼 Original Video Animation", + "special": "🎴 Special" + }, + "animeInvalidChoice": "That's an invalid choice! Please try with another option.", + "animeOutputDescription": "**English title:** {{englishTitle}}\n**Japanese title:** {{japaneseTitle}}\n**Canonical title:** {{canonicalTitle}}\n{{synopsis}}", + "animeNoSynopsis": "No synopsis available for this title.", + "animeEmbedData": { + "type": "Type", + "score": "Score", + "episodes": "Episode(s)", + "episodeLength": "Episode length", + "ageRating": "Age rating", + "firstAirDate": "First air date", + "watchIt": "Watch it here:", + "stillAiring": "Still airing" + }, + "mangaOutputDescription": "**English title:** {{englishTitle}}\n**Japanese title:** {{japaneseTitle}}\n**Canonical title:** {{canonicalTitle}}\n{{synopsis}}", + "mangaTypes": { + "manga": "📘 Manga", + "novel": "📕 Novel", + "manhwa": "🇰🇷 Manhwa", + "oneShot": "☄ One Shot", + "special": "🎴 Special" + }, + "mangaEmbedData": { + "ageRating": "Age Rating", + "firstPublishDate": "First published on", + "readIt": "Read it here:", + "score": "Score", + "type": "Subtype", + "none": "None" + }, + "waifuFooter": "Powered by thiswaifudoesnotexist.net" +} diff --git a/src/languages/en-US/commands/announcement.json b/src/languages/en-US/commands/announcement.json new file mode 100644 index 00000000000..b019d0e33b3 --- /dev/null +++ b/src/languages/en-US/commands/announcement.json @@ -0,0 +1,27 @@ +{ + "announcementHeader": "**New announcement for** {{role}}", + "announcementCancelled": "Cancelled the message.", + "announcementDescription": "Send new announcements, mentioning the announcement role.", + "announcementEmbedMentions": "{{header}}:", + "announcementEmbedMentionsWithMentions": "{{header}}, and mentioning: {{mentions, andList}}:", + "announcementExtended": { + "extendedHelp": "This command requires an announcement channel (**channels.announcement** in the configuration command) which tells Skyra where she should post the announcement messages.\n\nQuestion is, is this command needed? Well, nothing stops you from making your announcements by yourself, however, there are many people who hate being mentioned by at everyone/here.\n\nTo avoid this, Skyra gives you the option of creating a subscriber role, which is unmentionable (to avoid people spam mentioning the role), and once you run this command, Skyra will set the role to be mentionable, post the message, and back to unmentionable.\n\nFurthermore, you can configure Skyra to send the announcement as a message embed by setting the **messages.announcement-embed** option in the configuration command. When sending the message as an an embed you can exclude the mentions of any users, @here or @everyone by providing the `--excludeMentions` flag to the announcement.", + "explainedUsage": [["announcement", "The announcement text to post."]], + "examples": ["I am glad to announce that we have a bot able to safely send announcements for our subscribers!"], + "reminder": "If you want to edit the message you send in an announcement, just edit the message you used to have Skyra send that announcement. Skyra will then edit the message she sent previously. She can do this up to 15 minutes after the initial announcement, so be sure to not wait long!" + }, + "announcementPrompt": "This will be the message sent in the announcement channel. Are you OK with this?", + "announcementSuccess": "Successfully posted a new announcement.", + "subscribeDescription": "Subscribe to this server's announcements.", + "subscribeExtended": { + "extendedHelp": "This command serves the purpose of **giving** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." + }, + "subscribeNoChannel": "This server does not have a configured announcement channel.", + "subscribeNoRole": "This server does not have a configured announcement role.", + "subscribeSuccess": "Successfully granted the role: **{{role}}**", + "unsubscribeDescription": "Unsubscribe from this server's announcements.", + "unsubscribeExtended": { + "extendedHelp": "This command serves the purpose of **removing** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will **not longer** be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." + }, + "unsubscribeSuccess": "Successfully removed the role: **{{role}}**" +} diff --git a/src/languages/en-US/commands/developer.json b/src/languages/en-US/commands/developer.json new file mode 100644 index 00000000000..12e9abb8f19 --- /dev/null +++ b/src/languages/en-US/commands/developer.json @@ -0,0 +1,22 @@ +{ + "yarnDescription": "Responds with information on a NodeJS package using the Yarn package registry", + "yarnExtended": { + "extendedHelp": "This is for NodeJS developers who want to quickly find information on a package published to [npm](https://npmjs.com)", + "explainedUsage": [["package", "The name of the package to search for, has to be an exact match"]], + "examples": ["@skyra/char", "@skyra/saelem", "@skyra/eslint-config"] + }, + "yarnEmbedDescriptionAuthor": "❯ Author: {{author}}", + "yarnEmbedDescriptionDateCreated": "❯ Date Created: **{{dateCreated}}**", + "yarnEmbedDescriptionDateModified": "❯ Date Modified: **{{dateModified}}**", + "yarnEmbedDescriptionDependenciesLabel": "__*Dependencies:*__", + "yarnEmbedDescriptionDependenciesNoDeps": "No dependencies {{GREENTICK}}!", + "yarnEmbedDescriptionDeprecated": "❯ Deprecation Notice: **{{deprecated}}**", + "yarnEmbedDescriptionLatestVersion": "❯ Latest version: **{{latestVersionNumber}}**", + "yarnEmbedDescriptionLicense": "❯ License: **{{license}}**", + "yarnEmbedDescriptionMainFile": "❯ Main File: **{{mainFile}}**", + "yarnEmbedDescriptionMaintainers": "❯ Maintainers: **{{maintainers, andList}}**", + "yarnEmbedMoreText": "more...", + "yarnNoPackage": "{{REDCROSS}} I am sorry, but you have to give me the name of a package to look up.", + "yarnPackageNotFound": "I'm sorry, but I could not find any package by the name of `{{pkg}}` in the registry.", + "yarnUnpublishedPackage": "What a silly developer who made {{pkg}}! They unpublished it!" +} diff --git a/src/languages/en-US/commands/fun.json b/src/languages/en-US/commands/fun.json new file mode 100644 index 00000000000..d5f949e02d6 --- /dev/null +++ b/src/languages/en-US/commands/fun.json @@ -0,0 +1,176 @@ +{ + "8ballDescription": "Skyra will read the Holy Bible to find the correct answer for your question.", + "8ballExtended": { + "extendedHelp": "This command provides you a random question based on your questions' type. Be careful, it may be too smart.", + "explainedUsage": [["question", "The Holy Question"]], + "examples": ["Why did the chicken cross the road?"] + }, + "choiceDescription": "Eeny, meeny, miny, moe, catch a tiger by the toe...", + "choiceExtended": { + "extendedHelp": "I have an existencial doubt... should I wash the dishes or throw them through the window? The search continues. List me items separated by comma and I will choose one them. On a side note, I am not responsible of what happens next.", + "explainedUsage": [["words", "A list of words separated by comma."]], + "examples": ["Should Wash the dishes, Throw the dishes out the window", "Cat, Dog"] + }, + "changemymindDescription": "Skyra is the best, change my mind.", + "changemymindExtended": { + "extendedHelp": "I still think I'm the best, change my mind. I make a photo with your avatar and some text in some paper.", + "explainedUsage": [["text", "The phrase you want."]], + "examples": ["Skyra is the best bot in this server"] + }, + "diceDescription": "Roll the dice using d20 syntax.", + "diceExtended": { + "extendedHelp": "The mechanics of this command are easy. You have a dice, then you roll it __x__ times, but the dice can also be configured to have __y__ sides. By default, this command rolls a dice with 6 sides once. However, you can change the amount of rolls for the dice, and this command will \"roll\" (get a random number between 1 and the amount of sides). For example, rolling a dice with 6 sides 3 times will leave a random sequence of three random numbers between 1 and 6, for example: 3, 1, 6; And this command will return 10 as output.", + "examples": ["370d24", "100d6", "6"] + }, + "escaperopeDescription": "Use the escape rope from Pokemon.", + "escaperopeExtended": { + "extendedHelp": "**Skyra** used **Escape Rope**." + }, + "howToFlirtDescription": "Captain America, you do not know how to flirt.", + "howToFlirtExtended": { + "extendedHelp": "Let me show you how to effectively flirt with somebody using the Tony Stark's style for Captain America, I can guarantee that you'll get him.", + "explainedUsage": [["user", "The user to flirt with."]], + "examples": ["Skyra"] + }, + "loveDescription": "Lovemeter, online!", + "loveExtended": { + "extendedHelp": "Hey! Wanna check the lovemeter? I know it's a ridiculous machine, but many humans love it! Don't be shy and try it!", + "explainedUsage": [["user", "The user to rate."]], + "examples": ["Skyra"] + }, + "markovDescription": "Generate a Markov Chain from the text channel.", + "markovExtended": { + "extendedHelp": "A Markov chain is a stocha... what? Okay, something something a probability theory made by a Russian mathematician, check Wikipedia for more information. **In short**: I will generate a random message given the content of the messages in the channel." + }, + "norrisDescription": "Enjoy your day reading Chuck Norris's jokes.", + "norrisExtended": { + "extendedHelp": "Did you know that Chuck norris does **not** call the wrong number, but you **answer** the wrong phone? Woah, mindblow. He also threw a carton of milk and created the Milky Way. This command queries chucknorris.io and retrieves a fact (do not assume they're false, not in front of him) so you can read it" + }, + "rateDescription": "Let bots have opinions and rate somebody.", + "rateExtended": { + "extendedHelp": "Just because I am a bot doesn't mean I cannot rate you properly. I can grade you with a random number generator to ease the process. Okay okay, it's not fair, but I mean... I can also give you a 💯.", + "explainedUsage": [["user", "The user to rate."]], + "examples": ["Skyra", "me"] + }, + "shindeiruDescription": "Omae wa mou shindeiru.", + "shindeiruExtended": { + "extendedHelp": "\"You are already dead\" Japanese: お前はもう死んでいる; Omae Wa Mou Shindeiru, is an expression from the manga and anime series Fist of the North Star. This shows a comic strip of the character pronouncing the aforementioned words, which makes the opponent reply with \"nani?\" (what?)." + }, + "xkcdDescription": "Read comics from XKCD.", + "xkcdExtended": { + "extendedHelp": "**xkcd** is an archive for nerd comics filled with math, science, sarcasm and languages. If you don't provide any argument, I will get a random comic from xkcd. If you provide a number, I will retrieve the comic with said number. But if you provide a title/text/topic, I will fetch a comic that matches with your input and display it. For example, `Skyra, xkcd Curiosity` will show the comic number 1091.", + "explainedUsage": [["query", "Either the number of the comic, or a title to search for."]], + "examples": ["1091", "Curiosity"] + }, + "punDescription": "Shows you a random pun.", + "punExtended": { + "extendedHelp": "A steak pun is a rare medium well done.\nGet your daily doses of dad jokes from icanhazdadjoke.com and laugh at witty wisecracks." + }, + "wakandaDescription": "Helpful descriptions? We don't do that here", + "wakandaExtended": { + "extendedHelp": "Creates an image macro using the [We Don't Do That Here Meme](https://knowyourmeme.com/memes/we-dont-do-that-here) using the given user." + }, + "8ballOutput": "🎱 Question by {{author}}: *{{question}}*\n{{response}}", + "8ballQuestions": { + "When": "when", + "What": "what", + "HowMuch": "how much", + "HowMany": "how many", + "Why": "why", + "Who": "who" + }, + "8ballWhen": ["Soon™", "Maybe tomorrow.", "Maybe next year...", "Right now.", "In a few months."], + "8ballWhat": ["A plane.", "What? Ask again.", "A gift.", "Nothing.", "A ring.", "I do not know, maybe something."], + "8ballHowMuch": [ + "A lot.", + "A bit.", + "A few.", + "Ask me tomorrow.", + "I do not know, ask a physicist.", + "Nothing.", + "Within 10 and 1000L.", + "10e1000L.", + "2 or 3 liters, I don't remember.", + "Infinity.", + "1010 liters." + ], + "8ballHowMany": [ + "A lot.", + "A bit.", + "A few.", + "Ask me tomorrow.", + "I don't know, ask a physicist.", + "Nothing.", + "Within 10 and 1000.", + "10e1000.", + "2 or 3, I do not remember.", + "Infinity", + "1010." + ], + "8ballWhy": [ + "Maybe genetics.", + "Because somebody decided it.", + "For the glory of satan, of course!", + "I do not know, maybe destiny.", + "Because I said so.", + "I have no idea.", + "Ask the owner of this server.", + "Ask again.", + "To get to the other side.", + "It says so in the Bible." + ], + "8ballWho": [ + "A human.", + "A robot.", + "An airplane.", + "A bird.", + "A carbon composition.", + "A bunch of zeroes and ones.", + "I have no clue, is it material?", + "That is not logical." + ], + "8ballElse": [ + "Most likely.", + "Nope.", + "YES!", + "Maybe.", + "As I see it, yes", + "Ask me tomorrow.", + "I don't know, ask a physicist.", + "Better not tell you now.", + "Don’t count on it.", + "It is certain.", + "It is decidedly so.", + "My sources say no.", + "Outlook not so good.", + "Outlook good.", + "Reply hazy, try again.", + "Signs point to yes.", + "Very doubtful.", + "Without a doubt.", + "Yes – definitely.", + "You may rely on it." + ], + "choiceOutput": "🕺 *Eeny, meeny, miny, moe, catch a tiger by the toe...* {{user}}, I choose:{{word, codeBlock}}", + "choiceMissing": "Please write at least two options separated by comma.", + "choiceDuplicates": "Why would I accept duplicated words? \"{{words}}\".", + "diceOutput": "You rolled the dice! You got: **{{result}}**", + "diceRollsError": "Amount of rolls must be a number between 1 and 1024.", + "diceSidesError": "Amount of sides must be a number between 3 and 1024.", + "escaperopeOutput": "**{{user}}** used **Escape Rope**", + "loveLess45": "Try again next time...", + "loveLess75": "Good enough!", + "loveLess100": "Good match!", + "love100": "Perfect match!", + "loveItself": "You are a special creature and you should love yourself more than anyone <3", + "loveResult": "Result", + "markovTimer": "Processed in {{timer}}.", + "markovNoMessages": "The channel or user has no messages.", + "norrisOutput": "Chuck Norris", + "rateOutput": "**{{author}}**, I would give **{{userToRate}}** a **{{rate}}**/100 {{emoji}}", + "rateMyself": [". I love myself a lot 😊", "myself"], + "rateOwners": [". I love my developers a lot 🥰", "my developers"], + "punError": "Something went wrong. Try again later.", + "xkcdComics": "There are only {{amount}} comics.", + "xkcdNotfound": "I have searched far and wide, but I got no luck finding this comic, try again later or try another!" +} diff --git a/src/languages/en-US/commands/game.json b/src/languages/en-US/commands/game.json new file mode 100644 index 00000000000..ef860e52a52 --- /dev/null +++ b/src/languages/en-US/commands/game.json @@ -0,0 +1,475 @@ +{ + "c4Description": "Play Connect-Four with somebody.", + "c4Extended": { + "extendedHelp": "This game is best played on PC.\nConnect Four is a two-player connection game in which the players first choose a color and then take turns dropping colored discs from the top into a seven-column, six-row vertically suspended grid." + }, + "c4GameColumnFull": "This column is full. Please try another. ", + "c4GameDraw": "This match concluded in a **draw**!", + "c4GameNext": "Turn for: {{user}} (red).", + "c4GameNextTurn0": "Turn for: {{user}} (blue).", + "c4GameWin": "{{user}} (red) won!", + "c4GameWinTurn0": "{{user}} (blue) won!", + "c4Prompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a Connect-Four match. Reply with **yes** to accept!", + "c4Start": "Let's play! Turn for: **{{player}}**.", + "cannotHaveNegativeMoney": "You cannot have a negative amount of {{SHINY}}s.", + "coinFlipCoinnames": ["Heads", "Tails"], + "coinFlipDescription": "Flip a coin!", + "coinFlipExtended": { + "extendedHelp": "Flip a coin. If you guess the side that shows up, you get back your wager, doubled.\nIf you don't, you lose your wager.\nYou can also run a cashless flip, which doesn't cost anything, but also doesn't reward you with anything.\nNow get those coins flippin'.", + "examples": ["heads 50", "tails 200"] + }, + "coinFlipInvalidCoinname": "Excuse me, but {{arg}} is not a coin face!", + "coinFlipLoseDescription": "The coin was flipped, and it showed {{result}}. You didn't guess correctly.", + "coinFlipLoseDescriptionWithWager": "The coin was flipped, and it showed {{result}}. You didn't guess correctly and lost {{wager}} {{SHINY}}.", + "coinFlipLoseTitle": "You lost.", + "coinFlipNoguessDescription": "The coin was flipped, and it showed {{result}}.", + "coinFlipNoguessTitle": "You flipped a coin.", + "coinFlipWinDescription": "The coin was flipped, and it showed {{result}}. You got it right!", + "coinFlipWinDescriptionWithWager": "The coin was flipped, and it showed {{result}}. You guessed correctly and won {{wager}} {{SHINY}}!", + "coinFlipWinTitle": "You won!", + "gamesBot": "I am sorry, but I do not think they would like to stop doing what they are doing and play with humans.", + "gamesNoPlayers": "Please specify some tributes to play the Hunger Games, like so: `{{prefix}}hg Bob, Mark, Jim, Kyra`", + "gamesProgress": "I am sorry, but there is a game in progress in this channel, try again when it finishes.", + "gamesPromptDeny": "I am sorry, but the challengee refused to play.", + "gamesPromptTimeout": "I am sorry, but the challengee did not reply on time.", + "gamesRepeat": "I am sorry, but a user cannot play twice.", + "gamesSelf": "You must be so sad to play against yourself. Try again with another user.", + "gamesSkyra": "I am sorry, I know you want to play with me, but if I do, I will not be able to help other people! 💔", + "gamesTimeout": "**The match concluded in a draw due to lack of a response (60 seconds)**", + "gamesTooManyOrFew": "I am sorry but the amount of players is less than {{min}} or greater than {{max}}.", + "hgBloodbath": [ + "{1} grabs a shovel.", + "{1} grabs a backpack and retreats.", + "{1} and {2} fight for a bag. {1} gives up and retreats.", + "{1} and {2} fight for a bag. {2} gives up and retreats.", + "{1} finds a bow, some arrows, and a quiver.", + "{1} runs into the cornucopia and hides.", + "{1} takes a handful of throwing knives.", + "{1} rips a mace out of {2}'s hands.", + "{1} finds a canteen full of water.", + "{1} stays at the cornucopia for resources.", + "{1} gathers as much food as they can.", + "{1} grabs a sword.", + "{1} takes a spear from inside the cornucopia.", + "{1} finds a bag full of explosives.", + "{1} clutches a first aid kit and runs away.", + "{1} takes a sickle from inside the cornucopia.", + "{1}, {2}, and {3} work together to get as many supplies as possible.", + "{1} runs away with a lighter and some rope.", + "{1} snatches a bottle of alcohol and a rag.", + "{1} finds a backpack full of camping equipment.", + "{1} grabs a backpack, not realizing it is empty.", + "{1} breaks {2}'s nose for a basket of bread.", + "{1}, {2}, {3}, and {4} share everything they gathered before running.", + "{1} retrieves a trident from inside the cornucopia.", + "{1} grabs a jar of fishing bait while {2} gets fishing gear.", + "{1} scares {2} away from the cornucopia.", + "{1} grabs a shield leaning on the cornucopia.", + "{1} snatches a pair of sais.", + "{1} grabs a lone pair of pants.", + "{1T} steps off their podium too soon and blows up.", + "{1} throws a knife into {2T}'s head.", + "{1T} accidently steps on a landmine.", + "{1} catches {2T} off guard and kills them.", + "{1} and {2} work together to drown {3T}.", + "{1} strangles {2T} after engaging in a fist fight.", + "{1} shoots an arrow into {2T}'s head.", + "{1T} cannot handle the circumstances and commits suicide.", + "{1} bashes {2T}'s head against a rock several times.", + "{1} snaps {2T}'s neck.", + "{1} decapitates {2T} with a sword.", + "{1} spears {2T} in the abdomen.", + "{1} sets {2T} on fire with a molotov.", + "{1T} falls into a pit and dies.", + "{1} stabs {2T} while their back is turned.", + "{1} severely injures {2T}, but puts them out of their misery.", + "{1} severely injures {2T} and leaves them to die.", + "{1} bashes {2T}'s head in with a mace.", + "{1} pushes {2T} off a cliff during a knife fight.", + "{1} throws a knife into {2T}'s chest.", + "{1T} is unable to convince {2} to not kill them.", + "{1} convinces {2T} to not kill them, only to kill {2T} instead.", + "{1T} falls into a frozen lake and drowns.", + "{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.", + "{1} kills {2T} with their own weapon.", + "{1} overpowers {2T}, killing them.", + "{1} sets an explosive off, killing {2T}.", + "{1} sets an explosive off, killing {2T}, and {3T}.", + "{1} sets an explosive off, killing {2T}, {3T}, and {4T}.", + "{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.", + "{1} kills {2T} as they try to run.", + "{1T} and {2T} threaten a double suicide. It fails and they die.", + "{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.", + "{1} kills {2T} with a hatchet.", + "{1} and {2} fight {3T} and {4T}. {1} and {2} survive.", + "{1T} and {2T} fight {3} and {4}. {3} and {4} survive.", + "{1T} attacks {2}, but {3} protects them, killing {1T}.", + "{1} severely slices {2T} with a sword.", + "{1} strangles {2T} with a rope.", + "{1} kills {2T} for their supplies.", + "{1} shoots an arrow at {2}, but misses and kills {3T} instead.", + "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", + "{1} stabs {2T} with a tree branch.", + "{1} stabs {2T} in the back with a trident.", + "{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.", + "{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.", + "{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.", + "{1} finds {2T} hiding in the cornucopia and kills them.", + "{1T} finds {2} hiding in the cornucopia, but {2} kills them.", + "{1} kills {2T} with a sickle.", + "{1} and {2T} fight for a bag. {1} strangles {2T} with the straps and runs.", + "{1T} and {2} fight for a bag. {2} strangles {1T} with the straps and runs.", + "{1} repeatedly stabs {2T} to death with sais.", + "{1T} trips over while running from the cornucopia, and is killed by {2}.", + "{1} trips over while running from the cornucopia, {2} picks them up, they run off together.", + "{1} aims an arrow at {2}'s head and shoots, {3T} jumps in the way and sacrifies their life to save them." + ], + "hgDay": [ + "{1} goes hunting.", + "{1} injures themself.", + "{1} explores the arena.", + "{1} scares {2} off.", + "{1} diverts {2}'s attention and runs away.", + "{1} stalks {2}.", + "{1} fishes.", + "{1} camouflauges themself in the bushes.", + "{1} steals from {2} while they aren't looking.", + "{1} makes a wooden spear.", + "{1} discovers a cave.", + "{1} attacks {2}, but they manage to escape.", + "{1} chases {2}.", + "{1} runs away from {2}.", + "{1} collects fruit from a tree.", + "{1} receives a hatchet from an unknown sponsor.", + "{1} receives clean water from an unknown sponsor.", + "{1} receives medical supplies from an unknown sponsor.", + "{1} receives fresh food from an unknown sponsor.", + "{1} searches for a water source.", + "{1} defeats {2} in a fight, but spares their life.", + "{1} and {2} work together for the day.", + "{1} begs for {2} to kill them. They refuse, keeping {1} alive.", + "{1} tries to sleep through the entire day.", + "{1}, {2}, {3}, and {4} raid {5}'s camp while they are hunting.", + "{1} constructs a shack.", + "{1} overhears {2} and {3} talking in the distance.", + "{1} practices their archery.", + "{1} thinks about home.", + "{1} is pricked by thorns while picking berries.", + "{1} tries to spear fish with a trident.", + "{1} searches for firewood.", + "{1} and {2} split up to search for resources.", + "{1} picks flowers.", + "{1} tends to {2}'s wounds.", + "{1} sees smoke rising in the distance, but decides not to investigate.", + "{1} sprains their ankle while running away from {2}.", + "{1} makes a slingshot.", + "{1} travels to higher ground.", + "{1} discovers a river.", + "{1} hunts for other tributes.", + "{1} and {2} hunt for other tributes.", + "{1}, {2}, and {3} hunt for other tributes.", + "{1}, {2}, {3}, and {4} hunt for other tributes.", + "{1}, {2}, {3}, {4}, and {5} hunt for other tributes.", + "{1} receives an explosive from an unknown sponsor.", + "{1} questions their sanity.", + "{1} forces {2} to eat pant.", + "{1} forces {2T} to eat pant. {2T} chokes and dies.", + "{1} catches {2T} off guard and kills them.", + "{1} throws a knife into {2T}'s head.", + "{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.", + "{1} and {2} work together to drown {3T}.", + "{1} strangles {2T} after engaging in a fist fight.", + "{1} shoots an arrow into {2T}'s head.", + "{1T} bleeds out due to untreated injuries.", + "{1T} cannot handle the circumstances and commits suicide.", + "{1} bashes {2T}'s head against a rock several times.", + "{1T} unknowingly eats toxic berries.", + "{1} silently snaps {2T}'s neck.", + "{1} taints {2T}'s food, killing them.", + "{1} decapitates {2T} with a sword.", + "{1T} dies from an infection.", + "{1} spears {2T} in the abdomen.", + "{1} sets {2T} on fire with a molotov.", + "{1T} falls into a pit and dies.", + "{1} stabs {2T} while their back is turned.", + "{1} severely injures {2T}, but puts them out of their misery.", + "{1} severely injures {2T} and leaves them to die.", + "{1} bashes {2T}'s head in with a mace.", + "{1T} attempts to climb a tree, but falls to their death.", + "{1} pushes {2T} off a cliff during a knife fight.", + "{1} throws a knife into {2T}'s chest.", + "{1}'s trap kills {2T}.", + "{1} kills {2T} while they are resting.", + "{1T} is unable to convince {2} to not kill them.", + "{1} convinces {2T} to not kill them, only to kill {2T} instead.", + "{1T} falls into a frozen lake and drowns.", + "{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.", + "{1} kills {2T} with their own weapon.", + "{1} overpowers {2T}, killing them.", + "{1} sets an explosive off, killing {2T}.", + "{1} sets an explosive off, killing {2T}, and {3T}.", + "{1} sets an explosive off, killing {2T}, {3T}, and {4T}.", + "{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.", + "{1} kills {2T} as they try to run.", + "{1T} and {2T} threaten a double suicide. It fails and they die.", + "{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.", + "{1T} dies from hypothermia.", + "{1T} dies from hunger.", + "{1T} dies from thirst.", + "{1} kills {2T} with a hatchet.", + "{1} and {2} fight {3T} and {4T}. {1} and {2} survive.", + "{1T} and {2T} fight {3} and {4}. {3} and {4} survive.", + "{1T} dies trying to escape the arena.", + "{1T} dies of dysentery.", + "{1T} accidently detonates a land mine while trying to arm it.", + "{1T} attacks {2}, but {3} protects them, killing {1T}.", + "{1} ambushes {2T} and kills them.", + "{1T} accidently steps on a landmine.", + "{1} severely slices {2T} with a sword.", + "{1} strangles {2T} with a rope.", + "{1} kills {2T} for their supplies.", + "{1} shoots an arrow at {2}, but misses and kills {3T} instead.", + "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", + "{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.", + "{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.", + "{1} stabs {2T} with a tree branch.", + "{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.", + "{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.", + "{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.", + "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", + "{1} poisons {2T}'s drink. They drink it and die.", + "{1} stabs {2T} in the back with a trident.", + "{1T} attempts to climb a tree, but falls on {2T}, killing them both.", + "{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.", + "{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.", + "{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.", + "{1} kills {2T} with a sickle.", + "{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.", + "{1}, {2}, {3}, and {4} track down and kill {5T}.", + "{1}, {2}, and {3} track down and kill {4T}.", + "{1} and {2} track down and kill {3T}.", + "{1} tracks down and kills {2T}.", + "{1} repeatedly stabs {2T} to death with sais.", + "{1} doodles in the dirt.", + "{1} chases a butterfly.", + "{1T} falls off a cliff, and is impaled by a stick.", + "{1} runs into {2}, they decide to team up.", + "{1} sees {2} through the trees, and plans on killing them.", + "{1} sneaks up behind {2T}, and snaps their neck.", + "{1T} challenges {2} to a fight, and promptly dies.", + "{1} murders their partner, {2T}, to have more supplies for themself." + ], + "hgNight": [ + "{1} starts a fire.", + "{1} sets up camp for the night.", + "{1} loses sight of where they are.", + "{1} climbs a tree to rest.", + "{1} goes to sleep.", + "{1} and {2} tell stories about themselves to each other.", + "{1}, {2}, {3}, and {4} sleep in shifts.", + "{1}, {2}, and {3} sleep in shifts.", + "{1} and {2} sleep in shifts.", + "{1} tends to their wounds.", + "{1} sees a fire, but stays hidden.", + "{1} screams for help.", + "{1} stays awake all night.", + "{1} passes out from exhaustion.", + "{1} cooks their food before putting their fire out.", + "{1} and {2} run into each other and decide to truce for the night.", + "{1} fends {2}, {3}, and {4} away from their fire.", + "{1}, {2}, and {3} discuss the games and what might happen in the morning.", + "{1} cries themself to sleep.", + "{1} tries to treat their infection.", + "{1} and {2} talk about the tributes still alive.", + "{1} is awoken by nightmares.", + "{1} and {2} huddle for warmth.", + "{1} thinks about winning.", + "{1}, {2}, {3}, and {4} tell each other ghost stories to lighten the mood.", + "{1} looks at the night sky.", + "{1} defeats {2} in a fight, but spares their life.", + "{1} begs for {2} to kill them. They refuse, keeping {1} alive.", + "{1} destroys {2}'s supplies while they are asleep.", + "{1}, {2}, {3}, {4}, and {5} sleep in shifts.", + "{1} lets {2} into their shelter.", + "{1} receives a hatchet from an unknown sponsor.", + "{1} receives clean water from an unknown sponsor.", + "{1} receives medical supplies from an unknown sponsor.", + "{1} receives fresh food from an unknown sponsor.", + "{1} tries to sing themself to sleep.", + "{1} attempts to start a fire, but is unsuccessful.", + "{1} thinks about home.", + "{1} tends to {2}'s wounds.", + "{1} quietly hums.", + "{1}, {2}, and {3} cheerfully sing songs together.", + "{1} is unable to start a fire and sleeps without warmth.", + "{1} and {2} hold hands.", + "{1} convinces {2} to snuggle with them.", + "{1} receives an explosive from an unknown sponsor.", + "{1} questions their sanity.", + "{1} forces {2} to eat pant.", + "{1} forces {2T} to eat pant. {2T} chokes and dies.", + "{1} catches {2T} off guard and kills them.", + "{1} throws a knife into {2T}'s head.", + "{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.", + "{1} and {2} work together to drown {3T}.", + "{1} strangles {2T} after engaging in a fist fight.", + "{1} shoots an arrow into {2T}'s head.", + "{1T} bleeds out due to untreated injuries.", + "{1T} cannot handle the circumstances and commits suicide.", + "{1} bashes {2T}'s head against a rock several times.", + "{1T} unknowingly eats toxic berries.", + "{1} silently snaps {2T}'s neck.", + "{1} taints {2T}'s food, killing them.", + "{1} decapitates {2T} with a sword.", + "{1T} dies from an infection.", + "{1} spears {2T} in the abdomen.", + "{1} sets {2T} on fire with a molotov.", + "{1T} falls into a pit and dies.", + "{1} stabs {2T} while their back is turned.", + "{1} severely injures {2T}, but puts them out of their misery.", + "{1} severely injures {2T} and leaves them to die.", + "{1} bashes {2T}'s head in with a mace.", + "{1T} attempts to climb a tree, but falls to their death.", + "{1} pushes {2T} off a cliff during a knife fight.", + "{1} throws a knife into {2T}'s chest.", + "{1}'s trap kills {2T}.", + "{1} kills {2T} while they are sleeping.", + "{1T} is unable to convince {2} to not kill them.", + "{1} convinces {2T} to not kill them, only to kill {2T} instead.", + "{1T} falls into a frozen lake and drowns.", + "{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.", + "{1} kills {2T} with their own weapon.", + "{1} overpowers {2T}, killing them.", + "{1} sets an explosive off, killing {2T}.", + "{1} sets an explosive off, killing {2T}, and {3T}.", + "{1} sets an explosive off, killing {2T}, {3T}, and {4T}.", + "{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.", + "{1} kills {2T} as they try to run.", + "{1T} and {2T} threaten a double suicide. It fails and they die.", + "{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.", + "{1T} dies from hypothermia.", + "{1T} dies from hunger.", + "{1T} dies from thirst.", + "{1} kills {2T} with a hatchet.", + "{1} and {2} fight {3T} and {4T}. {1} and {2} survive.", + "{1T} and {2T} fight {3} and {4}. {3} and {4} survive.", + "{1T} dies trying to escape the arena.", + "{1T} dies of dysentery.", + "{1T} accidently detonates a land mine while trying to arm it.", + "{1T} attacks {2}, but {3} protects them, killing {1T}.", + "{1} ambushes {2T} and kills them.", + "{1T} accidently steps on a landmine.", + "{1} severely slices {2T} with a sword.", + "{1} strangles {2T} with a rope.", + "{1} kills {2T} for their supplies.", + "{1} shoots an arrow at {2}, but misses and kills {3T} instead.", + "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", + "{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.", + "{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.", + "{1} stabs {2T} with a tree branch.", + "{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.", + "{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.", + "{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.", + "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", + "{1} poisons {2T}'s drink. They drink it and die.", + "{1} stabs {2T} in the back with a trident.", + "{1T} attempts to climb a tree, but falls on {2T}, killing them both.", + "{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.", + "{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.", + "{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.", + "{1} kills {2T} with a sickle.", + "{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.", + "{1}, {2}, {3}, and {4} track down and kill {5T}.", + "{1}, {2}, and {3} track down and kill {4T}.", + "{1} and {2} track down and kill {3T}.", + "{1} tracks down and kills {2T}.", + "{1} repeatedly stabs {2T} to death with sais.", + "{1} writes in their journal.", + "{1} watches {2} sitting at their campfire, and considers killing them" + ], + "higherLowerCancel": { + "description": "Thanks for playing, {{username}}! I'll be here when you want to play again.", + "title": "Game cancelled by choice" + }, + "higherLowerCashout": "Paid out {{amount}} {{SHINY}} to your account. Hope you had fun!", + "higherLowerDescription": "Play a game of Higher/Lower", + "higherLowerEmbed": { + "description": "Your number is {{number}}. Will the next number be higher or lower?", + "footer": "The game will expire in 3 minutes, so act fast!", + "title": "Higher or Lower? | Turn {{turn}}" + }, + "higherLowerExtended": { + "extendedHelp": "Higher/Lower is a game of luck.\nI will pick a number and you'll have to guess if the next number I pick will be **higher** or **lower** than the current one, using the ⬆ or ⬇ emojis.\nYour winnings increase as you progress through the rounds, and you can cashout any time by pressing the 💰 emoji.\nBe warned though! The further you go, the more chances you have to lose the winnings." + }, + "higherLowerLoading": "{{LOADING}} Starting a new game of Higher/Lower.", + "higherLowerLose": { + "description": "You didn't quite get it. The number was {{number}}. You lost {{losses}} {{SHINY}}.", + "footer": "Better luck next time!", + "title": "You lost!" + }, + "higherLowerNewround": "Alright. Starting new round.", + "higherLowerWin": { + "description": "The number was {{number}}. Want to continue? With another attempt, you can win {{potentials}} {{SHINY}}!", + "footer": "Act fast! You don't have much time.", + "title": "You won!" + }, + "hungerGamesDescription": "Play Hunger Games with your friends!", + "hungerGamesExtended": { + "extendedHelp": "Enough discussion, let the games begin!", + "examples": ["Skyra, Katniss, Peeta, Clove, Cato, Johanna, Brutus, Blight"] + }, + "hungerGamesResultDeaths": "**{{deaths}} cannon shot can be heard in the distance.**", + "hungerGamesResultDeathsPlural": "**{{deaths}} cannon shots can be heard in the distance.**", + "hungerGamesResultHeaderBloodbath": "Bloodbath", + "hungerGamesResultHeaderMoon": "Night {{game.turn}}", + "hungerGamesResultHeaderSun": "Day {{game.turn}}", + "hungerGamesResultProceed": "Proceed?", + "hungerGamesStop": "Game finished by choice! See you later!", + "hungerGamesWinner": "And the winner is... {{winner}}!", + "notEnoughMoney": "I am sorry, but you do not have enough money to pay your bet! Your current account balance is {{money}} {{SHINY}}", + "slotmachineCanvasTextLost": "You lost", + "slotmachineCanvasTextWon": "You won", + "slotmachineDescription": "I bet 100 {{SHINY}}'s you ain't winning this round.", + "slotmachineExtended": { + "explainedUsage": [["Amount", "Either 50, 100, 200, 500, or even, 1000 {{SHINY}} to bet."]], + "extendedHelp": "Spin a slot machine of 3 reels and gamble your shinies for larger rewards.", + "reminder": "You will receive at least 5 times the amount (cherries/tada) at win, and up to 24 times (seven, diamond without skin)." + }, + "slotmachinesLoss": "**You rolled:**\n{{roll}}\n**Mission failed!**\nWe'll get em next time!", + "slotmachinesWin": "**You rolled:**\n{{roll}}\n**Congratulations!**\nYou won {{winnings}}{{SHINY}}!", + "ticTacToeDescription": "Play Tic-Tac-Toe with somebody.", + "ticTacToeDraw": "This match concluded in a **draw**!\n{{board}}", + "ticTacToeExtended": { + "extendedHelp": "Tic-tac-toe (also known as noughts and crosses or Xs and Os) is a paper-and-pencil game for two players, X and O, who take turns marking the spaces in a 3×3 grid.\nThe player who succeeds in placing three of their marks in a horizontal, vertical, or diagonal row wins the game." + }, + "ticTacToePrompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a Tic-Tac-Toe match. Reply with **yes** to accept!", + "ticTacToeTurn": "({{icon}}) Turn for {{player}}!\n{{board}}", + "ticTacToeWinner": "Winner is... {{winner}}!\n{{board}}", + "triviaActiveGame": "A game of trivia is already being played in this channel", + "triviaDescription": "Play a game of Trivia.", + "triviaEmbedTitles": { + "difficulty": "Difficulty", + "trivia": "Trivia" + }, + "triviaExtended": { + "extendedHelp": "Answer questions of trivia here, with categories ranging from books to mythology! (powered by OpenTDB)\n\n**Categories**: {{TRIVIA_CATEGORIES}}", + "explainedUsage": [ + ["category", "The category questions are asked from."], + ["type", "The type of question asked: can be boolean (true/false) or multiple choice."], + ["difficulty", "The difficulty level of the questions asked."], + ["duration", "The amount of time you get to answer."] + ], + "examples": ["trivia history.", "trivia books multiple easy.", "trivia videogames 45."] + }, + "triviaIncorrect": "I am sorry, but **{{attempt}}** is not the correct answer. Better luck next time!", + "triviaInvalidCategory": "Invalid category: Please use `Skyra, help trivia` for a list of categories.", + "triviaNoAnswer": "Looks like nobody got it! The right answer was **{{correctAnswer}}**.", + "triviaWinner": "We have a winner! {{winner}} had a right answer with **{{correctAnswer}}**!", + "wheelOfFortuneCanvasTextLost": "You lost", + "wheelOfFortuneCanvasTextWon": "You won", + "wheelOfFortuneDescription": "Gamble your shinies by spinning a wheel of fortune", + "wheelOfFortuneExtended": { + "extendedHelp": "You can lose 0.1, 0.2, 0.3 or 0.5 times your input or win 1.2, 1.5, 1.7 or 2.4 times your input" + }, + "balanceDifference": "**Previous**: {{previous, number}} {{SHINY}}\n**New**: {{next, number}} {{SHINY}}" +} diff --git a/src/languages/en-US/commands/gameIntegration.json b/src/languages/en-US/commands/gameIntegration.json new file mode 100644 index 00000000000..6f911a906d9 --- /dev/null +++ b/src/languages/en-US/commands/gameIntegration.json @@ -0,0 +1,215 @@ +{ + "brawlstarsDescription": "Get data on a player or club from Supercell's newest game, Brawl Stars.", + "brawlstarsExtended": { + "extendedHelp": "Use this command with --save to save your player/club tag.", + "explainedUsage": [ + ["category", "The category of data to get: **club** to get data on a club, or **player** to get data on a player (default)."], + ["query", "The tag of the player or club, depending on which category you choose."] + ], + "examples": ["player #RJQLQ999", "club #228JVRQC9"] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "Trophies", + "events": "Events", + "exp": "Experience", + "gamesModes": "Game Modes", + "other": "Other" + }, + "brawlstarsPlayerEmbedFields": { + "total": "Total", + "personalBest": "Personal Best", + "events": "Events", + "roboRumble": "Best Robo Rumble Rank", + "qualifiedForChamps": "Qualified for Championship", + "experienceLevel": "Experience Level", + "victories3v3": "3v3 Victories", + "victoriesSolo": "Solo Victories", + "victoriesDuo": "Duo Victories", + "club": "Club", + "brawlersUnlocked": "Brawlers Unlocked" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "Total Trophies", + "averageTrophies": "Average Trophies", + "requiredTrophies": "Required Trophies", + "members": "Members", + "type": "Type", + "top5Members": "Top 5 Members", + "president": "President" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "No President" + }, + "clashofclansDescription": "Get data on a player or clan in the popular mobile game Clash of Clans", + "clashofclansExtended": { + "extendedHelp": "The request for clans will try to return multiple possible responses.", + "explainedUsage": [ + ["category", "The category of data to get: **clan** to get data on a clan or **player** to get data on a player."], + ["query", "Either a clan name or player tag depending on the category you chose."] + ], + "examples": ["player #8GQPJG2CL", "clan Hog Raiders Swe"] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "XP level", + "builderHallLevel": "Builder Hall level", + "townhallLevel": "Town Hall level", + "townhallWeaponLevel": "Town Hall weapon level", + "trophies": "Current trophies", + "bestTrophies": "Best trophies", + "warStars": "War stars", + "attackWins": "Wins attacking", + "defenseWins": "Wins defending", + "amountOfAchievements": "Amount of achievements", + "versusTrophies": "Current versus trophies", + "bestVersusTrophies": "Best versus trophies", + "versusBattleWins": "Versus battle wins", + "clanRole": "Clan role", + "clanName": "Clan name", + "leagueName": "League name", + "noTownhallWeaponLevel": "Town Hall has no weapon level", + "noRole": "This player has no clan role", + "noClan": "This player is not in a clan", + "noLeague": "This user is not in any league" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "Clan level", + "clanPoints": "Clan points", + "clanVersusPoints": "Clan versus points", + "amountOfMembers": "Amount of members", + "description": "Description", + "locationName": "Location name", + "warFrequency": "War frequency", + "warWinStreak": "War win streak", + "warWins": "Total war wins", + "warTies": "Total war ties", + "warLosses": "Total war losses", + "warLogPublic": "War log is public?", + "unknown": "Unknown", + "warFrequencyDescr": { + "moreThanOncePerWeek": "More than once per week", + "always": "Always", + "lessThanOncePerWeek": "Less than once per week", + "oncePerWeek": "Once per week", + "unknown": "Unknown" + } + }, + "brawlStarsInvalidPlayerTag": "I am sorry, \"{{playertag}}\" is not a valid Clash of Clans player tag. Player tags have to start with a \"#\" followed by the ID.", + "brawlStarsClansQueryFail": "I am sorry, but I was unable to get data on the clan \"{{clan}}\".", + "brawlStarsPlayersQueryFail": "I am sorry, but I was unable to get data on the player with player tag \"{{playertag}}\".", + "clashofclansInvalidPlayerTag": "I am sorry, \"{{playertag}}\" is not a valid Clash of Clans player tag. Player tags have to start with a \"#\" followed by the ID.", + "clashOfClansClansQueryFail": "I am sorry, but I was unable to get data on the clan \"{{clan}}\".", + "clashofclansPlayersQueryFail": "I am sorry, but I was unable to get data on the player with player tag \"{{playertag}}\".", + "FFXIVDescription": "Queries the Final Fantasy 14 API for game data", + "FFXIVExtended": { + "extendedHelp": "This command allows you to character and item data for FFXIV.\nFor item a wildcard search is performed so if your term is in the middle of the name it can still match.", + "explainedUsage": [ + ["search type", "(optional, defaults to \"character\") \"character\" or \"item\""], + ["query", "The player or thing to search."] + ], + "examples": ["character Laytlan Ardevon", "Laytlan Ardevon", "item potion"] + }, + "FFXIVCharacterFields": { + "serverAndDc": "Server - Datacenter", + "tribe": "Tribe", + "characterGender": "Character gender", + "nameday": "Nameday", + "guardian": "Guardian", + "cityState": "City-State", + "grandCompany": "Grand Company", + "rank": "Rank", + "none": "None", + "male": "Male", + "female": "Female", + "dowDomClasses": "***__Disciple of War and Magic classes__***:", + "tank": "Tank", + "healer": "Healer", + "meleeDps": "Melee DPS", + "physicalRangedDps": "Physical Ranged DPS", + "magicalRangedDps": "Magical Ranged DPS", + "dohClasses": "***__Disciple of the Hand jobs__***:", + "dolClasses": "***__Disciple of the Land jobs__***:" + }, + "FFXIVItemFields": { + "kind": "Kind", + "category": "Category", + "levelEquip": "Level equippable", + "none": "None" + }, + "FFXIVNoCharacterFound": "{{REDCROSS}} I am sorry, but I was unable to find a character with that name.", + "FFXIVInvalidServer": "{{REDCROSS}} I am sorry, but an invalid server name was passed.", + "FFXIVNoItemFound": "{{REDCROSS}} I am sorry, but I was unable to find an item with that query.", + "fortniteDescription": "Gets player statistics for a Fortnite player", + "fortniteExtended": { + "extendedHelp": "This command retrieves statistics for any Fortnite player that plays on PC, Xbox or Playstation", + "explainedUsage": [ + ["platform", "(optional, defaults to \"pc\") Platform the player plays on, one of \"pc\", \"xbox\", or \"psn\"."], + ["player", "The Epic Games username of the player."] + ], + "examples": ["ninja", "pc ninja", "xbox TTV R1xbox", "psn TTV IllusionOG"] + }, + "fortniteNoUser": "I am sorry, but I was unable to find a user with that name.\nAre you sure that they play on the provided platform? (PC [default], Xbox or PSN are supported)", + "fortniteEmbedTitle": "Fortnite player statistics for {{epicUserHandle}}", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "**_Lifetime Stats_**", + "solos": "**_Solos_**", + "duos": "**_Duos_**", + "squads": "**_Squads_**" + }, + "fortniteEmbedStats": { + "wins": "Wins: **\"{{winCount}}\"**", + "kills": "Kills: **\"{{killCount}}\"**", + "kdr": "KDR: **\"{{kdrCount}}%\"**", + "matchesPlayed": "Matches played: **\"{{matchesPlayedCount}}\"**", + "top1s": "Top 1s: **\"{{top1Count}}\"**", + "top3s": "Top 3s: **\"{{top3Count}}\"**", + "top5s": "Top 5s: **\"{{top5Count}}\"**", + "top6s": "Top 6s: **\"{{top6Count}}\"**", + "top10s": "Top 10s: **\"{{top10Count}}\"**", + "top12s": "Top 12s: **\"{{top12Count}}\"**", + "top25s": "Top 25s: **\"{{top25Count}}\"**" + }, + "overwatchDescription": "Gets player statistics for an Overwatch player", + "overwatchExtended": { + "extendedHelp": "This command retrieves statistics for any Overwatch player that plays on PC, Xbox or Playstation.\nBy default it will look at PC players, if you want to check for Xbox or Playstation players then set the platform to \"xbl\" or \"psn\" respectively.", + "explainedUsage": [ + ["platform", "(optional, defaults to \"pc\") Platform the player plays on, one of \"pc\", \"xbl\", or \"psn\""], + ["player", "For PC the full blizzard tag, for console the username. Case sensitive!"] + ], + "examples": ["bame#1784", "xbl Dorus NL gamer", "psn decoda_24"], + "reminder": "**Player names are case sensitive!**" + }, + "overwatchInvalidPlayerName": "\"{{playerTag}}\" is an invalid player name\nFor PC it has to be their full Blizzard BattleTag, for example \"bame#1784\".\nFor Xbox and Playstation it just has to be their username.", + "overwatchQueryFail": "Failed to get data for \"{{player}}\", are you sure they play on \"{{platform}}\"?\nAlso make sure to get the casing right, names are case sensitive.", + "overwatchNoStats": "I found a player with the tag \"{{player}}\" but no stats were available for them.", + "overwatchNoAverage": "Not enough data to determine average.", + "overwatchEmbedDataStats": { + "finalBlows": "**Final blows:** {{finalBlows, number}}", + "deaths": "**Deaths:** {{deaths, number}}", + "damageDealt": "**Damage dealt:** {{damageDone, number}}", + "healing": "**Healing:** {{healing, number}}", + "objectiveKills": "**Objective kills:** {{objectiveKills, number}}", + "soloKills": "**Solo kills:** {{soloKills, number}}", + "playTime": "**Playtime:** {{playTime, duration}}", + "gamesWon": "**Games won:** {{gamesWon, number}}", + "goldenMedals": "**Gold medals earned:** {{goldenMedals, number}}", + "silverMedals": "**Silver medals earned:** {{silverMedals, number}}", + "bronzeMedals": "**Bronze medals earned:** {{bronzeMedals, number}}" + }, + "overwatchEmbedDataTopHero": "**{{name, toTitleCase}}** ({{playTime, duration}})", + "overwatchEmbedData": { + "title": "Click here for more details on overwatchtracker.com", + "ratingsTitle": "Ratings", + "author": "Overwatch Player Statistics for {{authorName}}", + "playerLevel": "**Player level:** {{playerLevel, number}}", + "prestigeLevel": "**Prestige level:** {{prestigeLevel, number}}", + "totalGamesWon": "**Total games won:** {{totalGamesWon, number}}", + "noGamesWon": "**Total games won:** $t(global:none)", + "headers": { + "account": "__Account Stats__", + "quickplay": "__Quickplay Stats__", + "competitive": "__Competitive Stats__", + "topHeroesQuickplay": "__Top Heroes Quickplay__", + "topHeroesCompetitive": "__Top Heroes Competitive__" + } + } +} diff --git a/src/languages/en-US/commands/general.json b/src/languages/en-US/commands/general.json new file mode 100644 index 00000000000..f7f5975c7ec --- /dev/null +++ b/src/languages/en-US/commands/general.json @@ -0,0 +1,38 @@ +{ + "helpAllFlag": "Displaying one category per page. Have issues with the embed? Run `{{prefix}}help --all` for a full list in DMs.", + "helpCommandCount": "{{count}} command", + "helpCommandCount_plural": "{{count}} commands", + "helpData": { + "extended": "🔍 | ***Extended Help***\n{{extendedHelp}}", + "footer": "Command help for {{footerName}}", + "title": "{{titleDescription}}", + "usage": "📝 | ***Command Usage***\n`{{usage}}`\n" + }, + "helpDescription": "Displays all commands or the description of one.", + "helpExtended": { + "extendedHelp": "The help command shows a paginated list of all commands by their categories, or the extended information of a command if specified.\n\nIf you use `--categories` or `--cat`, you can get the list of all categories and the amount of commands each one of them have.", + "reminder": "The help command **only** shows the commands you can use. For the full list, please visit ." + }, + "helpDm": "📥 | The list of commands you have access to has been sent to your DMs.", + "helpNodm": "{{REDCROSS}} | You have DMs disabled so I couldn't send you the list of commands.", + "helpNoExtended": "No extended help available.", + "infoBody": "Skyra {{VERSION}} is a multi-purpose Discord Bot designed to run the majority of tasks with a great performance and constant 24/7 uptime.\nShe is built on top of Klasa, a 'plug-and-play' framework built on top of the Discord.js library.\n\nSkyra features:\n• Advanced Moderation with temporary actions included\n• Announcement management\n• Fully configurable\n• Message logs, member logs, and mod logs\n• Multilingual\n• Profiles and levels, with leaderboards and social management\n• Role management\n• Weeb commands (+10)!\n• A full PokéDex with all data you will need\nAnd more!", + "infoDescription": "Provides some information about me.", + "infoExtended": { + "extendedHelp": "Just... that :P" + }, + "inviteDescription": "Shows the invite link to add Skyra to your server.", + "inviteExtended": { + "extendedHelp": "If you would like to get a link where Skyra will not ask for any permissions add either `noperms`, `--noperms`, or `--nopermissions` to the command.", + "examples": ["", "noperms", "--noperms", "--nopermissions"] + }, + "invitePermissionInviteText": "Invite Skyra to your server", + "invitePermissionsDescription": "Don't be afraid to uncheck some permissions, I will let you know if you're trying to run a command without permissions.", + "invitePermissionSupportServerText": "Join Support Server", + "ping": "{{LOADING}} Ping?", + "pingDescription": "Runs a connection test to Discord.", + "pingExtended": { + "extendedHelp": "Pong!" + }, + "pingPong": "Pong! (Roundtrip took: {{diff}}ms. Heartbeat: {{ping}}ms.)" +} diff --git a/src/languages/en-US/commands/giveaway.json b/src/languages/en-US/commands/giveaway.json new file mode 100644 index 00000000000..93f65592282 --- /dev/null +++ b/src/languages/en-US/commands/giveaway.json @@ -0,0 +1,33 @@ +{ + "giveawayDescription": "Start a new giveaway.", + "giveawayExtended": { + "extendedHelp": "This command is designed to manage giveaways. You can start them with this command by giving it the time and a title.\n\nWhen a giveaway has been created, I will send a giveaway message and react to it with 🎉 so the members of the server can participate on it.\n\nYou can pass a flag of `--winners=Xw`, wherein X is a number (for example 2w for 2 winners) to allow multiple people to win a giveaway.\nPlease note that there is a maximum of 25 winners.", + "explainedUsage": [ + ["channel", "(Optional) The channel in which to start the giveaway"], + ["time", "The time the giveaway should last."], + ["title", "The title of the giveaway."] + ], + "examples": ["6h A hug from Skyra.", "60m 5w A mysterious Steam game", "1d Free Discord Nitro! --winners=2w"] + }, + "giveawayRerollDescription": "Re-roll the winners from a giveaway.", + "giveawayRerollExtended": { + "extendedHelp": "This command is designed to re-roll finished giveaways. Please check `Skyra, help gstart` for more information about creating one.", + "explainedUsage": [ + ["winners", "The amount of winners to pick."], + ["message", "The message to target. Defaults to last giveaway message."] + ], + "examples": ["", "633939404745998346", "5", "5 633939404745998346"] + }, + "giveawayScheduleDescription": "Schedule a giveaway to start at a certain time.", + "giveawayScheduleExtended": { + "extendedHelp": "This command prepares a giveaway to start at a certain time if you do not wish to start it immediately.\nYou can pass a flag of `--winners=X`, wherein X is a number, to allow multiple people to win this giveaway.\nPlease note that there is a maximum of 25 winners.", + "explainedUsage": [ + ["channel", "(Optional) The channel in which to start the giveaway"], + ["schedule", "The time to wait before starting the giveaway."], + ["time", "The time the giveaway should last."], + ["title", "The title of the giveaway."] + ], + "examples": ["30m 6h A hug from Skyra."] + }, + "giveawayRerollInvalid": "The message ID does not exist or there is no finished giveaway." +} diff --git a/src/languages/en-US/commands/google.json b/src/languages/en-US/commands/google.json new file mode 100644 index 00000000000..39bea193468 --- /dev/null +++ b/src/languages/en-US/commands/google.json @@ -0,0 +1,49 @@ +{ + "currentTimeDescription": "Gets the current time in any location on the world", + "currentTimeExtended": { + "extendedHelp": "This command uses Google Maps to get the coordinates of the place.\nOnce this command has the coordinates, it queries TimezoneDB to get the time data.", + "explainedUsage": [["location", "The locality, governing, country or continent to check the time for."]], + "examples": ["Antarctica", "Arizona"] + }, + "currentTimeLocationNotFound": "I am sorry, but I could not find time data for that location.", + "currentTimeTitles": { + "currentTime": "Current Time", + "currentDate": "Current Date", + "country": "Country", + "gmsOffset": "GMT Offset", + "dst": "**DST**: {{dst}}" + }, + "currentTimeDst": "Does not observe DST right now", + "currentTimeNoDst": "Observes DST right now", + "gsearchDescription": "Find your favourite things on Google", + "gsearchExtended": { + "extendedHelp": "This command queries the powerful Google Search engine to find websites for your query. For images please use the `gimage` command.", + "explainedUsage": [["query", "The thing you want to find on Google"]], + "examples": ["Discord", "Skyra"] + }, + "gimageDescription": "Find your favourite images on Google", + "gimageExtended": { + "extendedHelp": "This command queries the powerful Google Search engine to find images for your query. For regular web results please use the `gsearch` command.", + "explainedUsage": [["query", "The image you want to find on Google"]], + "examples": ["Discord", "Skyra"], + "reminder": "This command has been marked as NSFW because it is unavoidable that when you query explicit content, you will get explicit results." + }, + "lmgtfyDescription": "Annoy another user by sending them a LMGTFY (Let Me Google That For You) link.", + "lmgtfyExtended": { + "explainedUsage": [["query", "The query to google"]] + }, + "lmgtfyClick": "Click me to search", + "weatherDescription": "Check the weather status in a location.", + "weatherExtended": { + "extendedHelp": "This command uses Google Maps to get the coordinates of the place.\nOnce this command got the coordinates, it queries DarkSky to retrieve information about the weather.", + "explainedUsage": [["city", "The locality, governing, country or continent to check the weather from."]], + "examples": ["Antarctica", "Arizona"], + "reminder": "Temperature is in **Celsius** by default. Use the --imperial or --fahrenheit flag to view it in **Fahrenheit**." + }, + "errorZeroResults": "Your request returned no results.", + "errorRequestDenied": "The GeoCode API Request was denied.", + "errorInvalidRequest": "Invalid request.", + "errorOverQueryLimit": "Query Limit exceeded. Try again tomorrow.", + "errorPermissionDenied": "Google denied my permission to this resource, please contact the developers regarding this in the official support server at ", + "errorUnknown": "I am sorry, but I failed to get a result from Google." +} diff --git a/src/languages/en-US/commands/management.json b/src/languages/en-US/commands/management.json new file mode 100644 index 00000000000..92fb8c4fe9e --- /dev/null +++ b/src/languages/en-US/commands/management.json @@ -0,0 +1,516 @@ +{ + "nickSet": "Changed the nickname to **{{nickname}}**.", + "nickCleared": "Nickname cleared.", + "permissionNodesHigher": "{{REDCROSS}} You cannot modify nor preview the permission nodes for this target.", + "permissionNodesInvalidType": "{{REDCROSS}} Invalid type, expected either of `allow` or `deny`.", + "permissionNodesAdd": "{{GREENTICK}} Successfully added the command to the permission node.", + "permissionNodesNodeNotExists": "{{REDCROSS}} The selected permission node does not exist.", + "permissionNodesCommandNotExists": "{{REDCROSS}} The selected command does not exist in the permision node.", + "permissionNodesRemove": "{{GREENTICK}} Successfully removed the command from the permission node.", + "permissionNodesReset": "{{GREENTICK}} Successfully removed all commands from the permission node.", + "permissionNodesShowName": "Permissions for: __{{name}}__", + "permissionNodesShowAllow": "**Allow**: {{allow}}", + "permissionNodesShowDeny": "**Deny**: {{deny, andList}}", + "triggersNotype": "You need to insert a trigger type (**alias**|**reaction**)", + "triggersNooutput": "You need to insert the trigger output.", + "triggersInvalidreaction": "This reaction does not seem valid for me, either it is not valid unicode or I do not have access to it.", + "triggersInvalidalias": "There is no command like this.", + "triggersRemoveNottaken": "There is no trigger with this input.", + "triggersRemove": "Successfully removed this trigger.", + "triggersAddTaken": "There is already a trigger with this input.", + "triggersAdd": "Successfully added the trigger.", + "triggersListEmpty": "The trigger list for this guild is empty.", + "guildInfoTitles": { + "CHANNELS": "Channels", + "MEMBERS": "Members", + "OTHER": "Other" + }, + "guildInfoRoles": "**Roles**\n\n{{roles}}", + "guildInfoNoroles": "Roles? Where? There is no other than the `@everyone` role!", + "guildInfoChannels": "• **{{text}}** Text, **{{voice}}** Voice, **{{categories}}** categories.\n• AFK: {{afkChannelText}}", + "guildInfoChannelsAfkChannelText": "**<#{{afkChannel}}>** after **{{afkTime}}**min", + "guildInfoMembers": "• **{{memberCount, number}}** member(s)\n• Owner: **{{owner.tag}}**\n (ID: **{{owner.id}}**)", + "guildInfoOther": "• Roles: **{{size}}**\n• Region: **{{region}}**\n• Created at: **{{createdAt, timestamp}}**\n• Verification Level: **{{verificationLevel, humanLevels}}**", + "roleInfoTitles": { "PERMISSIONS": "Permissions" }, + "roleInfoData": "ID: **{{role.id}}**\nName: **{{role.name}}**\nColor: **{{role.hexColor}}**\nHoisted: **{{hoisted}}**\nPosition: **{{role.rawPosition}}**\nMentionable: **{{mentionable}}**", + "roleInfoAll": "All Permissions granted.", + "roleInfoNoPermissions": "Permissions not granted.", + "filterUndefinedWord": "You must write what you want me to filter.", + "filterAlreadyFiltered": "This word is already filtered.", + "filterNotFiltered": "This word is not filtered.", + "filterAdded": "{{GREENTICK}} Success! Added the word {{word}} to the filter.", + "filterRemoved": "{{GREENTICK}} Success! Removed the word {{word}} from the filter.", + "filterReset": "{{GREENTICK}} Success! The filter has been reset.", + "filterShowEmpty": "The list of filtered words is empty!", + "filterShow": "Filtered words in this server: {{words}}", + "manageCommandAutoDeleteTextChannel": "You must input a valid text channel, people cannot use commands in a voice or a category channel!", + "manageCommandAutoDeleteRequiredDuration": "You must specify an amount of seconds for the command to be automatically deleted.", + "manageCommandAutoDeleteShowEmpty": "There are no command autodelete configured right now.", + "manageCommandAutoDeleteShow": "All command autodeletes configured:{{codeblock}}", + "manageCommandAutoDeleteAdd": "{{GREENTICK}} Success! All successful commands in {{channel}} will be deleted after {{time, duration}}!", + "manageCommandAutoDeleteRemove": "{{GREENTICK}} Success! Commands will not be automatically deleted in {{channel}} anymore!", + "manageCommandAutoDeleteRemoveNotset": "{{REDCROSS}} The channel {{channel}} was not configured to automatically delete messages!", + "manageCommandAutoDeleteReset": "All the command autodeletes have been reset.", + "manageCommandChannelTextChannel": "You must input a valid text channel, people cannot use commands in a voice or a category channel!", + "manageCommandChannelRequiredCommand": "You must specify what command do you want to add or remove from the channel's filter.", + "manageCommandChannelShow": "List of disabled commands in {{channel}}: {{commands}}", + "manageCommandChannelShowEmpty": "The list of disabled commands for the specified channel is empty!", + "manageCommandChannelAddAlreadyset": "The command you are trying to disable is already disabled!", + "manageCommandChannelAdd": "Successfully disabled the command {{command}} for the channel {{channel}}!", + "manageCommandChannelRemoveNotset": "The command you are trying to enable was not disabled for {{channel}}.", + "manageCommandChannelRemove": "Successfully enabled the command {{command}} for the channel {{channel}}!", + "manageCommandChannelResetEmpty": "This channel had no disabled command, so I decided to do nothing.", + "manageCommandChannelReset": "Successfully enabled all disabled commands in {{channel}}, enjoy!", + "manageReactionRolesShowEmpty": "There are no reaction roles set up in this server.", + "manageReactionRolesAddChannel": "{{GREENTICK}} Success! I will now give the role when people react with {{emoji}} to any message from {{channel}}!", + "manageReactionRolesAddPrompt": "Listening now! Please react to a message and I will bind the reaction with the role!", + "manageReactionRolesAddMissing": "I waited, but you did not seem to have reacted to a message.", + "manageReactionRolesAdd": "{{GREENTICK}} Success! I will now give the role when people react with {{emoji}} at {{url}}!", + "manageReactionRolesRemoveNotExists": "The reaction role you specified does not exist.", + "manageReactionRolesRemove": "{{GREENTICK}} Success! I will not longer give the role when people react with {{emoji}} at {{url}}!", + "manageReactionRolesResetEmpty": "There were no reaction roles set up.", + "manageReactionRolesReset": "{{GREENTICK}} Successfully removed all reaction roles.", + "setStarboardEmojiSet": "Successfully set a new emoji for the next star messages: {{emoji}}", + "configurationTextChannelRequired": "The selected channel is not a valid text channel, try again with another.", + "configurationEquals": "Successfully configured: no changes were made.", + "setIgnoreChannelsSet": "Ignoring all command input from {{channel}} now.", + "setIgnoreChannelsRemoved": "Listening all command input from {{channel}} now.", + "setImageLogsSet": "Successfully set the image logs channel to {{channel}}.", + "setMemberLogsSet": "Successfully set the member logs channel to {{channel}}.", + "setMessageLogsSet": "Successfully set the message logs channel to {{channel}}.", + "setModLogsSet": "Successfully set the mod logs channel to {{channel}}.", + "setPrefixSet": "Successfully set the prefix to {{prefix}}. Use {{prefix}}setPrefix to change it again.", + "stickyRolesRequiredUser": "A user target is required for this command to work.", + "stickyRolesRequiredRole": "A role name is required when adding or removing a role.", + "stickyRolesNotExists": "The user {{user}} does not have any sticky roles or does not have the specified one.", + "stickyRolesReset": "Successfully removed all sticky roles from {{user}}.", + "stickyRolesRemove": "Successfully removed the specified role from {{user}}.", + "stickyRolesAddExists": "The user {{user}} already had the specified role as sticky.", + "stickyRolesAdd": "Successfully added the specified role as sticky to {{user}}.", + "stickyRolesShowEmpty": "There are no sticky roles to show.", + "stickyRolesShowSingle": "Sticky Role(s) for **{{user}}**: {{roles, andList}}.", + "createMuteDescription": "Prepare the mute system.", + "createMuteExtended": { + "extendedHelp": "This command prepares the mute system by creating a role called `muted`, and configuring it to the guild settings. This command also modifies all channels (where possible) permissions and disables the permission **{{SEND_MESSAGES, permissions}}** in text channels and **{{PERMISSIONS.CONNECT}}** in voice channels for said role." + }, + "nickDescription": "Change Skyra's nickname for this server.", + "nickExtended": { + "extendedHelp": "This command allows you to change Skyra's nickname easily for the server.", + "reminder": "This command requires the **{{CHANGE_NICKNAME, permissions}}** permission. Make sure Skyra has it.", + "explainedUsage": [["nick", "The new nickname. If you don't put any, it'll reset it instead."]], + "examples": ["SkyNET", "Assistant", ""] + }, + "permissionNodesDescription": "Configure the permission nodes for this server.", + "permissionNodesExtended": { + "extendedHelp": "Permission nodes are per-user and per-role overrides. They are used when the built-in permissions system is not enough.\nFor example, in some servers they want to give a staff role the permissions to use mute and warn, but not ban and others (reserved to moderators), and only warn is available for the configurable staff-level permission, so you can tell me to allow the mute command for the staff role now.", + "explainedUsage": [ + ["action", "Either `add`, `remove`, `reset`, or `show`. Defaults to `show`."], + ["target", "Either a role name or a user name, allowing IDs and mentions for either."], + ["type", "Either `allow` or `deny`. This is ignored when `action` is not `add` nor `remove`."], + ["command", "The name of the command to allow or deny. This is ignored when `action` is not `add` nor `remove`."] + ], + "examples": ["add staff allow warn", "add moderators deny ban", "remove staff allow warn", "reset staff", "show staff"], + "reminder": "The server owner cannot have any actions, nor the `everyone` role can have allowed commands." + }, + "triggersDescription": "Set custom triggers for your guild!.", + "triggersExtended": { + "extendedHelp": "This command allows administrators to go further with the personalization of Skyra in the guild!.\nA trigger is a piece that can active other functions.\nFor example, the aliases are triggers that get executed when the command does not exist in bot, triggering the unknown command event.\nWhen this happens, the alias system executes and tries to find an entry that matches with the input.", + "reminder": "This command requires the **{{ADD_REACTIONS, permissions}}** permission so it can test reactions. Make sure Skyra has it.", + "explainedUsage": [ + ["list", "List all current triggers."], + ["add ", "Add a new trigger given a type, input and output."], + ["remove ", "Remove a trigger given the type and input."] + ], + "examples": ["", "list", "add reaction \"good night\" 🌛", "remove reaction \"good night\""] + }, + "managecommandautodeleteDescription": "Manage per-channel autodelete timer.", + "managecommandautodeleteExtended": { + "extendedHelp": "This command manages this guild's per-channel command autodelete timer, it serves well to leave a channel clean from commands.", + "explainedUsage": [ + ["show", "Show the autodelete timer for all channels."], + ["add [channel] ", "Add an autodelete timer for the specified channel."], + ["remove [channel]", "Remove the autotimer from the specified channel."], + ["reset", "Clear all autodelete timers."] + ], + "reminder": "The channel argument is optional, defaulting to the message's channel, but it uses fuzzy search when possible.", + "examples": ["show", "add #general 4s", "remove #general", "reset"] + }, + "manageCommandChannelDescription": "Manage per-channel command blacklist.", + "manageCommandChannelExtended": { + "extendedHelp": "This command manages this guild's per-channel command blacklist, it serves well to disable certain commands you do not want to be used in certain channels (to disable a command globally, use the `disabledCommands` settings key to disable in all channels.", + "explainedUsage": [ + ["show [channel]", "Show the command blacklist for the selected channel."], + ["add [channel] ", "Add a command to the specified channel's command blacklist."], + ["remove [channel] ", "Remove a command to the specified channel's command blacklist."], + ["reset [channel]", "Clear the command blacklist for the specified channel."] + ], + "reminder": "The channel argument is optional, but it uses fuzzy search when possible.", + "examples": ["show", "add #general profile", "remove #general profile", "reset #general"] + }, + "manageReactionRolesDescription": "Manage the reaction roles for this server.", + "manageReactionRolesExtended": { + "extendedHelp": "Seamlessly set up reaction roles in your server! When adding reaction roles, I listen to your reactions for 5 minutes and I bind the first reaction from you alongside the channel and the message, with the specified role.\nOtherwise, if a channel is specified, a prompt will not be created, and the reaction role will be bound to all of the channel's messages.\n\nThe best way to add new reaction roles is by using `add @role`. If you prefer not binding the reaction to a specific message then use `add @role #channel emoji`", + "explainedUsage": [ + ["show", "Retrieve the list of all reaction roles."], + ["add ", "Adds a reaction role binding the first reacted message since the execution with the role."], + ["remove ", "Removes a reaction role, use `show` to get a list of them."], + ["reset", "Removes all reaction roles."] + ], + "examples": ["show", "add @role", "add @role #channel emoji", "remove @role 123456789012345678", "reset"] + }, + "setIgnoreChannelsDescription": "Set a channel to the ignore channel list.", + "setIgnoreChannelsExtended": { + "extendedHelp": "This command helps you setting up ignored channels. An ignored channel is a channel where nobody but moderators can use Skyra's commands.\nUnlike removing the **{{SEND_MESSAGES, permissions}}** permission, Skyra is still able to send (and therefore execute commands) messages, which allows moderators to use moderation commands in the channel.\nUse this if you want to ban any command usage from the bot in a specific channel.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "reminder": "You cannot set the same channel twice, instead, Skyra will remove it.", + "examples": ["#general", "here"] + }, + "setImageLogsDescription": "Set the image logs channel.", + "setImageLogsExtended": { + "extendedHelp": "This command helps you setting up the image log channel. Whenever a member sends an image attachment, it will send an embed message with the attachment re-uploaded.\nAll messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "examples": ["#image-logs", "here"] + }, + "setMemberLogsDescription": "Set the member logs channel.", + "setMemberLogsExtended": { + "extendedHelp": "This command helps you setting up the member log channel. A member log channel only sends two kinds of logs: \"Member Join\" and \"Member Leave\".\nIf a muted user joins, it will send a special \"Muted Member Join\" event.\nAll messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.\nYou also need to individually set the \"events\" you want to listen: `events.memberAdd` and `events.memberRemove`.\nFor roles, you would enable `events.memberNicknameChange` and/or `events.memberRoleUpdate` via the `config` command.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "examples": ["#member-logs", "here"] + }, + "setMessageLogsDescription": "Set the message logs channel.", + "setMessageLogsExtended": { + "extendedHelp": "This command helps you setting up the message log channel. A message log channel only sends three kinds of logs: \"Message Delete\", \"Message Edit\", and \"Message Prune\".\nAll messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.\nYou also need to individually set the \"events\" you want to listen: `events.messageDelete` and `events.messageEdit` via the `config` command.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "reminder": "Due to Discord limitations, Skyra cannot know who deleted a message. The only way to know is by fetching audit logs, requiring the permission **{{VIEW_AUDIT_LOG, permissions}}** which access is limited in the majority of guilds and the amount of times I can fetch them in a period of time.", + "examples": ["#message-logs", "here"] + }, + "setmodlogsDescription": "Set the mod logs channel.", + "setmodlogsExtended": { + "extendedHelp": "This command helps you setting up the mod log channel. A mod log channel only sends case reports indexed by a number case and with \"claimable\" reasons and moderators.\nThis channel is not a must and you can always retrieve specific modlogs with the `case` command.\nAll messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.\nFor auto-detection, you need to individually set the \"events\" you want to listen: `events.banAdd`, `events.banRemove` via the `config` command.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "reminder": "Due to Discord limitations, the auto-detection does not detect kicks. You need to use the `kick` command if you want to document them as a formal moderation log case.", + "examples": ["#mod-logs", "here"] + }, + "setprefixDescription": "Set Skyra's prefix.", + "setprefixExtended": { + "extendedHelp": "This command helps you setting up Skyra's prefix. A prefix is an affix that is added in front of the word, in this case, the message.\nIt allows bots to distinguish between a regular message and a command. By nature, the prefix between should be different to avoid conflicts.\nIf you forget Skyra's prefix, simply mention her with nothing else and she will tell you the current prefix.\nAlternatively, you can prefix the commands with her name and a comma (for example `Skyra, ping`).", + "explainedUsage": [["prefix", "The prefix to set. Default one in Skyra is `{{DEFAULT_PREFIX}}`."]], + "reminder": "Your prefix should only contain characters everyone can write and type.", + "examples": ["&", "="] + }, + "setrolechannelDescription": "Set the role channel for role reactions.", + "setrolechannelExtended": { + "extendedHelp": "This command sets up the role channel to lock the reactions to, it is a requirement to set up before setting up the **role message**, and if none is given, the role reactions module will not run.", + "explainedUsage": [ + [ + "channel", + "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to select the channel the message was sent." + ] + ], + "reminder": "You cannot set the same channel twice, instead, Skyra will remove it.", + "examples": ["#roles", "here"] + }, + "setrolemessageDescription": "Set the role message for role reactions.", + "setrolemessageExtended": { + "extendedHelp": "This command sets up the role message to lock the reactions to, it requires a **role channel** to be set up first.\nIf none is given, Skyra will listen to any reaction in the channel.\nAdditionally, Skyra requires **{{READ_MESSAGE_HISTORY, permissions}}** in order to fetch the message for validation.", + "explainedUsage": [["message", "An ID, they are 17-18 characters long and numeric."]], + "reminder": "You must execute this command in the role channel.", + "examples": ["434096799847022598"] + }, + "setStarboardEmojiDescription": "Set the emoji reaction for starboard.", + "setStarboardEmojiExtended": { + "extendedHelp": "This command sets up the starboard emoji for the starboard, which is, by default, ⭐. Once this is changed, Skyra will ignore any star and will count users who reacted to said emoji.", + "explainedUsage": [["emoji", "The emoji to set."]], + "reminder": "Use this wisely, not everyone expects the starboard to listen to a custom emoji.", + "examples": ["⭐"] + }, + "roleInfoDescription": "Check the information for a role.", + "roleInfoExtended": { + "extendedHelp": "The roleinfo command displays information for a role, such as its id, name, color, whether it's hoisted (displays separately) or not, it's role hierarchy position, whether it's mentionable or not, how many members have said role, and its permissions.\nIt sends an embedded message with the color of the role.", + "explainedUsage": [["role", "The role name, partial name, mention or id."]], + "examples": ["Administrator", "Moderator", ""] + }, + "guildInfoDescription": "Check the information of the guild!.", + "guildInfoExtended": { + "extendedHelp": "The serverinfo command displays information for the guild the message got sent.\nIt shows the amount of channels, with the count for each category, the amount of members (given from the API), the owner with their user id, the amount of roles, region, creation date, verification level... between others." + }, + "stickyRolesDescription": "Manage sticky roles for users.", + "stickyRolesExtended": { + "extendedHelp": "The stickyRoles command allows you to manage per-member's sticky roles, they are roles that are kept even when you leave, and are applied back as soon as they join.", + "explainedUsage": [ + ["action", "Either you want to check the sticky roles, add one, remove one, or remove all of them."], + ["user", "The user target for all the actions."], + ["role", "The role to add or remove."] + ], + "examples": ["add Skyra Goddess", "show Skyra", "remove Skyra Goddess", "reset Skyra"], + "reminder": "The member's roles will not be modified by this command, you need to add or remove them." + }, + "attachmentsModeDescription": "Manage this guild's flags for the attachments filter.", + "attachmentsModeExtended": { + "extendedHelp": "The attachmentsMode command manages the behavior of the attachments system.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "capitalsModeDescription": "Manage this guild's flags for the caps filter.", + "capitalsModeExtended": { + "extendedHelp": "The capitalsMode command manages the behavior of the caps system.\nThe minimum amount of characters before filtering can be set with `Skyra, settings set selfmod.capitals.minimum `.\nThe percentage of uppercase letters can be set with `Skyra, settings set selfmod.capitals.maximum `.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "filterDescription": "Manage this guild's word blacklist.", + "filterExtended": { + "extendedHelp": "The filter command manages the word blacklist for this server and must have a filter mode set up, check `Skyra, help filterMode`.\nSkyra's word filter can find matches even with special characters or spaces between the letters of a blacklisted word, as well as it filters duplicated characters for enhanced filtering." + }, + "filterModeDescription": "Manage this server's word filter modes.", + "filterModeExtended": { + "extendedHelp": "The filterMode command manages the behavior of the word filter system. Run `Skyra, help filter` for how to add words.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "inviteModeDescription": "Manage the behavior for the invite link filter.", + "inviteModeExtended": { + "extendedHelp": "The inviteMode command manages the behavior of the word filter system.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "linkModeDescription": "Manage the behavior for the link filter.", + "linkModeExtended": { + "extendedHelp": "The linkMode command manages the behavior of the link system.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "messageModeDescription": "Manage the behavior for the message filter system.", + "messageModeExtended": { + "extendedHelp": "The messageMode command manages the behavior of the message filter system.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "newlineModeDescription": "Manage the behavior for the new line filter system.", + "newlineModeExtended": { + "extendedHelp": "The newLineMode command manages the behavior of the new line filter system.\nThe maximum amount of lines allowed can be set with `Skyra, settings set selfmod.newlines.maximum `", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "reactionModeDescription": "Manage the behavior for the reaction filter system.", + "reactionModeExtended": { + "extendedHelp": "The reactionMode command manages the behavior of the reaction filter system.", + "explainedUsage": [ + ["Enable", "Enable the sub-system."], + ["Disable", "Disable the sub-system"], + ["Action Alert", "Toggle message alerts in the channel."], + ["Action Log", "Toggle message logs in the moderation logs channel."], + ["Action Delete", "Toggle message deletions."], + ["Punishment", "The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`."], + ["Punishment-Duration", "The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration."], + [ + "Threshold-Maximum", + "The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number." + ], + ["Threshold-Duration", "The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration."] + ], + "reminder": "`Action Log` requires `channel.moderation-logs` to be set up.", + "examples": [ + "enable", + "disable", + "action alert", + "punishment ban", + "punishment mute", + "punishment-duration 1m", + "threshold-maximum 5", + "threshold-duration 30s" + ] + }, + "rolesDescription": "List, claim or unclaim public roles in this server.", + "rolesExtended": { + "extendedHelp": "Public roles are roles that are available for everyone.\nAn administrator must configure them with the configuration command.", + "explainedUsage": [["roles", "The list of roles to claim or unclaim. Leave this empty to get a list of available roles."]], + "reminder": "When claiming or unclaiming roles you can provide a single or multiple role(s).\nTo claim multiple roles, you must separate them by a comma, for example `red,green`.\nYou can specify which roles you want by providing the role ID, name, or a sub-section of the name.\n\nAdministrators can add public roles using `Skyra, conf set roles.public ExamplePublicRole`.", + "examples": ["", "Designer,Programmer", "Designer"] + } +} diff --git a/src/languages/en-US/commands/misc.json b/src/languages/en-US/commands/misc.json new file mode 100644 index 00000000000..ca359ede7a0 --- /dev/null +++ b/src/languages/en-US/commands/misc.json @@ -0,0 +1,159 @@ +{ + "randRedditRequiredReddit": "You must give the name of a reddit.", + "randRedditInvalidArgument": "{{REDCROSS}} The name you gave was not a valid name for a subreddit.", + "randRedditBanned": "This reddit is banned and should not be used.", + "randRedditFail": "I failed to retrieve data, are you sure you wrote the reddit correctly?", + "randRedditAllNsfw": "Nothing could be posted as all retrieved posts are NSFW.", + "randRedditAllNsfl": "Nothing could be posted as all retrieved posts are NSFL. You do not want to see that.", + "randRedditMessage": "**{{title}}** submitted by {{author}}\n{{url}}", + "randRedditErrorPrivate": "{{REDCROSS}} No data could be downloaded as the subreddit is marked as private.", + "randRedditErrorQuarantined": "{{REDCROSS}} No data could be downloaded as the subreddit is marked as quarantined.", + "randRedditErrorNotFound": "{{REDCROSS}} No data could be downloaded as the subreddit does not exist.", + "randRedditErrorBanned": "{{REDCROSS}} No data could be downloaded as the subreddit is marked as banned.", + "redditUserComplexityLevels": ["very low", "low", "medium", "high", "very high", "very high"], + "redditUserInvalidUser": "`{{user}}` is not a valid Reddit username", + "redditUserQueryFailed": "Couldn't find any data for that reddit user", + "redditUserTitles": { + "linkKarma": "Link Karma", + "commentKarma": "Comment Karma", + "totalComments": "Total Comments", + "totalSubmissions": "Total Submissions", + "commentControversiality": "Comment Controversiality", + "textComplexity": "Text Complexity", + "top5Subreddits": "Top 5 Subreddits", + "bySubmissions": "by submission", + "byComments": "by comments", + "bestComment": "Best Comment", + "worstComment": "Worst Comment" + }, + "redditUserData": { + "overviewFor": "Overview for /u/{{user}}", + "permalink": "Permalink", + "dataAvailableFor": "Data is available for the past 1000 comments and submissions (Reddit API limitation)", + "joinedReddit": "Joined Reddit {{timestamp, timeFull}}" + }, + "snipeEmpty": "There are no sniped messages in this channel.", + "snipeTitle": "Sniped Message", + "upvoteMessage": "Upvote me on **https://top.gg/bot/266624760782258186**, **https://botsfordiscord.com/bot/266624760782258186**, or **https://botlist.space/bot/266624760782258186** for free shinies! Remember, you can vote every 24 hours.", + "vaporwaveOutput": "Here is your converted message:\n{{str}}", + "cuddleDescription": "Cuddle somebody!", + "cuddleExtended": { + "extendedHelp": "Do you know something that I envy from humans? The warm feeling when somebody cuddles you. It's so cute ❤! I can imagine and draw a image of you cuddling somebody in the bed, I hope you like it!", + "explainedUsage": [["user", "The user to cuddle with."]], + "examples": ["Skyra"] + }, + "deletthisDescription": "*Sees offensive post* DELETTHIS!", + "deletthisExtended": { + "extendedHelp": "I see it! I see the hammer directly from your hand going directly to the user you want! Unless... unless it's me! If you try to tell me this, I'm going to take the MJOLNIR! Same if you do with my creator!", + "explainedUsage": [["user", "The user that should start deleting his post."]], + "examples": ["John Doe"] + }, + "fDescription": "Press F to pay respects.", + "fExtended": { + "extendedHelp": "This command generates an image... to pay respects reacting with 🇫. This command also makes Skyra react the image if she has permissions to react messages.", + "explainedUsage": [["user", "The user to pray respects to."]], + "examples": ["John Doe", "Jake"] + }, + "goodnightDescription": "Give somebody a nice Good Night!", + "goodnightExtended": { + "extendedHelp": "Let me draw you giving a goodnight kiss to the person who is going to sleep! Who doesn't like goodnight kisses?", + "explainedUsage": [["user", "The user to give the goodnight kiss."]], + "examples": ["Jake", "DefinitivelyNotSleeping"] + }, + "goofytimeDescription": "It's Goofy time!", + "goofytimeExtended": { + "extendedHelp": "IT'S GOOFY TIME! *Screams loudly in the background* NO, DAD! NO! This is a command based on the Goofy Time meme, what else would it be?", + "explainedUsage": [["user", "The user who will say IT'S GOOFY TIME!"]], + "examples": ["TotallyNotADaddy"] + }, + "hugDescription": "Hugs!", + "hugExtended": { + "extendedHelp": "What would be two people in the middle of the snow with coats and hugging each other? Wait! I get it! Mention somebody you want to hug with, and I'll try my best to draw it in a canvas!", + "explainedUsage": [["user", "The user to hug with."]], + "examples": ["Bear"] + }, + "ineedhealingDescription": "*Genji's voice* I NEED HEALING!", + "ineedhealingExtended": { + "extendedHelp": "Do you know the worst nightmare for every single healer in Overwatch, specially for Mercy? YES!\nYou know it, it's a cool cyborg ninja that looks like a XBOX and is always yelling \"I NEED HEALING\" loudly during the entire match.\nWell, don't expect so much, this command actually shows a medic with some tool in your chest.", + "explainedUsage": [["healer", "The healer you need to heal you."]], + "examples": ["Mercy"] + }, + "randRedditDescription": "Retrieve a random Reddit post.", + "randRedditExtended": { + "extendedHelp": "This is actually something like a Russian Roulette, you can get a good meme, but you can also get a terrible meme.", + "explainedUsage": [["reddit", "The reddit to look at."]], + "examples": ["discordapp"] + }, + "redditUserDescription": "Retrieve statistics for a Reddit user.", + "redditUserExtended": { + "extendedHelp": "Gets statistics of any given Reddit user", + "explainedUsage": [["user", "The reddit user to look at."]], + "examples": ["GloriousGe0rge"] + }, + "shipDescription": "Ships 2 members", + "shipExtended": { + "extendedHelp": "This commands generates a ship name between two users and creates more love in the world.\nUsers are optional, you can provide none, just one or both users. For any non-provided users I will pick a random guild member.", + "explainedUsage": [ + ["firstUser", "The first user to ship"], + ["secondUser", "The second user to ship"] + ], + "examples": ["romeo juliet"], + "reminder": "If I cannot find either given user then I will pick someone randomly." + }, + "shipData": { + "title": "**Shipping `{{romeoUsername}}` and `{{julietUsername}}`**", + "description": "I call it... {{shipName}}" + }, + "chaseDescription": "Get in here!", + "chaseExtended": { + "extendedHelp": "Do you love chasing? Start chasing people now for free! Just mention or write their ID and done!", + "explainedUsage": [["pinger", "The user who you want to chase."]], + "examples": ["IAmInnocent"] + }, + "shindeiruDescription": "Omae wa mou shindeiru.", + "shindeiruExtended": { + "extendedHelp": "\"You are already dead\" Japanese: お前はもう死んでいる; Omae Wa Mou Shindeiru, is an expression from the manga and anime series Fist of the North Star.\nThis shows a comic strip of the character pronouncing the aforementioned words, which makes the opponent reply with \"nani?\" (what?).", + "explainedUsage": [["user", "The person you're telling that phrase to."]], + "examples": ["Jack"] + }, + "peepoloveDescription": "Generates a peepoLove image from a users' avatar.", + "peepoloveExtended": { + "extendedHelp": "Allows you to generate a peepoLove image from a user's avatar.", + "explainedUsage": [["user", "The user that peepo should hug."]], + "examples": ["Joe"], + "reminder": "Custom image support has been temporarily disabled" + }, + "slapDescription": "Slap another user using the Batman & Robin Meme.", + "slapExtended": { + "extendedHelp": "The hell are you saying? *Slaps*. This meme is based on a comic from Batman and Robin.", + "explainedUsage": [["user", "The user you wish to slap."]], + "examples": ["Jake"], + "reminder": "You try to slap me and I'll slap you instead." + }, + "snipeDescription": "Retrieve the last deleted message from a channel", + "snipeExtended": { + "extendedHelp": "This just sends the last deleted message from this channel, somebody is misbehaving? This will catch them." + }, + "thesearchDescription": "Are we the only one in the universe, this man on earth probably knows.", + "thesearchExtended": { + "extendedHelp": "One man on Earth probably knows if there is intelligent life, ask and you shall receive an answer.", + "explainedUsage": [["answer", "The sentence that will reveal the truth."]], + "examples": ["Your waifu is not real."] + }, + "triggeredDescription": "I am getting TRIGGERED!", + "triggeredExtended": { + "extendedHelp": "What? My commands are not userfriendly enough?! (╯°□°)╯︵ ┻━┻. This command generates a GIF image your avatar wiggling fast, with a TRIGGERED footer, probably going faster than I thought, I don't know.", + "explainedUsage": [["user", "The user that is triggered."]], + "examples": ["kyra"] + }, + "upvoteDescription": "Get a link to upvote Skyra in **Bots For Discord**", + "upvoteExtended": { + "extendedHelp": "Bots For Discord is a website where you can find amazing bots for your website. If you really love me, you can help me a lot by upvoting me every 24 hours, so more users will be able to find me!" + }, + "vaporwaveDescription": "Vapowave characters!", + "vaporwaveExtended": { + "extendedHelp": "Well, what can I tell you? This command turns your messages into unicode monospaced characters. That is, what humans call 'A E S T H E T I C'. I wonder what it means...", + "explainedUsage": [["phrase", "The phrase to convert"]], + "examples": ["A E S T H E T I C"] + } +} diff --git a/src/languages/en-US/commands/moderation.json b/src/languages/en-US/commands/moderation.json new file mode 100644 index 00000000000..ddbfefc8074 --- /dev/null +++ b/src/languages/en-US/commands/moderation.json @@ -0,0 +1,298 @@ +{ + "permissions": "Permissions for {{username}} ({{id}})", + "permissionsAll": "All Permissions", + "flow": "{{amount}} messages have been sent within the last minute.", + "timeTimed": "The selected moderation case has already been timed.", + "timeUndefinedTime": "You must specify a time.", + "timeUnsupportedType": "The type of action for the selected case cannot be reverse, therefore this action is unsupported.", + "timeNotScheduled": "This task is not scheduled.", + "timeAborted": "Successfully aborted the schedule for {{title}}", + "timeScheduled": "{{GREENTICK}} Successfully scheduled a moderation action type **{{title}}** for the user {{user.tag}} ({{user.id}}) with a duration of {{time, duration}}", + "slowmodeSet": "The cooldown for this channel has been set to {{cooldown, duration}}.", + "slowmodeReset": "The cooldown for this channel has been reset.", + "slowmodeTooLong": "{{REDCROSS}} The maximum amount of time you can set is 6 hours.", + "timeDescription": "Set the timer.", + "timeExtended": { + "extendedHelp": "Updates the timer for a moderation case..", + "explainedUsage": [ + ["cancel", "Whether or not you want to cancel the timer."], + ["case", "The case you want to update"], + ["timer", "The timer, ignored if `cancel` was defined."] + ], + "examples": ["cancel 1234", "1234 6h"] + }, + "banNotBannable": "The target is not bannable for me.", + "dehoistStarting": "I will start dehoisting {{count}} members...", + "dehoistProgress": "Dehoisted {{count}} members so far! ({{percentage}}%)", + "dehoistEmbed": { + "title": "Finished dehoisting {{users}} members", + "descriptionNoone": "No members were dehoisted. A round of applause for your law-abiding users!", + "descriptionWithError": "{{dehoistedWithErrorsCount}} member was dehoisted. We also tried to dehoist an additional {{errored}} member, but they errored out", + "descriptionWithMultipleErrors": "{{dehoistedWithErrorsCount}} members were dehoisted. We also tried to dehoist an additional {{errored}} members, but they errored out", + "description": "{{dehoistedMemberCount}} member was dehoisted", + "descriptionMultipleMembers": "{{dehoistedMemberCount}} members were dehoisted", + "fieldErrorTitle": "The users we encountered an error for:" + }, + "kickNotKickable": "The target is not kickable for me.", + "lockdownLock": "The channel {{channel}} is now locked.", + "lockdownLocking": "{{LOADING}} Locking the channel {{channel}}... I might not be able to reply after this.", + "lockdownLocked": "The channel {{channel}} was already locked.", + "lockdownUnlocked": "The channel {{channel}} was not locked.", + "lockdownOpen": "The lockdown for the channel {{channel}} has been released.", + "muteLowlevel": "I am sorry, there is no Mute role configured. Please ask an Administrator or the Guild Owner to set it up.", + "muteConfigureCancelled": "Prompt aborted, the Mute role creation has been cancelled.", + "muteConfigure": "Do you want me to create and configure the Mute role now?", + "muteConfigureToomanyRoles": "There are too many roles (250). Please delete a role before proceeding.", + "muteMuted": "The target user is already muted.", + "muteUserNotMuted": "This user is not muted.", + "muteUnconfigured": "This guild does not have a **Muted** role. Aborting command execution.", + "mutecreateMissingPermission": "I need the **{{MANAGE_ROLES, permissions}}** permission to create the role and **{{MANAGE_CHANNELS, permissions}}** to edit the channels permissions.", + "restrictLowlevel": "{{REDCROSS}} I'm sorry, there is no restriction role configured. Please ask an Administrator or the server owner to set it up.", + "pruneInvalid": "{{REDCROSS}} You did not specify the arguments correctly, please make sure you gave a correct limit or filter.", + "pruneAlert": "Successfully deleted {{count}} message from {{total}}.", + "pruneAlert_plural": "Successfully deleted {{count}} messages from {{total}}.", + "pruneInvalidPosition": "{{REDCROSS}} Position must be one of \"before\" or \"after\".", + "pruneInvalidFilter": "{{REDCROSS}} Filter must be one of \"file\", \"author\", \"bot\", \"human\", \"invite\", \"link\", or \"skyra\".", + "pruneNoDeletes": "No message has been deleted, either no message match the filter or they are over 14 days old.", + "pruneLogHeader": "The following messages have been generated by request of a moderator.\nThe date formatting is of `YYYY/MM/DD hh:mm:ss`.", + "pruneLogMessage": "{{count}} message deleted in {{channel}} by {{author}}.", + "pruneLogMessage_plural": "{{count}} messages deleted in {{channel}} by {{author}}.", + "reasonMissingCase": "You need to provide a case or a case range.", + "reasonNotExists": "The selected modlog doesn't seem to exist.", + "reasonUpdated": ["{{GREENTICK}} Updated 1 case", " └─ **Set its reason to:** {{newReason}}"], + "reasonUpdated_plural": ["{{GREENTICK}} Updated {{entries.length}} cases", " └─ **Set their reasons to:** {{newReason}}"], + "toggleModerationDmToggledEnabled": "{{GREENTICK}} Successfully enabled moderation DMs.", + "toggleModerationDmToggledDisabled": "{{GREENTICK}} Successfully disabled moderation DMs", + "unbanMissingPermission": "I will need the **{{BAN_MEMBERS, permissions}}** permission to be able to unban.", + "unmuteMissingPermission": "I will need the **{{MANAGE_ROLES, permissions}}** permission to be able to unmute.", + "vmuteMissingPermission": "I will need the **{{MUTE_MEMBERS, permissions}}** permission to be able to voice unmute.", + "vmuteUserNotMuted": "This user is not voice muted.", + "warnDm": "You have been warned by {{moderator}} in {{guild}} for the reason: {{reason}}", + "warnMessage": "|`🔨`| [Case::{{log}}] **WARNED**: {{user.tag}} ({{user.id}})", + "moderationOutput": "{{GREENTICK}} Created case {{range}} | {{users, andList}}.", + "moderationOutput_plural": "{{GREENTICK}} Created cases {{range}} | {{users, andList}}.", + "moderationOutputWithReason": "{{GREENTICK}} Created case {{range}} | {{users, andList}}.\nWith the reason of: {{reason}}", + "moderationOutputWithReason_plural": "{{GREENTICK}} Created cases {{range}} | {{users, andList}}.\nWith the reason of: {{reason}}", + "moderationFailed": "{{REDCROSS}} Failed to moderate user:\n{{users, andList}}", + "moderationFailed_plural": "{{REDCROSS}} Failed to moderate users:\n{{users, andList}}", + "moderationDmFooter": "To disable moderation DMs, write `toggleModerationDM`.", + "moderationDmDescription": "**❯ Server**: {{guild}}\n**❯ Type**: {{title}}\n**❯ Reason**: None specified", + "moderationDmDescriptionWithReason": "**❯ Server**: {{guild}}\n**❯ Type**: {{title}}\n**❯ Reason**: {{reason}}", + "moderationDmDescriptionWithDuration": "**❯ Server**: {{guild}}\n**❯ Type**: {{title}}\n**❯ Duration**: {{duration, duration}}\n**❯ Reason**: None specified", + "moderationDmDescriptionWithReasonWithDuration": "**❯ Server**: {{guild}}\n**❯ Type**: {{title}}\n**❯ Duration**: {{duration, duration}}\n**❯ Reason**: {{reason}}", + "moderationDays": "days?", + "historyDescription": "Display the count of moderation cases from this guild or from a user.", + "historyExtended": { + "extendedHelp": "This command shows the amount of bans, mutes, kicks, and warnings, including temporary, that have not been appealed.", + "examples": ["", "@Pete"] + }, + "historyFooterNew": "This user has {{warnings}} {{warningsText}}, {{mutes}} {{mutesText}}, {{kicks}} {{kicksText}}, and {{bans}} {{bansText}}", + "historyFooterWarning": "warning", + "historyFooterWarning_plural": "warnings", + "historyFooterMutes": "mute", + "historyFooterMutes_plural": "mutes", + "historyFooterKicks": "kick", + "historyFooterKicks_plural": "kicks", + "historyFooterBans": "ban", + "historyFooterBans_plural": "bans", + "moderationsDescription": "List all running moderation logs from this guild.", + "moderationsExtended": { + "extendedHelp": "This command shows you all the temporary moderation actions that are still running. This command uses a reaction-based menu and requires the permission **{{MANAGE_MESSAGES, permissions}}** to execute correctly.", + "examples": ["", "@Pete", "mutes @Pete", "warnings"] + }, + "moderationsEmpty": "Nobody has behaved badly yet, who will be the first user to be listed here?", + "moderationsAmount": "There is 1 entry.", + "moderationsAmount_plural": "There are {{count}} entries.", + "mutesDescription": "List all mutes from this guild or from a user.", + "mutesExtended": { + "extendedHelp": "This command shows either all mutes filed in this guild, or all mutes filed in this guild for a specific user.\nThis command uses a reaction-based menu and requires the permission **{{MANAGE_MESSAGES, permissions}}** to execute correctly.", + "examples": ["", "@Pete"] + }, + "warningsDescription": "List all warnings from this guild or from a user.", + "warningsExtended": { + "extendedHelp": "This command shows either all warnings filed in this guild, or all warnings filed in this guild for a specific user.\nThis command uses a reaction-based menu and requires the permission **{{MANAGE_MESSAGES, permissions}}** to execute correctly.", + "examples": ["", "@Pete"] + }, + "slowmodeDescription": "Set the channel's slowmode value in seconds.", + "slowmodeExtended": { + "extendedHelp": "This command requires **{{MANAGE_CHANNELS, permissions}}** and will modify the channel's ratelimit per user to any value between 0 and 120 seconds.", + "examples": ["0", "reset", "4"], + "reminder": "To reset a channel's ratelimit per user, you can use either 0 or 'reset'." + }, + "banDescription": "Hit somebody with the ban hammer.", + "banExtended": { + "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be banned by me.\nNo, the guild's owner cannot be banned.\nThis action can be optionally timed to create a temporary ban.", + "examples": ["@Pete", "@Pete Spamming all channels.", "@Pete 24h Spamming all channels"] + }, + "dehoistDescription": "Shoot everyone with the Dehoistinator 3000", + "dehoistExtended": { + "extendedHelp": "The act of hoisting involves adding special characters in front of your nickname in order to appear higher in the members list.\nThis command replaces any member's nickname that includes those special characters with a special character that drags them to the bottom of the list.", + "reminder": "This command requires **{{MANAGE_NICKNAMES, permissions}}**, and only members with lower role hierarchy position can be dehoisted." + }, + "kickDescription": "Hit somebody with the 👢.", + "kickExtended": { + "extendedHelp": "This command requires **{{KICK_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be kicked by me. No, the guild's owner cannot be kicked.", + "examples": ["@Sarah", "@Sarah Spamming general chat."] + }, + "lockdownDescription": "Close the gates for this channel!", + "lockdownExtended": { + "extendedHelp": "This command requires **{{MANAGE_CHANNELS, permissions}}** in order to be able to manage the permissions for a channel.\nThis command removes the permission **{{SEND_MESSAGES, permissions}}** to the `@everyone` role so nobody but the members with roles that have their own overrides (besides administrators, who bypass channel overrides) can send messages.\nOptionally, you can pass time as second argument.", + "examples": ["", "#general", "#general 5m"] + }, + "muteDescription": "Mute a user in all text and voice channels.", + "muteExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be muted.\nThis action can be optionally timed to create a temporary mute. This action saves a member's roles temporarily and will be granted to the user after the unmute.\nThe muted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Alphonse", "@Alphonse Spamming all channels", "@Alphonse 24h Spamming all channels"] + }, + "setNicknameDescription": "Change the nickname of a user.", + "setNicknameExtended": { + "extendedHelp": "This command requires **{{MANAGE_NICKNAMES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner nickname cannot be changed.", + "examples": ["@Pete peeehteeerrr", "@ꓑ𝗲੮ẻ Pete Unmentionable name"] + }, + "addRoleDescription": "Adds a role to a user.", + "addRoleExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner roles cannot be changed.", + "examples": ["@John member", "@John member Make John a member"] + }, + "removeroleDescription": "Removes a role from a user", + "removeroleExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner roles cannot be changed.", + "examples": ["@Paula member", "@Paula member Remove member permissions from Paula"] + }, + "pruneDescription": "Prunes a certain amount of messages w/o filter.", + "pruneExtended": { + "extendedHelp": "This command deletes the given amount of messages given a filter within the last 100 messages sent in the channel the command has been run.\nOptionally, you can add `--silent` to tell Skyra not to send a response message.", + "explainedUsage": [ + ["Messages", "The amount of messages to prune."], + ["Filter", "The filter to apply."], + ["(Filter) Link", "Filters messages that have links on the content."], + ["(Filter) Invite", "Filters messages that have invite links on the content."], + ["(Filter) Bots", "Filters messages sent by bots."], + ["(Filter) You", "Filters messages sent by Skyra."], + ["(Filter) Me", "Filters your messages."], + ["(Filter) Upload", "Filters messages that have attachments."], + ["(Filter) User", "Filters messages sent by the specified user."], + ["(Filter) Human", "Filters messages sent by humans."], + ["Position", "Lets you delete messages before or after a specific message."], + ["(Position) Before", "Deletes all messages before the given message."], + ["(Position) After", "Deletes all messages after the given message."] + ], + "examples": ["50 me", "75 @kyra", "20 bots", "60 humans before 629992398700675082"], + "reminder": "Due to a Discord limitation, bots cannot delete messages older than 14 days." + }, + "caseDescription": "Get the information from a case by its index.", + "caseExtended": { + "extendedHelp": "You can also get the latest moderation case by specifying the case ID as `latest`", + "explainedUsage": [["Case", "Number of the case ID to get or `latest`"]], + "examples": ["5", "latest"] + }, + "permissionsDescription": "Check the permission for a member, or yours.", + "permissionsExtended": { + "extendedHelp": "Ideal if you want to know the what permissions are granted to a member when they have a certain set of roles." + }, + "flowDescription": "Shows the amount of messages per minute in a channel.", + "flowExtended": { + "extendedHelp": "This helps you determine the overall activity of a channel", + "explainedUsage": [["channel", "(Optional): The channel to check, if omitted current channel is used"]] + }, + "reasonDescription": "Edit the reason field from a moderation log case.", + "reasonExtended": { + "extendedHelp": "This command allows moderation log case management, it allows moderators to update the reason.\nIf you want to modify multiple cases at once you provide a range.\nFor example `1..3` for the `` will edit cases 1, 2, and 3.\nAlternatively you can also give ranges with commas:\n`1,3..6` will result in cases 1, 3, 4, 5, and 6\n`1,2,3` will result in cases 1, 2, and 3", + "examples": ["420 Spamming all channels", "419..421 Bad memes", "1..3,4,7..9 Posting NSFW", "latest Woops, I did a mistake!"] + }, + "restrictAttachmentDescription": "Restrict a user from sending attachments in all channels.", + "restrictAttachmentExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be restricted.\nThis action can be optionally timed to create a temporary restriction.\nThe restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Pete", "@Pete Sending weird images", "@Pete 24h Sending NSFW images"] + }, + "restrictEmbedDescription": "Restrict a user from attaching embeds in all channels.", + "restrictEmbedExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be restricted.\nThis action can be optionally timed to create a temporary restriction.\nThe restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Pete", "@Pete Sending weird links", "@Pete 24h Posted a spam link"] + }, + "restrictEmojiDescription": "Restrict a user from using external emojis in all channels.", + "restrictEmojiExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be restricted.\nThis action can be optionally timed to create a temporary restriction.\nThe restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Pete", "@Pete Spamming external emojis", "@Pete 24h Posted cringe"], + "reminder": "This will only prevent the usage of external emojis and so will have no effect for non-nitro users, your own server's emojis and regular build in twemojis can still be used by members with this role." + }, + "restrictReactionDescription": "Restrict a user from reacting to messages in all channels.", + "restrictReactionExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be restricted.\nThis action can be optionally timed to create a temporary restriction.\nThe restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Pete", "@Pete Spamming reactions", "@Pete 24h Posting weird reactions"] + }, + "restrictVoiceDescription": "Restrict a user from joining any voice channel.", + "restrictVoiceExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the guild's owner cannot be restricted.\nThis action can be optionally timed to create a temporary restriction.\nThe restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.", + "examples": ["@Pete", "@Pete Earraping in general voice channels", "@Pete 24h Making weird noises"] + }, + "softBanDescription": "Hit somebody with the ban hammer, destroying all their messages for some days, and unban it.", + "softBanExtended": { + "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be banned by me.\nNo, the guild's owner cannot be banned.\nThe ban feature from Discord has a feature that allows the moderator to remove all messages from all channels that have been sent in the last 'x' days, being a number between 0 (no days) and 7.\nThe user gets unbanned right after the ban, so it is like a kick, but that can prune many many messages.", + "examples": ["@Pete", "@Pete Spamming all channels", "@Pete 7 All messages sent in 7 are gone now, YEE HAH!"] + }, + "toggleModerationDmDescription": "Toggle moderation DMs.", + "toggleModerationDmExtended": { + "extendedHelp": "This command allows you to toggle moderation DMs. By default, they are on, meaning that any moderation action (automatic or manual) will DM you, but you can disable them with this command." + }, + "unbanDescription": "Unban somebody from this guild!.", + "unbanExtended": { + "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**. It literally gets somebody from the rubbish bin, cleans them up, and allows the pass to this guild's gates.", + "examples": ["@Pete", "@Pete Turns out he was not the one who spammed all channels ¯\\_(ツ)_/¯"] + }, + "unmuteDescription": "Remove the scotch tape from a user.", + "unmuteExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the muted people's list, and gives the old roles back if the user had them.", + "examples": ["@Pete", "@Pete (Insert random joke here)."] + }, + "unrestrictAttachmentDescription": "Remove the attachment restriction from one or more users.", + "unrestrictAttachmentExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", + "examples": ["@Pete"] + }, + "unrestrictEmbedDescription": "Remove the embed restriction from one or more users.", + "unrestrictEmbedExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", + "examples": ["@Pete"] + }, + "unrestrictEmojiDescription": "Remove the external emoji restriction from one or more users.", + "unrestrictEmojiExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", + "examples": ["@Pete"] + }, + "unrestrictReactionDescription": "Remove the reaction restriction from one or more users.", + "unrestrictReactionExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", + "examples": ["@Pete"] + }, + "unrestrictVoiceDescription": "Remove the voice restriction from one or more users.", + "unrestrictVoiceExtended": { + "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", + "examples": ["@Pete"] + }, + "unwarnDescription": "Appeal a warning moderation log case.", + "unwarnExtended": { + "extendedHelp": "This command appeals a warning, it requires no permissions, you only give me the moderation log case to appeal and the reason.", + "examples": ["0 Whoops, wrong dude.", "42 Turns out this was the definition of life."] + }, + "vmuteDescription": "Throw somebody's microphone out the window.", + "vmuteExtended": { + "extendedHelp": "This command requires **{{MUTE_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be silenced by me.\nNo, the guild's owner cannot be silenced.\nThis action can be optionally timed to create a temporary voice mute.", + "examples": ["@Pete", "@Pete Singing too loud", "@Pete 24h Literally sang ear rape"] + }, + "voiceKickDescription": "Hit somebody with the 👢 for singing so bad and loud.", + "voiceKickExtended": { + "extendedHelp": "This command requires the permissions **{{MANAGE_CHANNELS, permissions}}** to create a temporary (hidden) voice channel, and **{{MOVE_MEMBERS, permissions}}** to move the user to the temporary channel.\nAfter this, the channel is quickly deleted, making the user leave the voice channel.\nFor scared moderators, this command has almost no impact in the average user, as the channel is created in a way only me and the selected user can see and join, then quickly deleted.", + "examples": ["@Pete", "@Pete Spamming all channels"] + }, + "vunmuteDescription": "Get somebody's microphone back so they can talk.", + "vunmuteExtended": { + "extendedHelp": "This command requires **{{MUTE_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be un-silenced by me.\nNo, the guild's owner cannot be un-silenced.", + "examples": ["@Pete", "@Pete Appealed his times signing hear rape."] + }, + "warnDescription": "File a warning to somebody.", + "warnExtended": { + "extendedHelp": "This command files a warning to a user.\nThis kind of warning is meant to be **formal warnings**, as they will be shown in the 'warnings' command.\nIt is a good practise to do an informal warning before using this command.", + "examples": ["@Pete Attempted to mention everyone."] + } +} diff --git a/src/languages/en-US/commands/music.json b/src/languages/en-US/commands/music.json new file mode 100644 index 00000000000..8a11951dc0e --- /dev/null +++ b/src/languages/en-US/commands/music.json @@ -0,0 +1,173 @@ +{ + "addDescription": "Adds a song the the queue.", + "addExtended": { + "extendedHelp": "Add songs to the playing queue and prepare for musical enjoyment!\nI can play music from YouTube, Bandcamp, SoundCloud, Twitch, or Vimeo.\n\n- To play from YouTube either give me something to search for, a video link, or a playlist link.\n- To play from SoundCloud give me a SoundCloud link, or if you want me to search include either `--sc` or `--soundcloud` in your message.\n- To play from Bandcamp, Twitch, or Vimeo just give me a URL to a video or playlist on those sources.\n- To play a previously exported queue, include `--import` and attach the queue file to your message or give me a URL to it.", + "explainedUsage": [["song", "The song to queue. Can be either a URL or a video/song title."]], + "examples": [ + "The Pokémon Theme song", + "https://youtu.be/fJ9rUzIMcZQ", + "--sc Imagine Dragons Believer", + "https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix", + "https://vimeo.com/channels/music/239029778", + "https://thedisappointed.bandcamp.com/album/escapism-2", + "https://cdn.discordapp.com/attachments/642137151626018818/746716958627725402/Skyra_Development_Suite-1598101595077.squeue", + "--import https://cdn.skyra.pw/favsongs.squeue" + ] + }, + "addPlaylist": "{{GREENTICK}} Added {{songs}} to the queue 🎶", + "addPlaylistSongs": "**{{count}}** song", + "addPlaylistSongsPlural": "**{{count}}** songs", + "addSong": "{{GREENTICK}} Added **{{title}}** to the queue 🎶", + "clearDescription": "Clears the queue list.", + "clearExtended": { + "extendedHelp": "Clears the current queue to get a fresh start.", + "reminder": "Before you can use this command there has to be a queue to clear and you have to be a DJ or a moderator!" + }, + "clearDenied": "{{REDCROSS}} You can't execute this command when there are over 4 members! You must be a DJ or a moderator!", + "clearSuccess": "{{REDCROSS}} Pruned {{count}} song.", + "clearSuccessPlural": "{{REDCROSS}} Pruned {{count}} songs.", + "exportQueueDescription": "Exports your queue to a `.squeue` file.", + "exportQueueExtended": { + "extendedHelp": "Have a queue you liked and want to replay later? Or maybe you want to send your friends what you're listening right now\nUse \"exportqueue\" and I'll pack the music in your queue into a neat file you can either save or share with your friends!\nWhen you want to play it back, just use it with `play`, `add` or `importqueue`!", + "reminder": "If your queue is longer than 100 songs, I will only include the first 100, to prevent abuse of my systems" + }, + "exportQueueSuccess": "{{GREENTICK}} Here's the current queue for {{guildName}}!", + "importQueueDescription": "Imports a queue saved as a `.squeue` file.", + "importQueueExtended": { + "extendedHelp": "Did a friend send you a queue? Or maybe you want to play a queue you saved earlier?\nWith `importqueue`, I can load the queue for you, and then you can jam to your favorite tracks!", + "reminder": "You can either give me a link to the `.squeue` file, or attach it to your message!" + }, + "joinDescription": "Joins the message author's voice channel.", + "joinExtended": { + "extendedHelp": "If you only want me to join your channel but not start playing music you can use this command.", + "reminder": "Before you can use this command you should join a voice channel!" + }, + "joinNoMember": "{{REDCROSS}} I'm sorry, but Discord did not give me the information I need, so I don't know which voice channel you're connected to...", + "joinNoVoicechannel": "{{REDCROSS}} You are not connected in a voice channel.", + "joinSuccess": "{{GREENTICK}} Successfully joined the voice channel {{channel}}", + "joinVoiceDifferent": "{{REDCROSS}} I think you confused the channels! Earth to Moon, we are in another voice channel!", + "joinVoiceFull": "{{REDCROSS}} I cannot join your voice channel, it's full... kick somebody or make room for me!", + "joinVoiceNoConnect": "{{REDCROSS}} I do not have enough permissions to connect to your voice channel. I am missing the **{{CONNECT, permissions}}** permission.", + "joinVoiceNoSpeak": "{{REDCROSS}} I can connect... but not speak. Please turn on this permission so I can emit music.", + "joinVoiceSame": "{{REDCROSS}} Turn on your volume! I am playing music there!", + "joinFailed": "{{REDCROSS}} I could not join your voice channel because there is something wrong with my music player. Please join the support server by using \"@Skyra support\" and alert my developers.", + "leaveDescription": "Leaves the voice channel.", + "leaveExtended": { + "extendedHelp": "Use this command to make me leave the current voice channel.\nBy default I will leave the channel, forget about the currently playing song, but leave the queue intact.\nThis means that if you use `Skyra, play` after the leave command, I will continue playing with the first song that was on the queue before I left.\n\nThis default behavior can be modified with flags:\n`--removeall` or `--ra` to follow the default behavior as well clear the queue, next time you want me to start playing you will have build a new queue", + "examples": ["leave", "leave --removeall", "leave --ra", "leave --soft"] + }, + "leaveSuccess": "{{GREENTICK}} Successfully left the voice channel {{channel}}", + "pauseDescription": "Pauses the current song.", + "pauseExtended": { + "extendedHelp": "Pauses the currently playing song. You can resume by using the `resume` command.", + "reminder": "Before you can use this command you need to be in the same voice channel as Skyra, you need to be a moderator or DJ, and some music needs to be playing!" + }, + "pauseSuccess": "{{GREENTICK}} Paused", + "playDescription": "Let me be your DJ and play you some tunes!", + "playExtended": { + "extendedHelp": "Queue some music and allow me to start jamming out to your enjoyment.\nWhen using this command I will automatically join your voice channel and start playing the first song in my queue.\nI can play from YouTube, Bandcamp, SoundCloud, Twitch, Vimeo, Mixer, or a queue someone else exported earlier\n- To play from YouTube either give me something to search, a video link, or a playlist link.\n- To play from SoundCloud give me a SoundCloud link, or if you want me to search include either `--sc` or `--soundcloud` in your message.\n- To play from Mixer give me the URL of a Mixer streamer, I'm sorry but I cannot (yet) play Mixer VOD's.\n- To play from Bandcamp, Twitch, or Vimeo just give me a URL to a video or playlist on those sources.\n- To play from a previously-exported queue, include `--import` and attach it to your message or give me a URL to it", + "explainedUsage": [["song", "The song to play. Can be either a URL or a video/song title."]], + "examples": [ + "The Pokémon Theme song", + "https://youtu.be/fJ9rUzIMcZQ", + "--sc Imagine Dragons Believer", + "https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix", + "https://vimeo.com/channels/music/239029778", + "https://mixer.com/Ninja", + "https://thedisappointed.bandcamp.com/album/escapism-2", + "--import https://cdn.skyra.pw/favsongs.squeue" + ], + "reminder": "Before you can use this command you should join a voice channel!" + }, + "playEnd": "It looks like the queue ended here. I hope you enjoyed the session!", + "playNext": "🎧 Playing: **{{title}}** as requested by: **{{requester}}**", + "playQueuePaused": "There was a track going on! Playing it back! Now playing: {{song}}!", + "playQueuePlaying": "{{REDCROSS}} Hey! The disk is already spinning!", + "playQueueEmpty": "The session is over, add some songs to the queue, you can for example do `Skyra, add Imperial March`, and... *dumbrolls*!", + "playingDescription": "Get information from the current song.", + "playingExtended": { + "extendedHelp": "Want to know what the current song is playing? Use this command instead of external services.", + "reminder": "Before you can use this command some music should be playing!" + }, + "playingDuration": "**Duration**: {{duration}}", + "playingQueueEmpty": "{{REDCROSS}} Are you speaking to me? Because my deck is empty...", + "playingQueueNotPlaying": "{{REDCROSS}} I think you're listening to background noise, I'm not playing anything.", + "repeatDescription": "Toggle repeating the current song.", + "repeatExtended": { + "extendedHelp": "If you really love the current song you can repeat it into infinity.", + "reminder": "Before you can use this command you need to be in the same voice channel as Skyra, and some music needs to be playing!" + }, + "repeatSuccessEnabled": "This is your JAM isn't it? Don't you worry, we will repeat this on and on and on!", + "repeatSuccessDisabled": "I was actually getting tired of this too, but I didn't want to say anything.", + "queueDescription": "Check the queue list.", + "queueExtended": { + "extendedHelp": "Shows the current music queue, as well as what is currently playing and the progress of the current song.", + "reminder": "Before you can use this command there should be any queue at all to show!" + }, + "queueLast": "There are no more songs! After the one playing is over, the session will end!", + "queueTitle": "Music queue for {{guildname}}", + "queueLine": "**[\"{{position}\"]** │ \"{{duration}\" │ [{{title}}]({{url}}) │ Requester: **{{requester}}**.", + "queueNowplaying": "[{{title}}]({{url}})\nRequester: **{{requester}}**", + "queueNowplayingLiveStream": "Live Stream", + "queueNowplayingTimeRemaining": "🕰 Time remaining: {{timeRemaining}}.", + "queueNowplayingTitle": "Now Playing:", + "queueTotalTitle": "Total songs:", + "queueTotal": "{{songs}} in the queue, with a total duration of {{remainingTime}}", + "queueEmpty": "looks like nothing is playing right now and the queue is empty, why don't you start the disc?", + "queueDashboardInfo": "Did you know that you can also manage your music using a fancy webapp? [Click here to go there](https://skyra.pw/music/{{guild.id}})", + "removeDescription": "Remove a song from the queue list.", + "removeExtended": { + "extendedHelp": "Removes a song from the queue using the index of the queue. You can find the index of a song using the `queue` command.", + "reminder": "Before you can use this command there has to be a queue to remove a song from!" + }, + "removeIndexInvalid": "I'm good with maths, unlike my sister, but I need you to give me a number equal or bigger than 1.", + "removeIndexOutOfBounds": "maybe time happened too fast for you, there are {{songs}} in the queue!", + "removeDenied": "{{REDCROSS}} Let's play it nicely, don't remove other's songs if you're not a moderator nor a DJ.", + "removeSuccess": "{{GREENTICK}} Removed the song **{{title}}** requested by <@{{requester}}>.", + "seekDescription": "Change the player time for the current song.", + "seekExtended": { + "extendedHelp": "With this command you can jump to a specific position in the song.", + "reminder": "Before you can use this command you need to be a moderator or DJ, and some music needs to be playing!" + }, + "seekSuccess": "{{GREENTICK}} Successfully changed the time! Now at {{time, duration}}!", + "resumeDescription": "Resumes the current song.", + "resumeExtended": { + "extendedHelp": "Used the `pause` command and want to resume the song? Then use this command.", + "reminder": "Before you can use this command you need to be in the same voice channel as Skyra, and the current song needs to be paused!" + }, + "resumeSuccess": "▶ Resumed.", + "shuffleDescription": "Randomize the order of the songs in the queue.", + "shuffleExtended": { + "extendedHelp": "If you want to be in for a surprise you should *not* use the queue command after this so you'll be surprised about what plays next ;)", + "reminder": "Before you can use this command you need to be a moderator or DJ, and there has to be a queue of songs to shuffle!" + }, + "shuffleSuccess": "{{GREENTICK} Successfully randomized {{amount}} songs.", + "skipDescription": "Skip the current song.", + "skipExtended": { + "extendedHelp": "Someone put a crappy song in the queue? Yeet it from the existance with this command. If there are more than 4 listeners in the channel (excluding Skyra) then a vote will be started before the song is skipped.", + "explainedUsage": [["force", "DJs and moderators can force the skip (bypass the vote) by adding force to the command."]], + "reminder": "Before you can use this command you need to be in the same channel as Skyra and there has to be a current song (paused or playing)!" + }, + "skipPermissions": "{{REDCROSS}} You can't execute this command, you must be a DJ or a Moderator.", + "skipVotesVoted": "{{REDCROSS}} You have already voted.", + "skipVotesTotal": "🔸 | Votes: {{amount} of {{needed}}", + "skipSuccess": "⏭ Skipped **{{title}}**.", + "playingTimeDescription": "Check how much time is left for the song to end.", + "playingTimeQueueEmpty": "Are you speaking to me? Because my deck is empty...", + "promoteDescription": "Promote a song to the front of the queue", + "promoteExtended": { + "explainedUsage": [["number", "The index in the queue to promote to the front. Use `Skyra, queue` to find the index of a song"]], + "examples": ["5"], + "reminder": "This command requires that you are a DJ or a Moderator to use it" + }, + "promoteSuccess": "{{GREENTICK} Successfully promoted **{{title}}** (<{{url}}>) to the top of the queue", + "volumeDescription": "Manage the volume for the music queue.", + "volumeExtended": { + "extendedHelp": "Should be enough self explanatory", + "examples": ["85", "100", "125"] + }, + "volumeSuccess": "📢 Volume: {{volume}}%", + "volumeChanged": "{{emoji} Volume set to: {{volume}}%", + "volumeChangedExtreme": "{{emoji} {{text}} set to: {{volume}}%", + "volumeChangedTexts": ["**EXTREME VOLUME**", "**AIRPLANE NACELLE-LIKE VOLUME**", "**FALCON HEAVY LAUNCH-LIKE VOLUME**"] +} diff --git a/src/languages/en-US/commands/pokemon.json b/src/languages/en-US/commands/pokemon.json new file mode 100644 index 00000000000..8f6d3f2c5b9 --- /dev/null +++ b/src/languages/en-US/commands/pokemon.json @@ -0,0 +1,132 @@ +{ + "abilityDescription": "Gets data for any given Pokémon ability using my Pokémon dataset.", + "abilityExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches.", + "explainedUsage": [["ability", "The ability for which you want to find data"]], + "examples": ["multiscale", "pressure"] + }, + "abilityEmbedTitles": { + "authorTitle": "Ability", + "fieldEffectTitle": "Effect outside of battle" + }, + "abilityQueryFail": "I am sorry, but that query failed. Are you sure `{{ability}}` is actually an ability in Pokémon?", + "flavorsDescription": "Gets the dex entries across various games for a Pokémon.", + "flavorsExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches.\nYou can provide a flag of `--shiny` to get the shiny sprite.", + "explainedUsage": [["pokemon", "The Pokémon for which you want to get flavour texts"]], + "examples": ["dragonite", "pikachu", "pikachu --shiny"] + }, + "flavorsQueryFail": "I am sorry, but that query failed. Are you sure `{{pokemon}}` is actually a Pokémon?", + "itemDescription": "Gets data for any given Pokémon item using my Pokémon dataset.", + "itemExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches.", + "explainedUsage": [["item", "The item for which you want to find data"]], + "examples": ["life orb", "choice specs"] + }, + "itemEmbedData": { + "ITEM": "Item", + "generationIntroduced": "Generation introduced", + "availableInGeneration8Title": "Available in generation 8", + "availableInGeneration8Data": "{{availableInGen8}}" + }, + "itemQueryFail": "I am sorry, but that query failed. Are you sure `{{item}}` is actually a item in Pokémon?", + "learnDescription": "Retrieves whether a given Pokémon can learn one or more given moves using my Pokémon dataset.", + "learnExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches. Moves split on every `;` (comma space) and you can provide as many moves as you wish.\nYou can provide a flag of `--shiny` to get the shiny sprite.", + "explainedUsage": [ + ["generation", "(Optional), The generation for which to check the data"], + ["pokemon", "The Pokémon whose learnset you want to check"], + ["move", "The move(s) you want to check for"] + ], + "examples": ["7 dragonite dragon dance", "pikachu thunder bolt", "pikachu thunder bolt --shiny", "pikachu thunder bolt, thunder"] + }, + "learnMethodTypes": { + "levelUpMoves": "by level up at level {{level}}", + "eventMoves": "through an event", + "tutorMoves": "from a move tutor", + "eggMoves": "as an eggmove", + "virtualTransferMoves": "by transfering from virtual console games", + "tmMoves": "by using a technical machine or technical record", + "dreamworldMoves": "through a Dream World capture" + }, + "learnInvalidGeneration": "I am sorry, but {{generation}} is not a supported Pokémon Generation", + "learnMethod": "In generation {{generation}} {{pokemon}} __**can**__ learn **{{move}}** {{method}}", + "learnQueryFailed": "I am sorry, but that query failed. Are you sure you `{{pokemon, toTitleCase}}` is actually a Pokémon and {{moves, andList}} are actually moves?", + "learnCannotLearn": "Looks like {{pokemon, toTitleCase}} cannot learn {{moves, orList}}", + "learnTitle": "Learnset data for {{pokemon, toTitleCase}} in generation {{generation}}", + "moveDescription": "Gets data for any given Pokémon move using my Pokémon dataset", + "moveExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches.", + "explainedUsage": [["move", "The move for which you want to find data"]], + "examples": ["dragon dance", "GMax Wildfire", "Genesis Supernova"], + "reminder": "Z-Move power may be shown for Generation 8 moves because it is calculated with a conversion table.\nIf Pokémon ever returns Z-Moves to the game this would be their theoretical power, however as it stands\nZ-Moves are **NOT** in Generation 8." + }, + "moveEmbedData": { + "move": "Move", + "types": "Type", + "basePower": "Base Power", + "pp": "PP", + "category": "Category", + "accuracy": "Accuracy", + "priority": "Priority", + "target": "Target", + "contestCondition": "Contest Condition", + "zCrystal": "Z-Crystal", + "gmaxPokemon": "G-MAX Pokémon", + "availableInGeneration8Title": "Available in Generation 8", + "availableInGeneration8Data": "{{availableInGen8}}", + "none": "None", + "maxMovePower": "Base power as MAX move (Dynamax)", + "zMovePower": "Base power as Z-Move (Z-Crystal)", + "fieldMoveEffectTitle": "Effect outside of battle" + }, + "moveQueryFail": "I am sorry, but that query failed. Are you sure `{{move}}` is actually a move in Pokémon?", + "pokedexDescription": "Gets data for any given Pokémon using my Pokémon dataset.", + "pokedexExtended": { + "extendedHelp": "Uses a fuzzy search to also match against near-matches.\nYou can provide a flag of `--shiny` to get the shiny sprite.", + "explainedUsage": [["pokemon", "The Pokémon for which you want to find data"]], + "examples": ["dragonite", "pikachu", "pikachu --shiny"], + "reminder": "If there are any \"Other forme(s)\" on the optional fourth page, those can be requested as well.\nCosmetic Formes on that page list purely cosmetic changes and these do not have seperate entries in the Pokédex." + }, + "pokedexEmbedData": { + "types": "Type(s)", + "abilities": "Abilities", + "genderRatio": "Gender Ratio", + "smogonTier": "Smogon Tier", + "uknownSmogonTier": "Unknown / Alt form", + "height": "Height", + "weight": "Weight", + "eggGroups": "Egg group(s)", + "evolutionaryLine": "Evolutionary line", + "baseStats": "Base stats", + "baseStatsTotal": "BST", + "flavourText": "Pokdex entry", + "otherFormesTitle": "Other forme(s)", + "cosmeticFormesTitle": "Cosmetic Formes", + "otherFormesList": "{{otherFormes, andList}}", + "cosmeticFormesList": "{{cosmeticFormes, andList}}" + }, + "pokedexQueryFail": "I am sorry, but that query failed. Are you sure `{{pokemon}}` is actually a Pokémon?", + "typeDescription": "Gives the type matchups for one or two Pokémon types", + "typeExtended": { + "extendedHelp": "Types have to be exact matches to pokemon types (upper/lowercase can be ignored)", + "explainedUsage": [["type", "The type(s) to look up"]], + "examples": ["dragon", "fire flying"] + }, + "typeEmbedData": { + "offensive": "Offensive", + "defensive": "Defensive", + "superEffectiveAgainst": "Supereffective against", + "dealsNormalDamageTo": "Deals normal damage to", + "doesNotAffect": "Doesn't affect", + "notVeryEffectiveAgainst": "Not very effective against", + "vulnerableTo": "Vulnerable to", + "takesNormalDamageFrom": "Takes normal damage from", + "resists": "Resists", + "notAffectedBy": "Not affected by", + "typeEffectivenessFor": "Type effectiveness for {{types, andList}}" + }, + "typeTooManyTypes": "I am sorry, but you can get the matchup for at most 2 types", + "typeNotAType": "{{type}} is not a valid Pokémon type", + "typeQueryFail": "I am sorry, but that query failed. Are you sure {{types, andList}} are actually types in Pokémon?" +} diff --git a/src/languages/en-US/commands/social.json b/src/languages/en-US/commands/social.json new file mode 100644 index 00000000000..e8891d103b2 --- /dev/null +++ b/src/languages/en-US/commands/social.json @@ -0,0 +1,250 @@ +{ + "autoRolePointsRequired": "You must input a valid amount of points.", + "autoRoleUpdateConfigured": "This role is already configured as an autorole. Use the remove type instead.", + "autoRoleUpdateUnconfigured": "This role is not configured as an autorole. Use the add type instead.", + "autoRoleUpdate": "Updated autorole: {{role.name}} ({{role.id}}). Points required: {{points}} (before: {{before}})", + "autoRoleRemove": "Removed the autorole: {{role.name}} ({{role.id}}), which required {{before}} points.", + "autoRoleAdd": "Added new autorole: {{role.name}} ({{role.id}}). Points required: {{points}}", + "autoRoleListEmpty": "There is no role configured as an autorole in this server.", + "autoRoleUnknownRole": "Unknown role: {{role}}", + "balance": "The user {{user}} has a total of {{amount, number}}{{SHINY}}", + "balanceSelf": "You have a total of {{amount, number}}{{SHINY}}", + "balanceBots": "I think they have 5 gears as much, bots don't have {{SHINY}}", + "socialMemberNotexists": "{{REDCROSS}} The member is not in this server, and is not in my database either.", + "socialAdd": "{{GREENTICK}} Successfully added {{count}} point to {{user}}. Current amount: {{amount}}.", + "socialAdd_plural": "{{GREENTICK}} Successfully added {{count}} points to {{user}}. Current amount: {{amount}}.", + "socialRemove": "{{GREENTICK}} Successfully removed {{count}} point from {{user}}. Current amount: {{amount}}.", + "socialRemove_plural": "{{GREENTICK}} Successfully removed {{count}} points from {{user}}. Current amount: {{amount}}.", + "socialUnchanged": "{{REDCROSS}} The user {{user}} already had the given amount of points, no update was needed.", + "socialReset": "{{GREENTICK}} The user {{user}} got his points removed.", + "bannerMissing": "You must specify a banner id to {{type}}.", + "bannerNotexists": "This banner id does not exist. Please check `{{prefix}}banner list` for a list of banners you can buy.", + "bannerUserlistEmpty": "You did not buy a banner yet. Check `{{prefix}}banner list` for a list of banners you can buy.", + "bannerResetDefault": "You are already using the default banner.", + "bannerReset": "Your banner has been reset to the default.", + "bannerSetNotBought": "You did not buy this banner yet.", + "bannerSet": "|`✅`| **Success**. You have set your banner to: __{{banner}}__", + "bannerBought": "You already have this banner, you may want to use `{{prefix}}banner set {{banner}}` to make it visible in your profile.", + "bannerMoney": "You do not have enough money to buy this banner. You have {{money}}{{SHINY}}, the banner costs {{cost}}{{SHINY}}", + "bannerPaymentCancelled": "|`❌`| The payment has been cancelled.", + "bannerBuy": "|`✅`| **Success**. You have bought the banner: __{{banner}}__", + "bannerPrompt": "Reply to this message choosing an option:\n`all` to check a list of all available banners.\n`user` to check a list of all bought banners.", + "toggleDarkModeEnabled": "{{GREENTICK}} Successfully enabled the dark mode.", + "toggleDarkModeDisabled": "{{GREENTICK}} Successfully disabled the dark mode.", + "dailyTime": "Next dailies are available in {{time, duration}}", + "dailyTimeSuccess": "Yay! You earned {{amount}}{{SHINY}}! Next dailies in: 12 hours.", + "dailyGrace": "Would you like to claim the dailies early? The remaining time will be added up to a normal 12h wait period.\nRemaining time: {{remaining, duration}}", + "dailyGraceAccepted": "Successfully claimed {{amount}}{{SHINY}}! Next dailies in: {{remaining, duration}}", + "dailyGraceDenied": "Got it! Come back soon!", + "dailyCollect": "Collect dailies", + "level": { + "level": "Level", + "experience": "Experience", + "nextIn": "Next level in" + }, + "divorceSelf": "I am sorry, but you cannot divorce yourself.", + "divorceNotTaken": "Who would you divorce? You are not even taken!", + "divorcePrompt": "Ooh... that sounds quite bad 💔... are you 100% sure about this?", + "divorceCancel": "Oh lord. I am very glad you will continue with your partner!", + "divorceDm": "Pardon... but... do you remember {{user}}? They decided to break up with you 💔!", + "divorceSuccess": "Successful divorce 💔... You are no longer married to {{user}}!", + "marryWith": "Dear, how could you forget it... You are currently married to {{users, andList}}!", + "marryNotTaken": "Uh... I am sorry, but I am not aware of you being married... have you tried proposing to somebody?", + "marrySkyra": "I am sorry, I know you love me, but I am already taken by a brave man I love 💞!", + "marryAelia": "In your dreams. She is my sister, I am not letting somebody harm her!", + "marryBots": "Oh no! You should not be marrying bots! They still do not understand what true love is, and they are not warm!", + "marrySelf": "No! This is not how this works! You cannot marry yourself, who would you spend your life with? 💔", + "marryAuthorTaken": "You are already married. Is your love big enough for two people? <@{{author.id}}>, reply with **yes** to confirm!", + "marryAuthorMultipleCancel": "Cancelling. Your commitment to {{user}} is admirable.", + "marryTaken": "This user is already married to someone. Would you like to join their harem?", + "marryTaken_plural": "This user is already married to {{spousesCount}} people. Would you like to join their harem?", + "marryAlreadyMarried": "You are already married with {{user}}, did you forget it?", + "marryAuthorTooMany": "{{REDCROSS}} You are married to too many people, your maximum is {{limit}}!", + "marryTargetTooMany": "{{REDCROSS}} The user you are trying to marry to is already married to too many people, their maximum is {{limit}}!", + "marryMultipleCancel": "Cancelling. Don't worry, you'll find someone you don't have to share!", + "marryPetition": "Fresh pair of eyes! {{author.username}} is proposing to {{user.username}}! 💞 <@{{user.id}}>, reply with **yes** to accept!", + "marryNoreply": "The user did not reply on time... Maybe it was a hard decision?", + "marryDenied": "O-oh... The user rejected your proposal! 💔", + "marryAccepted": "Congratulations dear {{author}}! You're now officially married with {{user}}! ❤", + "mylevel": "The user {{user}} has a total of {{points}} points.{{next}}", + "mylevelSelf": "You have a total of {{points}} points.{{next}}", + "mylevelNext": "Points for next rank: **{{remaining}}** (at {{next}} points).", + "payMissingMoney": "I am sorry, but you need {{needed}}{{SHINY}} and you have {{has}}{{SHINY}}", + "payPrompt": "You are about to pay {{user}} {{amount}}{{SHINY}}, are you sure you want to proceed?", + "payPromptAccept": "Payment accepted, {{amount}}{{SHINY}} has been sent to {{user}}'s profile.", + "payPromptDeny": "Payment denied.", + "paySelf": "If I taxed this, you would lose money, therefore, do not try to pay yourself.", + "socialPayBot": "Oh, sorry, but money is meaningless for bots, I am pretty sure a human would take advantage of it better.", + "profile": { + "globalRank": "Global Rank", + "credits": "Credits | Vault", + "reputation": "Reputation", + "experience": "Experience", + "level": "Level" + }, + "profileMoney": "{{money, numberCompact}} | {{vault, numberCompact}}", + "remindmeCreate": "A reminder with ID `{{id}}` has been created.", + "remindmeCreateNoDuration": "You must tell me what you want me to remind you and when.", + "remindmeCreateNoDescription": "Something, you did not tell me what.", + "remindmeDeleteNoId": "You must give a valid ID, you can get them using the `list` sub-command.", + "remindmeDelete": "The reminder with ID `{{ id }}` and with a remaining time of **{{task.time.getTime() - Date.now(), duration}}** has been successfully deleted.", + "remindmeListEmpty": "You do not have any active reminder", + "remindmeShowFooter": "ID: {{id}} | Ends at:", + "remindmeInvalidId": "I am sorry, but the ID provided does not seem to be valid.", + "remindmeNotfound": "I cannot find something here. The reminder either never existed or it ended.", + "reputationTime": "You can give a reputation point in {{remaining, duration}}", + "reputationUsable": "You can give a reputation point now.", + "reputationUserNotfound": "You must mention a user to give a reputation point.", + "reputationSelf": "You cannot give a reputation point to yourself.", + "reputationBots": "You cannot give a reputation point to bots.", + "reputationGive": "You have given a reputation point to **{{user}}**!", + "reputationsBots": "Bots cannot have reputation points...", + "reputationsSelf": "You have a total of {{points}} reputation points.", + "reputation": "{{count}} reputation point", + "reputation_plural": "{{count}} reputation points", + "reputations": "The user {{user}} has a total of {{points}}.", + "autoRoleRequireRole": "I am sorry, but you must provide a role for this command.", + "scoreboardPosition": "Your placing position is: {{position}}", + "setColor": "Color changed to {{color}}", + "socialDescription": "Configure this guild's member points.", + "socialExtended": { + "extendedHelp": "This command allows for updating other members' points.", + "explainedUsage": [ + ["set ", "Sets an amount of points to the user."], + ["add ", "Adds an amount of points to the user."], + ["remove ", "Removes an amount of points from the user."], + ["reset ", "Resets all pointss from the user."] + ], + "examples": ["set @kyra 40000", "add @kyra 2400", "remove @kyra 3000", "reset @kyra"] + }, + "bannerDescription": "Configure the banner for your profile.", + "bannerExtended": { + "extendedHelp": "Banners are vertical in Skyra, they decorate your profile card.", + "explainedUsage": [ + ["list", "(Default) Lists all available banners."], + ["reset", "Set your displayed banner to default."], + ["buy ", "Buy a banner, must be an ID."], + ["set ", "Set your displayed banner, must be an ID."] + ], + "examples": ["list", "buy 0w1p06", "set 0w1p06", "reset"] + }, + "toggleDarkModeDescription": "Toggle between light and dark templates for your profile and rank cards.", + "toggleDarkModeExtended": { + "extendedHelp": "This command lets you toggle the template used to generate your profile." + }, + "autoRoleDescription": "List or configure the autoroles for a guild.", + "autoRoleExtended": { + "extendedHelp": "Autoroles are roles that are available for everyone, and automatically given when they reach a configured amount of (local) points, an administrator must configure them through a setting command.\nNote that if the role name has spaces in the name you need to put `'quotes'` around the name!", + "explainedUsage": [ + ["list", "Lists all the current autoroles."], + ["add ", "Add a new autorole."], + ["remove ", "Remove an autorole from the list."], + ["update ", "Change the required amount of points for an existing autorole."] + ], + "reminder": "The current system grants a random amount of points between 4 and 8 points, for each post with a 1 minute cooldown.", + "examples": ["list", "add 'Trusted Member' 20000", "update 'Trusted Member' 15000", "remove 'Trusted Member'"] + }, + "balanceDescription": "Check your current balance.", + "balanceExtended": { + "extendedHelp": "The balance command retrieves your amount of {{SHINY}}." + }, + "dailyDescription": "Get your semi-daily {{SHINY}}'s.", + "dailyExtended": { + "extendedHelp": "Shiiiiny!", + "reminder": "Skyra uses a virtual currency called Shiny, and it is used to buy stuff such as banners or bet it on slotmachines.\nYou can claim dailies once every 12 hours.\nIf you use the --reminder flag, I will remind you when it's time to collect dailies again." + }, + "leaderboardDescription": "Check the leaderboards.", + "leaderboardExtended": { + "extendedHelp": "The leaderboard command shows a list of users sorted by their local or global amount of points, by default, when using no arguments, it will show the local leaderboard.\nThe leaderboards refresh every 10 minutes.", + "reminder": "\"Local\" leaderboards refer to the guild's top list. \"Global\" refers to all scores from all guilds." + }, + "leaderboardListifyPage": "Page {{page}} / {{pageCount}} | {{results, number}} Total", + "levelDescription": "Check your global level.", + "levelExtended": { + "extendedHelp": "How much until the next level?", + "explainedUsage": [["user", "(Optional) The user's profile to show. Defaults to the message's author!."]] + }, + "divorceDescription": "Break up with your couple!", + "divorceExtended": { + "extendedHelp": "Sniff... This command is used to break up with your couple, hopefully in this virtual world, you are allowed to marry the user again." + }, + "marryDescription": "Marry somebody!", + "marryExtended": { + "extendedHelp": "Marry your waifu!", + "explainedUsage": [["user", "(Optional) The user to marry with. If not given, the command will tell you who are you married with."]], + "examples": ["", "@love"] + }, + "marriedDescription": "Check who you are married with.", + "marriedExtended": { + "extendedHelp": "This command will tell you who are you married with." + }, + "mylevelDescription": "Check your local level.", + "mylevelExtended": { + "extendedHelp": "How much until next auto role? How many points do I have in this guild?", + "explainedUsage": [["user", "(Optional) The user's profile to show. Defaults to the message's author!."]] + }, + "payDescription": "Pay somebody with your {{SHINY}}'s.", + "payExtended": { + "extendedHelp": "Businessmen! Today is payday!", + "explainedUsage": [ + ["money", "Amount of {{SHINY}} to pay, you must have the amount you are going to pay."], + ["user", "The targeted user to pay. (Must be mention/id)"] + ], + "examples": ["200 @kyra"] + }, + "profileDescription": "Check your user profile.", + "profileExtended": { + "extendedHelp": "This command sends a card image with some of your user profile such as your global rank, experience...\nAdditionally, you are able to customize your colours with the 'setColor' command.", + "explainedUsage": [["user", "(Optional) The user's profile to show. Defaults to the message's author!."]] + }, + "remindmeDescription": "Manage your reminders.", + "remindmeExtended": { + "extendedHelp": "This command allows you to set, delete and list reminders.", + "explainedUsage": [ + ["action", "The action, one of `list`, `show`, `delete`, or `create`/`me`. Defaults to `list`."], + ["idOrDuration", "Dependent of action; `list` → ignored; `delete`/`show` → reminder ID; else → duration."], + ["description", "(Optional) Dependent of action, this is only read when creating a new reminder."] + ], + "examples": ["me 6h to fix this command.", "list", "show 1234", "delete 1234"] + }, + "reputationDescription": "Give somebody a reputation point.", + "reputationExtended": { + "extendedHelp": "This guy is so helpful... I'll give him a reputation point!\nAdditionally, you can check how many reputation points a user has by writing 'check' before the mention.", + "explainedUsage": [ + ["check", "(Optional) Whether you want to check somebody (or yours) amount of reputation."], + ["user", "The user to give a reputation point."] + ], + "reminder": "You can give a reputation point once every 24 hours.", + "examples": ["check @kyra", "check", "@kyra", "check \"User With Spaces\"", "\"User With Spaces\""] + }, + "setColorDescription": "Change your user profile's color.", + "setColorExtended": { + "extendedHelp": "The setColor command sets a color for your profile.", + "explainedUsage": [["color", "A color resolvable."]], + "possibleFormats": [ + ["HEX", "#dfdfdf"], + ["RGB", "rgb(200, 200, 200)"], + ["HSL", "hsl(350, 100, 100)"], + ["B10", "14671839"] + ] + }, + "vaultDescription": "Store your {{SHINY}}'s securily in a vault so you cannot accidentally spend them gambling.", + "vaultEmbedData": { + "accountMoney": "Account Money", + "accountVault": "Account Vault", + "depositedDescription": "Deposited {{coins}} {{SHINY}} from your account balance into your vault.", + "showDescription": "Your current account and vault balance are:", + "withdrewDescription": "Withdrew {{coins}} {{SHINY}} from your vault." + }, + "vaultExtended": { + "extendedHelp": "This is for the greedy spenders among us that tend to play a bit too much at the slot machine or spin the wheel of fortune.\nYou need to actively withdraw {{SHINY}}'s from your vault before they can be spend gambling.", + "explainedUsage": [ + ["action", "The action to perform: **withdraw** to withdraw from your vault or **deposit** to deposit into your vault."], + ["money", "The amount of {{SHINY}}'s to withdraw or deposit."] + ], + "examples": ["deposit 10000.", "withdraw 10000."] + }, + "vaultInvalidCoins": "I am sorry, but that is an invalid amount of coins. Be sure it is a positive number!", + "vaultNotEnoughInVault": "I am sorry, but you do not have enough money in your vault to make that withdrawal! Your current vault balance is {{vault}} {{SHINY}}", + "vaultNotEnoughMoney": "I am sorry, but you do not have enough money to make that deposit! Your current money balance is {{money}} {{SHINY}}" +} diff --git a/src/languages/en-US/commands/starboard.json b/src/languages/en-US/commands/starboard.json new file mode 100644 index 00000000000..6f6964903d3 --- /dev/null +++ b/src/languages/en-US/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "Get a random starred message from the database or the star leaderboard.", + "starExtended": { + "extendedHelp": "This command shows a random starred message or the starboard usage and leaderboard for this server." + }, + "starMessages_plural": "{{count}} messages", + "starMessages": "{{count}} message", + "starNoChannel": "I'm sorry, but a starboard channel hasn't been set up.", + "starNostars": "There is no starred message.", + "stars_plural": "{{count}} stars", + "stars": "{{count}} star", + "starStats": "Starboard Stats", + "starStatsDescription": "{{messages}} starred with a total of {{stars}}", + "starTopreceivers": "Top Star Receivers", + "starTopreceiversDescription_plural": "{{medal}}: <@{{id}}> ({{count}} stars)", + "starTopreceiversDescription": "{{medal}}: <@{{id}}> ({{count}} star)", + "starTopstarred": "Top Starred Posts", + "starTopstarredDescription_plural": "{{medal}}: {{id}} ({{count}} stars)", + "starTopstarredDescription": "{{medal}}: {{id}} ({{count}} star)" +} diff --git a/src/languages/en-US/commands/suggestion.json b/src/languages/en-US/commands/suggestion.json new file mode 100644 index 00000000000..1633ef4ee88 --- /dev/null +++ b/src/languages/en-US/commands/suggestion.json @@ -0,0 +1,50 @@ +{ + "suggestDescription": "Posts a suggestion for the server.", + "suggestExtended": { + "extendedHelp": "Posts a suggestion to the server's suggestion channel, if configured.", + "explainedUsage": [["suggestion", "Your suggestion"]], + "examples": ["Let's make a music channel!"], + "reminder": "You need to have a suggestions channel setup for this command to work. If you are an administrator, you will be given the chance to do so upon invoking the command." + }, + "suggestNoSetup": "I'm sorry {{username}}, but a suggestions channel hasn't been set up.", + "suggestNoSetupAsk": "I'm sorry {{username}}, but a suggestions channel hasn't been set up. Would you like to set up a channel now?", + "suggestNoSetupAbort": "Alright then. Aborted creating a new suggestion.", + "suggestNopermissions": "I'm sorry {{username}}, but the administrators didn't give me permission to send messages in {{channel}}!", + "suggestChannelPrompt": "Please mention the channel you want to set as the suggestions channel.", + "suggestTitle": "Suggestion #{{id}}", + "suggestSuccess": "Thank you for your suggestion! It has been successfully posted to {{channel}}!", + "resolveSuggestionDescription": "Set the suggestion's status.", + "resolveSuggestionExtended": { + "extendedHelp": "This command allows you to update a suggestion's status, marking it either as accepted, considered or denied.", + "examples": [ + "1 accept Thank you for your suggestion!", + "1 a Thank you for your suggestion!", + "1 consider Hmm... we may do this, but it's really low priority", + "1 c Hmm... we may do this, but it's really low priority", + "1 deny There is no way this is going to happen.", + "1 d There is no way this is going to happen." + ], + "reminder": "Suggestions also can be configured to DM the author regarding the status of their suggestion, with the `suggestions.on-action.dm` setting.\nFurthermore, in case you wish to preserve anonymity, you can hide your name using the `suggestions.on-action` setting, which can be overridden with the `--hide-author` and `--show-author` flags." + }, + "resolveSuggestionInvalidId": "{{REDCROSS}} That's not a valid suggestion ID!", + "resolveSuggestionMessageNotFound": "{{REDCROSS}} I was not able to retrieve the suggestion as its message has been deleted.", + "resolveSuggestionIdNotFound": "{{REDCROSS}} Couldn't find a suggestion with that ID", + "resolveSuggestionDefaultComment": "No comment was provided.", + "resolveSuggestionAuthorAdmin": "An administrator", + "resolveSuggestionAuthorModerator": "A moderator", + "resolveSuggestionActions": { + "accept": "{{author}} accepted this suggestion:", + "consider": "{{author}} considered this suggestion:", + "deny": "{{author}} denied this suggestion:" + }, + "resolveSuggestionActionsDms": { + "accept": "{{author}} accepted this suggestion in {{guild}}:", + "consider": "{{author}} considered this suggestion in {{guild}}:", + "deny": "{{author}} denied this suggestion in {{guild}}:" + }, + "resolveSuggestionDmFail": "{{REDCROSS}} I wasn't able to send the author a DM. Are their DMs closed?", + "resolveSuggestionSuccess": "{{GREENTICK}} Successfully {{actionText}} suggestion `{{id}}`!", + "resolveSuggestionSuccessAcceptedText": "accepted", + "resolveSuggestionSuccessDeniedText": "denied", + "resolveSuggestionSuccessConsideredText": "considered" +} diff --git a/src/languages/en-US/commands/system.json b/src/languages/en-US/commands/system.json new file mode 100644 index 00000000000..2b98d8d81ac --- /dev/null +++ b/src/languages/en-US/commands/system.json @@ -0,0 +1,98 @@ +{ + "dmDescription": "Sends a Direct Message.", + "dmExtended": { + "extendedHelp": "The DM command is reserved for bot owners, and it's only used for very certain purposes, such as replying feedback messages sent by users.", + "reminder": "Reserved for bot owners for replying purposes." + }, + "evalDescription": "Evaluates arbitrary Javascript.", + "evalExtended": { + "extendedHelp": "The eval command evaluates code as-in, any error thrown from it will be handled.\nIt also uses the flags feature. Write --silent, --depth=number or --async to customize the output.\nThe --wait flag changes the time the eval will run. Defaults to 10 seconds. Accepts time in milliseconds.\nThe --output and --output-to flag accept either `file`, `log`, `haste` or `hastebin`.\nThe --delete flag makes the command delete the message that executed the message after evaluation.\nThe --silent flag will make it output nothing.\nThe --depth flag accepts a number, for example, --depth=2, to customize util.inspect's depth.\nThe --async flag will wrap the code into an async function where you can enjoy the use of await, however, if you want to return something, you will need the return keyword\nThe --showHidden flag will enable the showHidden option in util.inspect.\nThe --lang and --language flags allow different syntax highlight for the output.\nThe --json flag converts the output to json\nThe --no-timeout flag disables the timeout\nIf the output is too large, it'll send the output as a file, or in the console if the bot does not have the {{PERMISSIONS.ATTACH_FILES}} permission.", + "examples": ["msg.author.username;", "1 + 1;"], + "reminder": "Reserved for bot owners." + }, + "execDescription": "Execute Order 66.", + "execExtended": { + "extendedHelp": "You better not know about this." + }, + "setAvatarDescription": "Set Skyra's avatar.", + "setAvatarExtended": { + "extendedHelp": "This command changes Skyra's avatar. You can send a URL or upload an image attachment to the channel.", + "reminder": "Reserved for bot owners." + }, + "donateDescription": "Get information about how to donate to keep Skyra alive longer.", + "donateExtended": { + "extendedHelp": "Skyra Project started on 24th October 2016, if you are reading this, you are using version {{VERSION}}. The development team improves a lot in every iteration of Skyra.\n\nHowever, not everything is free and we need your help to keep Skyra alive.\nWe will be very thankful if you help us.\nWe have been working on a lot of things, and Skyra is precious to us. Take care of her ❤\n\nDo you want to support this amazing project? Feel free to do so! https://donate.skyra.pw/patreon or https://donate.skyra.pw/kofi" + }, + "echoDescription": "Make Skyra send a message to this (or another) channel.", + "echoExtended": { + "extendedHelp": "This should be very obvious...", + "reminder": "Reserved for bot owners." + }, + "feedbackDescription": "Send a feedback message to the bot's feedback channel.", + "feedbackExtended": { + "extendedHelp": "This command sends a message to a feedback channel which the bot's owners can read. You'll get a reply from me in your DMs when one of the owners has an update for you." + }, + "statsDescription": "Provides some details about the bot and stats.", + "statsExtended": { + "extendedHelp": "This should be very obvious..." + }, + "evalTimeout": "TIMEOUT: Took longer than {{seconds}} seconds.", + "evalError": "**Error**:{{output}}\n**Type**:{{type}}\n{{time}}", + "statsTitles": { + "stats": "Statistics", + "uptime": "Uptime", + "serverUsage": "Server Usage" + }, + "statsFields": { + "stats": "• **Users**: {{stats.users, number}}\n• **Guilds**: {{stats.guilds, number}}\n• **Channels**: {{stats.channels, number}}\n• **Discord.js**: {{stats.version}}\n• **Node.js**: {{stats.nodeJs}}", + "uptime": "• **Host**: {{uptime.host, duration}}\n• **Total**: {{uptime.total, duration}}\n• **Client**: {{uptime.client, duration}}", + "serverUsage": "• **CPU Load**: {{usage.cpuLoad}}\n• **Heap**: {{usage.ramUsed, number}}MB (Total: {{usage.ramTotal, number}}MB)" + }, + "disable": "+ Successfully disabled {{type}}: {{name}}", + "disableDescription": "Re-disables or temporarily disables a command/inhibitor/monitor/finalizer/event. Default state restored on reboot.", + "disableExtended": { + "extendedHelp": "Disable a piece that was previously enabled" + }, + "disableWarn": "You probably don't want to disable that, since you wouldn't be able to run any command to enable it again", + "dmNotSent": "I cannot send you a message in DMs, did you block me?", + "dmSent": "I have sent you the message in DMs.", + "enable": "+ Successfully enabled {{type}}: {{name}}", + "enableDescription": "Re-enables or temporarily enables a command/inhibitor/monitor/finalizer. Default state restored on reboot.", + "enableExtended": { + "extendedHelp": "Enables a piece that was previously disabled" + }, + "load": "{{GREENTICK}} Successfully loaded {{type}}: {{name}}. (Took: {{time}})", + "loadDescription": "Load a piece from your bot.", + "loadExtended": { + "extendedHelp": "Loads a piece when needed" + }, + "loadError": "{{REDCROSS}} Failed to load {{type}}: {{name}}. Reason: {{error, jsCodeBlock}}", + "loadFail": "The file does not exist, or an error occurred while loading your file. Please check your console.", + "reboot": "{{LOADING}} Rebooting...", + "rebootDescription": "Reboots the bot.", + "rebootExtended": { + "extendedHelp": "The bot goes boom, then the bot goes revive.", + "reminder": "Only owners can use this command" + }, + "reload": "{{GREENTICK}} Reloaded {{type}}: {{name}}. (Took: {{time}})", + "reloadAll": "{{GREENTICK}} Reloaded all {{type}}. (Took: {{time}})", + "reloadDescription": "Reloads a klasa piece, or all pieces of a klasa store.", + "reloadExtended": { + "extendedHelp": "Hot-reloads a piece.", + "reminder": "Be careful with potentially duplicate names as you can easily trigger reloading all pieces!" + }, + "reloadEverything": "{{GREENTICK}} Reloaded everything. (Took: {{time}})", + "reloadFailed": "{{REDCROSS}} Failed to reload {{type}}: {{name}}. Please check your Console.", + "unload": "{{GREENTICK}} Unloaded {{type}}: {{name}}", + "unloadDescription": "Unloads the klasa piece.", + "unloadExtended": { + "extendedHelp": "Unloads a piece when needed" + }, + "unloadWarn": "You probably don't want to unload that, since you wouldn't be able to run any command to enable it again", + "supportDescription": "Show support instructions", + "supportEmbedDescription": "Then you should probably join [Skyra's Lounge](https://join.skyra.pw)! There, you can receive support by the developers and other members of the community!", + "supportEmbedTitle": "Looking for help, {{username}}?", + "supportExtended": { + "extendedHelp": "This command gives you a link to *Skyra's Lounge*, the best place for everything related to me." + } +} diff --git a/src/languages/en-US/commands/tags.json b/src/languages/en-US/commands/tags.json new file mode 100644 index 00000000000..44496c574ec --- /dev/null +++ b/src/languages/en-US/commands/tags.json @@ -0,0 +1,34 @@ +{ + "added": "Successfully added a new tag: **{{name}}** with a content of:\n{{content}}", + "contentRequired": "You must provide a content for this tag.", + "description": "Manage this guilds' tags.", + "edited": "Successfully edited the tag **{{name}}** with a content of:\n{{content}}", + "exists": "The tag '{{tag}}' already exists.", + "extended": { + "extendedHelp": "Tags, also known as custom commands, can give you a chunk of text stored under a specific name.\nFor example after adding a tag with `Skyra, tag add rule1 ` you can use it with `Skyra, rule1` or `Skyra, tag rule1`\nWhen adding tags you can customize the final look by adding flags to the tag content (these won't show up in the tag itself!):\n❯ Add `--embed` to have Skyra send the tag embedded.\nThe content will be in the description, so you can use all the markdown you wish. for example, adding [masked links](https://skyra.pw).\n❯ Add `--color=` or `--colour=` to have Skyra colourize the embed. Does nothing unless also specifying `--embed`.\nColours can be RGB, HSL, HEX or Decimal.", + "explainedUsage": [ + [ + "action", + "The action to perform: `add` to add new tags, `remove` to delete a tag, `edit` to edit a tag, `source` to get the source of a tag, `list` to list all known tags, or `show` to show a tag." + ], + ["tag", "The tag's name."], + ["contents", "Required for the actions `add` and `edit`, specifies the content for the tag."] + ], + "examples": [ + "add rule1 Respect other users. Harassment, hatespeech, etc... will not be tolerated.", + "add rule1 --embed --color=#1E88E5 Respect other users. Harassment, hatespeech, etc... will not be tolerated.", + "edit rule1 Just be respectful with the others.", + "rule1", + "source rule1", + "remove rule1", + "list" + ] + }, + "listEmpty": "The tag list for this server is empty.", + "nameNotAllowed": "A tag name may not have a grave accent nor invisible characters.", + "nameTooLong": "A tag name must be 50 or less characters long.", + "notexists": "The tag '{{tag}}' does not exist.", + "permissionlevel": "You must be a staff member, moderator, or admin, to be able to manage tags.", + "removed": "Successfully removed the tag **{{name}}**.", + "reset": "All tags have been successfully removed from this server." +} diff --git a/src/languages/en-US/commands/tools.json b/src/languages/en-US/commands/tools.json new file mode 100644 index 00000000000..81a22aa2c04 --- /dev/null +++ b/src/languages/en-US/commands/tools.json @@ -0,0 +1,308 @@ +{ + "avatarDescription": "View somebody's avatar in full size.", + "avatarExtended": { + "extendedHelp": "As this command's name says, it shows somebody's avatar.", + "explainedUsage": [["user", "(Optional) A user mention. Defaults to the author if the input is invalid or not given."]], + "reminder": "Use the --size flag to change the avatar's size." + }, + "avatarNone": "The user does not have an avatar set.", + "color": "HEX: **{{hex}}**\nRGB: **{{rgb}}**\nHSL: **{{hsl}}**", + "colorDescription": "Display some awesome colours.", + "colorExtended": { + "extendedHelp": "The color command displays a set of colours with nearest tones given a difference between 1 and 255.", + "explainedUsage": [["color", "A color resolvable."]], + "examples": ["#dfdfdf >25", "rgb(200, 130, 75)"], + "possibleFormats": [ + ["HEX", "#dfdfdf"], + ["RGB", "rgb(200, 200, 200)"], + ["HSL", "hsl(350, 100, 100)"], + ["B10", "14671839"] + ] + }, + "contentDescription": "Get messages' raw content.", + "contentExtended": { + "extendedHelp": "Raw content will help you better copy-paste message content as you will not have to reproduce all the formatting.", + "explainedUsage": [ + ["channel", "(optional) The channel in which the message is to get the content from."], + ["message", "ID of the message to get the raw content for."] + ] + }, + "countryDescription": "Shows information about a country.", + "countryExtended": { + "extendedHelp": "This command uses https://restcountries.eu to get information on the provided country.", + "explainedUsage": [["country", "The name of the country."]], + "examples": ["United Kingdom"] + }, + "countryFields": { + "other": { + "area": "Area", + "currencies": "Currencies", + "demonym": "Demonym" + }, + "overview": { + "capital": "Capital", + "officialName": "Official Name", + "population": "Population" + } + }, + "countryTitles": { + "LANGUAGES": "Languages", + "OTHER": "Other", + "OVERVIEW": "Overview" + }, + "defineDescription": "Check the definition of a word.", + "defineExtended": { + "extendedHelp": "What does \"heel\" mean?", + "explainedUsage": [["Word", "The word or phrase you want to get the definition from."]], + "examples": ["heel"] + }, + "defineNotfound": "I could not find a definition for this word.", + "definePronounciation": "Pronunciation", + "defineUnknown": "Unknown", + "duckDuckGoDescription": "Search the Internet with DuckDuckGo.", + "duckDuckGoExtended": { + "extendedHelp": "This uses the alternative search enginge DuckDuckGo to search the web", + "reminder": "If you want to search google use `Skyra, google`" + }, + "duckDuckGoLookalso": "Related to this topic:", + "duckDuckGoNotfound": "I am sorry, but DuckDuckGo API returned a blank response. Try again with different keywords.", + "emojiCustom": "→ `Emoji ::` **{{emoji}}**\n→ `Type ::` **Custom**\n→ `ID ::` **{{id}}**", + "emojiDescription": "Get info on an emoji.", + "emojiExtended": { + "extendedHelp": "I'll give you the emoji name, whether it is a custom emoji or not, the emoji ID and a large image preview of the emoji.", + "explainedUsage": [["emoji", "The emoji to get information about"]], + "reminder": "It doesn't matter whether I share a server with a custom emoji or not!" + }, + "emojiInvalid": "The argument you provided is not a valid emoji.", + "emojiTooLarge": "'{{emoji}}' is so heavy the hamsters couldn't keep with its size. Maybe try one that is smaller?", + "emojiTwemoji": "→ `Emoji ::` `{{emoji}}`\n→ `Type ::` **Twemoji**\n→ `ID ::` **{{id}}**", + "emotesDescription": "Shows all custom emotes available on this server", + "emotesExtended": { + "extendedHelp": "The list of emotes is split per 50 emotes" + }, + "emotesTitle": "Emotes in", + "eshopDescription": "Request information for any American Nintendo Digital Store", + "eshopExtended": { + "extendedHelp": "This command queries Nintendo of America to show data for the game you request.", + "explainedUsage": [["query", "The name of the game you're looking for."]], + "examples": ["Breath of the Wild", "Pokemon", "Splatoon"] + }, + "eshopNotInDatabase": "None available", + "eshopPriceFree": "Free", + "eshopPricePaid": "${{price}} USD", + "eshopTitles": { + "availability": "Availability", + "categories": "Categories", + "esrb": "ESRB", + "noCategories": "This game has not been sorted into any categories", + "nsuid": "NSUID", + "numberOfPlayers": "Number of Players", + "platform": "Platform", + "price": "Price", + "releaseDate": "Release Date" + }, + "horoscopeDescription": "Get your latest horoscope", + "horoscopeExtended": { + "extendedHelp": "Gets the horoscope for a given sun sign from Kelli Fox's The Astrologer.", + "explainedUsage": [ + ["sunsign", "The sun sign you want to get the horoscope for"], + [ + "today|tomorrow|yesterday", + "(Optional, defaults to \"today\") If you want to get the horoscope of yesterday or tomorrow you can specify that." + ] + ], + "examples": ["pisces", "virgo tomorrow", "gemini yesterday", "aries today"] + }, + "horoscopeInvalidSunsign": "{{sign}} is an invalid sun sign, maybe try {{maybe}}", + "horoscopeTitles": { + "dailyHoroscope": "Daily horoscope for {{sign}}", + "metadata": ["**Intensity:** {{intensity}}", "**Keywords:** {{keywords, andList}}", "**Mood:** {{mood}}", "**Rating:** {{rating}}"], + "metadataTitle": "Metadata" + }, + "igdbData": { + "noAgeRatings": "No age ratings available", + "noDevelopers": "Developer(s) unknown", + "noGenres": "No known genres", + "noPlatforms": "Platform(s) unknown", + "noRating": "No user rating", + "noReleaseDate": "Release date unknown", + "noSummary": "No game summary available" + }, + "igdbDescription": "Searches IGDB (Internet Game Database) for your favourite games", + "igdbExtended": { + "extendedHelp": "This command queries the IGDB API to show data on your favourite games.", + "explainedUsage": [["query", "The name of the game"]], + "examples": ["Breath of the Wild", "Borderlands 3"] + }, + "igdbTitles": { + "ageRating": "Age rating(s)", + "developers": "Developer(s)", + "genres": "Genre(s)", + "platform": "Platform(s)", + "releaseDate": "Release date", + "userScore": "User score" + }, + "itunesDescription": "Searches iTunes API for music tracks", + "itunesExtended": { + "extendedHelp": "This command queries the Apple iTunes API to show data on a music you request.", + "explainedUsage": [["query", "The name of the song"]], + "examples": ["Apocalyptica feat. Brent Smith", "You're Gonna Go Far, Kid"] + }, + "itunesTitles": { + "artist": "Artist", + "collection": "Collection", + "collectionPrice": "Collection price (USD)", + "numberOfTracksInCollection": "# Tracks in collection", + "preview": "Preview", + "previewLabel": "Click here", + "primaryGenre": "Primary genre", + "trackPrice": "Track price (USD)", + "trackReleaseDate": "Track Release Date" + }, + "moviesData": { + "linkClickHere": "Click here", + "movieInProduction": "Movie in production", + "noGenres": "None on TheMovieDB", + "none": "None", + "notPartOfCollection": "Not part of a collection", + "variableRuntime": "Variable" + }, + "moviesDescription": "Searches TheMovieDatabase for any movie", + "moviesExtended": { + "extendedHelp": "This command queries TheMovieDatabase API for data on your favourite movies.\nTip: You can use the 'y:' filter to narrow your results by year. Example: \"star wars y:1977\".", + "explainedUsage": [["query", "The name of the movie"]], + "examples": ["Ocean's Eleven y:2001", "Star Wars Revenge of the Sith", "Spirited Away"] + }, + "moviesTitles": { + "collection": "Collection", + "genres": "Genres", + "homePage": "Home Page", + "imdbPage": "IMDB Page", + "releaseDate": "Release date", + "runtime": "Runtime", + "status": "Status", + "userScore": "User score" + }, + "pollDescription": "Simplifies reaction-based polls.", + "pollExtended": { + "extendedHelp": "Separate your options using commas.", + "examples": ["Make an anime channel, Make a gaming channel, Make a serious-discussion channel"] + }, + "pollReactionLimit": "Please don't add emojis while I am reacting!", + "priceCurrency": "**{{fromAmount}}** {{fromCurrency}} is worth {{worths, andList}}.", + "priceCurrencyNotFound": "There was an error, please make sure you specified an appropriate coin and currency.", + "priceDescription": "Convert between currencies with this command.", + "priceExtended": { + "extendedHelp": "Convert between any two currencies, even if they are cryptocurrencies.", + "explainedUsage": [ + ["from", "The currency to convert from"], + ["to", "The currency to convert to"], + ["amount", "The amount to convert, will default to 1"] + ], + "examples": ["EUR USD", "USD EUR 5", "USD BAT 10"] + }, + "quoteDescription": "Quote another person's message.", + "quoteExtended": { + "extendedHelp": "Quotes also include the message's image, if any", + "explainedUsage": [ + ["channel", "(optional) The channel in which the message is to quote"], + ["message", "ID of the message to quote"] + ] + }, + "quoteMessage": "It is very weird, but said message does not have a content nor a image.", + "rolesAbort": "I looked far and wide, but I seem to not have found what you were looking for. Please run `{{prefix}}roles` for the full list!", + "rolesAdded": "The following roles have been added to your profile: `{{roles}}`", + "rolesAuditlog": "Authorized: Public Role Management | 'Roles' Command.", + "rolesListEmpty": "This server does not have a role listed as a public role.", + "rolesListTitle": "List of public roles", + "rolesNotManageable": "The following roles cannot be given by me due to their hierarchy role position: `{{roles}}`", + "rolesNotPublic": "The following roles are not public: `{{roles}}`", + "rolesRemoved": "The following roles have been removed from your profile: `{{roles}}`", + "showsData": { + "noGenres": "None on TheMovieDB", + "unknownUserScore": "No user score", + "variableRuntime": "Variable" + }, + "showsDescription": "Searches The Movie Database for any show", + "showsExtended": { + "extendedHelp": "This command queries TheMovieDatabase for data on your favorite shows", + "explainedUsage": [["query", "The name of the show"]], + "examples": ["Final Space", "Gravity Falls", "Rick and Morty"] + }, + "showsTitles": { + "episodeRuntime": "Episode runtime", + "firstAirDate": "First air date", + "genres": "Genres", + "status": "Status", + "userScore": "User score" + }, + "systemTextTruncated": "{{definition}}... [continue reading]({{url}})", + "topInvitesDescription": "Shows the top 10 most used invites for this server", + "topInvitesEmbedData": { + "channel": "Channel", + "createdAt": "Date Created", + "createdAtUnknown": "Creation date unknown", + "expiresIn": "Expires in", + "link": "Link", + "neverExpress": "Never", + "temporary": "Temporary invite", + "uses": "Uses" + }, + "topInvitesExtended": { + "extendedHelp": "Use this to get some server insights if your server doesn't have access to Discord's official server insights." + }, + "topInvitesNoInvites": "There are no invites, or none of them have been used!", + "topInvitesTop10InvitesFor": "Top 10 invites for {{guild}}", + "urbanDescription": "Check the definition of a word on UrbanDictionary.", + "urbanExtended": { + "extendedHelp": "What does \"spam\" mean?", + "explainedUsage": [ + ["Word", "The word or phrase you want to get the definition from."], + ["Page", "Defaults to 1, the page you wish to read."] + ], + "examples": ["spam"] + }, + "urbanIndexNotfound": "You may want to try a lower page number.", + "urbanNotFound": "I am sorry, the word you are looking for does not seem to be defined in UrbanDictionary. Try another word?", + "voteDescription": "Simplified reaction-based vote.", + "voteExtended": { + "examples": ["Should I implement the #anime channel?"] + }, + "whoisDescription": "Who are you?", + "whoisExtended": { + "extendedHelp": "Gets information on any server member. Also known as `userinfo` in many other bots." + }, + "whoisMemberFields": { + "createdAt": "{{member.user.createdAt, timestamp}}\n{{createdTimestampOffset, duration}} ago", + "footer": "ID: {{member.id}}", + "joinedUnknown": "Unknown", + "joinedWithTimestamp": "{{member.joinedTimestamp, timestamp}}\n{{joinedTimestampOffset, duration}} ago" + }, + "whoisMemberPermissions": "Key Permissions", + "whoisMemberPermissionsAll": "All Permissions", + "whoisMemberRoles": "Role [1]", + "whoisMemberRoles_plural": "Roles [{{count}}]", + "whoisMemberTitles": { + "createdAt": "Created At", + "joined": "Joined" + }, + "whoisUserFields": { + "createdAt": "{{user.createdAt, timestamp}}\n{{createdTimestampOffset, duration}} ago", + "footer": "ID: {{user.id}}" + }, + "whoisUserTitles": { + "createdAt": "Created At" + }, + "wikipediaDescription": "Search something through Wikipedia.", + "wikipediaExtended": { + "extendedHelp": "In NSFW channels I will also add the page image. This restriction is in place because Wikipedia has NSFW images for NSFW pages as they have to be accurate (i.e. diseases or human body parts).", + "reminder": "Most Wikipedia page titles are case sensitive. Some celeberties will have lowercase redirects, but not many." + }, + "wikipediaNotfound": "I am sorry, I could not find something that could match your input in Wikipedia.", + "youtubeDescription": "Search something through YouTube.", + "youtubeExtended": { + "extendedHelp": "If I have the {{PERMISSIONS.MANAGE_MESSAGES}} {{PERMISSIONS.ADD_REACTIONS}} permissions then I will provide the option to navigate through the top 10 results." + }, + "youtubeIndexNotfound": "You may want to try a lower page number, because I am unable to find something at this index.", + "youtubeNotfound": "I am sorry, I could not find something that could match your input in YouTube." +} diff --git a/src/languages/en-US/commands/twitch.json b/src/languages/en-US/commands/twitch.json new file mode 100644 index 00000000000..285b0516933 --- /dev/null +++ b/src/languages/en-US/commands/twitch.json @@ -0,0 +1,71 @@ +{ + "followage": "{{user}} has been following {{channel}} for {{time, duration}}.", + "followageMissingEntries": "Either the user or the channel do not exist. Make sure you wrote their names correctly.", + "followageNotFollowing": "That user is not following the specified channel.", + "twitchNoEntries": "There are no entries. Are you sure you wrote the user name correctly?", + "twitchTitles": { + "followers": "Followers", + "views": "Views", + "clickToVisit": "Click to go to streamer's channel", + "partner": "Partner" + }, + "twitchPartnershipWithoutAffiliate": "This channel is not part of the Twitch affiliate program.", + "twitchAffiliateStatus": { + "affiliated": "This is an affiliated channel.", + "partnered": "This is a partnered channel." + }, + "twitchCreatedAt": "Created At:", + "twitchSubscriptionRequiredStreamer": "{{REDCROSS}} You must specify which streamer you want to subscribe to.", + "twitchSubscriptionStreamerNotFound": "{{REDCROSS}} Sorry, I could not find the streamer. Are you sure you wrote their name correctly?", + "twitchSubscriptionRequiredChannel": "{{REDCROSS}} You must tell me where do you want the messages to be sent.", + "twitchSubscriptionRequiredStatus": "{{REDCROSS}} You must tell me which type of notification do you want, the options are \"online\" and \"offline\".", + "twitchSubscriptionStatusValues": ["online", "offline"], + "twitchSubscriptionInvalidStatus": "{{REDCROSS}} Woah there! I expected \"online\" or \"offline\", but I cannot understand what you gave me instead.", + "twitchSubscriptionRequiredContent": "{{REDCROSS}} Mhmm, I wonder what you want me to send when the user goes live or something. Can you give me a hint please?", + "twitchSubscriptionAddDuplicated": "{{REDCROSS}} You're already subscribed to that streamer in this channel for that status.", + "twitchSubscriptionAddSuccessOffline": "{{GREENTICK}} Success! Whenever {{name}} goes offline, I will post a new message in {{channel}}.", + "twitchSubscriptionAddSuccessLive": "{{GREENTICK}} Success! Whenever {{name}} goes live, I will post a new message in {{channel}}.", + "twitchSubscriptionRemoveStreamerNotSubscribed": "{{REDCROSS}} I'm sorry, you cannot unsubscribe from a channel you're not subscribed to. Please subscribe to be able to unsubscribe.", + "twitchSubscriptionRemoveEntryNotExists": "{{REDCROSS}} I'm sorry; while you're subscribed to this user, their subscriptions are not posted in that channel.", + "twitchSubscriptionRemoveSuccessOffline": "{{GREENTICK}} Success! I will not longer post messages to {{channel}} whenever {{name}} goes offline.", + "twitchSubscriptionRemoveSuccessLive": "{{GREENTICK}} Success! I will not longer post messages to {{channel}} whenever {{name}} goes live.", + "twitchSubscriptionResetEmpty": "{{REDCROSS}} You were not subscribed to any streamer, mission abort!", + "twitchSubscriptionResetSuccess": "{{GREENTICK}} Success! {{count}} subscription has been removed from this server.", + "twitchSubscriptionResetSuccess_plural": "{{GREENTICK}} Success! {{count}} subscriptions have been removed from this server.", + "twitchSubscriptionResetStreamerNotSubscribed": "{{REDCROSS}} You were not subscribed to this streamer. Are you sure you specified the right one?", + "twitchSubscriptionResetChannelSuccess": "{{GREENTICK}} Success! Removed {{count}} subscription from the streamer {{name}}.", + "twitchSubscriptionResetChannelSuccess_plural": "{{GREENTICK}} Success! Removed {{count}} subscriptions from the streamer {{name}}.", + "twitchSubscriptionShowStreamerNotSubscribed": "{{REDCROSS}} You wanted to see all subscriptions from this streamer, but there are none!", + "twitchSubscriptionShowStatus": ["Online", "Offline"], + "twitchSubscriptionShowEmpty": "{{REDCROSS}} There are no subscriptions, who will be the first?", + "twitchSubscriptionShowUnknownUser": "Unknown", + "followageDescription": "Check how long a Twitch user has been following a channel.", + "followageExtended": { + "extendedHelp": "Just... that.", + "examples": ["dallas cohhcarnage"] + }, + "twitchDescription": "Check the information about a Twitch profile.", + "twitchExtended": { + "extendedHelp": "Really, just that.", + "examples": ["riotgames"] + }, + "twitchSubscriptionDescription": "Manage the subscriptions for your server.", + "twitchSubscriptionExtended": { + "extendedHelp": "Manage the subscriptions for this server.\n__Online Notifications__\nFor content, the best way is writing `--embed`, the notifications will then show up in MessageEmbeds with all available data.\nAlternatively you can set your own content and it will post as a regular message.\nThis content can contain some parameters that will be replaced with Twitch data:\n- `%TITLE%` for the stream's title\n- `%VIEWER_COUNT%` for the amount of current viewers,\n- `%GAME_NAME%` for the title being streamed\n- `%GAME_ID%` for the game's ID as seen by Twitch\n- `%LANGUAGE%` for the language the stream is in\n- `%USER_ID%` for the streamer's ID as seen by Twitch\n- and `%USER_NAME%` for the Streamer's twitch username.\n\n__Offline Notifications__\nFor offline events none of the variables above are available and you'll have to write your own content.\nYou can still use the `--embed` flag for the notification to show in a nice Twitch-purple MessageEmbed.", + "explainedUsage": [ + ["streamer", "The Twitch username of the streamer to get notifications for."], + ["channel", "A Discord channel where to post the notifications in."], + ["status", "The status that the Twitch streamer should get for an notification, one of online or offline."], + ["content", "The message to send in Discord chat. Refer to extended help above for more information."] + ], + "examples": [ + "add favna #twitch online --embed", + "add favna #twitch online %USER_NAME% went live | %TITLE%", + "remove kyranet #twitch online", + "reset kyranet", + "reset", + "show kyranet", + "show" + ] + } +} diff --git a/src/languages/en-US/commands/weeb.json b/src/languages/en-US/commands/weeb.json new file mode 100644 index 00000000000..f528b268d69 --- /dev/null +++ b/src/languages/en-US/commands/weeb.json @@ -0,0 +1,150 @@ +{ + "wblushDescription": "Blush with a weeb picture!", + "wblushExtended": { + "extendedHelp": "Blush with a random weeb image!" + }, + "wcryDescription": "Cry to somebody with a weeb picture!", + "wcryExtended": { + "extendedHelp": "Cry with a random weeb image!", + "explainedUsage": [["user", "The user to cry to."]], + "examples": ["@Skyra"] + }, + "wcuddleDescription": "Cuddle somebody with a weeb picture!", + "wcuddleExtended": { + "extendedHelp": "Unlike the original cuddle command, this one displays random weeb images, enjoy!", + "explainedUsage": [["user", "The user to cuddle with."]], + "examples": ["@Skyra"] + }, + "wdanceDescription": "Dance with a weeb picture!", + "wdanceExtended": { + "extendedHelp": "Dance with a random weeb image!" + }, + "whugDescription": "Hug somebody with a weeb picture!", + "whugExtended": { + "extendedHelp": "Unlike the original hug command, this one displays random weeb images, enjoy!", + "explainedUsage": [["user", "The user to give the hug."]], + "examples": ["@Skyra"] + }, + "wkissDescription": "Kiss somebody with a weeb picture!", + "wkissExtended": { + "extendedHelp": "Kiss somebody with a random weeb image!", + "explainedUsage": [["user", "The user to give the kiss to."]], + "examples": ["@Skyra"] + }, + "wlickDescription": "Lick somebody with a weeb picture!", + "wlickExtended": { + "extendedHelp": "Lick somebody with a random weeb image!", + "explainedUsage": [["user", "The user to lick."]], + "examples": ["@Skyra"] + }, + "wnomDescription": "Nom nom with a 🍞!", + "wnomExtended": { + "extendedHelp": "Nom nom nom! Wha~... I'm busy eating!" + }, + "wnekoDescription": "Human kittens!", + "wnekoExtended": { + "extendedHelp": "Unlike the original kitten command, this one displays random weeb images, the difference is that they're weebs... and humans, enjoy!" + }, + "wpatDescription": "Pats somebody's head!", + "wpatExtended": { + "extendedHelp": "Pat somebody's head with a random weeb image!", + "explainedUsage": [["user", "The user to pat with."]], + "examples": ["@Skyra"] + }, + "wpoutDescription": "I feel somebody... mad", + "wpoutExtended": { + "extendedHelp": "Show your expression with a random weeb image!" + }, + "wslapDescription": "Slap somebody with a weeb picture!", + "wslapExtended": { + "extendedHelp": "Unlike the original slap command, this one displays random weeb images, enjoy!", + "explainedUsage": [["user", "The user to slap."]], + "examples": ["@Pete"] + }, + "wsmugDescription": "Smug", + "wsmugExtended": { + "extendedHelp": "Just an anime smug face!" + }, + "wstareDescription": "*Stares*", + "wstareExtended": { + "extendedHelp": "*Still stares at you*", + "explainedUsage": [["user", "The user to stare at."]], + "examples": ["@Pete"] + }, + "wtickleDescription": "Give tickles to somebody with a weeb picture!", + "wtickleExtended": { + "extendedHelp": "Tickle somebody!", + "explainedUsage": [["user", "The user to tickle."]], + "examples": ["@Skyra"] + }, + "weebUnavailableError": "I am sorry, but the source of all my weeb images is not available at the moment. Please try again later!", + "weebUnexpectedError": "Weird! I encountered an error I should have never received!", + "wbangDescription": "Bang 💥🔫!", + "wbangExtended": { + "extendedHelp": "Shoot a user with a random weeb image!", + "explainedUsage": [["user", "The user to shoot."]], + "examples": ["@Skyra"] + }, + "wbangheadDescription": "STAHP! I'm banging my head here!", + "wbangheadExtended": { + "extendedHelp": "Bang your head with a random weeb image!" + }, + "wbiteDescription": "*nom nom* you are delicious!", + "wbiteExtended": { + "extendedHelp": "Bite a user with a random weeb image!", + "explainedUsage": [["user", "The user to bite."]], + "examples": ["@Skyra"] + }, + "wgreetDescription": "Say hi! to another user", + "wgreetExtended": { + "extendedHelp": "Greet a user with a random weeb image!", + "explainedUsage": [["user", "The user to greet."]], + "examples": ["@Skyra"] + }, + "wlewdDescription": "Lewds! Lewds! Lewds!", + "wlewdExtended": { + "extendedHelp": "Random lewd weeb image!" + }, + "wpunchDescription": "*pow* 👊👊", + "wpunchExtended": { + "extendedHelp": "Punch that annoying user with a random weeb image!", + "explainedUsage": [["user", "The user to punch."]], + "examples": ["@Skyra"] + }, + "wsleepyDescription": "I'm so sleeeeepy... *yawn*", + "wsleepyExtended": { + "extendedHelp": "Show how sleepy you are with a random weeb image!" + }, + "wsmileDescription": "Huh, because I'm happy. Clap along if you feel like a room without a roof", + "wsmileExtended": { + "extendedHelp": "Show just how happy you are with a random weeb image!" + }, + "wthumbsupDescription": "Raise your thumb into the air in a magnificent show of approval", + "wthumbsupExtended": { + "extendedHelp": "Raise your thumb with a random weeb image!" + }, + "wbang": "Hey {{user}}... bang!", + "wbanghead": "Head bang in progress!", + "wbite": "Biting {{user}}!", + "wblush": "You made them blush! 😊", + "wcry": "Dear {{user}}, did you make them cry? 💔", + "wcuddle": "Here is a cuddle for you, {{user}} 💞", + "wdance": "Dancing! 💃", + "wgreet": "Hello there {{user}}!", + "whug": "Here is a nice hug for you, {{user}} ❤", + "wkiss": "Here is a kiss for you, {{user}} 💜", + "wlewd": "Too lewd for my tastes!", + "wlick": "Licking {{user}} 👅", + "wnom": "Nom, nom, nom! 😊", + "wneko": "Nya! 🐱", + "wpat": "Gently pats {{user}}'s head ❤", + "wpout": "Uh?", + "wpunch": "Punching {{user}}!", + "wslap": "Slapping {{user}}!", + "wsleepy": "Falling asleep...", + "wsmile": "Showing a radiant smile!", + "wsmug": "There's a smug face!", + "wstare": "Dear {{user}}, somebody is staring at you 👀", + "wthumbsup": "You have their thumbs up!", + "wtickle": "Tickles for you, {{user}}!" +} diff --git a/src/languages/en-US/constants.ts b/src/languages/en-US/constants.ts new file mode 100644 index 00000000000..86840dd6a3f --- /dev/null +++ b/src/languages/en-US/constants.ts @@ -0,0 +1,60 @@ +import { Handler } from '#lib/structures/i18n/Handler'; +import { TimeTypes } from '@sapphire/time-utilities'; + +export class ExtendedHandler extends Handler { + public constructor() { + super({ + name: 'en-US', + duration: { + [TimeTypes.Year]: { + 1: 'year', + DEFAULT: 'years' + }, + [TimeTypes.Month]: { + 1: 'month', + DEFAULT: 'months' + }, + [TimeTypes.Week]: { + 1: 'week', + DEFAULT: 'weeks' + }, + [TimeTypes.Day]: { + 1: 'day', + DEFAULT: 'days' + }, + [TimeTypes.Hour]: { + 1: 'hour', + DEFAULT: 'hours' + }, + [TimeTypes.Minute]: { + 1: 'minute', + DEFAULT: 'minutes' + }, + [TimeTypes.Second]: { + 1: 'second', + DEFAULT: 'seconds' + } + } + }); + } + + public ordinal(cardinal: number): string { + const cent = cardinal % 100; + const dec = cardinal % 10; + + if (cent >= 10 && cent <= 20) { + return `${cardinal}th`; + } + + switch (dec) { + case 1: + return `${cardinal}st`; + case 2: + return `${cardinal}nd`; + case 3: + return `${cardinal}rd`; + default: + return `${cardinal}th`; + } + } +} diff --git a/src/languages/en-US/errors.json b/src/languages/en-US/errors.json new file mode 100644 index 00000000000..298887ddd25 --- /dev/null +++ b/src/languages/en-US/errors.json @@ -0,0 +1,11 @@ +{ + "channelNotReadable": "I am sorry, but I need the permissions **{{VIEW_CHANNEL, permissions}}** and **{{READ_MESSAGE_HISTORY, permissions}}**", + "guildBansEmpty": "There are no bans registered in this server.", + "guildBansNotFound": "I tried and failed to find this user from the ban list. Are you certain this user is banned?", + "guildMemberNotVoicechannel": "I cannot execute this action in a member that is not connected to a voice channel.", + "guildWarnNotFound": "I failed to fetch that warning. Either it does not exist, is not of type warning, or it has been appealed.", + "modlogTimed": "This moderation log is already timed. Expires in {{remaining, duration}}", + "unexpectedIssue": "An unexpected error popped up! Safely aborting this command...", + "userNotExistent": "This user does not exist. Are you sure you used a valid user ID?", + "userNotInGuild": "This user is not in this server." +} diff --git a/src/languages/en-US/events.json b/src/languages/en-US/events.json new file mode 100644 index 00000000000..88d69823c88 --- /dev/null +++ b/src/languages/en-US/events.json @@ -0,0 +1,32 @@ +{ + "command": "Command Used: {{command}}", + "errorString": "{{REDCROSS}} Dear {{mention}}, {{message}}", + "errorWtf": "{{REDCROSS}} What a Terrible Failure! I am very sorry!", + "guildMemberAdd": "User Joined", + "guildMemberAddDescription": "{{mention}} | **Joined Discord**: {{time, duration}} ago.", + "guildMemberAddedNickname": "Added a new nickname **{{current}}**", + "guildMemberAddedRoles_plural": "**Added roles**: {{addedRoles, andList}}", + "guildMemberAddedRoles": "**Added role**: {{addedRoles}}", + "guildMemberAddMute": "Muted User joined", + "guildMemberBanned": "User Banned", + "guildMemberKicked": "User Kicked", + "guildMemberNoUpdate": "No update detected", + "guildMemberRemove": "User Left", + "guildMemberRemoveDescription": "{{mention}} | **Joined Server**: Unknown.", + "guildMemberRemoveDescriptionWithJoinedAt": "{{mention}} | **Joined Server**: {{time, duration}} ago.", + "guildMemberRemovedNickname": "Removed the nickname **{{previous}}**", + "guildMemberRemovedRoles_plural": "**Removed roles**: {{removedRoles, andList}}", + "guildMemberRemovedRoles": "**Removed role**: {{removedRoles}}", + "guildMemberSoftBanned": "User Softbanned", + "guildMemberUpdateNickname": "Updated the nickname from **{{previous}}** to **{{current}}**", + "messageDelete": "Message Deleted • {{channel.name}}", + "messageUpdate": "Message Edited | {{message.channel.name}}", + "nameUpdateNextWasNotSet": "**Next**: Unset", + "nameUpdateNextWasSet": "**Next**: `{{nextName}}`", + "nameUpdatePreviousWasNotSet": "**Previous**: Unset", + "nameUpdatePreviousWasSet": "**Previous**: `{{previousName}}`", + "nicknameUpdate": "Nickname Edited", + "reaction": "Reaction Added", + "roleUpdate": "Roles Edited", + "usernameUpdate": "Username Edited" +} diff --git a/src/languages/en-US/fuzzySearch.json b/src/languages/en-US/fuzzySearch.json new file mode 100644 index 00000000000..d19a4ba17a3 --- /dev/null +++ b/src/languages/en-US/fuzzySearch.json @@ -0,0 +1,6 @@ +{ + "aborted": "Successfully aborted the prompt.", + "invalidIndex": "That number was out of range, aborting prompt.", + "invalidNumber": "I expected you to give me a (single digit) number, got a potato.", + "matches": "I found multiple matches! **Please select a number within 0 and {{matches}}**:\n{{codeblock}}\nWrite **ABORT** if you want to exit the prompt." +} diff --git a/src/languages/en-US/giveaway.json b/src/languages/en-US/giveaway.json new file mode 100644 index 00000000000..6ca93883207 --- /dev/null +++ b/src/languages/en-US/giveaway.json @@ -0,0 +1,17 @@ +{ + "time": "A giveaway must last at least 10 seconds.", + "timeTooLong": "Hey! That's an incredibly long time to keep track of!", + "endsAt": "Ends at:", + "duration": "This giveaway ends in **{{time, duration}}**! React to this message with 🎉 to join.", + "title": "🎉 **GIVEAWAY** 🎉", + "lastchance": "**LAST CHANCE**! Remaining time: **{{time, duration}}**. React to this message with 🎉 to join.", + "lastchanceTitle": "🎉 **LAST CHANCE GIVEAWAY** 🎉", + "ended": "Winner: {{winners, andJoin}}", + "endedPlural": "Winners: {{winners, andJoin}}", + "endedNoWinner": "No winner...", + "endedAt": "Ended at:", + "endedTitle": "🎉 **GIVEAWAY ENDED** 🎉", + "endedMessage": "Congratulations {{winners, andJoin}}! You won the giveaway **{{title}}**", + "endedMessageNoWinner": "The giveaway **{{title}}** ended without enough participants.", + "scheduled": "The giveaway will start in {{scheduledTime, duration}}." +} diff --git a/src/languages/en-US/globals.json b/src/languages/en-US/globals.json new file mode 100644 index 00000000000..13985ba2775 --- /dev/null +++ b/src/languages/en-US/globals.json @@ -0,0 +1,19 @@ +{ + "and": "and", + "default": "{{key}} has not been localized for en-US yet.", + "defaultLanguage": "Default Language", + "is": "is", + "no": "No", + "none": "None", + "or": "or", + "unknown": "unknown", + "yes": "Yes", + "ordinalValue": "{{value, ordinal}}", + "durationValue": "{{value, duration}}", + "numberValue": "{{value, number}}", + "numberCompactValue": "{{value, numberCompact}}", + "timeDateValue": "{{value, timeDate}}", + "timeFullValue": "{{value, timeFull}}", + "andListValue": "{{value, andList}}", + "orListValue": "{{value, orList}}" +} diff --git a/src/languages/en-US/humanLevels.json b/src/languages/en-US/humanLevels.json new file mode 100644 index 00000000000..a35c4b3c8dd --- /dev/null +++ b/src/languages/en-US/humanLevels.json @@ -0,0 +1,7 @@ +{ + "NONE": "None", + "LOW": "Low", + "MEDIUM": "Medium", + "HIGH": "High", + "VERY_HIGH": "Highest" +} diff --git a/src/languages/en-US/inhibitors.json b/src/languages/en-US/inhibitors.json new file mode 100644 index 00000000000..e606771ed9e --- /dev/null +++ b/src/languages/en-US/inhibitors.json @@ -0,0 +1,21 @@ +{ + "cooldown": "You have just used this command. You can use this command again in {{remaining, duration}}.", + "disabledGlobal": "This command has been globally disabled by the bot owners. Want to know why and find out when it will be back? Join the official Skyra server: ", + "disabledGuild": "This command has been disabled by an admin in this guild!", + "missingBotPerms": "I don't have sufficient permissions! I'm missing: {{missing, andList}}", + "musicBothVoiceChannel": "{{REDCROSS}} Hey! It looks like you're not in the same voice channel as me! Please come join me!", + "musicBotVoiceChannel": "{{REDCROSS}} I am afraid I need to be in a voice channel to operate this command, please show me the way!", + "musicDjMember": "{{REDCROSS}} I believe this is something only a moderator or a DJ of this session is supposed to do!", + "musicNothingPlaying": "{{REDCROSS}} Looks like nothing is playing right now, how about you start the party 🎉?", + "musicNotPlaying": "{{REDCROSS}} Hmm, doesn't look like I'm playing anything right now.", + "musicPaused": "{{REDCROSS}} The queue's playing and the session is still up 'till the night ends!", + "musicQueueEmpty": "{{REDCROSS}} The queue's empty! The session will start as soon as we have some songs queued.", + "musicUserVoiceChannel": "{{REDCROSS}} Hey, I need you to join a voice channel before I can run this command!", + "nsfw": "You may not use NSFW commands in this channel!", + "permissions": "You do not have permission to use this command!", + "requiredSettings_plural": "The guild is missing the **{{settings}}** guild settings and thus the command cannot run.", + "requiredSettings": "The guild is missing the **{{settings}}** guild setting and thus the command cannot run.", + "runin": "This command is only available in {{type}} channels.", + "runinNone": "The {{name}} command is not configured to run in any channel.", + "spam": "Can we move to {{channel}} please? This command might be too spammy and can ruin other people's conversations." +} diff --git a/src/languages/en-US/klasa.json b/src/languages/en-US/klasa.json new file mode 100644 index 00000000000..7132626ea51 --- /dev/null +++ b/src/languages/en-US/klasa.json @@ -0,0 +1,12 @@ +{ + "commandMessageMissing": "Missing one or more required arguments after end of input.", + "commandMessageMissingOptionals": "Missing a required option: ({{possibles}})", + "commandMessageMissingRequired": "{{name}} is a required argument.", + "commandMessageNoMatch": "Your option didn't match any of the possibilities: ({{possibles}})", + "messagePromptTimeout": "The prompt has timed out.", + "monitorCommandHandlerAborted": "Aborted", + "monitorCommandHandlerRepeatingReprompt": "{{tag}} | **{{name}}** is a repeating argument | You have **{{time}}** seconds to respond to this prompt with additional valid arguments. Type **{{cancelOptions}}** to cancel this prompt.", + "monitorCommandHandlerReprompt": "{{tag}} | **{{name}}** | You have **{{time}}** seconds to respond to this prompt with a valid argument. Type **{{cancelOptions}}** to abort this prompt.", + "reactionhandlerPrompt": "Which page would you like to jump to?", + "textPromptAbortOptions": ["abort", "cancel", "stop"] +} diff --git a/src/languages/en-US/moderation.json b/src/languages/en-US/moderation.json new file mode 100644 index 00000000000..fb95a51ed52 --- /dev/null +++ b/src/languages/en-US/moderation.json @@ -0,0 +1,21 @@ +{ + "caseNotExists": "{{REDCROSS}} I am sorry, but the selected moderation log case does not exist.", + "caseNotExists_plural": "{{REDCROSS}} I am sorry, but none of the selected moderation logs cases exist.", + "logAppealed": "{{REDCROSS}} I am sorry, but the selected moderation log has expired or cannot be cannot be made temporary.", + "logDescriptionTypeAndUser": "❯ **Type**: {{data.type}}\n❯ **User:** {{data.userName}}#{{data.userDiscriminator}} ({{data.userID}})", + "logDescriptionWithReason": "❯ **Reason:** {{data.reason}}{{data.formattedDuration}}", + "logDescriptionWithoutReason": "❯ **Reason:** Please use `{{data.prefix}}reason {{data.caseID}} ` to set the reason.{{data.formattedDuration}}", + "logExpiresIn": "\n❯ **Expires In**: {{duration, duration}}", + "logFooter": "Case {{caseID}}", + "muteCannotManageRoles": "I must have **{{MANAGE_ROLES, permissions}}** permissions to be able to mute.", + "muteLowHierarchy": "I cannot mute a user which higher role hierarchy than me.", + "muteNotConfigured": "The muted role must be configured for this action to happen.", + "muteNotExists": "The specified user is not muted.", + "muteNotInMember": "The muted role is not set in the member.", + "restrictionNotConfigured": "The restriction role must be configured for this action to happen", + "roleHigher": "The selected member has a role position that is higher than or equal to yours.", + "roleHigherSkyra": "The selected member has a role position that is higher than or equal to mine.", + "success": "Successfully executed the command.", + "toSkyra": "Why... I thought you loved me! 💔", + "userSelf": "Why would you do that to yourself?" +} diff --git a/src/languages/en-US/moderationActions.json b/src/languages/en-US/moderationActions.json new file mode 100644 index 00000000000..4066645ab76 --- /dev/null +++ b/src/languages/en-US/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "Added Role", + "ban": "Ban", + "kick": "Kick", + "mute": "Mute", + "removeRole": "Remove Role", + "restrictedAttachment": "Attachment Restriction", + "restrictedEmbed": "Embed Restriction", + "restrictedReact": "Reaction Restriction", + "restrictedVoice": "Voice Restriction", + "setNickname": "Set Nickname", + "softban": "Softban", + "vkick": "Voice Kick", + "vmute": "Voice Mute" + }, + "applyNoReason": "[Action] Applied {{action}}", + "applyReason": "[Action] Applied {{action}} | Reason: {{reason}}", + "requiredMember": "The user does not exist or is not in this server.", + "revokeNoReason": "[Action] Revoked {{action}}", + "revokeReason": "[Action] Revoked {{action}} | Reason: {{reason}}", + "setNicknameNoReasonRemoved": "[Action] Removed Nickname.", + "setNicknameNoReasonSet": "[Action] Set Nickname.", + "setNicknameRemoved": "[Action] Removed Nickname | Reason: {{reason}}", + "setNicknameSet": "[Action] Set Nickname | Reason: {{reason}}", + "setupMuteExists": "**Aborting mute role creation**: There is already one that exists.", + "setupRestrictionExists": "**Aborting restriction role creation**: There is already one that exists.", + "setupTooManyRoles": "**Aborting role creation**: There are 250 roles in this guild, you need to delete one role.", + "sharedRoleSetupAsk": "{{LOADING}} Can I modify {{channels}} channel to apply the role {{role}} the following permission: {{permissions}}?", + "sharedRoleSetupAskMultipleChannels": "{{LOADING}} Can I modify {{channels}} channels to apply the role {{role}} the following permission: {{permissions}}?", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "{{LOADING}} Can I modify {{channels}} channels to apply the role {{role}} the following permissions: {{permissions}}?", + "sharedRoleSetupAskMultiplePermissions": "{{LOADING}} Can I modify {{channels}} channel to apply the role {{role}} the following permissions: {{permissions}}?", + "sharedRoleSetupExisting": "I could not find a configured role. Do you want to configure an existing one?", + "sharedRoleSetupExistingName": "Please give me the name of the role you want to use for further actions of this type.", + "sharedRoleSetupNew": "Do you want me to create a new role and configure it automatically?", + "softbanNoReason": "[Action] Applying Softban.", + "softbanReason": "[Action] Applying Softban | Reason: {{reason}}", + "unSoftbanNoReason": "[Action] Applied Softban.", + "unSoftbanReason": "[Action] Applied Softban | Reason: {{reason}}" +} diff --git a/src/languages/en-US/monitors.json b/src/languages/en-US/monitors.json new file mode 100644 index 00000000000..1cbc5e7bd68 --- /dev/null +++ b/src/languages/en-US/monitors.json @@ -0,0 +1,41 @@ +{ + "attachmentFilter": "{{REDCROSS}} Dear {{user}}, file attachments aren't allowed here.", + "attachmentFilterFooter": "Too Many Attachments", + "attachments": "[Auto-Moderation] Triggered attachment filter, no threshold.", + "attachmentsWithMaximum": "[Auto-Moderation] Triggered attachment filter, reached {{amount}} out of {{maximum}} infractions.", + "capitals": "[Auto-Moderation] Triggered capital filter, no threshold.", + "capitalsWithMaximum": "[Auto-Moderation] Triggered capital filter, reached {{amount}} out of {{maximum}} infractions.", + "capsFilter": "{{REDCROSS}} EEEOOO {{user}}! PLEASE DO NOT SHOUT IN THIS PLACE! YOU HAVE HIT THE CAPS LIMIT!", + "capsFilterDm": "Speak lower! I know you need to express your thoughts. There is the message I deleted:{{message}}", + "capsFilterFooter": "Too Many UpperCases", + "inviteFilterAlert": "{{REDCROSS}} Dear {{user}}, invite links aren't allowed here.", + "inviteFilterLog": "**Link**: {{links, andList}}", + "inviteFilterLogPlural": "**Links**: {{links, andList}}", + "inviteLink": "Invite link", + "invites": "[Auto-Moderation] Triggered invite filter, no threshold.", + "invitesWithMaximum": "[Auto-Moderation] Triggered invite filter, reached {{amount}} out of {{maximum}} infractions.", + "link": "Filtered Link", + "links": "[Auto-Moderation] Triggered link filter, no threshold.", + "linksWithMaximum": "[Auto-Moderation] Triggered link filter, reached {{amount}} out of {{maximum}} infractions.", + "messageFilter": "{{REDCROSS}} Woah woah woah, please stop re-posting so much {{user}}!", + "messageFilterFooter": "Too Many Message Duplicates", + "messages": "[Auto-Moderation] Triggered duplicated message filter, no threshold.", + "messagesWithMaximum": "[Auto-Moderation] Triggered duplicated message filter, reached {{amount}} out of {{maximum}} infractions.", + "newlineFilter": "{{REDCROSS}} Wall of text incoming from {{user}}, wall of text taken down!", + "newlineFilterFooter": "Too Many Lines", + "newlines": "[Auto-Moderation] Triggered newline filter, no threshold.", + "newlinesWithMaximum": "[Auto-Moderation] Triggered newline filter, reached {{amount}} out of {{maximum}} infractions.", + "nms": "[NOMENTIONSPAM]", + "nmsAlert": "Be careful mentioning any more, as you are about to be banned for exceeding this server's mention threshold.", + "nmsMessage": "The banhammer has landed and now the user {{user.tag}} with id {{user.id}} is banned for mention spam.\nDo not worry! I'm here to help you! 😄", + "nmsModlog": "[NOMENTIONSPAM] Automatic: Mention Spam threshold exceeded.\nThreshold: {{threshold}}.", + "nolink": "{{REDCROSS}} Hey {{user}}, you are not allowed to post links here!", + "reactionFilterFooter": "Filtered Reaction", + "reactionsFilter": "{{REDCROSS}} Hey {{user}}, please do not add that reaction!", + "socialAchievement": "Congratulations dear %MEMBER%, you achieved the role %ROLE%", + "wordFilter": "{{REDCROSS}} Pardon, dear {{user}}, you said something that is not allowed in this server.", + "wordFilterDm": "Shush! You said some words that are not allowed in the server! But since you took a moment to write the message, I will post it here:\n{{filtered}}", + "wordFilterFooter": "Filtered Word", + "words": "[Auto-Moderation] Triggered word filter, no threshold.", + "wordsWithMaximum": "[Auto-Moderation] Triggered word filter, reached {{amount}} out of {{maximum}} infractions." +} diff --git a/src/languages/en-US/musicManager.json b/src/languages/en-US/musicManager.json new file mode 100644 index 00000000000..1d36b879990 --- /dev/null +++ b/src/languages/en-US/musicManager.json @@ -0,0 +1,13 @@ +{ + "fetchLoadFailed": "I'm sorry but I couldn't load this song! Maybe try other song!", + "fetchNoArguments": "I need you to give me the name of a song!", + "fetchNoMatches": "I'm sorry but I wasn't able to find the track!", + "importQueueError": "{{REDCROSS}} Sorry, but I'm having issues trying to import that playlist. Are you sure it's from my own DJ deck?", + "importQueueNotFound": "{{REDCROSS}} I need a queue to import!", + "playNoSongs": "There are no songs left in the queue!", + "playPlaying": "The deck's spinning, can't you hear it?", + "setvolumeLoud": "I'll be honest, an airplane's nacelle would be less noisy than this!", + "setvolumeSilent": "Woah, you can just leave the voice channel if you want silence!", + "stuck": "{{LOADING}} Hold on, I got a little problem, I'll be back in: {{milliseconds, duration}}!", + "tooManySongs": "{{REDCROSS}} Woah there, you are adding more songs than allowed!" +} diff --git a/src/languages/en-US/notifications.json b/src/languages/en-US/notifications.json new file mode 100644 index 00000000000..36fd87a6216 --- /dev/null +++ b/src/languages/en-US/notifications.json @@ -0,0 +1,6 @@ +{ + "twitchEmbedDescription": "{{userName}} is now live!", + "twitchEmbedDescriptionWithGame": "{{userName}} is now live - Streaming {{gameName}}!", + "twitchNoGameName": "*Game name not set*", + "twitchEmbedFooter": "Skyra Twitch Notifications" +} diff --git a/src/languages/en-US/permissions.json b/src/languages/en-US/permissions.json new file mode 100644 index 00000000000..32488402f30 --- /dev/null +++ b/src/languages/en-US/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Administrator", + "VIEW_AUDIT_LOG": "View Audit Log", + "MANAGE_GUILD": "Manage Server", + "MANAGE_ROLES": "Manage Roles", + "MANAGE_CHANNELS": "Manage Channels", + "KICK_MEMBERS": "Kick Members", + "BAN_MEMBERS": "Ban Members", + "CREATE_INSTANT_INVITE": "Create Instant Invite", + "CHANGE_NICKNAME": "Change Nickname", + "MANAGE_NICKNAMES": "Manage Nicknames", + "MANAGE_EMOJIS": "Manage Emojis", + "MANAGE_WEBHOOKS": "Manage Webhooks", + "VIEW_CHANNEL": "Read Messages", + "SEND_MESSAGES": "Send Messages", + "SEND_TTS_MESSAGES": "Send TTS Messages", + "MANAGE_MESSAGES": "Manage Messages", + "EMBED_LINKS": "Embed Links", + "ATTACH_FILES": "Attach Files", + "READ_MESSAGE_HISTORY": "Read Message History", + "MENTION_EVERYONE": "Mention Everyone", + "USE_EXTERNAL_EMOJIS": "Use External Emojis", + "ADD_REACTIONS": "Add Reactions", + "CONNECT": "Connect", + "SPEAK": "Speak", + "STREAM": "Stream", + "MUTE_MEMBERS": "Mute Members", + "DEAFEN_MEMBERS": "Deafen Members", + "MOVE_MEMBERS": "Move Members", + "USE_VAD": "Use Voice Activity", + "PRIORITY_SPEAKER": "Priority Speaker", + "VIEW_GUILD_INSIGHTS": "View Guild Insights" +} diff --git a/src/languages/en-US/promptList.json b/src/languages/en-US/promptList.json new file mode 100644 index 00000000000..e42ea217109 --- /dev/null +++ b/src/languages/en-US/promptList.json @@ -0,0 +1,6 @@ +{ + "aborted": "Successfully aborted the prompt.", + "attemptFailed": "Invalid input. Attempt **{{attempt}}** out of **{{maxAttempts}}**\n{{list}}", + "multipleChoice_plural": "There are {{count}} results. Please choose a number between 1 and {{count}}, or write **`CANCEL`** to cancel the prompt.\n{{list}}", + "multipleChoice": "There are {{count}} result. Please choose a number between 1 and {{count}}, or write **`CANCEL`** to cancel the prompt.\n{{list}}" +} diff --git a/src/languages/en-US/resolvers.json b/src/languages/en-US/resolvers.json new file mode 100644 index 00000000000..43bccd8660a --- /dev/null +++ b/src/languages/en-US/resolvers.json @@ -0,0 +1,51 @@ +{ + "boolDisabled": "Disabled", + "boolEnabled": "Enabled", + "boolFalseOptions": ["false", "f", "no", "n", "off", "disable", "disabled", "0", "-"], + "boolTrueOptions": ["true", "t", "yes", "y", "on", "enable", "enabled", "1", "+"], + "channelNotInGuild": "I am sorry, but that command can only be ran in a server.", + "channelNotInGuildSubCommand": "{{REDCROSS}} I am sorry, but the subcommand `{{subcommand}}` for the command `{{command}}` can only be used in a server.", + "dateSuffix": " seconds", + "invalidBool": "{{name}} must be true or false.", + "invalidChannel": "{{name}} must be a channel tag or valid channel id.", + "invalidChannelName": "{{name}} must be a valid channel name, id, or tag.", + "invalidCustom": "{{name}} must be a valid {{type}}.", + "invalidDate": "{{name}} must be a valid date.", + "invalidDuration": "{{name}} must be a valid duration string.", + "invalidEmoji": "{{name}} must be a custom emoji tag or valid emoji id.", + "invalidFloat": "{{name}} must be a valid number.", + "invalidGuild": "{{name}} must be a valid guild id.", + "invalidInt": "{{name}} must be an integer.", + "invalidInvite": "{{name}} must be a valid invite link.", + "invalidLiteral": "Your option did not match the only possibility: {{name}}", + "invalidLanguage": "{{name}} must be a valid and supported language.\n**Hint**: the following are supported: {{possibles, andList}}.\nFurthermore, you can add more (or improve the existing ones) at !", + "invalidMember": "{{name}} must be a mention or valid user id.", + "invalidMessage": "{{name}} must be a valid message id.", + "invalidPiece": "{{name}} must be a valid {{piece}} name.", + "invalidRegexMatch": "{{name}} must follow this regex pattern \"{{pattern}}\".", + "invalidRole": "{{name}} must be a role mention or role id.", + "invalidRoleName": "{{name}} must be a valid role name, id, or mention.", + "invalidSnowflake": "{{name}} must be a valid Discord snowflake.", + "invalidStore": "{{store}} must be a valid Store.", + "invalidString": "{{name}} must be a valid string.", + "invalidTime": "{{name}} must be a valid duration or date string.", + "invalidUrl": "{{name}} must be a valid url.", + "invalidUser": "{{name}} must be a mention or valid user id.", + "invalidUsername": "{{name}} must be a valid user name, id, or mention.", + "invalidWager": "I am sorry, but {{bet}} {{SHINY}} is an invalid amount to bet. You can bet one of {{validAmounts, orList}}", + "memberNameUserLeftDuringPrompt": "User left during prompt.", + "minmaxBothExclusive": "{{name}} must be between {{min}} and {{max}} exclusively.", + "minmaxBothInclusive": "{{name}} must be between {{min}} and {{max}} inclusively.", + "minmaxExactlyExclusive": "{{name}} must be exactly {{min}}.", + "minmaxExactlyInclusive": "{{name}} must be exactly {{min}}.", + "minmaxMaxExclusive": "{{name}} must be less than {{max}} exclusively.", + "minmaxMaxInclusive": "{{name}} must be less than {{max}} inclusively", + "minmaxMinExclusive": "{{name}} must be greater than {{min}} exclusively.", + "minmaxMinInclusive": "{{name}} must be greater than {{min}} inclusively.", + "multiTooFew": "Provided too few {{name}}s. At least {{min}} {{conjunctionWord}} required.", + "positiveAmount": "You must give me a positive number.", + "stringSuffix": " characters", + "unknownChannel": "Unknown channel", + "unknownRole": "Unknown role", + "unknownUser": "Unknown user" +} diff --git a/src/languages/en-US/selfModeration.json b/src/languages/en-US/selfModeration.json new file mode 100644 index 00000000000..d303544dbc3 --- /dev/null +++ b/src/languages/en-US/selfModeration.json @@ -0,0 +1,35 @@ +{ + "commandDisabled": "{{GREENTICK}} Successfully disabled sub-system.", + "commandEnabled": "{{GREENTICK}} Successfully enabled sub-system.", + "commandHardAction": "{{GREENTICK}} Successfully set punishment: {{value}}", + "commandHardActionDuration": "{{GREENTICK}} Successfully removed the punishment appeal timer.", + "commandHardActionDurationWithValue": "{{GREENTICK}} Successfully set the punishment appeal timer to: {{value, duration}}", + "commandInvalidHardaction": "{{REDCROSS}} Value must be any of the following: `none`, `warn`, `mute`, `kick`, `softban`, or `ban`. Check `Skyra, help {{name}}` for more information.", + "commandInvalidMissingAction": "{{REDCROSS}} Action must be any of the following: `enable`, `disable`, `action`, `punish`, `punish-duration`, `threshold-maximum`, `threshold-duration`, or `show`. Check `Skyra, help {{name}}` for more information.", + "commandInvalidMissingArguments": "{{REDCROSS}} The specified action requires an extra argument to be passed. Check `Skyra, help {{name}}` for more information.", + "commandInvalidSoftaction": "{{REDCROSS}} Value must be any of the following: `alert`, `log`, or `delete`. Check `Skyra, help {{name}}` for more information.", + "commandShow": "Enabled : {{kEnabled}}\nAction\n - Alert : {{kAlert}}\n - Log : {{kLog}}\n - Delete : {{kDelete}}\nPunishment\n - Type : {{kHardAction}}\n - Duration : {{hardActionDurationText}}\nThreshold\n - Maximum : {{thresholdMaximumText}}\n - Duration : {{thresholdDurationText}}", + "commandShowDurationPermanent": "Permanent", + "commandShowUnset": "Unset", + "commandSoftAction": "{{GREENTICK}} Successfully disabled actions.", + "commandSoftActionWithValue": "{{GREENTICK}} Successfully set actions to: `{{value}}`", + "commandThresholdDuration": "{{GREENTICK}} Successfully removed the threshold duration, punishments will take place instantly if set.", + "commandThresholdDurationWithValue": "{{GREENTICK}} Successfully set the threshold duration to: {{value, duration}}", + "commandThresholdMaximum": "{{GREENTICK}} Successfully removed the threshold maximum, punishment will take place instantly if set.", + "commandThresholdMaximumWithValue": "{{GREENTICK}} Successfully set the threshold maximum to: {{value}}", + "disabled": "No", + "durationTooLong": "{{REDCROSS}} The value ({{value, duration}}) was too long, expected maximum {{maximum, duration}}.", + "durationTooShort": "{{REDCROSS}} The value ({{value, duration}}) was too short, expected at least {{minimum, duration}}.", + "enabled": "Yes", + "hardActionBan": "Ban", + "hardActionKick": "Kick", + "hardActionMute": "Mute", + "hardActionNone": "None", + "hardActionSoftban": "SoftBan", + "hardActionWarning": "Warning", + "maximumTooLong": "{{REDCROSS}} The value ({{value}}) was too long, expected maximum {{maximum}}.", + "maximumTooShort": "{{REDCROSS}} The value ({{value}}) was too short, expected at least {{minimum}}.", + "softActionAlert": "Alert", + "softActionDelete": "Delete", + "softActionLog": "Log" +} diff --git a/src/languages/en-US/serializers.json b/src/languages/en-US/serializers.json new file mode 100644 index 00000000000..2b84b8cab4c --- /dev/null +++ b/src/languages/en-US/serializers.json @@ -0,0 +1,27 @@ +{ + "autoRoleInvalid": "Invalid autorole data.", + "commandAutoDeleteInvalid": "Invalid command auto-delete data.", + "customCommandInvalidArgs": "The property \"args\" must be an array of strings.", + "customCommandInvalidColor": "The property \"color\" must be a number.", + "customCommandInvalidContent": "The property \"content\" must be a string.", + "customCommandInvalidEmbed": "The property \"embed\" must be a boolean.", + "customCommandInvalidId": "The property \"id\" must be a string.", + "disabledCommandChannelsChannelsCommandDoesNotExist": "The command `{{name}}` does not exist.", + "disabledCommandChannelsChannelsDoesNotExist": "The channel does not exist.", + "permissionNodeDuplicatedCommand": "You have set `{{command}}` twice, either allow it, or deny it.", + "permissionNodeInvalid": "Invalid data.", + "permissionNodeInvalidCommand": "The command `{{command}}` does not exist or is invalid.", + "permissionNodeInvalidTarget": "No data could be found from the ID.", + "permissionNodeSecurityEveryoneAllows": "For security, the everyone role cannot have allows.", + "permissionNodeSecurityGuarded": "For security and for me to work properly, you cannot deny the usage for the command `{{command}}`.", + "permissionNodeSecurityOwner": "You cannot set permission overrides on the server owner.", + "reactionRoleInvalid": "Invalid reaction role data.", + "stickyRoleInvalid": "Invalid sticky role data.", + "triggerAliasInvalid": "Invalid trigger alias data.", + "triggerIncludeInvalid": "Invalid trigger includes data.", + "triggerIncludeInvalidAction": "Invalid trigger action.", + "twitchSubscriptionInvalid": "Invalid data.", + "twitchSubscriptionInvalidStreamer": "Invalid data streamer.", + "uniqueRoleSetInvalid": "Invalid unique role set data.", + "unsupported": "This configuration key cannot be updated via Discord at the moment, please use the dashboard at !" +} diff --git a/src/languages/en-US/settings.json b/src/languages/en-US/settings.json new file mode 100644 index 00000000000..31ad54100d1 --- /dev/null +++ b/src/languages/en-US/settings.json @@ -0,0 +1,122 @@ +{ + "channelsAnnouncements": "The channel for announcements. This (alongside the `roles.subscriber` key) is required for the announce command.", + "channelsFarewell": "The channel I will use to send farewells, you must enable the events and set up the messages, in other categories.", + "channelsGreeting": "The channel I will use to send greetings, you must enable the events and set up the messages, in other categories.", + "channelsIgnoreAll": "Channels I should ignore for all types of logging.", + "channelsIgnoreMessageDelete": "Channels I should ignore when checking for deleted messages to log.", + "channelsIgnoreMessageEdit": "Channels I should ignore when checking for edited messages to log.", + "channelsIgnoreReactionAdd": "Channels I should ignore when checking for added reactions.", + "channelsImageLogs": "The channel I will use to re-upload all images I see.", + "channelsMemberLogs": "The channel for member logs, you must enable the events (`events.memberAdd` for new members, `events.memberRemove` for members who left).", + "channelsMessageLogs": "The channel for (non-NSFW) message logs, you must enable the events (`events.messageDelete` for deleted messages, `events.messageEdit` for edited messages).", + "channelsModerationLogs": "The channel for moderation logs, once enabled, I will post all my moderation cases there. If `events.banRemove` and/or `events.banRemove` are enabled, I will automatically post anonymous logs.", + "channelsNsfwMessageLogs": "The channel for NSFW message logs, same requirement as normal message logs, but will only send NSFW messages.", + "channelsPruneLogs": "The channel for prune logs, same requirement as normal message logs, but will only send prune messages.", + "channelsReactionLogs": "The channel for the reaction logs, same requirement as normal message logs, but will only send message reactions. If you don't want twemojis to be logged you can toggle `events.twemoji-reactions`.", + "channelsRoles": "The channel for the reaction roles.", + "channelsSpam": "The channel for me to redirect users to when they use commands I consider spammy.", + "dashboardOnlyKey": "This key can only be configured through [the web dashboard](https://skyra.pw)", + "disabledChannels": "A list of channels for disabled commands, for example, setting up a channel called general will forbid all users from using my commands there. Moderators+ override this purposely to allow them to moderate without switching channels.", + "disabledCommands": "The disabled commands, core commands may not be disabled, and moderators will override this. All commands must be in lower case.", + "disableNaturalPrefix": "Whether or not I should listen for my natural prefix, `Skyra,`", + "eventsBanAdd": "This event posts anonymous moderation logs when a user gets banned. You must set up `channels.moderation-logs`.", + "eventsBanRemove": "This event posts anonymous moderation logs when a user gets unbanned. You must set up `channels.moderation-logs`.", + "eventsMemberAdd": "This event posts member logs when a user joins. They will be posted in `channels.member-logs`.", + "eventsMemberNickNameUpdate": "Whether member nickname updates should be logged or not.", + "eventsMemberRemove": "This event posts member logs when a user leaves. They will be posted in `channels.member-logs`.", + "eventsMemberRoleUpdate": "Whether member role changes should be logged or not.", + "eventsMemberUserNameUpdate": "Whether member username updates should be logged or not.", + "eventsMessageDelete": "This event posts message logs when a message is deleted. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).", + "eventsMessageEdit": "This event posts message logs when a message is edited. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).", + "eventsTwemojiReactions": "Whether or not twemoji reactions are posted in the reaction logs channel.", + "guildChannelsMod": "You need to configure a modlog channel. Use `Skyra, conf set channels.moderation-logs #modlogs`.", + "guildRolesRestricted": "{{REDCROSS}} You need to configure a role for this action, use `{{prefix}}settings set {{path}} ` to set it up.", + "language": "The language I will use for your server. It may not be available in the language you want.", + "messagesAnnouncementEmbed": "Whether to send announcements in embeds or not", + "messagesFarewell": "The message I shall send to when a user leaves. You must set up `channels.farewell` and `events.memberRemove`", + "messagesGreeting": "The message I shall send to when a user joins. You must set up `channels.greeting` and `events.memberAdd`", + "messagesIgnoreChannels": "The channels configured to not increase the point counter for users.", + "messagesJoinDm": "The message I shall send to when a user joins in DMs.", + "messagesModerationAutoDelete": "Whether or not moderation commands should be auto-deleted or not.", + "messagesModerationDm": "Whether or not I should send a direct message to the target user on moderation actions.", + "messagesModerationMessageDisplay": "Whether or not a response should be sent for moderation commands.", + "messagesModerationReasonDisplay": "Whether the reason will be displayed in moderation commands.", + "messagesModeratorNameDisplay": "Whether or not I should display the name of the moderator who took the action when sending the target user a moderation message. Requires `messages.moderation-dm` to be enabled.", + "messagesWarnings": "Whether or not I should send warnings to the user when they receive one.", + "musicAllowStreams": "Whether livestreams should be allowed to be played.", + "musicDefaultVolume": "The default music volume to start playing at for this server.", + "musicMaximumDuration": "The maximum length any playable single track can have.", + "musicMaximumEntriesPerUser": "The maximum amount of entries one user can have in the queue.", + "noMentionSpamAlerts": "Whether or not users should be alerted when they are about to get the ban hammer.", + "noMentionSpamEnabled": "Whether or not I should have the ban hammer ready for mention spammers.", + "noMentionSpamMentionsAllowed": "The minimum amount of \"points\" a user must accumulate before landing the hammer. A user mention will count as 1 point, a role mention as 2 points, and an everyone/here mention as 5 points.", + "noMentionSpamTimePeriod": "The amount of time in seconds in which the mention bucket should refresh. For example, if this is set to `8` and you mentioned two users 7 seconds apart, the bucket would run from start with the accumulated amount of points.", + "prefix": "A prefix is an affix that is added in front of the word, in this case, the message. It allows bots to distinguish between a regular message and a command.", + "rolesAdmin": "The administrator roles. Administrators have access to all moderation and management commands. Defaults to anyone with the {{MANAGE_GUILD, permissions}} permission.", + "rolesDj": "The DJ roles for this server. DJs have more advanced control over Skyra's music commands.", + "rolesInitial": "The initial role, if configured, I will give it to users as soon as they join.", + "rolesModerator": "The moderator roles. Moderators have access to almost all moderation commands. Defaults to anyone who can ban members.", + "rolesMuted": "The muted role, if configured, I will give new muted users this role. Otherwise I will prompt you the creation of one.", + "rolesPublic": "The public roles. These can be claimed by any user using the `roles` command.", + "rolesRemoveInitial": "Whether claiming a public role should remove the initial role at the same time.", + "rolesRestrictedAttachment": "The role that is used for the restrictAttachment moderation command", + "rolesRestrictedEmbed": "The role that is used for the restrictEmbed moderation command.", + "rolesRestrictedEmoji": "The role that is used for the restrictEmoji moderation command.", + "rolesRestrictedReaction": "The role that is used for the restrictReaction moderation command.", + "rolesRestrictedVoice": "The role that is used for the restrictVoice moderation command.", + "rolesSubscriber": "The subscriber role. This role will be mentioned every time you use the `announce` command. I will always keep it non-mentionable so people don't mention it abusively.", + "selfmodAttachmentsEnabled": "Whether or not the attachment filter is enabled.", + "selfmodAttachmentsIgnoredChannels": "The channels that will be ignored by the attachments filter sub-system", + "selfmodAttachmentsIgnoredRoles": "The roles that will be ignored by the attachments filters sub-system", + "selfmodCapitalsEnabled": "Whether the capitals filter selfmod sub-system is enabled or not.", + "selfmodCapitalsIgnoredChannels": "The channels that will be ignored by the capitals filter sub-system", + "selfmodCapitalsIgnoredRoles": "The roles that will be ignored by the capitals filters sub-system", + "selfmodCapitalsMaximum": "The maximum amount of characters the messages must have before trying to delete it. You must enable it with the `capitalsMode` command.", + "selfmodCapitalsMinimum": "The minimum amount of characters the message must have before trying to delete it. You must enable it with the `capitalsMode` command.", + "selfmodFilterEnabled": "Whether the word filter selfmod sub-system is enabled or not.", + "selfmodFilterIgnoredChannels": "The channels that will be ignored by the filters sub-system", + "selfmodFilterIgnoredRoles": "The roles that will be ignored by the filters sub-system", + "selfmodIgnoreChannels": "The channels I will ignore, be careful any channel configured will have all auto-moderation systems (CapsFilter, InviteLinks, and NoMentionSpam) deactivated.", + "selfmodInvitesEnabled": "Whether the invites filter selfmod sub-system is enabled or not.", + "selfmodInvitesIgnoredChannels": "The channels that will be ignored by the invites sub-system", + "selfmodInvitesIgnoredCodes": "The Discord invite codes that will be ignored by the invites sub-system", + "selfmodInvitesIgnoredGuilds": "The Discord servers that will be ignored by the invites sub-system", + "selfmodInvitesIgnoredRoles": "The roles that will be ignored by the invites sub-system", + "selfmodLinksEnabled": "Whether the links filter selfmod sub-system is enabled or not.", + "selfmodLinksIgnoredChannels": "The channels that will be ignored by the links filter sub-system", + "selfmodLinksIgnoredRoles": "The roles that will be ignored by the links filters sub-system", + "selfmodLinksWhitelist": "The whitelisted links that are allowed", + "selfmodMessagesEnabled": "Whether Skyra should attempt to remove duplicated messages or not.", + "selfmodMessagesIgnoredChannels": "The channels that will be ignored by the duplicate messages sub-system", + "selfmodMessagesIgnoredRoles": "The roles that will be ignored by the duplicate messages sub-system", + "selfmodMessagesMaximum": "The amount of duplicated messages required in the queue before taking action The queue size is configurable in `selfmod.messages.queue-size`.", + "selfmodMessagesQueueSize": "The amount of messages Skyra will keep track of for the message duplication detection.", + "selfmodNewlinesEnabled": "Whether the new lines filter selfmod sub-system is enabled or not.", + "selfmodNewlinesIgnoredChannels": "The channels that will be ignored by the new lines sub-system", + "selfmodNewlinesIgnoredRoles": "The roles that will be ignored by the new lines sub-system", + "selfmodNewlinesMaximum": "The maximum amount of new lines before Skyra will start applying penalties", + "selfmodReactionsBlacklist": "The reactions that are blacklisted", + "selfmodReactionsEnabled": "Whether the reactions filter selfmod sub-system is enabled or not.", + "selfmodReactionsIgnoredChannels": "The channels that will be ignored by the reactions sub-system", + "selfmodReactionsIgnoredRoles": "The roles that will be ignored by the reactions sub-system", + "selfmodReactionsMaximum": "The maximum amount of reactions before I will start applying penalties", + "selfmodReactionsWhitelist": "The reactions that are whitelisted", + "socialAchieve": "Whether or not I should congratulate people who get a new leveled role.", + "socialAchieveMessage": "The congratulation message for people when they get a new leveled role. Requires `social.achieve` to be enabled.", + "socialEnabled": "Whether the social module should be enabled or not", + "socialIgnoreChannels": "The channels I should ignore when adding points.", + "socialMultiplier": "The multiplier to apply to the gain of points for users", + "starboardChannel": "The starboard channel. If you star a message, it will be posted there. Using the `setStarboardEmoji` command allows the emoji customization.", + "starboardIgnoreChannels": "The channels I should ignore when listening for new stars.", + "starboardMinimum": "The minimum amount of stars required before a message is posted to the starboard channel.", + "starboardSelfStar": "Whether the author's reaction should be included in the total star count", + "suggestionsChannel": "The channel where suggestions will be sent.", + "suggestionsEmojisDownvote": "The downvote emoji Skyra reacts with on every suggestion.", + "suggestionsEmojisUpvote": "The upvote emoji Skyra reacts with on every suggestion.", + "suggestionsOnActionDm": "If this setting is enabled, Skyra will DM the suggestion's author every time it is updated.", + "suggestionsOnActionHideAuthor": "This setting allows you to update suggestions anonymously. It will substitute the updater's name with either `An administrator` or `A moderator`, according to their permission level.", + "suggestionsOnActionRepost": "If this setting is enabled, Skyra will repost the suggestion's message every time it is updated. If it is disabled, it will edit the original message.", + "validationChooseKey": "You cannot configure a group, please pick one of the following keys: {{keys, andList}}.", + "validationMissingValue": "The value ``{{value}}`` was not set in the key **{{path}}**.", + "validationDuplicatedValue": "The value ``{{value}}`` was already set in the key **{{path}}**." +} diff --git a/src/languages/en-US/system.json b/src/languages/en-US/system.json new file mode 100644 index 00000000000..ebf78ce9239 --- /dev/null +++ b/src/languages/en-US/system.json @@ -0,0 +1,44 @@ +{ + "cannotAccessChannel": "I am sorry, but you do not have permission to see that channel.", + "channelNotPostable": "I am not allowed to send messages to this channel.", + "databaseError": "I wasn't able get that in my database! Please try again, or if the issue keeps happening join the support server (hint: use `Skyra, support`)", + "discordAbortError": "I had a small network error when messaging Discord, please run this command again!", + "error": "Something bad happened! Please try again, or if the issue keeps happening join the support server (hint: use `Skyra, support`)", + "exceededLengthChooseOutput": "Choose one of the following options: {{output, orList}}", + "exceededLengthOutput": "**Output**:{{output}}", + "exceededLengthOutputConsole": "Sent the result to console.", + "exceededLengthOutputConsoleWithTypeAndTime": "Sent the result to console.\n**Type**:{{type}}\n{{time}}", + "exceededLengthOutputFile": "Sent the result as a file.", + "exceededLengthOutputFileWithTypeAndTime": "Sent the result as a file.\n**Type**:{{type}}\n{{time}}", + "exceededLengthOutputHastebin": "Sent the result to hastebin: {{url}}", + "exceededLengthOutputHastebinWithTypeAndTime": "Sent the result to hastebin: {{url}}\n**Type**:{{type}}\n{{time}}", + "exceededLengthOutputWithTypeAndTime": "**Output**:{{output}}\n**Type**:{{type}}\n{{time}}", + "externalServerError": "The external service we use could not process our message. Please try again later.", + "fetchBansFail": "Failed to fetch bans. Do I have the **{{ADMINISTRATOR, permissions}}** permission?", + "helpTitles": { + "explainedUsage": "⚙ | ***Explained usage***", + "possibleFormats": "🔢 | ***Possible formats***", + "examples": "🔗 | ***Examples***", + "reminders": "⏰ | ***Reminder***" + }, + "highestRole": "This role's hierarchy position is higher or equal than me, I am not able to grant it to anyone.", + "jumpTo": "Jump to Message ►", + "loading": [ + "{{LOADING}} Watching hamsters run...", + "{{LOADING}} Finding people at hide-and-seek...", + "{{LOADING}} Trying to figure out this command...", + "{{LOADING}} Fetching data from the cloud...", + "{{LOADING}} Calibrating lenses...", + "{{LOADING}} Playing rock, paper, scissors...", + "{{LOADING}} Tuning in to the right frequencies...", + "{{LOADING}} Reticulating splines..." + ], + "messageNotFound": "I am sorry, but either you wrote the message ID incorrectly, or it got deleted.", + "noResults": "I wasn't able to find any results for that query", + "notEnoughParameters": "I am sorry, but you did not provide enough parameters...", + "parseError": "{{REDCROSS}} I failed to process the data I was given, sorry~!", + "pokedexExternalResource": "External Resources", + "poweredByWeebSh": "Powered by weeb.sh", + "prefixReminder": "The prefix in this guild is set to: `{{prefix}}`", + "queryFail": "I am sorry, but the application could not resolve your request. Are you sure you wrote the name correctly?" +} diff --git a/src/languages/es-ES.ts b/src/languages/es-ES.ts deleted file mode 100644 index 55d9e17066a..00000000000 --- a/src/languages/es-ES.ts +++ /dev/null @@ -1,5056 +0,0 @@ -/* eslint-disable @typescript-eslint/no-invalid-this, @typescript-eslint/member-ordering */ -import { VERSION } from '#root/config'; -import { Emojis } from '#utils/constants'; -import { CATEGORIES } from '#utils/Games/TriviaManager'; -import { random } from '#utils/util'; -import { DurationFormatter, TimeTypes } from '@sapphire/time-utilities'; -import { codeBlock, inlineCodeBlock, toTitleCase } from '@sapphire/utilities'; -import { Language, LanguageKeys, Timestamp, version as klasaVersion } from 'klasa'; - -const LOADING = Emojis.Loading; -const SHINY = Emojis.Shiny; -const GREENTICK = Emojis.GreenTick; -const REDCROSS = Emojis.RedCross; - -const timestamp = new Timestamp('DD/MM/YYYY [a las] HH:mm:ss'); - -const duration = new DurationFormatter({ - [TimeTypes.Year]: { - 1: 'año', - DEFAULT: 'años' - }, - [TimeTypes.Month]: { - 1: 'mes', - DEFAULT: 'meses' - }, - [TimeTypes.Week]: { - 1: 'semana', - DEFAULT: 'semanas' - }, - [TimeTypes.Day]: { - 1: 'día', - DEFAULT: 'días' - }, - [TimeTypes.Hour]: { - 1: 'hora', - DEFAULT: 'horas' - }, - [TimeTypes.Minute]: { - 1: 'minuto', - DEFAULT: 'minutos' - }, - [TimeTypes.Second]: { - 1: 'segundo', - DEFAULT: 'segundos' - } -}); - -export default class extends Language { - public PERMISSIONS = { - ADMINISTRATOR: 'Administrador', - VIEW_AUDIT_LOG: 'Ver el registro de auditoría', - MANAGE_GUILD: 'Administrar el Servidor', - MANAGE_ROLES: 'Administrar Roles', - MANAGE_CHANNELS: 'Administrar Canales', - KICK_MEMBERS: 'Expulsar Miembros', - BAN_MEMBERS: 'Banear Miembros', - CREATE_INSTANT_INVITE: 'Crear Invitación Instantánea', - CHANGE_NICKNAME: 'Cambiar apodo', - MANAGE_NICKNAMES: 'Administrar apodos', - MANAGE_EMOJIS: 'Administrar emojis', - MANAGE_WEBHOOKS: 'Administrar Webhooks', - VIEW_CHANNEL: 'Leer Mensajes', - SEND_MESSAGES: 'Enviar Mensajes', - SEND_TTS_MESSAGES: 'Enviar Mensajes de TTS', - MANAGE_MESSAGES: 'Administrar Mensajes', - EMBED_LINKS: 'Insertar Enlaces', - ATTACH_FILES: 'Adjuntar Archivos', - READ_MESSAGE_HISTORY: 'Leer el historial de mensajes', - MENTION_EVERYONE: 'Mencionar a todos', - USE_EXTERNAL_EMOJIS: 'Usar Emojis externos', - ADD_REACTIONS: 'Añadir reacciones', - CONNECT: 'Conectar', - SPEAK: 'Hablar', - STREAM: 'Conectar en Vivo', - MUTE_MEMBERS: 'Silenciar Miembros', - DEAFEN_MEMBERS: 'Ensordecer Miembros', - MOVE_MEMBERS: 'Mover Miembros', - USE_VAD: 'Usar la actividad de voz', - PRIORITY_SPEAKER: 'Orador Prioritario', - VIEW_GUILD_INSIGHTS: 'View Guild Insights' - }; - - public HUMAN_LEVELS = { - NONE: 'Ninguno', - LOW: 'Bajo', - MEDIUM: 'Medio', - HIGH: 'Alto', - VERY_HIGH: 'Muy alto' - }; - - public duration(time: number, precision?: number) { - return duration.format(time, precision); - } - - /** Parses cardinal numbers to the ordinal counterparts */ - public ordinal(cardinal: number) { - const dec = cardinal % 10; - - switch (dec) { - case 1: - return `${cardinal}ro`; - case 2: - return `${cardinal}do`; - case 3: - return `${cardinal}ro`; - case 0: - case 7: - return `${cardinal}mo`; - case 8: - return `${cardinal}vo`; - case 9: - return `${cardinal}no`; - default: - return `${cardinal}to`; - } - } - - public list(values: readonly string[], conjunction: 'o' | 'y') { - switch (values.length) { - case 0: - return ''; - case 1: - return values[0]; - case 2: - return `${values[0]} ${conjunction} ${values[1]}`; - default: { - const trail = values.slice(0, -1); - const head = values[values.length - 1]; - return `${trail.join(', ')}, ${conjunction} ${head}`; - } - } - } - - public groupDigits(number: number) { - return number.toLocaleString(this.name, { useGrouping: true }); - } - - public language: LanguageKeys = { - /** - * ################################ - * # FRAMEWORK MESSAGES # - * # KLASA 0.5.0d # - * ################################ - */ - - default: ({ key }) => `La clave ${key} aún no ha sido traducida a es-ES.`, - defaultLanguage: 'Lenguaje Predeterminado', - globalYes: 'Si', - globalNo: 'No', - globalNone: 'Ninguno', - globalIs: 'es', - globalAnd: 'y', - globalOr: 'o', - globalUnknown: 'Unknown', - settingGatewayKeyNoext: ({ key }) => `The key "${key}" does not exist in the data schema.`, - settingGatewayChooseKey: ({ keys }) => `You cannot edit a settings group, pick any of the following: "${keys}"`, - settingGatewayUnconfigurableFolder: 'This settings group does not have any configurable sub-key.', - settingGatewayUnconfigurableKey: ({ key }) => `The settings key "${key}" has been marked as non-configurable by the bot owners.`, - settingGatewayMissingValue: ({ path, value }) => `The value "${value}" cannot be removed from the key "${path}" because it does not exist.`, - settingGatewayDuplicateValue: ({ path, value }) => `The value "${value}" cannot be added to the key "${path}" because it was already set.`, - settingGatewayInvalidFilteredValue: ({ path, value }) => `The settings key "${path}" does not accept the value "${value}".`, - resolverBoolFalseOptions: ['falso', 'f', 'no', 'n', 'off', 'desactiva', 'desactivar', 'desactivado', '0', '-'], - resolverBoolTrueOptions: ['verdadero', 'v', 'si', 'sí', 's', 'on', 'activa', 'activar', 'activado', '1', '+'], - resolverBoolEnabled: 'Activado', - resolverBoolDisabled: 'Desactivado', - resolverMultiTooFew: ({ name, min, conjunctionWord }) => - `No pude resolver suficientes ${name}s. Al menos ${min} ${conjunctionWord} requeridos.`, - resolverInvalidBool: ({ name }) => `${name} debe ser o 'true' para afirmativo, o 'false' para negativo.`, - resolverInvalidChannel: ({ name }) => `${name} debe ser una mención de canal o una id de canal válida.`, - resolverInvalidCustom: ({ name, type }) => `${name} debe ser un válido ${type}.`, - resolverInvalidDate: ({ name }) => `${name} debe ser una fecha válida.`, - resolverInvalidDuration: ({ name }) => `${name} debe ser una duración válida.`, - resolverInvalidEmoji: ({ name }) => `${name} debe ser un emoji o una id de emoji válida.`, - resolverInvalidFloat: ({ name }) => `${name} debe ser un número válido.`, - resolverInvalidGuild: ({ name }) => `${name} debe ser una id de servidor válida.`, - resolverInvalidInt: ({ name }) => `${name} debe ser un número entero válido.`, - resolverInvalidInvite: ({ name }) => `${name} debe ser una invitación de servidor válida.`, - resolverInvalidWager: ({ bet, validAmounts }) => - `Lo siento, pero ${bet} ${SHINY} es una cantidad no válida para apostar. Puedes apostar una de las siguientes cantidades ${validAmounts}`, - resolverInvalidLiteral: ({ name }) => `La opción no coincide con la única posibilidad: ${name}`, - resolverInvalidMember: ({ name }) => `${name} debe ser una mención de usuario o una id de usuario válida.`, - resolverInvalidMessage: ({ name }) => `${name} debe ser una id de mensaje válida.`, - resolverInvalidPiece: ({ name, piece }) => `${name} debe ser un nombre de ${piece} válido.`, - resolverInvalidRegexMatch: ({ name, pattern }) => `${name} debe combinar con el siguiente patrón \`${pattern}\`.`, - resolverInvalidRole: ({ name }) => `${name} debe ser una mención de rol o una id de rol válida.`, - resolverInvalidString: ({ name }) => `${name} debe ser un texto no vacío válido.`, - resolverInvalidTime: ({ name }) => `${name} debe ser una duración o fecha válida.`, - resolverInvalidUrl: ({ name }) => `${name} debe ser un enlace válido.`, - resolverInvalidUser: ({ name }) => `${name} debe ser una mención o una id de usuario válida.`, - resolverInvalidSnowflake: ({ name }) => `${name} debe ser un snowflake válido de Discord.`, - resolverInvalidStore: ({ store }) => `${store} debe ser una tienda válido.`, - resolverStringSuffix: ' carácteres', - resolverMinmaxExactlyInclusive: ({ name, min }) => `${name} must be exactly ${min}.`, - resolverMinmaxExactlyExclusive: ({ name, min }) => `${name} must be exactly ${min}.`, - resolverMinmaxBothInclusive: ({ name, min, max }) => `${name} must be between ${min} and ${max} inclusively.`, - resolverMinmaxBothExclusive: ({ name, min, max }) => `${name} must be between ${min} and ${max} exclusively.`, - resolverMinmaxMinInclusive: ({ name, min }) => `${name} must be greater than ${min} inclusively.`, - resolverMinmaxMinExclusive: ({ name, min }) => `${name} must be greater than ${min} exclusively.`, - resolverMinmaxMaxInclusive: ({ name, max }) => `${name} must be less than ${max} inclusively`, - resolverMinmaxMaxExclusive: ({ name, max }) => `${name} must be less than ${max} exclusively.`, - reactionhandlerPrompt: '¿A qué página te gustaría saltar?', - systemHelpTitles: { - explainedUsage: '⚙ | ***Uso Explicado***', - possibleFormats: '🔢 | ***Formatos Posibles***', - examples: '🔗 | ***Ejemplos***', - reminders: '⏰ | ***Recordatorio***' - }, - commandmessageMissing: 'Faltan uno o más argumentos al final de la entrada.', - commandmessageMissingRequired: ({ name }) => `El argumento ${name} es requerido.`, - commandmessageMissingOptionals: ({ possibles }) => `Falta una opción requerida: (${possibles})`, - commandmessageNomatch: ({ possibles }) => `Su opción no se pudo encontrar en ninguna de las posibilidades: (${possibles})`, - monitorCommandHandlerReprompt: ({ tag, name, time, cancelOptions }) => - `${tag} | **${name}** | Tienes **${time}** segundos para responder a este mensaje con un argumento válido. Escribe **${cancelOptions}** para cancelar la solicitud.`, - monitorCommandHandlerRepeatingReprompt: ({ tag, name, time, cancelOptions }) => - `${tag} | El argumento **${name}** puede aceptar multiples valores | Tienes **${time}** segundos para responder a esta solicitud con valores adicionales. Escribe **${cancelOptions}** para cancelar la solicitud.`, - monitorCommandHandlerAborted: 'Cancelado.', - inhibitorCooldown: ({ remaining }) => `Acabas de usar este comando. Puedes usarlo de nuevo en ${remaining}.`, - inhibitorMissingBotPerms: ({ missing }) => `No tengo los permisos suficientes, me faltan: ${missing}`, - inhibitorNsfw: 'Este comando no es apto para este canal, no es un canal marcado como "NSFW"', - inhibitorPermissions: 'No tienes permisos para usar este comando', - inhibitorRequiredSettings: ({ settings }) => - `El servidor requiere el ajuste del servidor **${settings}**, y por lo tanto, no puedo ejecutar el comando.`, - inhibitorRequiredSettingsPlural: ({ settings }) => - `El servidor requiere los ajustes del servidor **${settings}**, y por lo tanto, no puedo ejecutar el comando.`, - inhibitorRunin: ({ type }) => `Éste comando sólo está disponible en los canales de ${type}`, - inhibitorRuninNone: ({ name }) => `El comando ${name} no está configurado para ejecutarse en algún canal.`, - inhibitorDisabledGuild: 'This command has been disabled by an admin in this guild!.', - inhibitorDisabledGlobal: - 'This command has been globally disabled by the bot owners. Want to know why and find out when it will be back? Join the official Skyra server: https://join.skyra.pw', - commandBlocklistDescription: 'Bloquear o permitir que usuarios y gremios utilicen mis funcionalidades.', - commandBlocklistSaveSuccess: `${GREENTICK} Successfully updated blocked users and/or guilds`, - commandBlocklistResetSuccess: `${GREENTICK} Successfully reset blocked users and guilds`, - commandUnload: ({ type, name }) => `${GREENTICK} Eliminado con éxito la pieza tipo ${type}: ${name}`, - commandUnloadDescription: 'Elimina una pieza de Klasa.', - commandTransferError: `${REDCROSS} El archivo ya había sido transferido o nunca existió.`, - commandTransferSuccess: ({ type, name }) => `${GREENTICK} Transferido con éxito la pieza tipo ${type}: ${name}`, - commandTransferFailed: ({ type, name }) => - `La transferencia de la pieza tipo ${type}: ${name} al cliente falló. Por favor revisa la consola.`, - commandTransferDescription: 'Transfiere una pieza interna a su carpeta respectiva.', - commandReload: ({ type, name, time }) => `${GREENTICK} Recargada la pieza tipo ${type}: ${name}. (Tomó: ${time})`, - commandReloadFailed: ({ type, name }) => `${REDCROSS} La recarga de la pieza tipo ${type}: ${name} falló. Por favor revisa su consola.`, - commandReloadAll: ({ type, time }) => `${GREENTICK} Recargadas todas las piezas tipo ${type}. (Tomó: ${time})`, - commandReloadEverything: ({ time }) => `${GREENTICK} Recargado todo. (Tomó: ${time})`, - commandReloadDescription: 'Recarga una pieza de Klasa, o todas las piezas de su lista.', - commandReboot: `${LOADING} Reiniciando...`, - commandRebootDescription: 'Reinicia el bot.', - commandPing: `${LOADING} Ping?`, - commandPingDescription: 'Establece una prueba de conexión con Discord.', - commandPingPong: ({ diff, ping }) => `Pong! (El viaje ida y vuelta tomó: ${diff}ms. Pulso: ${ping}ms.)`, - commandInfoDescription: 'Muestra alguna información sobre mí.', - commandHelpDescription: 'Muestra la ayuda para un comando o todos.', - commandHelpNoExtended: 'No está documentado completamente.', - commandHelpDm: '📥 | La lista de comandos ha sido enviada a tus mensajes privados.', - commandHelpNodm: `${REDCROSS} | Parece que tienes tus mensajes privados desactivados, no pude mandarte el mensaje.`, - commandHelpAllFlag: ({ prefix }) => - `Mostrando una categoría por página. ¿Problemas con el mensaje? Envía \`${prefix}help --all\` para la lista de todos los comandos en tus Mensajes Directos.`, - commandHelpCommandCount: ({ count }) => `${count} comando`, - commandHelpCommandCountPlural: ({ count }) => `${count} comandos`, - commandEnable: ({ type, name }) => `+ Activado con éxito la pieza tipo ${type}: ${name}`, - commandEnableDescription: 'Re-activa o activa temporalmente una pieza de Klasa. El estado por defecto es restaurado al recargar.', - commandDisable: ({ type, name }) => `+ Desactivado con éxito la pieza tipo ${type}: ${name}`, - commandDisableDescription: 'Re-desactiva o desactiva temporalmente una pieza de Klasa. El estado por defecto es restaurado al recargar.', - commandDisableWarn: 'Probablemente no quieras desactivar eso, ya que no tendrías ningún comando para re-activarlo.', - commandConfNoKey: 'Debes proveer el nombre de una clave.', - commandConfNoValue: 'Debes proveer un valor para la clave.', - commandConfGuarded: ({ name }) => `La pieza ${toTitleCase(name)} no debería ser desactivada.`, - commandConfUpdated: ({ key, response }) => `Actualizado con éxito la clave **${key}** al valor: \`${response}\`.`, - commandConfKeyNotArray: "Esta clave no acepta múltiples valores. Usa la acción 'reset' en su lugar.", - commandConfGetNoExt: ({ key }) => `The key **${key}** does not seem to exist.`, - commandConfGet: ({ key, value }) => `The value for the key **${key}** is: \`${value}\``, - commandConfReset: ({ key, value }) => `The key **${key}** has been reset to: \`${value}\``, - commandConfNochange: ({ key }) => `The value for **${key}** was already that value.`, - commandConfServerDescription: 'Define per-server settings.', - commandConfServer: ({ key, list }) => `**Server Setting ${key}**\n${list}`, - commandConfUserDescription: 'Define per-user settings.', - commandConfDashboardOnlyKey: ({ key }) => `\`${key}\` can only be configured through the web dashboard ()`, - commandConfUser: ({ key, list }) => `**User Setting ${key}**\n${list}`, - commandConfSettingNotSet: 'No Establecido', - messagePromptTimeout: 'La solicitud no recibió ninguna respuesta a tiempo.', - textPromptAbortOptions: ['abortar', 'parar', 'cancelar'], - commandLoad: ({ time, type, name }) => `${GREENTICK} Successfully loaded ${type}: ${name}. (Took: ${time})`, - commandLoadFail: 'The file does not exist, or an error occurred while loading your file. Please check your console.', - commandLoadError: ({ type, name, error }) => `${REDCROSS} Failed to load ${type}: ${name}. Reason:${codeBlock('js', error)}`, - commandLoadDescription: 'Load a piece from your bot.', - - /** - * ################################ - * # COMMAND DESCRIPTIONS # - * ################################ - */ - - argumentRangeInvalid: ({ name }) => `${name} debe ser un número o un rango de números.`, - argumentRangeMax: ({ name, maximum }) => `El argumento ${name} acepta un rango de máximo ${maximum} 'número`, - argumentRangeMaxPlural: ({ name, maximum }) => `El argumento ${name} acepta un rango de máximo ${maximum} 'números`, - - commandAddDescription: 'Añade una canción a la cola.', - commandAddExtended: { - extendedHelp: [ - `¡Agregue canciones a la lista de reproducción y prepárese para el concierto! - Puedo reproducir desde YouTube, Bandcamp, SoundCloud, Twitch, Vimeo o Mixer.`, - '- Para reproducir desde YouTube, dame algo para buscar, un enlace de video o un enlace de lista de reproducción.', - '- Para reproducir desde SoundCloud, dame un enlace de SoundCloud, o si quieres que busque, incluya `--sc` o` --soundcloud` en su mensaje.', - '- Para reproducir desde Mixer, escribe la URL de un streamer de Mixer, lo siento pero no puedo (todavía) reproducir VODs.', - '- Para reproducir desde Bandcamp, Twitch o Vimeo, solo necesita escribir un enlace a un video o lista de reproducción.', - '- Para reproducir una cola previamente exportada, incluya `--import` y adjunte el archivo de la lista a su mensaje o deme de URL a la.' - ], - explainedUsage: [['song', 'La canción para incluirlo en la cola. Puede ser un enlace o el nombre de un vídeo o tema musical.']], - examples: [ - 'The Pokémon Theme song', - 'https://youtu.be/fJ9rUzIMcZQ', - '--sc Imagine Dragons Believer', - 'https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix', - 'https://vimeo.com/channels/music/239029778', - 'https://mixer.com/Ninja', - 'https://thedisappointed.bandcamp.com/album/escapism-2', - '--import https://cdn.skyra.pw/favsongs.squeue' - ], - multiline: true - }, - commandAddPlaylist: ({ songs }) => `🎵 Añadida ${songs} a la cola 🎶`, - commandAddPlaylistSongs: () => `**una** canción`, - commandAddPlaylistSongsPlural: ({ count }) => `**${count}** canciones`, - commandAddSong: ({ title }) => `🎵 Añadida la canción **${title}** a la cola 🎶`, - commandClearDescription: 'Borra las canciones de la cola.', - commandClearDenied: '¡No puedes ejecutar este comando mientras que hayan más de 4 usuarios! ¡Debes ser el Dj de esta fiesta!', - commandClearSuccess: () => '🗑 Una canción fue borrada de la cola.', - commandClearSuccessPlural: ({ count }) => `🗑 ${count} canciones fueron borradas de la cola.`, - commandExportQueueDescription: 'Exports your queue to a `.squeue` file.', - commandExportQueueExtended: { - extendedHelp: [ - "Have a queue you liked and want to replay later? Or maybe you want to send your friends what you're listening right now", - "Use `exportqueue` and I'll pack the music in your queue into a neat file you can either save or share with your friends!", - 'When you want to play it back, just use it with `play`, `add` or `importqueue`!' - ], - reminder: 'If your queue is longer than 100 words, I will only include the first 100, to prevent abuse of my systems', - multiline: true - }, - commandExportQueueSuccess: ({ guildName }) => `${GREENTICK} Here's the current queue for ${guildName}!`, - commandImportQueueDescription: 'Imports a queue saved as an `.squeue` file.', - commandImportQueueExtended: { - extendedHelp: [ - 'Did a friend send you a queue? Or you maybe want to play back a queue you have saved?', - 'With `importqueue`, I can load the queue for you, and then you can jam to your favourite tracks!' - ], - reminder: 'You can either give me a link to the `.squeue` file, or attach it along your commands!', - multiline: true - }, - - commandJoinDescription: 'Unirse al canal de voz del autor del mensaje.', - commandJoinNoMember: - 'Lo siento, pero Discord no me ha mandado la información necesaria que necesito para saber en qué canal de voz estás conectado/a...', - commandJoinNoVoicechannel: 'No estás conectado/a a un canal de voz.', - commandJoinSuccess: ({ channel }) => `Me he conectado con éxito al canal de voz ${channel}`, - commandJoinVoiceDifferent: 'Lo siento, pero estoy reproduciendo música en otro canal de voz. ¡Intenta de nuevo más tarde o únete a ellos!', - commandJoinVoiceFull: 'No puedo unirme a tu canal de voz, está lleno... ¡echa a alguien con las botas o haz espacio para mí!', - commandJoinVoiceNoConnect: - 'No tengo suficientes permisos para unirme a tu canal de voz, necesito el permiso para conectarme a canales de voz.', - commandJoinVoiceNoSpeak: 'Puedo conectarme... pero no hablar. Por favor dame permisos para hablar.', - commandJoinVoiceSame: '¡Sube el volumen! ¡Ya estoy reproduciendo música ahí!', - commandJoinFailed: `${REDCROSS} I could not join your voice channel because there is something wrong with my music player. Please join the support server by using \`@Skyra support\` and alert my developers.`, - commandLeaveDescription: 'Desconecta del canal de voz.', - commandLeaveExtended: { - extendedHelp: [ - 'Use este comando para que Skyra deje el canal de voz actual.', - 'Por defecto, dejaré el canal, me olvidaré de la canción que se está reproduciendo actualmente, ero dejaré la cola intacta.', - 'Esto significa que una vez que hagas Skyra, `play`', - 'después del comando de salida, continuaré tocando con la primera canción que estaba en la cola antes de irme.', - '', - 'Este comportamiento predeterminado se puede modificar con banderas:', - '`--removeall` o `--ra` para seguir el comportamiento predeterminado, así como borrar la cola, la próxima vez que quieras que comience a jugar tendrás que crear una nueva cola' - ], - examples: ['leave', 'leave --removeall', 'leave --ra', 'leave --soft'], - multiline: true - }, - commandLeaveSuccess: ({ channel }) => `Me he desconectado con éxito del canal de voz ${channel}`, - commandPauseDescription: 'Pausa la canción actual.', - commandPauseSuccess: '⏸ Pausado.', - commandPlayDescription: '¡Empecemos la cola!', - commandPlayExtended: { - extendedHelp: [ - `Ponga música en cola y permítame comenzar a improvisar para su disfrute. - Cuando use este comando, me uniré automáticamente a su canal de voz y comenzaré a reproducir la primera canción en la cola. - Puedo reproducir desde YouTube, Bandcamp, SoundCloud, Twitch, Vimeo o Mixer.`, - '- Para reproducir desde YouTube, dame algo para buscar, un enlace de video o un enlace de lista de reproducción.', - '- Para reproducir desde SoundCloud, dame un enlace de SoundCloud, o si quieres que busque, incluya `--sc` o` --soundcloud` en su mensaje.', - '- Para reproducir desde Mixer, escribe la URL de un streamer de Mixer, lo siento pero no puedo (todavía) reproducir VODs.', - '- Para reproducir desde Bandcamp, Twitch o Vimeo, solo necesita escribir un enlace a un video o lista de reproducción.', - '- Para reproducir una cola previamente exportada, incluya `--import` y adjunte el archivo de la lista a su mensaje o deme de URL a la.' - ], - explainedUsage: [['song', 'La canción para incluirlo en la cola. Puede ser un enlace o el nombre de un vídeo o tema musical.']], - examples: [ - 'The Pokémon Theme song', - 'https://youtu.be/fJ9rUzIMcZQ', - '--sc Imagine Dragons Believer', - 'https://soundcloud.com/vladkurt/imagine-dragons-beliver-vladkurt-remix', - 'https://vimeo.com/channels/music/239029778', - 'https://mixer.com/Ninja', - 'https://thedisappointed.bandcamp.com/album/escapism-2' - ], - reminder: 'Before you can use this command you should join a voice channel!', - multiline: true - }, - commandPlayEnd: '⏹ Del 1 al 10, siendo 1 la peor puntuación y 10 la mejor, ¿cómo valorarías la sesión? ¡Ya ha terminado!', - commandPlayNext: ({ title, requester }) => `🎧 Reproduciendo: **${title}**, pedida por: **${requester}**`, - commandPlayQueuePaused: ({ song }) => `¡Había una canción pausada! ¡Reproduciéndolo ahora! Ahora reproduciendo: ${song}!`, - commandPlayQueuePlaying: '¡Ey! ¡El disco ya está girando!', - commandPlayQueueEmpty: - 'The session is over, add some songs to the queue, you can for example do `Skyra, add Imperial March`, and... *dumbrolls*!', - commandPlayingDescription: 'Obtén información de la canción actual.', - commandPlayingDuration: ({ duration }) => `**Duración**: ${duration}`, - commandPlayingQueueEmpty: '¿Es conmigo? Porque no hay nada en reproducción...', - commandPlayingQueueNotPlaying: 'Creo que estás escuchando ruido de fondo, no estoy reproduciendo nada.', - commandRepeatDescription: 'Se alterna repitiendo la canción actual.', - commandRepeatSuccessEnabled: "This is your JAM isn't it? No te preocupes, repetiremos esto una y otra vez!", - commandRepeatSuccessDisabled: 'En realidad, también me estaba cansando de esto, pero no quería decir nada.', - commandQueueDescription: 'Check the queue list.', - commandQueueLast: 'There are no more songs! After the one playing is over, the session will end!', - commandQueueTitle: ({ guildname }) => `Music queue for ${guildname}`, - commandQueueLine: ({ position, duration, title, url, requester }) => - `**[\`${position}\`]** │ \`${duration}\` │ [${title}](${url}) │ Requester: **${requester}**.`, - commandQueueNowplaying: ({ title, url, requester }) => `[${title}](${url})\nRequester: **${requester}**`, - commandQueueNowplayingLiveStream: 'Live Stream', - commandQueueNowplayingTimeRemaining: ({ timeRemaining }) => `🕰 Tiempo restante: ${timeRemaining}.`, - commandQueueNowplayingTitle: 'Now Playing:', - commandQueueTotalTitle: 'Total songs:', - commandQueueTotal: ({ songs, remainingTime }) => `${songs} in the queue, with a total duration of ${remainingTime}`, - commandQueueEmpty: 'parece que nada se está reproduciendo en este momento y la cola está vacía, ¿por qué no inicias el disco?', - commandQueueDashboardInfo: ({ guild }) => - `¿Sabías que también puedes administrar tu música usando una aplicación web elegante? [Haga clic aquí para ir allí](https://skyra.pw/music/${guild.id})`, - commandRemoveDescription: 'Elimina una canción de la lista de cola.', - commandRemoveIndexInvalid: 'mira, no soy una experta en mates, pero esperaba un número igual o mayor que 1...', - commandRemoveIndexOutOfBounds: ({ songs }) => `he intentado acceder a esa canción por tí, ¡pero sólo tengo ${songs} en mi mesa!`, - commandRemoveDenied: [ - 'Lo veo un poco rudo el borrar la canción de alguien de la lista... Habla con ellos para quitarla o', - 'grita al DJ si hay uno en este servidor, si la canción arruina la fiesta, ¡entonces ellos probablemente lo consideren!' - ].join(' '), - commandRemoveSuccess: ({ title, requester }) => `🗑 Borrada la canción **${title}**, pedida por <@${requester}>, de la cola.`, - commandSeekDescription: 'Change the player time for the current song.', - commandSeekSuccess: ({ time }) => `${GREENTICK} Successfully changed the time! Now at ${this.duration(time)}!`, - commandResumeDescription: 'Reanuda la canción actual.', - commandResumeSuccess: '▶ Reanudado.', - commandRolesetDescription: 'Gestionar conjuntos de roles únicos.', - commandRolesetExtended: { - extendedHelp: [ - 'A role set is a group of roles Skyra identifies as unique for all members in the server, i.e. a roleset named "region" could have the roles `Africa`, `America`, `Asia`, and `Europe`, and members will only be able to have one of them. This is like a kind of "rule" that is applied in the three following situations:', - '', - '- When somebody claims a role via the `Skyra, roles`.', - '- When somebody claims a role via reaction roles.', - '- When somebody receives a role either manually or from another bot.' - ], - explainedUsage: [ - ['add', 'Create a new roleset or add a role to an existing one.'], - ['remove', 'Remove a role from an existing roleset.'], - ['reset', 'Removes all roles from a roleset or, if not specified, all existing rolesets.'], - ['list', 'Lists all rolesets.'], - ['auto', 'Adds or removes a roleset.'] - ], - examples: [ - 'add regions America', - 'add regions Africa America Asia Europe', - 'remove regions America', - 'reset', - 'reset regions', - 'list', - 'regions America', - 'regions Africa America Asia Europe' - ], - reminder: 'This command can add and/or remove multiple roles at the same time.', - multiline: true - }, - commandRolesetCreated: ({ name, roles }) => `El conjunto de roles único ${name} se ha creado con los siguientes roles: ${roles}`, - commandRolesetAdded: ({ name, roles }) => `El conjunto de roles único ${name} ahora también tiene los siguientes roles: ${roles}.`, - commandRolesetInvalidName: ({ name }) => `No puede eliminar el conjunto de roles único ${name} porque no existe.`, - commandRolesetRemoved: ({ name, roles }) => `El conjunto de roles único ${name} ya no incluirá los siguientes roles:${roles}`, - commandRolesetResetEmpty: `${REDCROSS} There are no rolesets configured in this groupo.`, - commandRolesetResetAll: `${GREENTICK} Successfully removed all rolesets.`, - commandRolesetResetNotExists: ({ name }) => `${REDCROSS} The roleset \`${name}\` does not exist in this server.`, - commandRolesetResetGroup: ({ name }) => `${GREENTICK} Successfully removed the roleset \`${name}\` from this server.`, - commandRolesetUpdated: ({ name }) => `El conjunto de roles único ${name} se ha actualizado.`, - commandRolesetNoRolesets: 'No tienes conjuntos de roles.', - commandShuffleDescription: 'Aleatoriza el orden de las canciones en la cola.', - commandShuffleSuccess: ({ amount }) => `${GREENTICK} Canciones aleatorias exitosas de ${amount}.`, - commandSkipDescription: 'Salta la canción actual.', - commandSkipPermissions: 'No puedes ejecutar este comando, debes ser un DJ o un Moderador.', - commandSkipVotesVoted: 'Ya has votado para saltar esta canción.', - commandSkipVotesTotal: ({ amount, needed }) => `🔸 | Votos: ${amount} de ${needed}`, - commandSkipSuccess: ({ title }) => `⏭ Saltada la canción ${title}.`, - commandPlayingTimeDescription: 'Revisa cuánto tiempo falta para terminar la canción.', - commandPlayingTimeQueueEmpty: '¿Es conmigo? La cola está vacía...', - commandPromoteDescription: 'Promociona una canción al frente de la fila', - commandPromoteExtended: { - explainedUsage: [['number', 'El índice en la cola para ascender al frente. Usa `Skyra, queue` para encontrar el índice de una canción']], - examples: ['5'], - reminder: 'Este comando requiere que seas DJ o moderador para usarlo' - }, - commandPromoteSuccess: ({ title, url }) => `${GREENTICK} **${title}** (<${url}>) promovido con éxito a la parte superior de la cola`, - commandVolumeDescription: 'Controla el volumen para la canción.', - commandVolumeSuccess: ({ volume }) => `📢 Volumen: ${volume}%`, - commandVolumeChanged: ({ emoji, volume }) => `${emoji} Volumen ajustado a: ${volume}%`, - commandVolumeChangedExtreme: ({ emoji, text, volume }) => `${emoji} ${text} ajustado a: ${volume}%`, - commandVolumeChangedTexts: ['**VOLUMEN EXTREMO**', '**VOLUMEN TIPO NACELLE DE AVIÓN**', '**VOLUMEN TIPO LANZAMIENTO DE FALCON HEAVY**'], - - inhibitorMusicQueueEmpty: `${REDCROSS} ¡La cola está sin discos! ¡Añade algunas canciones así podemos empezar una fiesta!`, - inhibitorMusicNotPlaying: `${REDCROSS} Hmm, no parece que esté jugando nada ahora.`, - inhibitorMusicPaused: `${REDCROSS} ¡El disco ya está girando y la fiesta está en marcha hasta que termine la noche!`, - inhibitorMusicDjMember: `${REDCROSS} ¡Creo que esto es algo que sólo un moderador o un administrador de la fiesta pueden hacer!`, - inhibitorMusicUserVoiceChannel: `${REDCROSS} ¡Ey! Necesito que te unas a un canal de voz antes para usar este comando!`, - inhibitorMusicBotVoiceChannel: `${REDCROSS} Temo que necesito estar en un canal de voz antes de poder usar este comando, ¡por favor muéstreme el camino!`, - inhibitorMusicBothVoiceChannel: `${REDCROSS} ¡Hey! Parece que no estamos en el mismo canal de voz, ¡por favor únete conmigo!`, - inhibitorMusicNothingPlaying: `${REDCROSS} Parece que no hay nada en este momento, ¿qué tal si comienzas la fiesta 🎉?`, - - musicManagerFetchNoArguments: '¡Necesito que me des el nombre de una canción!', - musicManagerFetchNoMatches: 'Lo siento, ¡pero no he sido capaz de encontrar la canción que querías', - musicManagerFetchLoadFailed: 'Lo siento, ¡pero no he podido cargar esta canción! Por si acaso, ¡intenta con otra canción!', - musicManagerImportQueueError: `${REDCROSS} Sorry, but I'm having issues trying to import that playlist. Are you sure it's from my own DJ deck?`, - musicManagerImportQueueNotFound: `${REDCROSS} I need a queue to import!`, - musicManagerTooManySongs: `${REDCROSS} ¡Ah, estás agregando más canciones de las permitidas!`, - musicManagerSetvolumeSilent: 'Woah, ¡podrías simplemente salir del canal de voz si quieres silencio!', - musicManagerSetvolumeLoud: 'Seré honesta, ¡las turbinas de un avión serían menos ruidosos que esto!', - musicManagerPlayNoSongs: '¡No hay más canciones en la cola!', - musicManagerPlayPlaying: 'Los discos están girando, ¿no los escuchas?', - musicManagerStuck: ({ milliseconds }) => - `${LOADING} Espera un momento, he tenido un pequeño problema. ¡Estaré de vuelta en: ${this.duration(milliseconds)}!`, - - commandConfMenuNopermissions: `I need the permissions ${this.PERMISSIONS.ADD_REACTIONS} and ${this.PERMISSIONS.MANAGE_MESSAGES} to be able to run the menu.`, - commandConfMenuRenderAtFolder: ({ path }) => `Currently at: 📁 ${path}`, - commandConfMenuRenderAtPiece: ({ path }) => `Currently at: ⚙️ ${path}`, - commandConfMenuRenderNokeys: 'There are no configurable keys for this folder', - commandConfMenuRenderSelect: 'Please select any of the following entries', - commandConfMenuRenderTctitle: 'Text Commands:', - commandConfMenuRenderUpdate: '• Update Value → `set `', - commandConfMenuRenderRemove: '• Remove Value → `remove `', - commandConfMenuRenderReset: '• Reset Value → `reset`', - commandConfMenuRenderUndo: '• Undo Update → `undo`', - commandConfMenuRenderCvalue: ({ value }) => `Current Value: **\`\`${value}\`\`**`, - commandConfMenuRenderBack: 'Press ◀ to go back', - commandConfMenuInvalidKey: 'Invalid Key, please try again with any of the following options.', - commandConfMenuInvalidAction: 'Invalid Action, please try again with any of the following options.', - commandConfMenuSaved: 'Successfully saved all changes.', - - settingsPrefix: - 'A prefix is an affix that is added in front of the word, in this case, the message. It allows bots to distinguish between a regular message and a command.', - settingsLanguage: 'The language I will use for your server. It may not be available in the language you want.', - settingsDisablenaturalprefix: 'Whether or not I should listen for my natural prefix, `Skyra,`', - settingsDisabledcommands: - 'The disabled commands, core commands may not be disabled, and moderators will override this. All commands must be in lower case.', - settingsChannelsAnnouncements: - 'The channel for announcements, in pair with the key `roles.subscriber`, they are required for the announce command.', - settingsChannelsFarewell: - 'The channel I will use to send farewells, you must enable the events and set up the messages, in other categories.', - settingsChannelsGreeting: - 'The channel I will use to send greetings, you must enable the events and set up the messages, in other categories.', - settingsChannelsImageLogs: 'The channel I will use to re-upload all images I see.', - settingsChannelsMemberLogs: - 'The channel for member logs, you must enable the events (`events.memberAdd` for new members, `events.memberRemove` for members who left).', - settingsChannelsMessageLogs: - 'The channel for (non-NSFW) message logs, you must enable the events (`events.messageDelete` for deleted messages, `events.messageEdit` for edited messages).', - settingsChannelsModerationLogs: - 'The channel for moderation logs, once enabled, I will post all my moderation cases there. If `events.banRemove` and/or `events.banRemove` are enabled, I will automatically post anonymous logs.', - settingsChannelsNsfwMessageLogs: - 'The channel for NSFW message logs, same requirement as normal message logs, but will only send NSFW messages.', - settingsChannelsPruneLogs: 'The channel for prune logs, same requirement as normal mesasge logs, but will only send prune messages.', - settingsChannelsReactionLogs: - "The channel for the reaction logs, same requirement as normal message logs, but will only send message reactions. If you don't want twemojis to be logged you can toggle `events.twemoji-reactions`.", - settingsChannelsRoles: 'The channel for the reaction roles.', - settingsChannelsSpam: 'The channel for me to redirect users to when they use commands I consider spammy.', - settingsChannelsIgnoreMessageDelete: 'Channels I should ignore when checking for deleted messages to log.', - settingsChannelsIgnoreMessageEdit: 'Channels I should ignore when checking for edited messags to log.', - settingsChannelsIgnoreReactionAdd: 'Channels I should ignore when checking for added reactions.', - settingsChannelsIgnoreAll: 'Channels I should ignore for all types of logging.', - settingsDisabledchannels: - 'A list of channels for disabled commands, for example, setting up a channel called general will forbid all users from using my commands there. Moderators+ override this purposedly to allow them to moderate without switching channels.', - settingsEventsBanadd: 'This event posts anonymous moderation logs when a user gets banned. You must set up `channels.moderation-logs`.', - settingsEventsBanremove: 'This event posts anonymous moderation logs when a user gets unbanned. You must set up `channels.moderation-logs`.', - settingsEventsMemberadd: 'This event posts member logs when a user joins. They will be posted in `channels.member-logs`.', - settingsEventsMemberNickNameUpdate: 'Whether member nickname updates should be logged or not.', - settingsEventsMemberUserNameUpdate: 'Whether member username updates should be logged or not.', - settingsEventsMemberroleupdate: 'Whether memner role changes should be logged or not.', - settingsEventsMemberremove: 'This event posts member logs when a user leaves. They will be posted in `channels.member-logs`.', - settingsEventsMessagedelete: - 'This event posts message logs when a message is deleted. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).', - settingsEventsMessageedit: - 'This event posts message logs when a message is edited. They will be posted in `channels.message-logs` (or `channel.nsfw-message-logs` in case of NSFW channels).', - settingsEventsTwemojiReactions: 'Whether or not twemoji reactions are posted in the reaction logs channel.', - settingsMessagesFarewell: 'The message I shall send to when a user leaves. You must set up `channels.farewell` and `events.memberRemove`', - settingsMessagesGreeting: 'The message I shall send to when a user joins. You must set up `channels.greeting` and `events.memberAdd`', - settingsMessagesIgnorechannels: 'The channels configured to not increase the point counter for users.', - settingsMessagesJoinDm: 'The message I shall send to when a user joins in DMs.', - settingsMessagesModerationAutoDelete: 'Whether or not moderation commands should be auto-deleted or not.', - settingsMessagesModerationDm: 'Whether or not I should send a direct message to the target user on moderation actions.', - settingsMessagesModerationMessageDisplay: 'Whether or not a response should be sent for moderation commands.', - settingsMessagesModerationReasonDisplay: 'Whether the reason will be displayed in moderation commands.', - settingsMessagesModeratorNameDisplay: - 'Whether or not I should display the name of the moderator who took the action whne sending the target user a moderation message. Requires `messages.moderation-dm` to be enabled.', - settingsMessagesWarnings: 'Whether or not I should send warnings to the user when they receive one.', - settingsMessagesAnnouncementEmbed: 'Whether to send announcements in embeds or not', - settingsMusicAllowStreams: 'Whether livestreams should be allowed to be played.', - settingsMusicDefaultVolume: 'The default music volume to start playing at for this server.', - settingsMusicMaximumDuration: 'The maximum length any playable single track can have.', - settingsMusicMaximumEntriesPerUser: 'The maximum amount of entries one user can have in the queue.', - settingsNoMentionSpamAlerts: 'Whether or not users should be alerted when they are about to get the ban hammer.', - settingsNoMentionSpamEnabled: 'Whether or not I should have the ban hammer ready for mention spammers.', - settingsNoMentionSpamMentionsallowed: - 'The minimum amount of "points" a user must accumulate before landing the hammer. A user mention will count as 1 point, a role mention as 2 points, and an everyone/here mention as 5 points.', - settingsNoMentionSpamTimeperiod: - 'The amount of time in seconds in which the mention bucket should refresh. For example, if this is set to `8` and you mentioned two users 7 seconds apart, the bucket would run from start with the accumulated amount of points.', - settingsRolesAdmin: `The administrator roles. Administrators have access to all moderation and management commands. Defaults to anyone with the ${this.PERMISSIONS.MANAGE_GUILD} permission.`, - settingsRolesDj: "The DJ roles for this server. DJs have more advanced control over Skyra's music commands.", - settingsRolesInitial: 'The initial role, if configured, I will give it to users as soon as they join.', - settingsRolesModerator: - 'The moderator roles. Moderators have access to almost all moderation commands. Defaults to anyone who can ban members.', - settingsRolesMuted: 'The muted role, if configured, I will give new muted users this role. Otherwise I will prompt you the creation of one.', - settingsRolesPublic: 'The public roles. These can be claimed by any user using the `roles` command.', - settingsRolesRemoveinitial: 'Whether claiming a public role should remove the initial role at the same time.', - settingsRolesRestrictedAttachment: 'The role that is used for the restrictAttachment moderation command', - settingsRolesRestrictedEmbed: 'The role that is used for the restrictEmbed moderation command.', - settingsRolesRestrictedEmoji: 'The role that is used for the restrictEmoji moderation command.', - settingsRolesRestrictedReaction: 'The role that is used for the restrictReaction moderation command.', - settingsRolesRestrictedVoice: 'The role that is used for the restrictVoice moderation command.', - settingsRolesSubscriber: - 'The subscriber role, this role will be mentioned every time you use the `announce` command. I will always keep it non-mentionable so people do not abuse mentions.', - settingsSelfmodAttachmentsEnabled: 'Whether or not the attachment filter is enabled.', - settingsSelfmodAttachmentsIgnoredChannels: 'The channels that will be ignored by the attachments filter sub-system', - settingsSelfmodAttachmentsIgnoredRoles: 'The roles that will be ignored by the attachments afilters sub-system', - settingsSelfmodCapitalsEnabled: 'Whether the capitals filter selfmod sub-system is enabled or not.', - settingsSelfmodCapitalsIgnoredchannels: 'The channels that will be ignored by the capitals filter sub-system', - settingsSelfmodCapitalsIgnoredroles: 'The roles that will be ignored by the capitals afilters sub-system', - settingsSelfmodCapitalsMaximum: - 'The maximum amount of characters the messages must have before trying to delete it. You must enable it with the `capitalsMode` command.', - settingsSelfmodCapitalsMinimum: - 'The minimum amount of characters the message must have before trying to delete it. You must enable it with the `capitalsMode` command.', - settingsSelfmodFilterEnabled: 'Whether the word filter selfmod sub-system is enabled or not.', - settingsSelfmodFilterIgnoredchannels: 'The channels that will be ignored by the filters sub-system', - settingsSelfmodFilterIgnoredroles: 'The roles that will be ignored by the filters sub-system', - settingsSelfmodIgnorechannels: - 'The channels I will ignore, be careful any channel configured will have all auto-moderation systems (CapsFilter, InviteLinks, and NoMentionSpam) deactivated.', - settingsSelfmodInvitesEnabled: 'Whether the invites filter selfmod sub-system is enabled or not.', - settingsSelfmodInvitesIgnoredchannels: 'The channels that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredroles: 'The roles that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredcodes: 'The Discord invite codes that will be ignored by the invites sub-system', - settingsSelfmodInvitesIgnoredguilds: 'The Discord servers that will be ignored by the invites sub-system', - settingsSelfmodLinksEnabled: 'Whether the links filter selfmod sub-system is enabled or not.', - settingsSelfmodLinksIgnoredchannels: 'The channels that will be ignored by the links filter sub-system', - settingsSelfmodLinksIgnoredroles: 'The roles that will be ignored by the links filters sub-system', - settingsSelfmodLinksWhitelist: 'The whitelisted links that are allowed', - settingsSelfmodMessagesEnabled: 'Whether Skyra should attempt to remove duplicated messages or not.', - settingsSelfmodMessagesIgnoredchannels: 'The channels that will be ignored by the duplicate messages sub-system', - settingsSelfmodMessagesIgnoredroles: 'The roles that will be ignored by the duplicate messages sub-system', - settingsSelfmodMessagesMaximum: - 'The amount of duplicated messages required in the queue before taking action The queue size is configurable in `selfmod.messages.queue-size`.', - settingsSelfmodMessagesQueueSize: 'The amount of messages Skyra will keep track of for the message duplication detection.', - settingsSelfmodNewlinesEnabled: 'Whether the new lines filter selfmod sub-system is enabled or not.', - settingsSelfmodNewlinesIgnoredchannels: 'The channels that will be ignored by the new lines sub-system', - settingsSelfmodNewlinesIgnoredroles: 'The roles that will be ignored by the new lines sub-system', - settingsSelfmodNewlinesMaximum: 'The maximum amount of new lines before Skyra will start applying penalties', - settingsSelfmodReactionsMaximum: 'The maximum amount of reactions before I will start applying penalties', - settingsSelfmodReactionsBlacklist: 'The reactions that are blacklisted', - settingsSelfmodReactionsEnabled: 'Whether the reactions filter selfmod sub-system is enabled or not.', - settingsSelfmodReactionsIgnoredchannels: 'The channels that will be ignored by the reactions sub-system', - settingsSelfmodReactionsIgnoredroles: 'The roles that will be ignored by the reactons sub-system', - settingsSelfmodReactionsWhitelist: 'The reactions that are whitelisted', - settingsSocialEnabled: 'Whether the social module should be enabled or not', - settingsSocialMultiplier: 'The multiplier to apply to the gain of points for users', - settingsSocialAchieve: 'Whether or not I should congratulate people who get a new leveled role.', - settingsSocialAchievemessage: - 'The congratulation message for people when they get a new leveled role. Requires `social.achieve` to be enabled.', - settingsSocialIgnorechannels: 'The channels I should ignore when adding points.', - settingsStarboardChannel: - 'The starboard channel. If you star a message, it will be posted there. Using the `setStarboardEmoji` command allows the emoji customization.', - settingsStarboardIgnorechannels: 'The channels I should ignore when listening for new stars.', - settingsStarboardMinimum: 'The minimum amount of stars required before a message is posted to the starboard channel.', - settingsStarboardSelfstar: 'Si la reacción del autor está incluida en el recuento total de estrellas', - settingsSuggestionsChannel: 'El canal donde se enviarán las sugerencias.', - settingsSuggestionsEmojisUpvote: 'El emoji utilizado para votar a favor en las reacciones de las sugerencias.', - settingsSuggestionsEmojisDownvote: 'El emoji utilizado para votar en contra en las reacciones de las sugerencias.', - settingsSuggestionsOnActionDm: - 'Si esta opción está habilitada, enviaré un mensaje directo al autor de la sugerencia cada vez que ésta se modifique.', - settingsSuggestionsOnActionRepost: - 'Si esta opción está habilitada, volveré a publicar el mensaje de la sugerencia cada vez que se ésta se modifique. En caso opuesto editaré el mensaje original.', - settingsSuggestionsOnActionHideAuthor: - 'Esta configuración le permite actualizar recomendaciónes anónimamente. Sustituirá el nombre del editor con `Un administrador` o` Un moderador`, de acuerdo con su nivel de permisos.', - settingsDashboardOnlyKey: 'This key can only be configured through [the web dashboard](https://skyra.pw)', - - /** - * ################ - * ANIMALS COMMANDS - */ - - commandCatfactDescription: 'Let me tell you a mysterious cat fact.', - commandCatfactExtended: { - extendedHelp: `Do **you** know cats are very curious, right? They certainly have a lot of fun and weird facts. - This command queries catfact.ninja and retrieves a fact so you can read it.` - }, - commandDogDescription: 'Cute doggos! ❤', - commandDogExtended: { - extendedHelp: [ - 'Do **you** know how cute dogs are? They are so beautiful!', - 'This command uses [dog.ceo](https://dog.ceo) to show pictures of the cuttest doggos!' - ] - }, - commandFoxDescription: 'Let me show you an image of a fox!', - commandFoxExtended: { - extendedHelp: 'This command gives a random image from [randomfox.ca](https://randomfox.ca/)' - }, - commandKittyDescription: 'KITTENS!', - commandKittyExtended: { - extendedHelp: [ - 'Do **you** know how cute are kittens? They are so beautiful!', - 'This command uses [cataas.com](https://cataas.com/) to show pictures of the cuttest cats!' - ] - }, - commandShibeDescription: 'Cute shibas!', - commandShibeExtended: { - extendedHelp: "Everyone loves shibas, I shall love them aswell! They're so adorable ❤." - }, - - /** - * ############## - * ANIME COMMANDS - */ - - commandAnimeDescription: 'Search your favourite anime by title with this command.', - commandAnimeExtended: { - extendedHelp: 'This command queries Kitsu.io to show data for the anime you request.', - explainedUsage: [['query', "The anime's name you are looking for."]], - examples: ['One Piece'] - }, - commandMangaDescription: 'Search your favourite manga by title with this command.', - commandMangaExtended: { - extendedHelp: 'This command queries Kitsu.io to show data for the manga you request.', - explainedUsage: [['query', "The manga's name you are looking for."]], - examples: ['Stone Ocean', 'One Piece'] - }, - commandWaifuDescription: 'Posts a randomly generated waifu image.', - commandWaifuExtended: { - extendedHelp: 'This commands posts a random waifu generated by ' - }, - - /** - * ##################### - * ANNOUNCEMENT COMMANDS - */ - - commandAnnouncementDescription: 'Send new announcements, mentioning the announcement role.', - commandAnnouncementExtended: { - extendedHelp: [ - 'This command requires an announcement channel (**channels.announcement** in the configuration command) which tells Skyra where she should post the announcement messages.', - '', - 'Question is, is this command needed? Well, nothing stops you from making your announcements by yourself, however, there are many people who hate being mentioned by at everyone/here.', - '', - 'To avoid this, Skyra gives you the option of creating a subscriber role, which is unmentionable (to avoid people spam mentioning the role), and once you run this command, Skyra will set the role to be mentionable, post the message, and back to unmentionable.', - '', - 'Furthermore, you can configure Skyra to send the announcement as a message embed by setting the **messages.announcement-embed** option in the configuration command. When sending the message as an an embed you can exclude the mentions of any users, @here or @everyone by providing the `--excludeMentions` flag to the announcement.' - ], - explainedUsage: [['announcement', 'The announcement text to post.']], - examples: ['I am glad to announce that we have a bot able to safely send announcements for our subscribers!'], - reminder: - 'If you want to edit the message you send in an announcement, just edit the message you used to have Skyra send that announcement. Skyra will then edit the message she sent previously. She can do this up to 15 minutes after the initial announcement, so be sure to not wait long!', - multiline: true - }, - commandSubscribeDescription: "Subscribe to this server's announcements.", - commandSubscribeExtended: { - extendedHelp: - "This command serves the purpose of **giving** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." - }, - commandUnsubscribeDescription: "Unsubscribe from this server's announcements.", - commandUnsubscribeExtended: { - extendedHelp: - "This command serves the purpose of **removing** you the subscriber role, which must be configured by the server's administrators. When a moderator or administrator use the **announcement** command, you will **not longer** be mentioned. This feature is meant to replace everyone/here tags and mention only the interested users." - }, - - /** - * ############ - * FUN COMMANDS - */ - - command8ballDescription: 'Skyra will read the Holy Bible to find the correct answer for your question.', - command8ballExtended: { - extendedHelp: "This command provides you a random question based on your questions' type. Be careful, it may be too smart.", - explainedUsage: [['question', 'The Holy Question']], - examples: ['Why did the chicken cross the road?'] - }, - commandChoiceDescription: 'Eeny, meeny, miny, moe, catch a tiger by the toe...', - commandChoiceExtended: { - extendedHelp: - 'I have an existencial doubt... should I wash the dishes or throw them through the window? The search continues. List me items separated by comma and I will choose one them. On a side note, I am not responsible of what happens next.', - explainedUsage: [['words', 'A list of words separated by comma.']], - examples: ['Should Wash the dishes, Throw the dishes out the window', 'Cat, Dog'] - }, - commandChangemymindDescription: 'Skyra is the best, change my mind.', - commandChangemymindExtended: { - extendedHelp: "I still think I'm the best, change my mind. I make a photo with your avatar and some text in some paper.", - explainedUsage: [['text', 'The phrase you want.']], - examples: ['Skyra is the best bot in this server'] - }, - commandDiceDescription: 'Roll the dice using d20 syntax.', - commandDiceExtended: { - extendedHelp: - "The mechanics of this command are easy. You have a dice, then you roll it __x__ times, but the dice can also be configured to have __y__ sides. By default, this command rolls a dice with 6 sides once. However, you can change the amount of rolls for the dice, and this command will 'roll' (get a random number between 1 and the amount of sides). For example, rolling a dice with 6 sides 3 times will leave a random sequence of three random numbers between 1 and 6, for example: 3, 1, 6; And this command will return 10 as output.", - examples: ['370d24', '100d6', '6'] - }, - commandEscaperopeDescription: 'Use the escape rope from Pokemon.', - commandEscaperopeExtended: { - extendedHelp: '**Skyra** used **Escape Rope**.' - }, - commandHowToFlirtDescription: 'Captain America, you do not know how to flirt.', - commandHowToFlirtExtended: { - extendedHelp: - "Let me show you how to effectively flirt with somebody using the Tony Stark's style for Captain America, I can guarantee that you'll get him.", - explainedUsage: [['user', 'The user to flirt with.']], - examples: ['Skyra'] - }, - commandLoveDescription: 'Lovemeter, online!', - commandLoveExtended: { - extendedHelp: "Hey! Wanna check the lovemeter? I know it's a ridiculous machine, but many humans love it! Don't be shy and try it!", - explainedUsage: [['user', 'The user to rate.']], - examples: ['Skyra'] - }, - commandMarkovDescription: 'Generate a Markov Chain from the text channel.', - commandMarkovExtended: { - extendedHelp: - 'A Markov chain is a stocha... what? Okay, something something a probability theory made by a Russian mathematician, check Wikipedia for more information. **In short**: I will generate a random message given the content of the messages in the channel.' - }, - commandNorrisDescription: "Enjoy your day reading Chuck Norris' jokes.", - commandNorrisExtended: { - extendedHelp: - "Did you know that Chuck norris does **not** call the wrong number, but you **answer** the wrong phone? Woah, mindblow. He also threw a carton of milk and created the Milky Way. This command queries chucknorris.io and retrieves a fact (do not assume they're false, not in front of him) so you can read it" - }, - commandRateDescription: 'Let bots have opinions and rate somebody.', - commandRateExtended: { - extendedHelp: - "Just because I am a bot doesn't mean I cannot rate you properly. I can grade you with a random number generator to ease the process. Okay okay, it's not fair, but I mean... I can also give you a 💯.", - explainedUsage: [['user', 'The user to rate.']], - examples: ['Skyra', 'me'] - }, - commandXkcdDescription: 'Read comics from XKCD.', - commandXkcdExtended: { - extendedHelp: - "**xkcd** is an archive for nerd comics filled with math, science, sarcasm and languages. If you don't provide any argument, I will get a random comic from xkcd. If you provide a number, I will retrieve the comic with said number. But if you provide a title/text/topic, I will fetch a comic that matches with your input and display it. For example, `Skyra, xkcd Curiosity` will show the comic number 1091.", - explainedUsage: [['query', 'Either the number of the comic, or a title to search for.']], - examples: ['1091', 'Curiosity'] - }, - commandPunDescription: 'Shows you a random pun.', - commandPunExtended: { - extendedHelp: [ - 'A steak pun is a rare medium well done.', - 'Get your daily doses of dad jokes from icanhazdadjoke.com and laugh at witty wisecracks.' - ], - multiline: true - }, - commandWakandaDescription: "Helpful descriptions? We don't do that here", - commandWakandaExtended: { - extendedHelp: - "Creates an image macro using the [We Don't Do That Here Meme](https://knowyourmeme.com/memes/we-dont-do-that-here) using the given user." - }, - - /** - * ################ - * GAME INTEGRATION COMMANDS - */ - - commandBrawlstarsDescription: "Get data on a player or club from Supercell's newest game, Brawl Stars.", - commandBrawlstarsExtended: { - extendedHelp: 'Use this command with --save to save your player/club tag.', - explainedUsage: [ - ['category', 'The category of data to get: **club** to get data on a club, or **player** to get data on a player (default).'], - ['query', 'The tag of the player or club, depending on which category you choose.'] - ], - examples: ['player #RJQLQ999'] - }, - commandBrawlstarsPlayerEmbedTitles: { - trophies: 'Trophies', - events: 'Events', - exp: 'Experience', - gamesModes: 'Game Modes', - other: 'Other' - }, - commandBrawlstarsPlayerEmbedFields: { - total: 'Total', - personalBest: 'Personal Best', - events: 'Events', - roboRumble: 'Best Robo Rumble Rank', - qualifiedForChamps: 'Qualified for Championship', - experienceLevel: 'Experience Level', - victories3v3: '3v3 Victories', - victoriesSolo: 'Solo Victories', - victoriesDuo: 'Duo Victories', - club: 'Club', - brawlersUnlocked: 'Brawlers Unlocked' - }, - commandBrawlstarsClubEmbedTitles: { - totalTrophies: 'Total Trophies', - averageTrophies: 'Average Trophies', - requiredTrophies: 'Required Trophies', - members: 'Members', - type: 'Type', - top5Members: 'Top 5 Members', - president: 'President' - }, - commandBrawlstarsClubEmbedFields: { - noPresident: 'No President' - }, - commandClashofclansDescription: 'Obtenga datos sobre un jugador o clan en el popular juego móvil Choque de clanes', - commandClashofclansExtended: { - extendedHelp: 'La solicitud de clanes intentará devolver múltiples respuestas posibles.', - explainedUsage: [ - [ - 'categoría', - 'La categoría de datos para obtener: ** clan ** para obtener datos de un clan o ** jugador ** para obtener datos de un jugador.' - ], - ['consulta', 'Ya sea un nombre de clan o una etiqueta de jugador según la categoría que elijas.'] - ], - examples: ['player #8GQPJG2CL', 'clan Hog Raiders Swe'] - }, - commandClashofclansPlayerEmbedTitles: { - xpLevel: 'Nivel de XP', - builderHallLevel: 'Nivel de sala de constructores', - townhallLevel: 'Nivel del ayuntamiento', - townhallWeaponLevel: 'Nivel de arma del ayuntamiento', - - trophies: 'Trofeos actuales', - bestTrophies: 'Mejores trofeos', - warStars: 'Estrellas de guerra', - - attackWins: 'Gana atacando', - defenseWins: 'Gana defendiendo', - amountOfAchievements: 'Cantidad de logros', - - versusTrophies: 'Actual contra trofeos', - bestVersusTrophies: 'Mejor contra trofeos', - versusBattleWins: 'Versus batalla gana', - - clanRole: 'Papel del clan', - clanName: 'Nombre del clan', - leagueName: 'Nombre de la liga', - noTownhallWeaponLevel: 'El ayuntamiento no tiene nivel de arma', - noRole: 'Este jugador no tiene rol de clan.', - noClan: 'Este jugador no es miembro del clan.', - noLeague: 'Este usuario no está en ninguna liga' - }, - commandClashofclansClanEmbedTitles: { - clanLevel: 'Nivel de clan', - clanPoints: 'Puntos del clan', - clanVersusPoints: 'Clan versus puntos', - amountOfMembers: 'Cantidad de miembros', - description: 'Descripción', - locationName: 'Nombre del lugar', - warFrequency: 'Frecuencia de guerra', - warWinStreak: 'Racha de victorias de guerra', - warWins: 'La guerra total gana', - warTies: 'Lazos de guerra total', - warLosses: 'Pérdidas de guerra totales', - warLogPublic: '¿El registro de guerra es público?', - unknown: 'Desconocido', - warFrequencyDescr: { - moreThanOncePerWeek: 'Más de una vez por semana', - always: 'Siempre', - lessThanOncePerWeek: 'Menos de una vez por semana', - oncePerWeek: 'Una vez por semana', - unknown: 'Desconocido' - } - }, - commandBrawlStarsInvalidPlayerTag: ({ playertag }) => - `Lo siento, \`${playertag}\` no es una etiqueta de jugador de BrawlStars válida. Las etiquetas de jugador deben comenzar con un \`#\` seguido de la ID.`, - commandBrawlStarsClansQueryFail: ({ clan }) => `Lo siento, pero no pude obtener datos sobre el clan \`${clan}\`.`, - commandBrawlStarsPlayersQueryFail: ({ playertag }) => - `Lo siento, pero no pude obtener datos sobre el jugador con la etiqueta de jugador \`${playertag}\`.`, - commandClashofclansInvalidPlayerTag: ({ playertag }) => - `Lo siento, \`${playertag}\` no es una etiqueta de jugador de Clash of Clans válida. Las etiquetas de jugador deben comenzar con un \`#\` seguido de la ID.`, - commandClashOfClansClansQueryFail: ({ clan }) => `Lo siento, pero no pude obtener datos sobre el clan \`${clan}\`.`, - commandClashofclansPlayersQueryFail: ({ playertag }) => - `Lo siento, pero no pude obtener datos sobre el jugador con la etiqueta de jugador \`${playertag}\`.`, - commandFFXIVDescription: 'Consulta la API de Final Fantasy 14 para obtener datos del juego', - commandFFXIVExtended: { - extendedHelp: [ - 'Este comando le permite datos de caracteres y elementos para FFXIV.', - 'Para el elemento, se realiza una búsqueda con comodines, por lo que si su término está en el medio del nombre, aún puede coincidir.' - ], - explainedUsage: [ - ['Tipo de búsqueda', '(opcional, el valor predeterminado es `character`)` character` o `item`'], - ['consulta', 'El jugador o cosa a buscar.'] - ], - examples: ['character Laytlan Ardevon', 'Laytlan Ardevon', 'item potion'], - multiline: true - }, - commandFFXIVCharacterFields: { - serverAndDc: 'Servidor - Centro de datos', - tribe: 'Tribu', - characterGender: 'Género del personaje', - nameday: 'Día del nombre', - guardian: 'Guardián', - cityState: 'Estado de la Ciudad', - grandCompany: 'Gran empresa', - rank: 'Rango', - none: 'Ninguno', - male: 'Masculino', - female: 'Hembra', - dowDomClasses: '***__Discípulo de clases de guerra y magia__***:', - tank: 'Tanque', - healer: 'Curador', - meleeDps: 'Cuerpo a cuerpo DPS', - physicalRangedDps: 'DPS a distancia física', - magicalRangedDps: 'DPS a distancia mágica', - dohClasses: '***__Trabajos de discípulo de la mano__***:', - dolClasses: '***__Trabajos de discípulo de la tierra__***:' - }, - commandFFXIVItemFields: { - kind: 'Tipo', - category: 'Categoría', - levelEquip: 'Nivel equipable', - none: 'Ninguno' - }, - commandFFXIVNoCharacterFound: `${REDCROSS} Lo siento, pero no pude encontrar un personaje con ese nombre.`, - commandFFXIVInvalidServer: `${REDCROSS} Lo siento, pero el nombre del servidor no es válido.`, - commandFFXIVNoItemFound: `${REDCROSS} Lo siento, pero no pude encontrar un elemento con esa consulta.`, - commandFortniteDescription: 'Obtiene estadísticas de jugador para un jugador de Fortnite', - commandFortniteExtended: { - extendedHelp: 'Este comando recupera estadísticas para cualquier jugador de Fortnite que juegue en PC, Xbox o Playstation', - explainedUsage: [ - ['plataforma', '(opcional, predeterminado a `pc`) Plataforma en la que se reproduce el reproductor, una de` pc`, `xbox` o` psn`.'], - ['jugador', 'El nombre de usuario de Epic Games del jugador.'] - ], - examples: ['ninja', 'pc ninja', 'xbox TTV R1xbox', 'psn TTV IllusionOG'] - }, - commandFortniteNoUser: - 'Lo siento, pero no pude encontrar un usuario con ese nombre.\n¿Estás seguro de que juegan en la plataforma proporcionada? (PC [predeterminado], Xbox o PSN son compatibles)', - commandFortniteEmbedTitle: ({ epicUserHandle }) => `Estadísticas de jugadores de Fortnite para ${epicUserHandle}`, - commandFortniteEmbedSectionTitles: { - lifetimeStats: '**_Estadísticas de por vida_**', - solos: '**_Solos_**', - duos: '**_Duos_**', - squads: '**_Escuadrones_**' - }, - commandFortniteEmbedStats: ({ - winCount, - killCount, - kdrCount, - matchesPlayedCount, - top1Count, - top3Count, - top5Count, - top6Count, - top10Count, - top12Count, - top25Count - }) => ({ - wins: `Victorias: **\`${winCount}\`**`, - kills: `Matas: **\`${killCount}\`**`, - kdr: `Mata / Relación de la muerte: **\`${kdrCount}%\`**`, - matchesPlayed: `Partidos jugados: **\`${matchesPlayedCount}\`**`, - top1s: `Top 1s: **\`${top1Count}\`**`, - top3s: `Top 3s: **\`${top3Count}\`**`, - top5s: `Top 5s: **\`${top5Count}\`**`, - top6s: `Top 6s: **\`${top6Count}\`**`, - top10s: `Top 10s: **\`${top10Count}\`**`, - top12s: `Top 12s: **\`${top12Count}\`**`, - top25s: `Top 25s: **\`${top25Count}\`**` - }), - commandOverwatchDescription: 'Obtiene estadísticas de jugador para un jugador de Overwatch', - commandOverwatchExtended: { - extendedHelp: [ - 'Este comando recupera estadísticas para cualquier jugador de Overwatch que juegue en PC, Xbox o Playstation.', - 'De manera predeterminada, buscará en los reproductores de PC, si desea comprobar si hay reproductores de', - 'Xbox o Playstation, configure la plataforma en `xbl` o `psn` respectivamente.' - ], - explainedUsage: [ - ['platform', '(opcional, predeterminado en `pc`) Plataforma en la que se reproduce el reproductor, una de `pc`, `xbl` o `psn`'], - [ - 'player', - 'Para PC, la etiqueta de tormenta de nieve completa, para la consola, el nombre de usuario. ¡Distingue mayúsculas y minúsculas!' - ] - ], - examples: ['bame#1784', 'xbl Dorus NL gamer', 'psn decoda_24'], - reminder: '**¡Los nombres de los jugadores distinguen entre mayúsculas y minúsculas!**', - multiline: true - }, - commandOverwatchInvalidPlayerName: ({ playerTag }) => - `\`${playerTag}\` es un nombre de jugador no válido\nPara PC tiene que ser su Blizzard BattleTag completo, por ejemplo \`bame#1784\`.\nPara Xbox y Playstation tiene que ser su nombre de usuario.`, - commandOverwatchQueryFail: ({ player, platform }) => - `No se pudieron obtener datos para \`${player}\`, ¿estás seguro de que juegan en la \`${platform}\`?\nTambién asegúrese de tener la carcasa correcta, los nombres distinguen mayúsculas de minúsculas.`, - commandOverwatchNoStats: ({ player }) => - `Encontré un jugador con la etiqueta \`${player}\` pero no había estadísticas disponibles para ellos.`, - commandOverwatchNoAverage: 'No hay suficientes datos para determinar el promedio.', - commandOverwatchEmbedDataStats: ({ - finalBlows, - deaths, - damageDone, - healing, - objectiveKills, - soloKills, - playTime, - gamesWon, - goldenMedals, - silverMedals, - bronzeMedals - }) => ({ - finalBlows: `**Golpes finales:** ${this.groupDigits(finalBlows)}`, - deaths: `**Muertes:** ${this.groupDigits(deaths)}`, - damageDealt: `**Daño infligido:** ${this.groupDigits(damageDone)}`, - healing: `**Curación:** ${this.groupDigits(healing)}`, - objectiveKills: `**El objetivo mata:** ${this.groupDigits(objectiveKills)}`, - soloKills: `**Solo mata:** ${this.groupDigits(soloKills)}`, - playTime: `**Tiempo de juego:** ${this.duration(playTime, 2)}`, - gamesWon: `**Juegos ganados:** ${this.groupDigits(gamesWon)}`, - goldenMedals: `**Medallas de oro ganadas:** ${this.groupDigits(goldenMedals)}`, - silverMedals: `**Medallas de plata ganadas:** ${this.groupDigits(silverMedals)}`, - bronzeMedals: `**Medallas de bronce ganadas:** ${this.groupDigits(bronzeMedals)}` - }), - commandOverwatchEmbedDataTopHero: ({ name, playTime }) => `**${toTitleCase(name)}** (${playTime})`, - commandOverwatchEmbedData: ({ authorName, playerLevel, prestigeLevel, totalGamesWon }) => ({ - title: 'Haga clic aquí para obtener más detalles en overwatchtracker.com', - ratingsTitle: 'Calificaciones', - author: `Estadísticas de jugador de Overwatch para ${authorName}`, - playerLevel: `**Nivel de jugador:** ${this.groupDigits(playerLevel)}`, - prestigeLevel: `**Nivel de prestigio:** ${this.groupDigits(prestigeLevel)}`, - totalGamesWon: `**Total de juegos ganados:** ${this.groupDigits(totalGamesWon)}`, - noGamesWon: `**Total de juegos ganados:** ${this.language.globalNone}`, - headers: { - account: '__Estadísticas de cuenta__', - quickplay: '__Estadísticas de Quickplay__', - competitive: '__Estadísticas competitivas__', - topHeroesQuickplay: '__Mejores héroes juego rápido', - topHeroesCompetitive: '__Mejores héroes competitivos__' - } - }), - - /** - * ################ - * GENERAL COMMANDS - */ - - commandSupportDescription: 'Muestra instrucciones de soporte', - commandSupportExtended: { - extendedHelp: "Le brinda un enlace a *Skyra's Lounge*, el lugar indicado para todo lo relacionado conmigo." - }, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandCreateMuteDescription: 'Prepare the mute system.', - commandCreateMuteExtended: { - extendedHelp: `This command prepares the mute system by creating a role called 'muted', and configuring it to the guild settings. This command also modifies all channels (where possible) permissions and disables the permission **${this.PERMISSIONS.SEND_MESSAGES}** in text channels and **${this.PERMISSIONS.CONNECT}** in voice channels for said role.` - }, - commandGiveawayDescription: 'Start a new giveaway.', - commandGiveawayExtended: { - extendedHelp: [ - 'This command is designed to manage giveaways. You can start them with this command by giving it the time and a title.', - '', - 'When a giveaway has been created, I will send a giveaway message and react to it with 🎉 so the members of the server can participate on it.', - '', - 'You can pass a flag of `--winners=Xw`, wherein X is a number (for example 2w for 2 winners) to allow multiple people to win a giveaway.', - 'Please note that there is a maximum of 25 winners.' - ], - explainedUsage: [ - ['channel', '(Optional) The channel in which to start the giveaway'], - ['time', 'The time the giveaway should last.'], - ['title', 'The title of the giveaway.'] - ], - examples: ['6h A hug from Skyra.', '60m 5w A mysterious Steam game', '1d Free Discord Nitro! --winners=2w'], - multiline: true - }, - commandGiveawayRerollDescription: 'Re-roll the winners from a giveaway.', - commandGiveawayRerollExtended: { - extendedHelp: `This command is designed to re-roll finished giveaways. Please check \`Skyra, help gstart\` for more information about creating one.`, - explainedUsage: [ - ['winners', 'The amount of winners to pick.'], - ['message', 'The message to target. Defaults to last giveaway message.'] - ], - examples: ['', '633939404745998346', '5', '5 633939404745998346'] - }, - commandGiveawayScheduleDescription: 'Schedule a giveaway to start at a certain time.', - commandGiveawayScheduleExtended: { - extendedHelp: [ - 'This command prepares a giveaway to start at a certain time if you do not wish to start it immediately.', - 'You can pass a flag of `--winners=X`, wherein X is a number, to allow multiple people to win this giveaway.', - 'Please note that there is a maximum of 25 winners.' - ], - explainedUsage: [ - ['channel', '(Optional) The channel in which to start the giveaway'], - ['schedule', 'The time to wait before starting the giveaway.'], - ['time', 'The time the giveaway should last.'], - ['title', 'The title of the giveaway.'] - ], - examples: ['30m 6h A hug from Skyra.'], - multiline: true - }, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandNickDescription: "Change Skyra's nickname for this server.", - commandNickExtended: { - extendedHelp: "This command allows you to change Skyra's nickname easily for the server.", - reminder: `This command requires the **${this.PERMISSIONS.CHANGE_NICKNAME}** permission. Make sure Skyra has it.`, - explainedUsage: [['nick', "The new nickname. If you don't put any, it'll reset it instead."]], - examples: ['SkyNET', 'Assistant', ''] - }, - commandPermissionNodesDescription: 'Configure the permission nodes for this server.', - commandPermissionNodesExtended: { - extendedHelp: [ - 'Permission nodes are per-user and per-role overrides. They are used when the built-in permissions system is not enough.', - 'For example, in some servers they want to give a staff role the permissions to use mute and warn, but not ban and others (reserved to moderators), and only warn is available for the configurable staff-level permission, so you can tell me to allow the mute command for the staff role now.' - ], - explainedUsage: [ - ['action', 'Either `add`, `remove`, `reset`, or `show`. Defaults to `show`.'], - ['target', 'Either a role name or a user name, allowing IDs and mentions for either.'], - ['type', 'Either `allow` or `deny`. This is ignored when `action` is not `add` nor `remove`.'], - ['command', 'The name of the command to allow or deny. This is ignored when `action` is not `add` nor `remove`.'] - ], - examples: ['add staff allow warn', 'add moderators deny ban', 'remove staff allow warn', 'reset staff', 'show staff'], - reminder: 'The server owner cannot have any actions, nor the `everyone` role can have allowed commands.', - multiline: true - }, - commandTriggersDescription: 'Set custom triggers for your guild!.', - commandTriggersExtended: { - extendedHelp: [ - 'This command allows administrators to go further with the personalization of Skyra in the guild!.', - 'A trigger is a piece that can active other functions.', - 'For example, the aliases are triggers that get executed when the command does not exist in bot, triggering the unknown command event.', - 'When this happens, the alias system executes and tries to find an entry that matches with the input.' - ], - reminder: `This command requires the **${this.PERMISSIONS.ADD_REACTIONS}** permission so it can test reactions. Make sure Skyra has it.`, - explainedUsage: [ - ['list', 'List all current triggers.'], - ['add ', 'Add a new trigger given a type, input and output.'], - ['remove ', 'Remove a trigger given the type and input.'] - ], - examples: ['', 'list', 'add reaction "good night" 🌛', 'remove reaction "good night"'], - multiline: true - }, - - /** - * ################################# - * MANAGEMENT/CONFIGURATION COMMANDS - */ - - commandManagecommandautodeleteDescription: 'Manage per-channel autodelete timer.', - commandManagecommandautodeleteExtended: { - extendedHelp: - "This command manages this guild's per-channel command autodelete timer, it serves well to leave a channel clean from commands.", - explainedUsage: [ - ['show', 'Show the autodelete timer for all channels.'], - ['add [channel] ', 'Add an autodelete timer for the specified channel.'], - ['remove [channel]', 'Remove the autotimer from the specified channel.'], - ['reset', 'Clear all autodelete timers.'] - ], - reminder: "The channel argument is optional, defaulting to the message's channel, but it uses fuzzy search when possible.", - examples: ['show', 'add #general 4s', 'remove #general', 'reset'] - }, - commandManageCommandChannelDescription: 'Manage per-channel command blacklist.', - commandManageCommandChannelExtended: { - extendedHelp: - "This command manages this guild's per-channel command blacklist, it serves well to disable certain commands you do not want to be used in certain channels (to disable a command globally, use the `disabledCommands` settings key to disable in all channels.", - explainedUsage: [ - ['show [channel]', 'Show the command blacklist for the selected channel.'], - ['add [channel] ', "Add a command to the specified channel's command blacklist."], - ['remove [channel] ', "Remove a command to the specified channel's command blacklist."], - ['reset [channel]', 'Clear the command blacklist for the specified channel.'] - ], - reminder: 'The channel argument is optional, but it uses fuzzy search when possible.', - examples: ['show', 'add #general profile', 'remove #general profile', 'reset #general'] - }, - commandManageReactionRolesDescription: 'Manage the reaction roles for this server.', - commandManageReactionRolesExtended: { - extendedHelp: [ - 'Seamlessly set up reaction roles in your server! When adding reaction roles, I listen to your reactions for 5 minutes and I bind the first reaction from you alongside the channel and the message, with the specified role.', - "Otherwise, if a channel is specified, a prompt will not be created, and the reaction role will be bound to all of the channel's messages.", - '', - 'The best way to add new reaction roles is by using `add @role`. If you prefer not binding the reaction to a specific message then use `add @role #channel emoji`' - ], - explainedUsage: [ - ['show', 'Retrieve the list of all reaction roles.'], - ['add ', 'Adds a reaction role binding the first reacted message since the execution with the role.'], - ['remove ', 'Removes a reaction role, use `show` to get a list of them.'], - ['reset', 'Removes all reaction roles.'] - ], - multiline: true, - examples: ['show', 'add @role', 'add @role #channel emoji', 'remove @role 123456789012345678', 'reset'] - }, - commandSetIgnoreChannelsDescription: 'Set a channel to the ignore channel list.', - commandSetIgnoreChannelsExtended: { - extendedHelp: [ - "This command helps you setting up ignored channels. An ignored channel is a channel where nobody but moderators can use Skyra's commands.", - `Unlike removing the **${this.PERMISSIONS.SEND_MESSAGES}** permission, Skyra is still able to send (and therefore execute commands) messages, which allows moderators to use moderation commands in the channel.`, - 'Use this if you want to ban any command usage from the bot in a specific channel.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: 'You cannot set the same channel twice, instead, Skyra will remove it.', - examples: ['#general', 'here'], - multiline: true - }, - commandSetImageLogsDescription: 'Set the image logs channel.', - commandSetImageLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the image log channel. Whenever a member sends an image attachment, it will send an embed message with the attachment re-uploaded.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.` - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - examples: ['#image-logs', 'here'], - multiline: true - }, - commandSetMemberLogsDescription: 'Set the member logs channel.', - commandSetMemberLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the member log channel. A member log channel only sends two kinds of logs: "Member Join" and "Member Leave".', - 'If a muted user joins, it will send a special "Muted Member Join" event.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - `You also need to individually set the "events" you want to listen: "events.memberAdd" and "events.memberRemove".`, - 'For roles, you would enable "events.memberNicknameChange" and/or "events.memberRoleUpdate" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - examples: ['#member-logs', 'here'], - multiline: true - }, - commandSetMessageLogsDescription: 'Set the message logs channel.', - commandSetMessageLogsExtended: { - extendedHelp: [ - 'This command helps you setting up the message log channel. A message log channel only sends three kinds of logs: "Message Delete", "Message Edit", and "Message Prune".', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - 'You also need to individually set the "events" you want to listen: "events.messageDelete" and "events.messageEdit" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: `Due to Discord limitations, Skyra cannot know who deleted a message. The only way to know is by fetching audit logs, requiring the permission **${this.PERMISSIONS.VIEW_AUDIT_LOG}** which access is limited in the majority of guilds and the amount of times I can fetch them in a period of time.`, - examples: ['#message-logs', 'here'], - multiline: true - }, - commandSetmodlogsDescription: 'Set the mod logs channel.', - commandSetmodlogsExtended: { - extendedHelp: [ - 'This command helps you setting up the mod log channel. A mod log channel only sends case reports indexed by a number case and with "claimable" reasons and moderators.', - 'This channel is not a must and you can always retrieve specific modlogs with the "case" command.', - `All messages are in embeds so you will need to enable the permission **${this.PERMISSIONS.EMBED_LINKS}** for Skyra.`, - 'For auto-detection, you need to individually set the "events" you want to listen: "events.banAdd", "events.banRemove" via the "config" command.' - ], - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: `Due to Discord limitations, the auto-detection does not detect kicks. You need to use the "kick" command if you want to document them as - a formal moderation log case.`, - examples: ['#mod-logs', 'here'], - multiline: true - }, - commandSetprefixDescription: "Set Skyra's prefix.", - commandSetprefixExtended: { - extendedHelp: [ - "This command helps you setting up Skyra's prefix. A prefix is an affix that is added in front of the word, in this case, the message.", - 'It allows bots to distinguish between a regular message and a command. By nature, the prefix between should be different to avoid conflicts.', - "If you forget Skyra's prefix, simply mention her with nothing else and she will tell you the current prefix.", - 'Alternatively, you can prefix the commands with her name and a comma (for example `Skyra, ping`).' - ], - explainedUsage: [['prefix', `The prefix to set. Default one in Skyra is "${this.client.options.prefix}".`]], - reminder: 'Your prefix should only contain characters everyone can write and type.', - examples: ['&', '='], - multiline: true - }, - commandSetrolechannelDescription: 'Set the role channel for role reactions.', - commandSetrolechannelExtended: { - extendedHelp: - 'This command sets up the role channel to lock the reactions to, it is a requirement to set up before setting up the **role message**, and if none is given, the role reactions module will not run.', - explainedUsage: [ - [ - 'channel', - 'A TextChannel. You can either put the name of the channel, tag it, or type in "here" to select the channel the message was sent.' - ] - ], - reminder: 'You cannot set the same channel twice, instead, Skyra will remove it.', - examples: ['#roles', 'here'] - }, - commandSetrolemessageDescription: 'Set the role message for role reactions.', - commandSetrolemessageExtended: { - extendedHelp: [ - 'This command sets up the role message to lock the reactions to, it requires a **role channel** to be set up first.', - 'If none is given, Skyra will listen to any reaction in the channel.', - `Additionally, Skyra requires **${this.PERMISSIONS.READ_MESSAGE_HISTORY}** in order to fetch the message for validation.` - ], - explainedUsage: [['message', 'An ID, they are 17-18 characters long and numeric.']], - reminder: 'You must execute this command in the role channel.', - examples: ['434096799847022598'], - multiline: true - }, - commandSetStarboardEmojiDescription: 'Set the emoji reaction for starboard.', - commandSetStarboardEmojiExtended: { - extendedHelp: - 'This command sets up the starboard emoji for the starboard, which is, by default, ⭐. Once this is changed, Skyra will ignore any star and will count users who reacted to said emoji.', - explainedUsage: [['emoji', 'The emoji to set.']], - reminder: 'Use this wisely, not everyone expects the starboard to listen to a custom emoji.', - examples: ['⭐'] - }, - - /** - * ################# - * GIVEAWAY COMMANDS - */ - - commandGiveawayRerollInvalid: 'The message ID does not exist or there is no finished giveaway.', - - /** - * ########################### - * MANAGEMENT/HELPERS COMMANDS - */ - - commandRoleInfoDescription: 'Check the information for a role.', - commandRoleInfoExtended: { - extendedHelp: [ - "The roleinfo command displays information for a role, such as its id, name, color, whether it's hoisted (displays separately) or not, it's role hierarchy position, whether it's mentionable or not, how many members have said role, and its permissions.", - 'It sends an embedded message with the color of the role.' - ], - explainedUsage: [['role', 'The role name, partial name, mention or id.']], - examples: ['Administrator', 'Moderator', ''], - multiline: true - }, - commandGuildInfoDescription: 'Check the information of the guild!.', - commandGuildInfoExtended: { - extendedHelp: [ - 'The serverinfo command displays information for the guild the message got sent.', - 'It shows the amount of channels, with the count for each category, the amount of members (given from the API), the owner with their user id, the amount of roles, region, creation date, verification level... between others.' - ], - multiline: true - }, - - /** - * ########################### - * MANAGEMENT/MEMBERS COMMANDS - */ - - commandStickyRolesDescription: 'Manage sticky roles for users.', - commandStickyRolesExtended: { - extendedHelp: - "The stickyRoles command allows you to manage per-member's sticky roles, they are roles that are kept even when you leave, and are applied back as soon as they join.", - explainedUsage: [ - ['action', 'Either you want to check the sticky roles, add one, remove one, or remove all of them.'], - ['user', 'The user target for all the actions.'], - ['role', 'The role to add or remove.'] - ], - examples: ['add Skyra Goddess', 'show Skyra', 'remove Skyra Goddess', 'reset Skyra'], - reminder: "The member's roles will not be modified by this command, you need to add or remove them." - }, - - /** - * ################################## - * MANAGEMENT/MESSAGE FILTER COMMANDS - */ - - commandAttachmentsModeDescription: "Manage this guild's flags for the attachments filter.", - commandAttachmentsModeExtended: { - extendedHelp: ['The attachmentsMode command manages the behavior of the attachments system.'], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandCapitalsModeDescription: "Manage this guild's flags for the caps filter.", - commandCapitalsModeExtended: { - extendedHelp: [ - 'The capitalsMode command manages the behavior of the caps system.', - 'The minimum amount of characters before filtering can be set with `Skyra, settings set selfmod.capitals.minimum `.', - 'The percentage of uppercase letters can be set with `Skyra, settings set selfmod.capitals.maximum `.' - ], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandFilterDescription: "Manage this guild's word blacklist.", - commandFilterExtended: { - extendedHelp: [ - 'The filter command manages the word blacklist for this server and must have a filter mode set up, check `Skyra, help filterMode`.', - "Skyra's word filter can find matches even with special characters or spaces between the letters of a blacklisted word, as well as it filters duplicated characters for enhanced filtering." - ], - multiline: true - }, - commandFilterModeDescription: "Manage this server's word filter modes.", - commandFilterModeExtended: { - extendedHelp: 'The filterMode command manages the behavior of the word filter system. Run `Skyra, help filter` for how to add words.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandInviteModeDescription: 'Manage the behavior for the invite link filter.', - commandInviteModeExtended: { - extendedHelp: 'The inviteMode command manages the behavior of the word filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandLinkModeDescription: 'Manage the behavior for the link filter.', - commandLinkModeExtended: { - extendedHelp: 'The linkMode command manages the behavior of the link system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandMessageModeDescription: 'Manage the behavior for the message filter system.', - commandMessageModeExtended: { - extendedHelp: 'The messageMode command manages the behavior of the message filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - commandNewlineModeDescription: 'Manage the behavior for the new line filter system.', - commandNewlineModeExtended: { - extendedHelp: [ - 'The newLineMode command manages the behavior of the new line filter system.', - 'The maximum amount of lines allowed can be set with `Skyra, settings set selfmod.newlines.maximum `' - ], - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ], - multiline: true - }, - commandReactionModeDescription: 'Manage the behavior for the reaction filter system.', - commandReactionModeExtended: { - extendedHelp: 'The reactionMode command manages the behavior of the reaction filter system.', - explainedUsage: [ - ['Enable', 'Enable the sub-system.'], - ['Disable', 'Disable the sub-system'], - ['Action Alert', 'Toggle message alerts in the channel.'], - ['Action Log', 'Toggle message logs in the moderation logs channel.'], - ['Action Delete', 'Toggle message deletions.'], - ['Punishment', 'The moderation action to take, takes any of `none`, `warn`, `kick`, `mute`, `softban`, or `ban`.'], - ['Punishment-Duration', 'The duration for the punishment, only applicable to `mute` and `ban`. Takes a duration.'], - [ - 'Threshold-Maximum', - 'The amount of infractions that can be done within `Threshold-Duration` before taking action, instantly if unset. Takes a number.' - ], - ['Threshold-Duration', 'The time in which infractions will accumulate before taking action, instantly if unset. Takes a duration.'] - ], - reminder: '`Action Log` requires `channel.moderation-logs` to be set up.', - examples: [ - 'enable', - 'disable', - 'action alert', - 'punishment ban', - 'punishment mute', - 'punishment-duration 1m', - 'threshold-maximum 5', - 'threshold-duration 30s' - ] - }, - - /** - * ############# - * MISC COMMANDS - */ - - commandCuddleDescription: 'Cuddle somebody!', - commandCuddleExtended: { - extendedHelp: - "Do you know something that I envy from humans? The warm feeling when somebody cuddles you. It's so cute ❤! I can imagine and draw a image of you cuddling somebody in the bed, I hope you like it!", - explainedUsage: [['user', 'The user to cuddle with.']], - examples: ['Skyra'] - }, - commandDeletthisDescription: '*Sees offensive post* DELETTHIS!', - commandDeletthisExtended: { - extendedHelp: - "I see it! I see the hammer directly from your hand going directly to the user you want! Unless... unless it's me! If you try to tell me this, I'm going to take the MJOLNIR! Same if you do with my creator!", - explainedUsage: [['user', 'The user that should start deleting his post.']], - examples: ['John Doe'] - }, - commandFDescription: 'Press F to pay respects.', - commandFExtended: { - extendedHelp: - 'This command generates an image... to pay respects reacting with 🇫. This command also makes Skyra react the image if she has permissions to react messages.', - explainedUsage: [['user', 'The user to pray respects to.']], - examples: ['John Doe', 'Jake'] - }, - commandGoodnightDescription: 'Give somebody a nice Good Night!', - commandGoodnightExtended: { - extendedHelp: "Let me draw you giving a goodnight kiss to the person who is going to sleep! Who doesn't like goodnight kisses?", - explainedUsage: [['user', 'The user to give the goodnight kiss.']], - examples: ['Jake', 'DefinitivelyNotSleeping'] - }, - commandGoofytimeDescription: "It's Goofy time!", - commandGoofytimeExtended: { - extendedHelp: - "IT'S GOOFY TIME! *Screams loudly in the background* NO, DAD! NO! This is a command based on the Goofy Time meme, what else would it be?", - explainedUsage: [['user', "The user who will say IT'S GOOFY TIME!"]], - examples: ['TotallyNotADaddy'] - }, - commandHugDescription: 'Hugs!', - commandHugExtended: { - extendedHelp: - "What would be two people in the middle of the snow with coats and hugging each other? Wait! I get it! Mention somebody you want to hug with, and I'll try my best to draw it in a canvas!", - explainedUsage: [['user', 'The user to hug with.']], - examples: ['Bear'] - }, - commandIneedhealingDescription: "*Genji's voice* I NEED HEALING!", - commandIneedhealingExtended: { - extendedHelp: [ - 'Do you know the worst nightmare for every single healer in Overwatch, specially for Mercy? YES!', - 'You know it, it\'s a cool cyborg ninja that looks like a XBOX and is always yelling "I NEED HEALING" loudly during the entire match.', - "Well, don't expect so much, this command actually shows a medic with some tool in your chest." - ], - explainedUsage: [['healer', 'The healer you need to heal you.']], - examples: ['Mercy'], - multiline: true - }, - commandRandRedditDescription: 'Retrieve a random Reddit post.', - commandRandRedditExtended: { - extendedHelp: 'This is actually something like a Russian Roulette, you can get a good meme, but you can also get a terrible meme.', - explainedUsage: [['reddit', 'The reddit to look at.']], - examples: ['discordapp'] - }, - commandRedditUserDescription: 'Retrieve statistics for a Reddit user.', - commandRedditUserExtended: { - extendedHelp: 'Gets statistics of any given Reddit user', - explainedUsage: [['user', 'The reddit user to look at.']], - examples: ['GloriousGe0rge'] - }, - commandShipDescription: 'Ships 2 members', - commandShipExtended: { - extendedHelp: [ - 'This commands generates a ship name between two users and creates more love in the world.', - 'Users are optional, you can provide none, just one or both users. For any non-provided users I will pick a random guild member.' - ], - explainedUsage: [ - ['firstUser', 'The first user to ship'], - ['secondUser', 'The second user to ship'] - ], - examples: ['romeo juliet'], - reminder: 'If I cannot find either given user then I will pick someone randomly.', - multiline: true - }, - commandShipData: ({ romeoUsername, julietUsername, shipName }) => ({ - title: `**Shipping \`${romeoUsername}\` and \`${julietUsername}\`**`, - description: `I call it... ${shipName}` - }), - commandChaseDescription: 'Get in here!', - commandChaseExtended: { - extendedHelp: 'Do you love chasing? Start chasing people now for free! Just mention or write their ID and done!', - explainedUsage: [['pinger', 'The user who you want to chase.']], - examples: ['IAmInnocent'] - }, - commandShindeiruDescription: 'Omae wa mou shindeiru.', - commandShindeiruExtended: { - extendedHelp: [ - '"You are already dead" Japanese: お前はもう死んでいる; Omae Wa Mou Shindeiru, is an expression from the manga and anime series Fist of the North Star.', - 'This shows a comic strip of the character pronouncing the aforementioned words, which makes the opponent reply with "nani?" (what?).' - ], - explainedUsage: [['user', "The person you're telling that phrase to."]], - examples: ['Jack'], - multiline: true - }, - commandPeepoloveDescription: 'Genera una imagen peepoLove con avatar de usuario.', - commandPeepoloveExtended: { - extendedHelp: `Le permite generar una imagen peepoLove a partir del avatar de usuario.`, - explainedUsage: [['user', 'El usuario que peepo debe abrazar.']], - examples: ['Jack'], - reminder: - 'El soporte de imágenes personalizadas se ha deshabilitado temporalmente, la ETA que regresa es aproximadamente noviembre de 2020.' - }, - commandSlapDescription: 'Slap another user using the Batman & Robin Meme.', - commandSlapExtended: { - extendedHelp: 'The hell are you saying? *Slaps*. This meme is based on a comic from Batman and Robin.', - explainedUsage: [['user', 'The user you wish to slap.']], - examples: ['Jake'], - reminder: "You try to slap me and I'll slap you instead." - }, - commandSnipeDescription: 'Retrieve the last deleted message from a channel', - commandSnipeExtended: { - extendedHelp: 'This just sends the last deleted message from this channel, somebody is misbehaving? This will catch them.' - }, - commandThesearchDescription: 'Are we the only one in the universe, this man on earth probably knows.', - commandThesearchExtended: { - extendedHelp: 'One man on Earth probably knows if there is intelligent life, ask and you shall receive an answer.', - explainedUsage: [['answer', 'The sentence that will reveal the truth.']], - examples: ['Your waifu is not real.'] - }, - commandTriggeredDescription: 'I am getting TRIGGERED!', - commandTriggeredExtended: { - extendedHelp: - "What? My commands are not userfriendly enough?! (╯°□°)╯︵ ┻━┻. This command generates a GIF image your avatar wiggling fast, with a TRIGGERED footer, probably going faster than I thought, I don't know.", - explainedUsage: [['user', 'The user that is triggered.']], - examples: ['kyra'] - }, - commandUpvoteDescription: 'Get a link to upvote Skyra in **Bots For Discord**', - commandUpvoteExtended: { - extendedHelp: - 'Bots For Discord is a website where you can find amazing bots for your website. If you really love me, you can help me a lot by upvoting me every 24 hours, so more users will be able to find me!' - }, - commandVaporwaveDescription: 'Vapowave characters!', - commandVaporwaveExtended: { - extendedHelp: - "Well, what can I tell you? This command turns your messages into unicode monospaced characters. That is, what humans call 'A E S T H E T I C'. I wonder what it means...", - explainedUsage: [['phrase', 'The phrase to convert']], - examples: ['A E S T H E T I C'] - }, - /** - * ############################## - * MODERATION/MANAGEMENT COMMANDS - */ - - commandHistoryDescription: 'Display the count of moderation cases from this guild or from a user.', - commandHistoryExtended: { - extendedHelp: 'This command shows the amount of bans, mutes, kicks, and warnings, including temporary, that have not been appealed.', - examples: ['', '@Pete'] - }, - commandHistoryFooterNew: ({ warnings, mutes, kicks, bans, warningsText, mutesText, kicksText, bansText }) => - `This user has ${warnings} ${warningsText}, ${mutes} ${mutesText}, ${kicks} ${kicksText}, and ${bans} ${bansText}`, - commandHistoryFooterWarning: () => 'warning', - commandHistoryFooterWarningPlural: () => 'warnings', - commandHistoryFooterMutes: () => 'mute', - commandHistoryFooterMutesPlural: () => 'mutes', - commandHistoryFooterKicks: () => 'kick', - commandHistoryFooterKicksPlural: () => 'kicks', - commandHistoryFooterBans: () => 'ban', - commandHistoryFooterBansPlural: () => 'bans', - commandModerationsDescription: 'List all running moderation logs from this guild.', - commandModerationsExtended: { - extendedHelp: `This command shows you all the temporary moderation actions that are still running. This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.`, - examples: ['', '@Pete', 'mutes @Pete', 'warnings'] - }, - commandModerationsEmpty: 'Nobody has behaved badly yet, who will be the first user to be listed here?', - commandModerationsAmount: () => 'There is 1 entry.', - commandModerationsAmountPlural: ({ count }) => `There are ${count} entries.`, - commandMutesDescription: 'List all mutes from this guild or from a user.', - commandMutesExtended: { - extendedHelp: [ - 'This command shows either all mutes filed in this guild, or all mutes filed in this guild for a specific user.', - `This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.` - ], - examples: ['', '@Pete'], - multiline: true - }, - commandWarningsDescription: 'List all warnings from this guild or from a user.', - commandWarningsExtended: { - extendedHelp: [ - 'This command shows either all warnings filed in this guild, or all warnings filed in this guild for a specific user.', - `This command uses a reaction-based menu and requires the permission **${this.PERMISSIONS.MANAGE_MESSAGES}** to execute correctly.` - ], - examples: ['', '@Pete'], - multiline: true - }, - - /** - * ############################# - * MODERATION/UTILITIES COMMANDS - */ - - commandSlowmodeDescription: "Set the channel's slowmode value in seconds.", - commandSlowmodeExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_CHANNELS}** and will modify the channel's ratelimit per user to any value between 0 and 120 seconds.`, - examples: ['0', 'reset', '4'], - reminder: "To reset a channel's ratelimit per user, you can use either 0 or 'reset'." - }, - - /** - * ################### - * MODERATION COMMANDS - */ - - commandBanDescription: 'Hit somebody with the ban hammer.', - commandBanExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**, and only members with lower role hierarchy position can be banned by me.`, - "No, the guild's owner cannot be banned.", - 'This action can be optionally timed to create a temporary ban.' - ], - examples: ['@Pete', '@Pete Spamming all channels.', '@Pete 24h Spamming all channels'], - multiline: true - }, - commandDehoistDescription: 'Shoot everyone with the Dehoistinator 3000', - commandDehoistExtended: { - extendedHelp: [ - 'The act of hoisting involves adding special characters in front of your nickname in order to appear higher in the members list.', - "This command replaces any member's nickname that includes those special characters with a special character that drags them to the bottom of the list." - ], - reminder: `This command requires **${this.PERMISSIONS.MANAGE_NICKNAMES}**, and only members with lower role hierarchy position can be dehoisted.`, - multiline: true - }, - commandKickDescription: 'Hit somebody with the 👢.', - commandKickExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.KICK_MEMBERS}**, and only members with lower role hierarchy position can be kicked by me. No, the guild's owner cannot be kicked.`, - examples: ['@Sarah', '@Sarah Spamming general chat.'] - }, - commandLockdownDescription: 'Close the gates for this channel!', - commandLockdownExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_CHANNELS}** in order to be able to manage the permissions for a channel.`, - `This command removes the permission **${this.PERMISSIONS.SEND_MESSAGES}** to the \`@everyone\` role so nobody but the members with roles that have their own overrides (besides administrators, who bypass channel overrides) can send messages.`, - 'Optionally, you can pass time as second argument.' - ], - examples: ['', '#general', '#general 5m'], - multiline: true - }, - commandMuteDescription: 'Mute a user in all text and voice channels.', - commandMuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be muted.", - "This action can be optionally timed to create a temporary mute. This action saves a member's roles temporarily and will be granted to the user after the unmute.", - 'The muted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Alphonse', '@Alphonse Spamming all channels', '@Alphonse 24h Spamming all channels'], - multiline: true - }, - commandSetNicknameDescription: 'Change the nickname of a user.', - commandSetNicknameExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_NICKNAMES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner nickname cannot be changed." - ], - examples: ['@Pete peeehteeerrr', '@ꓑ𝗲੮ẻ Pete Unmentionable name'], - multiline: true - }, - commandAddRoleDescription: 'Adds a role to a user.', - commandAddRoleExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner roles cannot be changed." - ], - examples: ['@John member', '@John member Make John a member'], - multiline: true - }, - commandRemoveroleDescription: 'Removes a role from a user', - commandRemoveroleExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner roles cannot be changed." - ], - examples: ['@Paula member', '@Paula member Remove member permissions from Paula'], - multiline: true - }, - commandPruneDescription: 'Prunes a certain amount of messages w/o filter.', - commandPruneExtended: { - extendedHelp: [ - 'This command deletes the given amount of messages given a filter within the last 100 messages sent in the channel the command has been run.', - 'Optionally, you can add `--silent` to tell Skyra not to send a response message.' - ], - explainedUsage: [ - ['Messages', 'The amount of messages to prune.'], - ['Filter', 'The filter to apply.'], - ['(Filter) Link', 'Filters messages that have links on the content.'], - ['(Filter) Invite', 'Filters messages that have invite links on the content.'], - ['(Filter) Bots', 'Filters messages sent by bots.'], - ['(Filter) You', 'Filters messages sent by Skyra.'], - ['(Filter) Me', 'Filters your messages.'], - ['(Filter) Upload', 'Filters messages that have attachments.'], - ['(Filter) User', 'Filters messages sent by the specified user.'], - ['(Filter) Human', 'Filters messages sent by humans.'], - ['Position', 'Lets you delete messages before or after a specific message.'], - ['(Position) Before', 'Deletes all messages before the given message.'], - ['(Position) After', 'Deletes all messages after the given message.'] - ], - examples: ['50 me', '75 @kyra', '20 bots', '60 humans before 629992398700675082'], - reminder: 'Due to a Discord limitation, bots cannot delete messages older than 14 days.', - multiline: true - }, - commandCaseDescription: 'Get the information from a case by its index.', - commandCaseExtended: { - extendedHelp: 'You can also get the latest moderation case by specifying the case ID as "latest"', - explainedUsage: [['Case', 'Number of the case ID to get or "latest"']], - examples: ['5', 'latest'] - }, - commandPermissionsDescription: 'Check the permission for a member, or yours.', - commandPermissionsExtended: { - extendedHelp: 'Ideal if you want to know the what permissions are granted to a member when they have a certain set of roles.' - }, - commandFlowDescription: 'Shows the amount of messages per minute in a channel.', - commandFlowExtended: { - extendedHelp: 'This helps you determine the overall activity of a channel', - explainedUsage: [['channel', '(Optional): The channel to check, if omitted current channel is used']] - }, - commandReasonDescription: 'Edit the reason field from a moderation log case.', - commandReasonExtended: { - extendedHelp: [ - 'This command allows moderation log case management, it allows moderators to update the reason.', - 'If you want to modify multiple cases at once you provide a range.', - 'For example `1..3` for the `` will edit cases 1, 2, and 3.', - 'Alternatively you can also give ranges with commas:', - '`1,3..6` will result in cases 1, 3, 4, 5, and 6', - '`1,2,3` will result in cases 1, 2, and 3' - ], - examples: ['420 Spamming all channels', '419..421 Bad memes', '1..3,4,7..9 Posting NSFW', 'latest Woops, I did a mistake!'], - multiline: true - }, - commandRestrictAttachmentDescription: 'Restrict a user from sending attachments in all channels.', - commandRestrictAttachmentExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Sending weird images', '@Pete 24h Sending NSFW images'], - multiline: true - }, - commandRestrictEmbedDescription: 'Restrict a user from attaching embeds in all channels.', - commandRestrictEmbedExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Sending weird links', '@Pete 24h Posted a spam link'], - multiline: true - }, - commandRestrictEmojiDescription: 'Restrict a user from using external emojis in all channels.', - commandRestrictEmojiExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Spamming external emojis', '@Pete 24h Posted cringe'], - reminder: `This will only prevent the usage of external emojis and so will have no effect for non-nitro users, your own server's emojis and regular build in twemojis can still be used by members with this role.`, - multiline: true - }, - commandRestrictReactionDescription: 'Restrict a user from reacting to messages in all channels.', - commandRestrictReactionExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Spamming reactions', '@Pete 24h Posting weird reactions'], - multiline: true - }, - commandRestrictVoiceDescription: 'Restrict a user from joining any voice channel.', - commandRestrictVoiceExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MANAGE_ROLES}**, and only members with lower role hierarchy position can be managed by me.`, - "No, the guild's owner cannot be restricted.", - 'This action can be optionally timed to create a temporary restriction.', - 'The restricted role is **sticky**, if the user tries to remove it by rejoining the guild, it will be added back.' - ], - examples: ['@Pete', '@Pete Earraping in general voice channels', '@Pete 24h Making weird noises'], - multiline: true - }, - commandSoftBanDescription: 'Hit somebody with the ban hammer, destroying all their messages for some days, and unban it.', - commandSoftBanExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**, and only members with lower role hierarchy position can be banned by me.`, - "No, the guild's owner cannot be banned.", - "The ban feature from Discord has a feature that allows the moderator to remove all messages from all channels that have been sent in the last 'x' days, being a number between 0 (no days) and 7.", - 'The user gets unbanned right after the ban, so it is like a kick, but that can prune many many messages.' - ], - examples: ['@Pete', '@Pete Spamming all channels', '@Pete 7 All messages sent in 7 are gone now, YEE HAH!'], - multiline: true - }, - commandToggleModerationDmDescription: 'Toggle moderation DMs.', - commandToggleModerationDmExtended: { - extendedHelp: `This command allows you to toggle moderation DMs. By default, they are on, meaning that any moderation action (automatic or manual) will DM you, but you can disable them with this command.` - }, - commandUnbanDescription: 'Unban somebody from this guild!.', - commandUnbanExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.BAN_MEMBERS}**. It literally gets somebody from the rubbish bin, cleans them up, and allows the pass to this guild's gates.`, - examples: ['@Pete', '@Pete Turns out he was not the one who spammed all channels ¯\\_(ツ)_/¯'] - }, - commandUnmuteDescription: 'Remove the scotch tape from a user.', - commandUnmuteExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the muted people's list, and gives the old roles back if the user had them.`, - examples: ['@Pete', '@Pete (Insert random joke here).'] - }, - commandUnrestrictAttachmentDescription: 'Remove the attachment restriction from one or more users.', - commandUnrestrictAttachmentExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictEmbedDescription: 'Remove the embed restriction from one or more users.', - commandUnrestrictEmbedExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictEmojiDescription: 'Remove the external emoji restriction from one or more users.', - commandUnrestrictEmojiExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictReactionDescription: 'Remove the reaction restriction from one or more users.', - commandUnrestrictReactionExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnrestrictVoiceDescription: 'Remove the voice restriction from one or more users.', - commandUnrestrictVoiceExtended: { - extendedHelp: `This command requires **${this.PERMISSIONS.MANAGE_ROLES}** and removes a user from the restricted people's list.`, - examples: ['@Pete'] - }, - commandUnwarnDescription: 'Appeal a warning moderation log case.', - commandUnwarnExtended: { - extendedHelp: `This command appeals a warning, it requires no permissions, you only give me the moderation log case to appeal and the reason.`, - examples: ['0 Whoops, wrong dude.', '42 Turns out this was the definition of life.'] - }, - commandVmuteDescription: "Throw somebody's microphone out the window.", - commandVmuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MUTE_MEMBERS}**, and only members with lower role hierarchy position can be silenced by me.`, - "No, the guild's owner cannot be silenced.", - 'This action can be optionally timed to create a temporary voice mute.' - ], - examples: ['@Pete', '@Pete Singing too loud', '@Pete 24h Literally sang ear rape'], - multiline: true - }, - commandVoiceKickDescription: 'Hit somebody with the 👢 for singing so bad and loud.', - commandVoiceKickExtended: { - extendedHelp: [ - `This command requires the permissions **${this.PERMISSIONS.MANAGE_CHANNELS}** to create a temporary (hidden) voice channel, and **${this.PERMISSIONS.MOVE_MEMBERS}** to move the user to the temporary channel.`, - 'After this, the channel is quickly deleted, making the user leave the voice channel.', - 'For scared moderators, this command has almost no impact in the average user, as the channel is created in a way only me and the selected user can see and join, then quickly deleted.' - ], - examples: ['@Pete', '@Pete Spamming all channels'], - multiline: true - }, - commandVunmuteDescription: "Get somebody's microphone back so they can talk.", - commandVunmuteExtended: { - extendedHelp: [ - `This command requires **${this.PERMISSIONS.MUTE_MEMBERS}**, and only members with lower role hierarchy position can be un-silenced by me.`, - "No, the guild's owner cannot be un-silenced." - ], - examples: ['@Pete', '@Pete Appealed his times signing hear rape.'], - multiline: true - }, - commandWarnDescription: 'File a warning to somebody.', - commandWarnExtended: { - extendedHelp: [ - 'This command files a warning to a user.', - "This kind of warning is meant to be **formal warnings**, as they will be shown in the 'warnings' command.", - 'It is a good practise to do an informal warning before using this command.' - ], - examples: ['@Pete Attempted to mention everyone.'], - multiline: true - }, - - /** - * ################## - * POKÉMON COMMANDS - */ - commandAbilityDescription: 'Obtiene datos de cualquier habilidad Pokémon dada usando mi conjunto de datos Pokémon.', - commandAbilityExtended: { - extendedHelp: 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - explainedUsage: [['habilidad', 'La capacidad para la que desea encontrar datos']], - examples: ['multiscale', 'pressure'] - }, - commandAbilityEmbedTitles: { - authorTitle: 'Habilidad', - fieldEffectTitle: 'Efecto fuera de la batalla' - }, - commandAbilityQueryFail: ({ ability }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${ability}\` es realmente una habilidad en Pokémon?`, - commandFlavorsDescription: 'Obtiene las entradas de dex en varios juegos para un Pokémon.', - commandFlavorsExtended: { - extendedHelp: [ - 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - 'Puede proporcionar una bandera de `--shiny` para obtener el sprite brillante.' - ], - explainedUsage: [['pokemon', 'El Pokémon para el que quieres obtener textos de sabor.']], - examples: ['dragonite', 'pikachu', 'pikachu --shiny'], - multiline: true - }, - commandFlavorsQueryFail: ({ pokemon }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${pokemon}\` es en realidad un Pokémon?`, - commandItemDescription: 'Obtiene datos para cualquier elemento Pokémon usando mi conjunto de datos Pokémon.', - commandItemExtended: { - extendedHelp: 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - explainedUsage: [['ítem', 'El elemento para el que desea buscar datos']], - examples: ['life orb', 'choice specs'] - }, - commandItemEmbedData: ({ availableInGen8 }) => ({ - ITEM: 'Ítem', - generationIntroduced: 'Generación introducida', - availableInGeneration8Title: 'Disponible en la generación 8', - availableInGeneration8Data: availableInGen8 - }), - commandItemQueryFail: ({ item }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${item}\` es realmente un elemento en Pokémon?`, - commandLearnDescription: 'Recupera si un Pokémon dado puede aprender uno o más movimientos dados usando mi conjunto de datos Pokémon.', - commandLearnExtended: { - extendedHelp: [ - 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - 'Los movimientos se dividen en cada `, ` (coma y espacio) y puedes proporcionar tantos movimientos como desee.', - 'Puede proporcionar una bandera de `--shiny` para obtener el sprite brillante.' - ], - explainedUsage: [ - ['generation', '(Opcional), la generación para la cual verificar los datos'], - ['pokemon', 'El Pokémon cuyo conjunto de aprendizaje quieres comprobar'], - ['movimiento', 'Los movimientos que desea verificar'] - ], - examples: ['7 dragonite dragon dance', 'pikachu thunder bolt', 'pikachu thunder bolt --shiny', 'pikachu thunder bolt, thunder'], - multiline: true - }, - commandLearnMethodTypes: ({ level }) => ({ - levelUpMoves: `por subir de nivel en el nivel ${level}`, - eventMoves: 'a través de un evento', - tutorMoves: 'de un tutor de movimiento', - eggMoves: 'como un movimiento de huevo', - virtualTransferMoves: 'al transfiriendo desde juegos de consola virtual', - tmMoves: 'utilizando un Máquina Técnico o Disco Técnico', - dreamworldMoves: 'a través de una captura de Pokémon Dream World' - }), - commandLearnInvalidGeneration: ({ generation }) => `Lo siento, pero ${generation} no es una Generación Pokémon admitida`, - commandLearnMethod: ({ generation, pokemon, move, method }) => - `En la generacion ${generation} ${pokemon} __**puede**__ aprender **${move}** ${method}`, - commandLearnQueryFailed: ({ pokemon, moves }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${toTitleCase( - pokemon - )}\` es en realidad un Pokémon y ${moves} son realmente movimientos?`, - commandLearnCannotLearn: ({ pokemon, moves }) => `Parece que ${toTitleCase(pokemon)} no puede aprender ${moves}`, - commandLearnTitle: ({ pokemon, generation }) => `Datos de Learnset para ${toTitleCase(pokemon)} en la generación ${generation}`, - commandMoveDescription: 'Obtiene datos para cualquier movimiento Pokémon usando mi conjunto de datos Pokémon', - commandMoveExtended: { - extendedHelp: 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - explainedUsage: [['movimiento', 'El movimiento para el que desea buscar datos']], - examples: ['dragon dance', 'GMax Wildfire', 'Genesis Supernova'], - reminder: [ - 'Los Movimientos Z muestran la potencia para los movimientos en la Octava Generación ya que son calculados con una tabla de conversión.', - 'Si Pokémon añade los Movimientos Z al juego, éstos serían sus niveles de poder teóricos. Sin embargo,', - 'al día de escritura, los Movimientos Z NO están disponibles en la Octava Generación.' - ], - multiline: true - }, - commandMoveEmbedData: ({ availableInGen8 }) => ({ - move: 'Movimiento', - types: 'Tipo', - basePower: 'Potencia', - pp: 'PP', - category: 'Categoría', - accuracy: 'Precisión', - priority: 'Movimiento con prioridad', - target: 'Objetivo', - contestCondition: 'Cualidad', - zCrystal: 'Cristal Z', - gmaxPokemon: 'Gigamax Pokémon', - availableInGeneration8Title: 'Disponible en la generación 8', - availableInGeneration8Data: availableInGen8, - none: 'Ninguno', - maxMovePower: 'Potencia base como Movimiento Dinamax (Dinamax)', - zMovePower: 'Potencia base como Movimiento Z (Cristal Z)', - fieldMoveEffectTitle: 'Efecto fuera de la batalla' - }), - commandMoveQueryFail: ({ move }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${move}\` es realmente un movimiento en Pokémon?`, - commandPokedexDescription: 'Obtiene datos de cualquier Pokémon usando mi conjunto de datos Pokémon.', - commandPokedexExtended: { - extendedHelp: [ - 'Utiliza una búsqueda difusa para comparar también con coincidencias cercanas.', - 'Puede proporcionar una bandera de `--shiny` para obtener el sprite brillante.' - ], - explainedUsage: [['Pokémon', 'El Pokémon para el que quieres encontrar datos']], - examples: ['dragonite', 'pikachu'], - reminder: [ - 'Si hay algún "Otro (s) formulario (s)" en la cuarta página opcional, también se pueden solicitar.', - 'Las formas cosméticas en esa página enumeran cambios puramente cosméticos y estos no tienen entradas separadas en la Pokédex.' - ], - multiline: true - }, - commandPokedexEmbedData: ({ otherFormes, cosmeticFormes }) => ({ - types: 'Tipo(s)', - abilities: 'Habilidades', - genderRatio: 'Relación de género', - smogonTier: 'Smogon Tier', - uknownSmogonTier: 'Forma desconocida / alternativa', - height: 'Altura', - weight: 'Peso', - eggGroups: 'Grupo (s) de huevo', - evolutionaryLine: 'Línea evolutiva', - baseStats: 'Puntos de base', - baseStatsTotal: 'TDPB', - flavourText: 'Entrada de Pokédex', - otherFormesTitle: 'Otras formas', - cosmeticFormesTitle: 'Formas cosméticas', - otherFormesList: this.list(otherFormes, 'y'), - cosmeticFormesList: this.list(cosmeticFormes, 'y') - }), - commandPokedexQueryFail: ({ pokemon }) => - `Lo siento, pero esa consulta falló. ¿Estás seguro de que \`${pokemon}\` es en realidad un Pokémon?`, - commandTypeDescription: 'Da los emparejamientos de tipos para uno o dos tipos de Pokémon.', - commandTypeExtended: { - extendedHelp: 'Los tipos deben ser coincidencias exactas con los tipos de pokemon (se pueden ignorar mayúsculas / minúsculas)', - explainedUsage: [['tipo', 'El tipo(s) para buscar']], - examples: ['dragon', 'fire flying'] - }, - commandTypeEmbedData: ({ types }) => ({ - offensive: 'Ofensivo', - defensive: 'Defensivo', - superEffectiveAgainst: 'Súper efectivo contra', - dealsNormalDamageTo: 'Inflige daño normal a', - doesNotAffect: 'No afecta', - notVeryEffectiveAgainst: 'No muy efectivo contra', - vulnerableTo: 'Vulnerable a', - takesNormalDamageFrom: 'Toma daño normal de', - resists: 'Resiste', - notAffectedBy: 'No afectado por', - typeEffectivenessFor: `Tipo de efectividad para ${this.list(types, 'y')}` - }), - commandTypeTooManyTypes: 'Lo siento, pero puedes obtener el emparejamiento para 2 tipos como máximo', - commandTypeNotAType: ({ type }) => `${type} no es un tipo de Pokémon válido`, - commandTypeQueryFail: ({ types }) => `Lo siento, pero esa consulta falló. ¿Estás seguro de que los ${types} son realmente tipos en Pokémon?`, - - /** - * ############### - * SOCIAL COMMANDS - */ - - commandSocialDescription: "Configure this guild's member points.", - commandSocialExtended: { - extendedHelp: "This command allows for updating other members' points.", - explainedUsage: [ - ['set ', 'Sets an amount of points to the user.'], - ['add ', 'Adds an amount of points to the user.'], - ['remove ', 'Removes an amount of points from the user.'], - ['reset ', 'Resets all pointss from the user.'] - ], - examples: ['set @kyra 40000', 'add @kyra 2400', 'remove @kyra 3000', 'reset @kyra'] - }, - commandBannerDescription: 'Configure the banner for your profile.', - commandBannerExtended: { - extendedHelp: 'Banners are vertical in Skyra, they decorate your profile card.', - explainedUsage: [ - ['list', '(Default) Lists all available banners.'], - ['reset', 'Set your displayed banner to default.'], - ['buy ', 'Buy a banner, must be an ID.'], - ['set ', 'Set your displayed banner, must be an ID.'] - ], - examples: ['list', 'buy 0w1p06', 'set 0w1p06', 'reset'] - }, - commandToggleDarkModeDescription: 'Toggle between light and dark templates for your profile and rank cards.', - commandToggleDarkModeExtended: { - extendedHelp: 'This command lets you toggle the template used to generate your profile.' - }, - - commandAutoRoleDescription: 'List or configure the autoroles for a guild.', - commandAutoRoleExtended: { - extendedHelp: [ - 'Autoroles are roles that are available for everyone, and automatically given when they reach a configured', - 'amount of (local) points, an administrator must configure them through a setting command.', - "Note that if the role name has spaces in the name you need to put `'quotes'` around the name!" - ], - explainedUsage: [ - ['list', 'Lists all the current autoroles.'], - ['add ', 'Add a new autorole.'], - ['remove ', 'Remove an autorole from the list.'], - ['update ', 'Change the required amount of points for an existing autorole.'] - ], - reminder: 'The current system grants a random amount of points between 4 and 8 points, for each post with a 1 minute cooldown.', - examples: ['list', "add 'Trusted Member' 20000", "update 'Trusted Member' 15000", "remove 'Trusted Member'"], - multiline: true - }, - - commandBalanceDescription: 'Check your current balance.', - commandBalanceExtended: { - extendedHelp: `The balance command retrieves your amount of ${SHINY}.` - }, - commandDailyDescription: `Get your semi-daily ${SHINY}'s.`, - commandDailyExtended: { - extendedHelp: 'Shiiiiny!', - reminder: [ - 'Skyra uses a virtual currency called Shiny, and it is used to buy stuff such as banners or bet it on slotmachines.', - 'You can claim dailies once every 12 hours.', - "If you use the --reminder flag, I will remind you when it's time to collect dailies again." - ], - multiline: true - }, - commandLeaderboardDescription: 'Check the leaderboards.', - commandLeaderboardExtended: { - extendedHelp: [ - 'The leaderboard command shows a list of users sorted by their local or global amount of points, by default, when using no arguments, it will show the local leaderboard.', - 'The leaderboards refresh every 10 minutes.' - ], - reminder: '"Local" leaderboards refer to the guild\'s top list. "Global" refers to all scores from all guilds.', - multiline: true - }, - commandLevelDescription: 'Check your global level.', - commandLevelExtended: { - extendedHelp: 'How much until the next level?', - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]] - }, - commandDivorceDescription: 'Break up with your couple!', - commandDivorceExtended: { - extendedHelp: - 'Sniff... This command is used to break up with your couple, hopefully in this virtual world, you are allowed to marry the user again.' - }, - commandMarryDescription: 'Marry somebody!', - commandMarryExtended: { - extendedHelp: 'Marry your waifu!', - explainedUsage: [['user', '(Optional) The user to marry with. If not given, the command will tell you who are you married with.']], - examples: ['', '@love'] - }, - commandMarriedDescription: 'Check who you are married with.', - commandMarriedExtended: { - extendedHelp: 'This command will tell you who are you married with.' - }, - commandMylevelDescription: 'Check your local level.', - commandMylevelExtended: { - extendedHelp: 'How much until next auto role? How many points do I have in this guild?', - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]] - }, - commandPayDescription: `Pay somebody with your ${SHINY}'s.`, - commandPayExtended: { - extendedHelp: 'Businessmen! Today is payday!', - explainedUsage: [ - ['money', `Amount of ${SHINY} to pay, you must have the amount you are going to pay.`], - ['user', 'The targeted user to pay. (Must be mention/id)'] - ], - examples: ['200 @kyra'] - }, - commandProfileDescription: 'Check your user profile.', - commandProfileExtended: { - extendedHelp: [ - 'This command sends a card image with some of your user profile such as your global rank, experience...', - "Additionally, you are able to customize your colours with the 'setColor' command." - ], - explainedUsage: [['user', "(Optional) The user's profile to show. Defaults to the message's author!."]], - multiline: true - }, - commandRemindmeDescription: 'Manage your reminders.', - commandRemindmeExtended: { - extendedHelp: 'This command allows you to set, delete and list reminders.', - explainedUsage: [ - ['action', 'The action, one of "list", "show", "delete", or "create"/"me". Defaults to "list".'], - ['idOrDuration', 'Dependent of action; "list" → ignored; "delete"/"show" → reminder ID; else → duration.'], - ['description', '(Optional) Dependent of action, this is only read when creating a new reminder.'] - ], - examples: ['me 6h to fix this command.', 'list', 'show jedbcuywb', 'delete jedbcuywb'] - }, - commandReputationDescription: 'Give somebody a reputation point.', - commandReputationExtended: { - extendedHelp: [ - "This guy is so helpful... I'll give him a reputation point!", - "Additionally, you can check how many reputation points a user has by writing 'check' before the mention." - ], - explainedUsage: [ - ['check', '(Optional) Whether you want to check somebody (or yours) amount of reputation.'], - ['user', 'The user to give a reputation point.'] - ], - reminder: 'You can give a reputation point once every 24 hours.', - examples: ['check @kyra', 'check', '@kyra', 'check "User With Spaces"', '"User With Spaces"'], - multiline: true - }, - commandSetColorDescription: "Change your user profile's color.", - commandSetColorExtended: { - extendedHelp: 'The setColor command sets a color for your profile.', - explainedUsage: [['color', 'A color resolvable.']], - possibleFormats: [ - ['HEX', '#dfdfdf'], - ['RGB', 'rgb(200, 200, 200)'], - ['HSL', 'hsl(350, 100, 100)'], - ['B10', '14671839'] - ] - }, - - /** - * ################## - * STARBOARD COMMANDS - */ - - commandStarDescription: 'Get a random starred message from the database or the star leaderboard.', - commandStarExtended: { - extendedHelp: 'This command shows a random starred message or the starboard usage and leaderboard for this server.' - }, - - /** - * ############### - * SYSTEM COMMANDS - */ - - commandDmDescription: 'Sends a Direct Message.', - commandDmExtended: { - extendedHelp: `The DM command is reserved for bot owners, and it's only used for very certain purposes, such as replying feedback messages sent by users.`, - reminder: 'Reserved for bot owners for replying purposes.' - }, - commandEvalDescription: 'Evaluates arbitrary Javascript.', - commandEvalExtended: { - extendedHelp: [ - 'The eval command evaluates code as-in, any error thrown from it will be handled.', - 'It also uses the flags feature. Write --silent, --depth=number or --async to customize the output.', - 'The --wait flag changes the time the eval will run. Defaults to 10 seconds. Accepts time in milliseconds.', - "The --output and --output-to flag accept either 'file', 'log', 'haste' or 'hastebin'.", - 'The --delete flag makes the command delete the message that executed the message after evaluation.', - 'The --silent flag will make it output nothing.', - "The --depth flag accepts a number, for example, --depth=2, to customize util.inspect's depth.", - 'The --async flag will wrap the code into an async function where you can enjoy the use of await, however, if you want to return something, you will need the return keyword', - 'The --showHidden flag will enable the showHidden option in util.inspect.', - 'The --lang and --language flags allow different syntax highlight for the output.', - 'The --json flag converts the output to json', - 'The --no-timeout flag disables the timeout', - `If the output is too large, it'll send the output as a file, or in the console if the bot does not have the ${this.PERMISSIONS.ATTACH_FILES} permission.` - ], - examples: ['msg.author!.username;', '1 + 1;'], - reminder: 'Reserved for bot owners.', - multiline: true - }, - commandExecDescription: 'Execute Order 66.', - commandExecExtended: { - extendedHelp: 'You better not know about this.' - }, - commandSetAvatarDescription: "Set Skyra's avatar.", - commandSetAvatarExtended: { - extendedHelp: "This command changes Skyra's avatar. You can send a URL or upload an image attachment to the channel.", - reminder: 'Reserved for bot owners.' - }, - commandDonateDescription: 'Get information about how to donate to keep Skyra alive longer.', - commandDonateExtended: { - extendedHelp: [ - 'Skyra Project started on 24th October 2016, if you are reading this, you are', - `using version ${VERSION}. The development team improves a lot in every iteration of Skyra.`, - '', - 'However, not everything is free and we need your help to keep Skyra alive.', - 'We will be very thankful if you help us.', - 'We have been working on a lot of things, and Skyra is precious to us. Take care of her ❤', - '', - 'Do you want to support this amazing project? Feel free to do so! https://donate.skyra.pw/patreon or https://donate.skyra.pw/kofi' - ], - multiline: true - }, - commandEchoDescription: 'Make Skyra send a message to this (or another) channel.', - commandEchoExtended: { - extendedHelp: 'This should be very obvious...', - reminder: 'Reserved for bot owners.' - }, - commandFeedbackDescription: "Send a feedback message to the bot's owner.", - commandFeedbackExtended: { - extendedHelp: `This command sends a message to a feedback channel which the bot's owners can read. You'll get a reply from me in your DMs when one of the owners has an update for you.` - }, - commandStatsDescription: 'Provides some details about the bot and stats.', - commandStatsExtended: { - extendedHelp: 'This should be very obvious...' - }, - - /** - * ############## - * TOOLS COMMANDS - */ - - commandAvatarDescription: "View somebody's avatar in full size.", - commandAvatarExtended: { - extendedHelp: "As this command's name says, it shows somebody's avatar.", - explainedUsage: [['user', '(Optional) A user mention. Defaults to the author if the input is invalid or not given.']], - reminder: "Use the --size flag to change the avatar's size." - }, - commandColorDescription: 'Display some awesome colours.', - commandColorExtended: { - extendedHelp: 'The color command displays a set of colours with nearest tones given a difference between 1 and 255..', - explainedUsage: [['color', 'A color resolvable.']], - possibleFormats: [ - ['HEX', '#dfdfdf'], - ['RGB', 'rgb(200, 200, 200)'], - ['HSL', 'hsl(350, 100, 100)'], - ['B10', '14671839'] - ], - examples: ['#dfdfdf >25', 'rgb(200, 130, 75)'] - }, - commandContentDescription: 'Obtener el contenido sin formato de los mensajes.', - commandContentExtended: { - extendedHelp: 'Raw content will help you better copy-paste message content as you will not have to reproduce all the formatting', - explainedUsage: [ - ['channel', '(optional) The channel in which the message is to get the content from'], - ['message', 'ID of the message to get the raw content for'] - ] - }, - commandEmojiDescription: 'Obtén información sobre un emoji.', - commandEmojiExtended: { - extendedHelp: "I'll give you the emoji name, whether it is a custom emoji or not, the emoji ID and a large image preview of the emoji.", - explainedUsage: [['emoji', 'The emoji to get information about']], - reminder: "It doesn't matter whether I share a server with a custom emoji or not!" - }, - commandEmotesDescription: 'Muestra todos los gestos personalizados disponibles en este servidor.', - commandEmotesExtended: { - extendedHelp: 'La lista de emotes se divide por 50 emotes..' - }, - commandEmotesTitle: 'Emotes en', - commandPriceDescription: 'Convert the currency with this tool.', - commandPriceExtended: { - extendedHelp: 'Convert between any two currencies, even if they are cryptocurrencies.', - explainedUsage: [ - ['from', 'The currency to convert from'], - ['to', 'The currency to convert to'], - ['amount', 'The amount to convert, will default to 1'] - ], - examples: ['EUR USD', 'USD EUR 5', 'USD BAT 10'] - }, - commandQuoteDescription: "Quote another person's message.", - commandQuoteExtended: { - extendedHelp: "Quotes also include the message's image, if any", - explainedUsage: [ - ['channel', '(optional) The channel in which the message is to quote'], - ['message', 'ID of the message to quote'] - ] - }, - commandRolesDescription: 'List, claim or unclaim public roles in this server.', - commandRolesExtended: { - extendedHelp: [ - 'Public roles are roles that are available for everyone.', - 'An administrator must configure them with the configuration command.' - ], - explainedUsage: [['roles', 'The list of roles to claim or unclaim. Leave this empty to get a list of available roles.']], - reminder: [ - 'When claiming or unclaiming roles you can provide a single or multiple role(s).', - 'To claim multiple roles, you must separate them by a comma, for example `red,green`.', - 'You can specify which roles you want by providing the role ID, name, or a sub-section of the name.', - '', - 'Administrators can add public roles using `Skyra, conf set roles.public ExamplePublicRole`.' - ], - examples: ['', 'Designer,Programmer', 'Designer'], - multiline: true - }, - commandDuckDuckGoDescription: 'Search the Internet with DuckDuckGo.', - commandDuckDuckGoExtended: { - extendedHelp: 'This uses the alternative search enginge DuckDuckGo to search the web', - reminder: 'If you want to search google use `Skyra, google`' - }, - commandPollDescription: 'Simplifies reaction-based polls.', - commandPollExtended: { - extendedHelp: 'Separate your options using commas.', - examples: ['Make an anime channel, Make a gaming channel, Make a serious-discussion channel'] - }, - commandPollReactionLimit: "Please don't add emojis while I am reacting!", - commandVoteDescription: 'Simplified reaction-based vote.', - commandVoteExtended: { - examples: ['Should I implement the #anime channel?'] - }, - commandTopInvitesDescription: 'Muestra las 10 invitaciones más utilizadas para este servidor.', - commandTopInvitesExtended: { - extendedHelp: - 'Use esto para obtener información sobre el servidor si su servidor no tiene acceso a la información sobre el servidor oficial de Discord.' - }, - commandTopInvitesNoInvites: '¡No hay invitaciones, o ninguna de ellas ha sido utilizada!', - commandTopInvitesTop10InvitesFor: ({ guild }) => `Las 10 mejores invitaciones para ${guild}`, - commandTopInvitesEmbedData: { - channel: 'Canal', - link: 'Enlace', - createdAt: 'Fecha de creacion', - createdAtUnknown: 'Fecha de creación desconocida', - expiresIn: 'Expira en', - neverExpress: 'Nunca', - temporary: 'Invitación temporal', - uses: 'Usos' - }, - commandUrbanDescription: 'Check the definition of a word on UrbanDictionary.', - commandUrbanExtended: { - extendedHelp: 'What does "spam" mean?', - explainedUsage: [ - ['Word', 'The word or phrase you want to get the definition from.'], - ['Page', 'Defaults to 1, the page you wish to read.'] - ], - examples: ['spam'] - }, - commandWhoisDescription: 'Who are you?', - commandWhoisExtended: { - extendedHelp: 'Gets information on any server member. Also known as `userinfo` in many other bots.' - }, - commandFollowageDescription: 'Check how long a Twitch user has been following a channel.', - commandFollowageExtended: { - extendedHelp: 'Just... that.', - examples: ['dallas cohhcarnage'] - }, - commandTwitchDescription: 'Check the information about a Twitch profile.', - commandTwitchExtended: { - extendedHelp: 'Really, just that.', - examples: ['riotgames'] - }, - commandTwitchSubscriptionDescription: 'Manage the subscriptions for your server.', - commandTwitchSubscriptionExtended: { - extendedHelp: [ - 'Manage the subscriptions for this server.', - '__Online Notifications__', - 'For content, the best way is writing `--embed`, the notifications will then show up in MessageEmbeds with all available data.', - 'Alternatively you can set your own content and it will post as a regular message.', - 'This content can contain some parameters that will be replaced with Twitch data:', - "- `%TITLE%` for the stream's title", - '- `%VIEWER_COUNT%` for the amount of current viewers,', - '- `%GAME_NAME%` for the title being streamed', - "- `%GAME_ID%` for the game's ID as seen by Twitch", - '- `%LANGUAGE%` for the language the stream is in', - "- `%USER_ID%` for the streamer's ID as seen by Twitch", - "- and `%USER_NAME%` for the Streamer's twitch username.", - '', - '__Offline Notifications__', - "For offline events none of the variables above are available and you'll have to write your own content.", - 'You can still use the `--embed` flag for the notification to show in a nice Twitch-purple MessageEmbed.' - ], - explainedUsage: [ - ['streamer', 'The Twitch username of the streamer to get notifications for.'], - ['channel', 'A Discord channel where to post the notifications in.'], - ['status', `The status that the Twitch streamer should get for an notification, one of online or offline.`], - ['content', 'The message to send in Discord chat. Refer to extended help above for more information.'] - ], - examples: [ - 'add favna #twitch online --embed', - 'add favna #twitch online %USER_NAME% went live | %TITLE%', - 'remove kyranet #twitch online', - 'reset kyranet', - 'reset', - 'show kyranet', - 'show' - ], - multiline: true - }, - commandWikipediaDescription: 'Search something through Wikipedia.', - commandWikipediaExtended: { - extendedHelp: - 'In NSFW channels I will also add the page image. This restriction is in place because Wikipedia has NSFW images for NSFW pages as they have to be accurate (i.e. diseases or human body parts).', - reminder: 'Most Wikipedia page titles are case sensitive. Some celeberties will have lowercase redirects, but not many.' - }, - commandYoutubeDescription: 'Search something through YouTube.', - commandYoutubeExtended: { - extendedHelp: `If I have the ${this.PERMISSIONS.MANAGE_MESSAGES} ${this.PERMISSIONS.ADD_REACTIONS} permissions then I will provide the option to navigate through the top 10 results.` - }, - - /** - * ################ - * GOOGLE COMMANDS - */ - - commandCurrentTimeDescription: 'Obtiene la hora actual en cualquier lugar del mundo', - commandCurrentTimeExtended: { - extendedHelp: [ - 'Este comando usa Google Maps para obtener las coordenadas del lugar.', - 'Una vez que este comando obtuvo las coordenadas, consulta TimezoneDB para obtener los datos de tiempo' - ], - explainedUsage: [['ubicación', 'La localidad, el gobierno, el país o el continente para consultar la hora.']], - examples: ['Madrid', 'Barcelona'], - multiline: true - }, - commandCurrentTimeLocationNotFound: 'Lo siento, pero no pude encontrar datos de tiempo para esa ubicación.', - commandCurrentTimeTitles: ({ dst }) => ({ - currentTime: 'Tiempo actual', - currentDate: 'Fecha actual', - country: 'País', - gmsOffset: 'GMT Offset', - dst: `**Horario de verano**: ${dst}` - }), - commandCurrentTimeDst: 'Observa el horario de verano en este momento', - commandCurrentTimeNoDst: 'No observa el horario de verano en este momento', - commandGsearchDescription: 'Encuentra tus cosas favoritas en Google', - commandGsearchExtended: { - extendedHelp: `Este comando consulta el poderoso motor de búsqueda de Google para encontrar sitios web para su consulta. Para imágenes, utilice el comando \`gimage\`.`, - explainedUsage: [['consulta', 'Lo que quieres encontrar en Google']], - examples: ['Discord', 'Skyra'] - }, - commandGimageDescription: 'Encuentra tus imágenes favoritas en Google', - commandGimageExtended: { - extendedHelp: `Este comando consulta el poderoso motor de búsqueda de Google para encontrar imágenes para su consulta. Para obtener resultados web regulares, utilice el comando \`gsearch\`.`, - explainedUsage: [['consulta', 'La imagen que quieres encontrar en Google']], - examples: ['Discord', 'Skyra'], - reminder: - 'Este comando se ha marcado como NSFW porque es inevitable que cuando consulta contenido explícito, obtendrá resultados explícitos.' - }, - commandLmgtfyDescription: 'Moleste a otro usuario enviándole un enlace LMGTFY (Permítame Google eso para usted).', - commandLmgtfyExtended: { - explainedUsage: [['query', 'La consulta a google']] - }, - commandWeatherDescription: 'Check the weather status in a location.', - commandWeatherExtended: { - extendedHelp: [ - 'Este comando usa Google Maps para obtener las coordenadas del lugar.', - 'Una vez que este comando obtuvo las coordenadas, consulta a DarkSky para recuperar información sobre el clima.' - ], - explainedUsage: [['ciudad', 'La localidad, el gobierno, el país o el continente para consultar la hora.']], - examples: ['Madrid', 'Barcelona'], - reminder: - 'La temperatura está en ** Celsius ** de forma predeterminada. Use la bandera --imperial o --fahrenheit para verla en ** Fahrenheit **.', - multiline: true - }, - googleErrorZeroResults: 'La aplicación no devolvió resultados.', - googleErrorRequestDenied: 'La aplicación GeoCode ha rechazado su solicitud.', - googleErrorInvalidRequest: 'Solicitud incorrecta.', - googleErrorOverQueryLimit: 'Límite de solicitudes excedida, prueba de nuevo mañana.', - googleErrorUnknown: 'Lo siento, pero no pude obtener un resultado de Google.', - - /** - * ############# - * WEEB COMMANDS - */ - - commandWblushDescription: 'Blush with a weeb picture!', - commandWblushExtended: { - extendedHelp: 'Blush with a random weeb image!' - }, - commandWcryDescription: 'Cry to somebody with a weeb picture!', - commandWcryExtended: { - extendedHelp: 'Cry with a random weeb image!', - explainedUsage: [['user', 'The user to cry to.']], - examples: ['@Skyra'] - }, - commandWcuddleDescription: 'Cuddle somebody with a weeb picture!', - commandWcuddleExtended: { - extendedHelp: 'Unlike the original cuddle command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to cuddle with.']], - examples: ['@Skyra'] - }, - commandWdanceDescription: 'Dance with a weeb picture!', - commandWdanceExtended: { - extendedHelp: 'Dance with a random weeb image!' - }, - commandWhugDescription: 'Hug somebody with a weeb picture!', - commandWhugExtended: { - extendedHelp: 'Unlike the original hug command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to give the hug.']], - examples: ['@Skyra'] - }, - commandWkissDescription: 'Kiss somebody with a weeb picture!', - commandWkissExtended: { - extendedHelp: 'Kiss somebody with a random weeb image!', - explainedUsage: [['user', 'The user to give the kiss to.']], - examples: ['@Skyra'] - }, - commandWlickDescription: 'Lick somebody with a weeb picture!', - commandWlickExtended: { - extendedHelp: 'Lick somebody with a random weeb image!', - explainedUsage: [['user', 'The user to lick.']], - examples: ['@Skyra'] - }, - commandWnomDescription: 'Nom nom with a 🍞!', - commandWnomExtended: { - extendedHelp: "Nom nom nom! Wha~... I'm busy eating!" - }, - commandWnekoDescription: 'Human kittens!', - commandWnekoExtended: { - extendedHelp: `Unlike the original kitten command, this one displays random weeb images, the difference is that they're weebs... and humans, enjoy!` - }, - commandWpatDescription: "Pats somebody's head!", - commandWpatExtended: { - extendedHelp: "Pat somebody's head with a random weeb image!", - explainedUsage: [['user', 'The user to pat with.']], - examples: ['@Skyra'] - }, - commandWpoutDescription: 'I feel somebody... mad', - commandWpoutExtended: { - extendedHelp: 'Show your expression with a random weeb image!' - }, - commandWslapDescription: 'Slap somebody with a weeb picture!', - commandWslapExtended: { - extendedHelp: 'Unlike the original slap command, this one displays random weeb images, enjoy!', - explainedUsage: [['user', 'The user to slap.']], - examples: ['@Pete'] - }, - commandWsmugDescription: 'Smug', - commandWsmugExtended: { - extendedHelp: 'Just an anime smug face!' - }, - commandWstareDescription: '*Stares*', - commandWstareExtended: { - extendedHelp: '*Still stares at you*', - explainedUsage: [['user', 'The user to stare at.']], - examples: ['@Pete'] - }, - commandWtickleDescription: 'Give tickles to somebody with a weeb picture!', - commandWtickleExtended: { - extendedHelp: 'Tickle somebody!', - explainedUsage: [['user', 'The user to tickle.']], - examples: ['@Skyra'] - }, - commandWeebUnavailableError: 'I am sorry, but the source of all my weeb images is not available at the moment. Please try again later!', - commandWeebUnexpectedError: 'Weird! I encountered an error I should have never received!', - commandWbangDescription: 'Bang 💥🔫!', - commandWbangExtended: { - extendedHelp: 'Shoot a user with a random weeb image!', - explainedUsage: [['user', 'The user to shoot.']], - examples: ['@Skyra'] - }, - commandWbangheadDescription: "STAHP! I'm banging my head here!", - commandWbangheadExtended: { - extendedHelp: 'Bang your head with a random weeb image!' - }, - commandWbiteDescription: '*nom nom* you are delicious!', - commandWbiteExtended: { - extendedHelp: 'Bite a user with a random weeb image!', - explainedUsage: [['user', 'The user to bite.']], - examples: ['@Skyra'] - }, - commandWgreetDescription: 'Say hi! to another user', - commandWgreetExtended: { - extendedHelp: 'Greet a user with a random weeb image!', - explainedUsage: [['user', 'The user to greet.']], - examples: ['@Skyra'] - }, - commandWlewdDescription: 'Lewds! Lewds! Lewds!', - commandWlewdExtended: { - extendedHelp: 'Random lewd weeb image!' - }, - commandWpunchDescription: '*pow* 👊👊', - commandWpunchExtended: { - extendedHelp: 'Punch that annoying user with a random weeb image!', - explainedUsage: [['user', 'The user to punch.']], - examples: ['@Skyra'] - }, - commandWsleepyDescription: "I'm so sleeeeepy... *yawn*", - commandWsleepyExtended: { - extendedHelp: 'Show how sleepy you are with a random weeb image!' - }, - commandWsmileDescription: "Huh, because I'm happy. Clap along if you feel like a room without a roof", - commandWsmileExtended: { - extendedHelp: 'Show just how happy you are with a random weeb image!' - }, - commandWthumbsupDescription: 'Raise your thumb into the air in a magnificent show of approval', - commandWthumbsupExtended: { - extendedHelp: 'Raise your thumb with a random weeb image!' - }, - - /** - * ############## - * ANIME COMMANDS - */ - - commandAnimeTypes: { - tv: '📺 TV', - movie: '🎥 Película', - ova: '📼 Animación de Vídeo Original', - special: '🎴 Especial' - }, - commandAnimeInvalidChoice: '¡Esa opción no es válida! Selecciona otra opción, por favor.', - commandAnimeOutputDescription: ({ englishTitle, japaneseTitle, canonicalTitle, synopsis }) => - `**Título inglés:** ${englishTitle}\n**Título japonés:** ${japaneseTitle}\n**Título canónico:** ${canonicalTitle}\n${synopsis}`, - commandAnimeNoSynopsis: 'No hay sinopsis disponible para este título.', - commandAnimeEmbedData: { - type: 'Tipo', - score: 'Puntuación', - episodes: 'Episodio(s)', - episodeLength: 'Duración del episodio', - ageRating: 'Clasificación de edad', - firstAirDate: 'Primera fecha de emisión', - watchIt: 'Míralo Aquí:', - stillAiring: 'Aún se transmite' - }, - commandMangaOutputDescription: ({ englishTitle, japaneseTitle, canonicalTitle, synopsis }) => - `**Título inglés:** ${englishTitle}\n**Título japonés:** ${japaneseTitle}\n**Título canónico:** ${canonicalTitle}\n${synopsis}`, - commandMangaTypes: { - manga: '📘 Manga', - novel: '📕 Novela', - manhwa: '🇰🇷 Manhwa', - oneShot: '☄ Cameo', - special: '🎴 Especial' - }, - commandMangaEmbedData: { - ageRating: 'Clasificación de edad', - firstPublishDate: 'Primera fecha de publicación', - readIt: 'Léelo Aquí:', - score: 'Puntuación', - type: 'Tipo', - none: 'Ninguno' - }, - commandWaifuFooter: 'Imagen por thiswaifudoesnotexist.net', - - /** - * ##################### - * ANNOUNCEMENT COMMANDS - */ - - commandSubscribeNoRole: 'Este servidor no configuró el rol para los anuncios.', - commandSubscribeSuccess: ({ role }) => `Concedido con éxito el rol: **${role}**`, - commandUnsubscribeSuccess: ({ role }) => `Removido con éxito el rol: **${role}***`, - commandSubscribeNoChannel: 'Este servidor no tiene un canal de anuncios configurado.', - commandAnnouncement: ({ role }) => `**Nuevo anuncio para** ${role}`, - commandAnnouncementSuccess: 'Se ha publicado un nuevo anuncio con éxito.', - commandAnnouncementCancelled: 'Se ha cancelado el anuncio con éxito.', - commandAnnouncementPrompt: 'Éste es el contenido que será mandado al canal de anuncios. ¿Quiere enviarlo ahora?', - commandAnnouncementEmbedMentions: ({ header }) => `${header}:`, - commandAnnouncementEmbedMentionsWithMentions: ({ header, mentions }) => `${header}, y mencionando a: ${mentions}:`, - - /** - * ################ - * GENERAL COMMANDS - */ - - commandInviteDescription: 'Muestra el enlace para invitarme.', - commandInviteExtended: { - extendedHelp: - 'Si desea obtener un enlace donde Skyra no solicitará ningún permiso, agregue `noperms`, `--noperms` o `--nopermissions` al comando.', - examples: ['', 'noperms', '--noperms', '--nopermissions'] - }, - commandInvitePermissionInviteText: 'Invita a Skyra a tu servidor', - commandInvitePermissionSupportServerText: 'Únase al servidor de soporte', - commandInvitePermissionsDescription: - 'No tengas miedo de quitar algunos permisos, Skyra te hará saber si estás intentando ejecutar un comando sin los permisos requeridos.', - commandInfoBody: [ - `Skyra ${VERSION} is a multi-purpose Discord Bot designed to run the majority of tasks with a great performance and constant 24/7 uptime.`, - "She is built on top of Klasa, a 'plug-and-play' framework built on top of the Discord.js library.", - '', - 'Skyra features:', - '• Advanced Moderation with temporary actions included', - '• Announcement management', - '• Fully configurable', - '• Message logs, member logs, and mod logs', - '• Multilingual', - '• Profiles and levels, with leaderboards and social management', - '• Role management', - '• Weeb commands (+10)!', - 'And more!' - ], - commandHelpData: ({ titleDescription, usage, extendedHelp, footerName }) => ({ - title: `${titleDescription}`, - usage: `📝 | ***Uso del Comando***\n\`${usage}\`\n`, - extended: `🔍 | ***Descripción Extendida***\n${extendedHelp}`, - footer: `Ayuda de comando para ${footerName}` - }), - commandSupportEmbedTitle: ({ username }) => `¿Necesita ayuda, ${username}?`, - commandSupportEmbedDescription: - "¡Entonces deberías unirte a [Skyra's lounge](https://join.skyra.pw)! Allí, puede recibir ayuda de los desarrolladores y otros miembros de la comunidad.", - - /** - * ##################### - * DEVELOPERS COMMANDS - */ - - commandYarnDescription: 'Responde con información sobre un paquete NodeJS utilizando el registro del paquete Yarn.', - commandYarnExtended: { - extendedHelp: `Esto es para los desarrolladores de NodeJS que desean encontrar rápidamente información sobre un paquete publicado en npm [npm](https://npmjs.com)`, - explainedUsage: [['package', 'El nombre del paquete a buscar debe ser una coincidencia exacta']], - examples: ['@skyra/char', '@skyra/saelem', '@skyra/eslint-config'] - }, - commandYarnNoPackage: `${REDCROSS} Lo siento, pero tienes que darme el nombre de un paquete para buscarlo.`, - commandYarnUnpublishedPackage: ({ pkg }) => `¡Qué desarrollador tan tonto que hizo \`${pkg}\`! ¡No lo publicaron!`, - commandYarnPackageNotFound: ({ pkg }) => `Lo siento, pero no pude encontrar ningún paquete con el nombre de \`${pkg}\` en el registro.`, - commandYarnEmbedDescriptionAuthor: ({ author }) => `❯ Autor: ${author}`, - commandYarnEmbedDescriptionMaintainers: `❯ Mantenedores: `, - commandYarnEmbedDescriptionLatestVersion: ({ latestVersionNumber }) => `❯ Ultima versión: **${latestVersionNumber}**`, - commandYarnEmbedDescriptionLicense: ({ license }) => `❯ Licencia: **${license}**`, - commandYarnEmbedDescriptionMainFile: ({ mainFile }) => `❯ Archivo principal: **${mainFile}**`, - commandYarnEmbedDescriptionDateCreated: ({ dateCreated }) => `❯ Fecha de creacion: **${dateCreated}**`, - commandYarnEmbedDescriptionDateModified: ({ dateModified }) => `❯ Fecha modificada: **${dateModified}**`, - commandYarnEmbedDescriptionDeprecated: ({ deprecated }) => `❯ Aviso de desuso: **${deprecated}**`, - commandYarnEmbedDescriptionDependenciesLabel: '__*Dependencias:*__', - commandYarnEmbedDescriptionDependenciesNoDeps: `Sin dependencias ${GREENTICK}!`, - commandYarnEmbedMoreText: 'más...', - - /** - * ############## - * FUN COMMANDS - */ - - command8ballOutput: ({ author, question, response }) => `🎱 Pregunta por ${author}: *${question}*\n${response}`, - command8ballQuestions: { - When: '^¿?cu[áa]ndo', - What: '^¿?qu[ée]', - HowMuch: '^¿?cu[áa]nto', - HowMany: '^¿?cu[áa]nto', - Why: '^¿?por qu[ée]', - Who: '^¿?qui[ée]n' - }, - command8ballWhen: ['Pronto™', 'Quizá mañana.', 'Quizá el año que viene...', 'Ahora mismo.', 'En unos cuantos meses.'], - command8ballWhat: ['Un avión.', '¿Qué? Pregunta de nuevo.', '¡Un regalo!', 'Nada.', 'Un anillo.', 'No lo sé, quizá sea algo.'], - command8ballHowMuch: [ - 'Un montón.', - 'Un poco.', - 'Un poquillo.', - 'Pregúnteme mañana.', - 'No lo sé, pregúntaselo a un físico.', - 'Absolutamente nada.', - `Entre ${random(10)} y ${random(1000)}L.`, - `${random(10)}e${random(1000)}L.`, - '2 o 3 litros, no recuerdo.', - '¡Infinito!', - '1010 litros.' - ], - command8ballHowMany: [ - 'Un montón.', - 'Un poco.', - 'Un poquillo.', - 'Pregúnteme mañana.', - 'No lo sé, pregúntaselo a un físico.', - 'Absolutamente nada.', - `Entre ${random(10)} y ${random(1000)}.`, - `${random(10)}e${random(1000)}.`, - '2 o 3, no recuerdo.', - '¡Infinito!', - '1010.' - ], - command8ballWhy: [ - 'Probablemente genética.', - 'Porque alguien decidió que fuera así.', - '¡Por la gloria de Satán, por supuesto!', - 'No lo sé, quizás fuese el destino.', - 'Porque lo dije yo.', - 'No tengo ni idea.', - 'Uhm... pregúntale al dueño del servidor.', - 'Pregunta de nuevo.', - 'Para llegar al otro lado.', - 'Lo dice en la Biblia.' - ], - command8ballWho: [ - 'Un humano.', - 'Un robot.', - 'Un avión.', - 'Un pájaro.', - 'Una composición de carbono.', - 'Un puñado de zeros y unos.', - 'No tengo ni idea, ¿es material?', - 'Eso no es lógico.' - ], - command8ballElse: [ - 'Probablemente.', - 'No.', - '¡SÍ!', - 'Quizás.', - 'Como yo lo veo, sí.', - 'Pregúnteme mañana.', - 'No lo sé, pregúntaselo a un físico.', - 'Mejor no decirte ahora.', - 'No cuentes con eso.', - 'Es cierto.', - 'Es decididamente así.', - 'Mis fuentes dicen que no.', - 'No tiene muy buena pinta.', - 'Tiene buena pinta.', - 'No pude procesar mi respuesta, inténtalo de nuevo.', - 'Un pajarito me susurró al oído diciendo que sí.', - 'Muy dudoso.', - 'Sin duda.', - 'Definitivamente, sí.', - 'Puedes confiar en ello.' - ], - - commandCatfactTitle: 'Hecho Gatuno', - commandChoiceOutput: ({ user, word }) => `🕺 *Pito, pito, gorgorito, ¿dónde vas tan bonito?...* ${user}, Elijo:${codeBlock('', word)}`, - commandChoiceMissing: 'Por favor, escribe al menos dos opciones separadas con coma.', - commandChoiceDuplicates: ({ words }) => `¿Por qué aceptaría palabras duplicadas? '${words}'.`, - commandDiceOutput: ({ result }) => `¡Lanzaste el dado! Obteniste: **${result}**`, - commandDiceRollsError: 'La cantidad de lanzamientos debe ser un número entre 1 y 1024.', - commandDiceSidesError: 'La cantidad de lados debe ser un número entre 3 y 1024.', - commandEscaperopeOutput: ({ user }) => `**${user}** usó **Cuerda Huída**`, - commandLoveLess45: 'Prueba de nuevo la próxima vez...', - commandLoveLess75: '¡Bastante bien!', - commandLoveLess100: '¡Haríais una gran pareja!', - commandLove100: '¡Emparejamiento perfecto!', - commandLoveItself: 'Eres una criatura muy especial y deberías amarte a tí mismo más que a los demás <3', - commandLoveResult: 'Resultado', - commandMarkovTimer: ({ timer }) => `Processed in ${timer}.`, - commandMarkovNoMessages: 'The channel or user has no messages.', - commandNorrisOutput: 'Chuck Norris', - commandRateOutput: ({ author, userToRate, rate, emoji }) => `**${author}**, Uhm... le daría a **${userToRate}** un **${rate}**/100 ${emoji}`, - commandRateMyself: ['Me quiero a mí misma mucho 😊', 'yo'], - commandRateOwners: ['Amo mucho a mis desarrolladores', 'mis desarrolladores'], - commandPunError: 'Something went wrong. Try again later.', - commandXkcdComics: ({ amount }) => `Hay ${amount} comics.`, - commandXkcdNotfound: - 'He buscado en todos los rincones, pero no he tenido suerte encontrando este comic, ¡prueba más tarde o prueba con otro!', - - /** - * ############## - * GAMES COMMANDS - */ - - commandGamesSkyra: 'I am sorry, I know you want to play with me, but if I do, I will not be able to help other people! 💔', - commandGamesBot: 'I am sorry, but I do not think they would like to stop doing what they are doing and play with humans.', - commandGamesSelf: 'You must be so sad to play against yourself. Try again with another user.', - commandGamesProgress: 'I am sorry, but there is a game in progress in this channel, try again when it finishes.', - commandGamesNoPlayers: ({ prefix }) => - `Por favor, especifique algunos homenajes para jugar a los Juegos del Hambre, así: \`${prefix}hg Bob, Mark, Jim, Kyra\``, - commandGamesTooManyOrFew: ({ min, max }) => `I am sorry but the amount of players is less than ${min} or greater than ${max}.`, - commandGamesRepeat: 'Lo siento, pero un usuario no puede jugar dos veces.', - commandGamesPromptTimeout: 'I am sorry, but the challengee did not reply on time.', - commandGamesPromptDeny: 'I am sorry, but the challengee refused to play.', - commandGamesTimeout: '**The match concluded in a draw due to lack of a response (60 seconds)**', - commandC4Prompt: ({ challenger, challengee }) => - `Dear ${challengee}, you have been challenged by ${challenger} in a Connect-Four match. Reply with **yes** to accept!`, - commandC4Start: ({ player }) => `Let's play! Turn for: **${player}**.`, - commandC4GameColumnFull: 'This column is full. Please try another. ', - commandC4GameWin: ({ user }) => `${user} (red) won!`, - commandC4GameWinTurn0: ({ user }) => `${user} (blue) won!`, - commandC4GameDraw: 'This match concluded in a **draw**!', - commandC4GameNext: ({ user }) => `Turn for: ${user} (red).`, - commandC4GameNextTurn0: ({ user }) => `Turn for: ${user} (blue).`, - commandC4Description: 'Play Connect-Four with somebody.', - commandC4Extended: { - extendedHelp: [ - 'This game is best played on PC.', - 'Connect Four is a two-player connection game in which the players first choose a color and then take turns dropping colored discs from the top into a seven-column, six-row vertically suspended grid.' - ], - multiline: true - }, - commandCoinFlipDescription: '¡Lanza una moneda!', - commandCoinFlipExtended: { - extendedHelp: [ - 'Lanza una moneda. Si adivina el lado que aparece, recupera su apuesta, duplicada.', - 'Si no lo haces, pierdes tu apuesta.', - 'También puede ejecutar un giro sin efectivo, que no cuesta nada, pero tampoco lo recompensa con nada.', - 'Ahora consigue esas monedas volteando.' - ], - examples: ['heads 50', 'tails 200'], - multiline: true - }, - commandCoinFlipInvalidCoinname: ({ arg }) => `Disculpe, pero ${arg} no es una cara de moneda!`, - commandCoinFlipCoinnames: ['Cabezas', 'Cruz'], - commandCoinFlipWinTitle: '¡Ganaste!', - commandCoinFlipLoseTitle: 'Perdiste.', - commandCoinFlipNoguessTitle: 'Lanzaste una moneda.', - commandCoinFlipWinDescription: ({ result }) => `La moneda fue lanzada y mostró ${result}. Lo entendiste bien!`, - commandCoinFlipWinDescriptionWithWager: ({ result, wager }) => - `La moneda fue lanzada y mostró ${result}. Adivinaste correctamente y ganaste ${wager} ${SHINY}!`, - commandCoinFlipLoseDescription: ({ result }) => `La moneda fue lanzada y mostró${result}. No adivinaste correctamente.`, - commandCoinFlipLoseDescriptionWithWager: ({ result, wager }) => - `La moneda fue lanzada y mostró${result}. No adivinaste correctamente y perdido ${wager} ${SHINY}..`, - commandCoinFlipNoguessDescription: ({ result }) => `La moneda fue lanzada y mostró ${result}.`, - commandHigherLowerDescription: 'Comenzar un juego de Mayor/Menor', - commandHigherLowerExtended: { - extendedHelp: [ - 'Mayor/Menor es un juego de suerte.', - 'Elegiré un número y tendrás que adivinar si el próximo número que elijo será **mayor** o **menor** que el actual, usando los ⬆ o ⬇ emojis.', - 'Sus ganancias aumentan a medida que avanza en las rondas, y puede retirar dinero en cualquier momento presionando el 💰 reacción emoji .', - '¡Pero ten cuidado! ¡Cuanto más lejos vayas, más posibilidades tendrás de perderlo todo!' - ], - multiline: true - }, - commandHigherLowerLoading: `${LOADING} Comenzar un nuevo juego de Mayor/Meno`, - commandHigherLowerNewround: 'Bien. Comenzando una nueva ronda', - commandHigherLowerEmbed: ({ turn, number }) => ({ - title: `¿Mayor o menor? | Turno ${turn}`, - description: `Su número es ${number}. ¿Será el siguiente mayor o menor?`, - footer: 'El juego caducará en 3 minutos, ¡así que actúa rápido!' - }), - commandHigherLowerLose: ({ number, losses }) => ({ - title: '¡Perdiste!', - description: `No lo entendiste del todo. El número era ${number}. Perdiste ${losses} ${SHINY}`, - footer: '¡Mejor suerte la próxima vez!' - }), - commandHigherLowerWin: ({ potentials, number }) => ({ - title: '¡Ganaste!', - description: `El número era ${number}. ¿Quieres continuar? Con otro intento, puedes ganar ${potentials} ${SHINY}`, - footer: '¡Actúa rapido! No tienes mucho tiempo.' - }), - commandHigherLowerCancel: ({ username }) => ({ - title: 'Juego cancelado por elección', - description: `Gracias por jugar, ¡${username}! Estaré aquí por si quieres continuar.` - }), - commandHigherLowerCashout: ({ amount }) => `${amount} ${SHINY} fueron directo a a su cuenta. ¡Espero que haya sido divertido!`, - commandHungerGamesResultHeaderBloodbath: () => 'Bloodbath', - commandHungerGamesResultHeaderSun: ({ game }) => `Day ${game.turn}`, - commandHungerGamesResultHeaderMoon: ({ game }) => `Night ${game.turn}`, - commandHungerGamesResultDeaths: ({ deaths }) => `**${deaths} cannon shot can be heard in the distance.**`, - commandHungerGamesResultDeathsPlural: ({ deaths }) => `**${deaths} cannon shots can be heard in the distance.**`, - commandHungerGamesResultProceed: 'Proceed?', - commandHungerGamesStop: 'Game finished by choice! See you later!', - commandHungerGamesWinner: ({ winner }) => `And the winner is... ${winner}!`, - commandHungerGamesDescription: 'Play Hunger Games with your friends!', - commandHungerGamesExtended: { - extendedHelp: 'Enough discussion, let the games begin!', - examples: ['Skyra, Katniss, Peeta, Clove, Cato, Johanna, Brutus, Blight'] - }, - commandSlotmachineDescription: `I bet 100${SHINY} you ain't winning this round.`, - commandSlotmachineExtended: { - extendedHelp: `Gira una máquina tragamonedas de 3 carretes y juega tus brillos para obtener recompensas más grandes`, - explainedUsage: [['Cantidad', 'Ya sea 50, 100, 200, 500 o incluso, 1000 shinies para apostar.']], - reminder: 'Recibirá al menos 5 veces la cantidad (cerezas / tada) al ganar, y hasta 24 veces (siete, diamante sin piel).' - }, - commandSlotmachinesWin: ({ roll, winnings }) => `**You rolled:**\n${roll}\n**Congratulations!**\nYou won ${winnings}${SHINY}!`, - commandSlotmachinesLoss: ({ roll }) => `**You rolled:**\n${roll}\n**Mission failed!**\nWe'll get em next time!`, - commandSlotmachineCanvasTextWon: 'Tú ganaste', - commandSlotmachineCanvasTextLost: 'Tú perdiste', - commandSlotmachineTitles: { - previous: 'Anterior', - new: 'Nuevo' - }, - commandTicTacToeDescription: 'Play Tic-Tac-Toe with somebody.', - commandTicTacToeExtended: { - extendedHelp: [ - 'Tic-tac-toe (también conocido como ceros y cruces o Xs y Os) es un juego de papel y lápiz para dos jugadores, X y O, que se turnan para marcar los espacios en una cuadrícula de 3 × 3.', - 'El jugador que logra colocar tres de sus marcas en una fila horizontal, vertical o diagonal gana el juego.' - ], - multiline: true - }, - commandTicTacToePrompt: ({ challenger, challengee }) => - `Querido ${challenger}, ${challengee} te ha desafiado en un partido de tres en raya. Responda con **yes** para aceptar`, - commandTicTacToeTurn: ({ icon, player, board }) => `(${icon}) Girar para ${player}!\n${board}`, - commandTicTacToeWinner: ({ winner, board }) => `El ganador es ...${winner}!\n${board}`, - commandTicTacToeDraw: ({ board }) => `Este partido concluyó en un **empate**!\n${board}`, - commandTriviaDescription: 'Play a game of Trivia.', - commandTriviaExtended: { - extendedHelp: [ - 'Answer questions of trivia here, with categories ranging from books to mythology! (powered by OpenTDB)', - '', - `**Categories**: ${Object.keys(CATEGORIES).join(', ')}` - ], - explainedUsage: [ - ['category', 'The category questions are asked from.'], - ['type', 'The type of question asked: can be boolean (true/false) or multiple choice.'], - ['difficulty', 'The difficulty level of the questions asked.'], - ['duration', 'The amount of time you get to answer.'] - ], - examples: ['trivia history.', 'trivia books multiple easy.', 'trivia videogames 45.'], - multiline: true - }, - commandTriviaInvalidCategory: 'Invalid category: Please use `Skyra, help trivia` for a list of categories.', - commandTriviaActiveGame: 'A game of trivia is already being played in this channel', - commandTriviaIncorrect: ({ attempt }) => `I am sorry, but **${attempt}** is not the correct answer. Better luck next time!`, - commandTriviaNoAnswer: ({ correctAnswer }) => `Looks like nobody got it! The right answer was **${correctAnswer}**.`, - commandTriviaEmbedTitles: { - trivia: 'Trivia', - difficulty: 'Difficulty' - }, - commandTriviaWinner: ({ winner, correctAnswer }) => `We have a winner! ${winner} had a right answer with **${correctAnswer}**!`, - commandVaultDescription: `Guarde sus ${SHINY} de forma segura en una bóveda para que no pueda gastarlos accidentalmente en juegos de azar.`, - commandVaultExtended: { - extendedHelp: [ - 'Esto es para los gastadores codiciosos entre nosotros que tienden a jugar demasiado en la máquina tragamonedas o girar la rueda de la fortuna.', - `Debes retirar activamente a los ${SHINY} de tu bóveda antes de que puedan gastarse el juego.` - ], - explainedUsage: [ - ['acción', 'La acción a realizar: **retirarse** para retirarse de su bóveda o **depositar** para depositar en su bóveda.'], - ['dinero', `La cantidad de ${SHINY} para retirar o depositar.`] - ], - examples: ['depositar 10000.', 'retirar 10000.'], - multiline: true - }, - commandVaultEmbedData: ({ coins }) => ({ - depositedDescription: `Depositó ${coins} ${SHINY} del saldo de su cuenta en su bóveda.`, - withdrewDescription: `Retiró ${coins} ${SHINY} de su bóveda.`, - showDescription: 'Su cuenta corriente y saldo de caja fuerte son:', - accountMoney: 'Dinero de la cuenta', - accountVault: 'Bóveda de cuenta' - }), - commandVaultInvalidCoins: 'Lo siento, pero esa es una cantidad inválida de monedas. ¡Asegúrese de que sea un número positivo!', - commandVaultNotEnoughMoney: ({ money }) => - `Lo siento, ¡pero no tienes suficiente dinero para hacer ese depósito! Su saldo monetario actual es ${money}${SHINY}`, - commandVaultNotEnoughInVault: ({ vault }) => - `Lo siento, ¡pero no tienes suficiente almacenado en tu bóveda para hacer esa retirada! Su saldo actual es ${vault}${SHINY}`, - commandWheelOfFortuneDescription: 'Juega con tus shinies haciendo girar una rueda de la fortuna.', - commandWheelOfFortuneExtended: { - extendedHelp: `Puede perder 0.1, 0.2, 0.3 o 0.5 veces su entrada o ganar 1.2, 1.5, 1.7 o 2.4 veces su entrada.` - }, - commandWheelOfFortuneTitles: { - previous: 'Anterior', - new: 'Nuevo' - }, - commandWheelOfFortuneCanvasTextWon: 'Tú ganaste', - commandWheelOfFortuneCanvasTextLost: 'Tú perdiste', - gamesNotEnoughMoney: ({ money }) => - `Lo siento, ¡pero no tienes suficiente dinero para pagar tu apuesta! El saldo de su cuenta corriente es ${money}${SHINY}`, - gamesCannotHaveNegativeMoney: `No puedes tener una cantidad negativa de ${SHINY}s`, - - /** - * ################# - * GIVEAWAY COMMANDS - */ - - giveawayTime: 'El sorteo debe durar al menos 10 seconds.', - giveawayTimeTooLong: '¡Oye! ¡Eso es un tiempo increíblemente largo para contarlo con los dedos de mis manos!', - giveawayEndsAt: 'Termina en:', - giveawayDuration: ({ time }) => `This giveaway ends in **${this.duration(time)}**! React to this message with 🎉 to join.`, - giveawayTitle: '🎉 **GIVEAWAY** 🎉', - giveawayLastchance: ({ time }) => `**LAST CHANCE**! Remaining time: **${this.duration(time)}**. React to this message with 🎉 to join.`, - giveawayLastchanceTitle: '🎉 **LAST CHANCE GIVEAWAY** 🎉', - giveawayEnded: ({ winners }) => `Ganador: ${winners}`, - giveawayEndedPlural: ({ winners }) => `Ganadores: ${winners}`, - giveawayEndedNoWinner: 'No winner...', - giveawayEndedAt: 'Ended at:', - giveawayEndedTitle: '🎉 **GIVEAWAY ENDED** 🎉', - giveawayEndedMessage: ({ winners, title }) => `Congratulations ${winners.join(' ')}! You won the giveaway **${title}**`, - giveawayEndedMessageNoWinner: ({ title }) => `The giveaway **${title}** ended without enough participants.`, - giveawayScheduled: ({ scheduledTime }) => `El sorteo comenzará en ${this.duration(scheduledTime)}.`, - - /** - * ################### - * MANAGEMENT COMMANDS - */ - - commandNickSet: ({ nickname }) => `Changed the nickname to **${nickname}**.`, - commandNickCleared: 'Nickname cleared.', - commandPermissionNodesHigher: `${REDCROSS} You cannot modify nor preview the permission nodes for this target.`, - commandPermissionNodesInvalidType: `${REDCROSS} Invalid type, expected either of \`allow\` or \`deny\`.`, - commandPermissionNodesAdd: `${GREENTICK} Successfully added the command to the permission node.`, - commandPermissionNodesNodeNotExists: `${REDCROSS} The selected permission node does not exist.`, - commandPermissionNodesCommandNotExists: `${REDCROSS} The selected command does not exist in the permision node.`, - commandPermissionNodesRemove: `${GREENTICK} Successfully removed the command from the permission node.`, - commandPermissionNodesReset: `${GREENTICK} Successfully removed all commands from the permission node.`, - commandPermissionNodesShowName: ({ name }) => `Permissions for: __${name}__`, - commandPermissionNodesShowAllow: ({ allow }) => `**Allow**: ${allow}`, - commandPermissionNodesShowDeny: ({ deny }) => `**Deny**: ${deny}`, - commandTriggersNotype: 'You need to insert a trigger type (**alias**|**reaction**)', - commandTriggersNooutput: 'You need to insert the trigger output.', - commandTriggersInvalidreaction: 'This reaction does not seem valid for me, either it is not valid unicode or I do not have access to it.', - commandTriggersInvalidalias: 'There is no command like this.', - commandTriggersRemoveNottaken: 'There is no trigger with this input.', - commandTriggersRemove: 'Successfully removed this trigger.', - commandTriggersAddTaken: 'There is already a trigger with this input.', - commandTriggersAdd: 'Successfully added the trigger.', - commandTriggersListEmpty: 'The trigger list for this guild is empty.', - commandGuildInfoTitles: { - CHANNELS: 'Channels', - MEMBERS: 'Members', - OTHER: 'Other' - }, - commandGuildInfoRoles: ({ roles }) => `**Roles**\n\n${roles}`, - commandGuildInfoNoroles: 'Roles? Where? There is no other than the `@everyone` role!', - commandGuildInfoChannels: ({ text, voice, categories, afkChannelText }) => [ - `• **${text}** Text, **${voice}** Voice, **${categories}** categories.`, - `• AFK: ${afkChannelText}` - ], - commandGuildInfoChannelsAfkChannelText: ({ afkChannel, afkTime }) => `**<#${afkChannel}>** after **${afkTime / 60}**min`, - commandGuildInfoMembers: ({ count, owner }) => [`• **${count}** members`, `• Owner: **${owner.tag}**`, ` (ID: **${owner.id}**)`], - commandGuildInfoOther: ({ size, region, createdAt, verificationLevel }) => [ - `• Roles: **${size}**`, - `• Region: **${region}**`, - `• Created at: **${timestamp.displayUTC(createdAt)}** (UTC - YYYY/MM/DD)`, - `• Verification Level: **${this.HUMAN_LEVELS[verificationLevel]}**` - ], - commandRoleInfoTitles: { PERMISSIONS: 'Permissions' }, - commandRoleInfoData: ({ role, hoisted, mentionable }) => [ - `ID: **${role.id}**`, - `Name: **${role.name}**`, - `Color: **${role.hexColor}**`, - `Hoisted: **${hoisted}**`, - `Position: **${role.rawPosition}**`, - `Mentionable: **${mentionable}**` - ], - commandRoleInfoAll: 'All Permissions granted.', - commandRoleInfoNoPermissions: 'Permissions not granted.', - commandFilterUndefinedWord: 'You must write what you want me to filter.', - commandFilterAlreadyFiltered: `This word is already filtered.`, - commandFilterNotFiltered: `This word is not filtered.`, - commandFilterAdded: ({ word }) => `${GREENTICK} Success! Added the word ${word} to the filter.`, - commandFilterRemoved: ({ word }) => `${GREENTICK} Success! Removed the word ${word} from the filter.`, - commandFilterReset: `${GREENTICK} Success! The filter has been reset.`, - commandFilterShowEmpty: 'The list of filtered words is empty!', - commandFilterShow: ({ words }) => `There is the list of all filtered words: ${words}`, - - /** - * ################################# - * MANAGEMENT/CONFIGURATION COMMANDS - */ - - commandManageCommandAutoDeleteTextChannel: - 'You must input a valid text channel, people cannot use commands in a voice or a category channel!', - commandManageCommandAutoDeleteRequiredDuration: 'You must specify an amount of seconds for the command to be automatically deleted.', - commandManageCommandAutoDeleteShowEmpty: 'There are no command autodelete configured right now.', - commandManageCommandAutoDeleteShow: ({ codeblock }) => `All command autodeletes configured:${codeblock}`, - commandManageCommandAutoDeleteAdd: ({ channel, time }) => - `${GREENTICK} Success! All successful commands in ${channel} will be deleted after ${this.duration(time)}!`, - commandManageCommandAutoDeleteRemove: ({ channel }) => - `${GREENTICK} Success! Commands will not be automatically deleted in ${channel} anymore!`, - commandManageCommandAutoDeleteRemoveNotset: ({ channel }) => - `${REDCROSS} The channel ${channel} was not configured to automatically delete messages!`, - commandManageCommandAutoDeleteReset: 'All the command autodeletes have been reset.', - commandManageCommandChannelTextChannel: 'You must input a valid text channel, people cannot use commands in a voice or a category channel!', - commandManageCommandChannelRequiredCommand: "You must specify what command do you want to add or remove from the channel's filter.", - commandManageCommandChannelShow: ({ channel, commands }) => `List of disabled commands in ${channel}: ${commands}`, - commandManageCommandChannelShowEmpty: 'The list of disabled commands for the specified channel is empty!', - commandManageCommandChannelAddAlreadyset: 'The command you are trying to disable is already disabled!', - commandManageCommandChannelAdd: ({ channel, command }) => `Successfully disabled the command ${command} for the channel ${channel}!`, - commandManageCommandChannelRemoveNotset: ({ channel }) => `The command you are trying to enable was not disabled for ${channel}.`, - commandManageCommandChannelRemove: ({ channel, command }) => `Successfully enabled the command ${command} for the channel ${channel}!`, - commandManageCommandChannelResetEmpty: 'This channel had no disabled command, so I decided to do nothing.', - commandManageCommandChannelReset: ({ channel }) => `Successfully enabled all disabled commands in ${channel}, enjoy!`, - commandManageReactionRolesShowEmpty: 'There are no reaction roles set up in this server.', - commandManageReactionRolesAddChannel: ({ emoji, channel }) => - `${GREENTICK} Success! I will now give the role when people react with ${emoji} to any message from ${channel}!`, - commandManageReactionRolesAddPrompt: 'Listening now! Please react to a message and I will bind the reaction with the role!', - commandManageReactionRolesAddMissing: 'I waited, but you did not seem to have reacted to a message.', - commandManageReactionRolesAdd: ({ emoji, url }) => - `${GREENTICK} Success! I will now give the role when people react with ${emoji} at ${url}!`, - commandManageReactionRolesRemoveNotExists: 'The reaction role you specified does not exist.', - commandManageReactionRolesRemove: ({ emoji, url }) => - `${GREENTICK} Success! I will not longer give the role when people react with ${emoji} at ${url}!`, - commandManageReactionRolesResetEmpty: 'There were no reaction roles set up.', - commandManageReactionRolesReset: `${GREENTICK} Successfully removed all reaction roles.`, - commandSetStarboardEmojiSet: ({ emoji }) => `Successfully set a new emoji for the next star messages: ${emoji}`, - configurationTextChannelRequired: 'The selected channel is not a valid text channel, try again with another.', - configurationEquals: 'Successfully configured: no changes were made.', - commandSetIgnoreChannelsSet: ({ channel }) => `Ignoring all command input from ${channel} now.`, - commandSetIgnoreChannelsRemoved: ({ channel }) => `Listening all command input from ${channel} now.`, - commandSetImageLogsSet: ({ channel }) => `Establezca correctamente el canal de registros de imagen en ${channel}.`, - commandSetMemberLogsSet: ({ channel }) => `Establecer correctamente el canal de registros de miembros en ${channel}.`, - commandSetMessageLogsSet: ({ channel }) => `Establezca correctamente el canal de registros de mensajes en ${channel}.`, - commandSetModLogsSet: ({ channel }) => `Establezca con éxito el canal de registros de modificaciones en ${channel}.`, - commandSetPrefixSet: ({ prefix }) => `Successfully set the prefix to ${prefix}. Use ${prefix}setPrefix to change it again.`, - - /** - * ########################### - * MANAGEMENT/MEMBERS COMMANDS - */ - - commandStickyRolesRequiredUser: 'A user target is required for this command to work.', - commandStickyRolesRequiredRole: 'A role name is required when adding or removing a role.', - commandStickyRolesNotExists: ({ user }) => `The user ${user} does not have any sticky roles or does not have the specified one.`, - commandStickyRolesReset: ({ user }) => `Successfully removed all sticky roles from ${user}.`, - commandStickyRolesRemove: ({ user }) => `Successfully removed the specified role from ${user}.`, - commandStickyRolesAddExists: ({ user }) => `The user ${user} already had the specified role as sticky.`, - commandStickyRolesAdd: ({ user }) => `Successfully added the specified role as sticky to ${user}.`, - commandStickyRolesShowEmpty: 'There are no sticky roles to show.', - commandStickyRolesShowSingle: ({ user, roles }) => `Sticky Role(s) for **${user}**: ${roles}.`, - - /** - * ############# - * MISC COMMANDS - */ - - commandRandRedditRequiredReddit: 'You must give the name of a reddit.', - commandRandRedditInvalidArgument: `${REDCROSS} The name you gave was not a valid name for a subreddit.`, - commandRandRedditBanned: 'This reddit is banned and should not be used.', - commandRandRedditFail: 'I failed to retrieve data, are you sure you wrote the reddit correctly?', - commandRandRedditAllNsfw: 'Nothing could be posted as all retrieved posts are NSFW.', - commandRandRedditAllNsfl: 'Nothing could be posted as all retrieved posts are NSFL. You do not want to see that.', - commandRandRedditMessage: ({ title, author, url }) => `**${title}** submitted by ${author}\n${url}`, - commandRandRedditErrorPrivate: `${REDCROSS} No data could be downloaded as the subreddit is marked as private.`, - commandRandRedditErrorQuarantined: `${REDCROSS} No data could be downloaded as the subreddit is marked as quarantined.`, - commandRandRedditErrorNotFound: `${REDCROSS} No data could be downloaded as the subreddit does not exist.`, - commandRandRedditErrorBanned: `${REDCROSS} No data could be downloaded as the subreddit is marked as banned.`, - commandRedditUserComplexityLevels: ['muy bajo', 'bajo', 'medio', 'alto', 'muy alto', 'muy alto'], - commandRedditUserInvalidUser: ({ user }) => `\`${user}\` no es un nombre de usuario de Reddit válido`, - commandRedditUserQueryFailed: 'No se pudieron encontrar datos para ese usuario de reddit', - commandRedditUserTitles: { - linkKarma: 'Link Karma', - commentKarma: 'Comentar Karma', - totalComments: 'Comentarios totales', - totalSubmissions: 'Presentaciones totales', - commentControversiality: 'Comentario controversialidad', - textComplexity: 'Complejidad de texto', - top5Subreddits: 'Top 5 Subreddits', - bySubmissions: 'por sumisión', - byComments: 'por comentarios', - bestComment: 'Mejor comentario', - worstComment: 'Peor comentario' - }, - commandRedditUserData: ({ user, timestamp }) => ({ - overviewFor: `Resumen de/u/${user}`, - permalink: 'Enlace permanente', - dataAvailableFor: 'Los datos están disponibles para los últimos 1000 comentarios y presentaciones (limitación de la API de Reddit)', - joinedReddit: `Se unió a Reddit ${timestamp}` - }), - commandSnipeEmpty: 'There are no sniped messages in this channel.', - commandSnipeTitle: 'Sniped Message', - commandUpvoteMessage: - 'Upvote me on **https://top.gg/bot/266624760782258186**, **https://botsfordiscord.com/bot/266624760782258186**, or **https://botlist.space/bot/266624760782258186** for free shinies! Remember, you can vote every 24 hours.', - commandVaporwaveOutput: ({ str }) => `Here is your converted message:\n${str}`, - - /** - * ############################# - * MODERATION/UTILITIES COMMANDS - */ - - commandPermissions: ({ username, id }) => `Permissions for ${username} (${id})`, - commandPermissionsAll: 'All Permissions', - commandFlow: ({ amount }) => `${amount} messages have been sent within the last minute.`, - commandTimeTimed: 'The selected moderation case has already been timed.', - commandTimeUndefinedTime: 'You must specify a time.', - commandTimeUnsupportedType: 'The type of action for the selected case cannot be reverse, therefore this action is unsupported.', - commandTimeNotScheduled: 'This task is not scheduled.', - commandTimeAborted: ({ title }) => `Successfully aborted the schedule for ${title}`, - commandTimeScheduled: ({ title, user, time }) => - `${GREENTICK} Successfully scheduled a moderation action type **${title}** for the user ${user.tag} (${ - user.id - }) with a duration of ${this.duration(time)}`, - - /** - * ################### - * MODERATION COMMANDS - */ - - commandSlowmodeSet: ({ cooldown }) => `The cooldown for this channel has been set to ${this.duration(cooldown)}.`, - commandSlowmodeReset: 'The cooldown for this channel has been reset.', - commandSlowmodeTooLong: `${REDCROSS} The maximum amount of time you can set is 6 hours.`, - commandTimeDescription: 'Set the timer.', - commandTimeExtended: { - extendedHelp: 'Updates the timer for a moderation case..', - explainedUsage: [ - ['cancel', 'Whether or not you want to cancel the timer.'], - ['case', 'The case you want to update'], - ['timer', 'The timer, ignored if `cancel` was defined.'] - ], - examples: ['cancel 1234', '1234 6h'] - }, - commandBanNotBannable: 'The target is not bannable for me.', - commandDehoistStarting: ({ count }) => `I will start dehoisting ${count} members...`, - commandDehoistProgress: ({ count, percentage }) => `Dehoisted ${count} members so far! (${percentage}%)`, - commandDehoistEmbed: ({ users, dehoistedMemberCount, dehoistedWithErrorsCount, errored }) => ({ - title: `Finished dehoisting ${users} members`, - descriptionNoone: 'No members were dehoisted. A round of applause for your law-abiding users!', - descriptionWithError: `${dehoistedWithErrorsCount} member was dehoisted. We also tried to dehoist an additional ${errored} member, but they errored out`, - descriptionWithMultipleErrors: `${dehoistedWithErrorsCount} members were dehoisted. We also tried to dehoist an additional ${errored} members, but they errored out`, - description: `${dehoistedMemberCount} member was dehoisted`, - descriptionMultipleMembers: `${dehoistedMemberCount} members were dehoisted`, - fieldErrorTitle: 'The users we encountered an error for:' - }), - commandKickNotKickable: 'The target is not kickable for me.', - commandLockdownLock: ({ channel }) => `The channel ${channel} is now locked.`, - commandLockdownLocking: ({ channel }) => `${LOADING} Locking the channel ${channel}... I might not be able to reply after this.`, - commandLockdownLocked: ({ channel }) => `The channel ${channel} was already locked.`, - commandLockdownUnlocked: ({ channel }) => `The channel ${channel} was not locked.`, - commandLockdownOpen: ({ channel }) => `The lockdown for the channel ${channel} has been released.`, - commandMuteLowlevel: 'I am sorry, there is no Mute role configured. Please ask an Administrator or the Guild Owner to set it up.', - commandMuteConfigureCancelled: 'Prompt aborted, the Mute role creation has been cancelled.', - commandMuteConfigure: 'Do you want me to create and configure the Mute role now?', - commandMuteConfigureToomanyRoles: 'There are too many roles (250). Please delete a role before proceeding.', - commandMuteMuted: 'The target user is already muted.', - commandMuteUserNotMuted: 'This user is not muted.', - commandMuteUnconfigured: 'This guild does not have a **Muted** role. Aborting command execution.', - commandMutecreateMissingPermission: `I need the **${this.PERMISSIONS.MANAGE_ROLES}** permission to create the role and **${this.PERMISSIONS.MANAGE_CHANNELS}** to edit the channels permissions.`, - commandRestrictLowlevel: `${REDCROSS} I am sorry, there is no restriction role configured. Please ask an Administrator or the server owner to set i up.`, - commandPruneInvalid: `${REDCROSS} You did not specify the arguments correctly, please make sure you gave a correct limit or filter.`, - commandPruneAlert: ({ count, total }) => `Successfully deleted ${count} message from ${total}.`, - commandPruneAlertPlural: ({ count, total }) => `Successfully deleted ${count} messages from ${total}.`, - commandPruneInvalidPosition: `${REDCROSS} Position must be one of "before" or "after".`, - commandPruneInvalidFilter: `${REDCROSS} Filtro debe ser uno de "archivo", "autor", "bot", "humano", "invitación", "enlace" o "skyra".`, - commandPruneNoDeletes: 'No message has been deleted, either no message match the filter or they are over 14 days old.', - commandPruneLogHeader: - 'The following messages have been generated by request of a moderator.\nThe date formatting is of `YYYY/MM/DD hh:mm:ss`.', - commandPruneLogMessage: ({ channel, author, count }) => `${count} message deleted in ${channel} by ${author}.`, - commandPruneLogMessagePlural: ({ channel, author, count }) => `${count} messages deleted in ${channel} by ${author}.`, - commandReasonMissingCase: 'You need to provide a case or a case range.', - commandReasonNotExists: `The selected modlog doen't seem to exist.`, - commandReasonUpdated: ({ newReason }) => [`${GREENTICK} Actualizado 1 caso.`, ` └─ **Set the reason to:** ${newReason}`], - commandReasonUpdatedPlural: ({ entries, newReason }) => [ - `${GREENTICK} Actualizados ${entries.length} casos.`, - ` └─ **Set their reasons to:** ${newReason}` - ], - commandToggleModerationDmToggledEnabled: `${GREENTICK} Successfully enabled moderation DMs.`, - commandToggleModerationDmToggledDisabled: `${GREENTICK} Successfully disabled moderation DMs`, - commandUnbanMissingPermission: `I will need the **${this.PERMISSIONS.BAN_MEMBERS}** permission to be able to unban.`, - commandUnmuteMissingPermission: `I will need the **${this.PERMISSIONS.MANAGE_ROLES}** permission to be able to unmute.`, - commandVmuteMissingPermission: `I will need the **${this.PERMISSIONS.MUTE_MEMBERS}** permission to be able to voice unmute.`, - commandVmuteUserNotMuted: 'This user is not voice muted.', - commandWarnDm: ({ moderator, guild, reason }) => `You have been warned by ${moderator} in ${guild} for the reason: ${reason}`, - commandWarnMessage: ({ user, log }) => `|\`🔨\`| [Case::${log}] **WARNED**: ${user.tag} (${user.id})`, - commandModerationOutput: ({ range, users }) => `${GREENTICK} Created case ${range} | ${users}.`, - commandModerationOutputPlural: ({ range, users }) => `${GREENTICK} Created cases ${range} | ${users}.`, - commandModerationOutputWithReason: ({ range, users, reason }) => - `${GREENTICK} Created case ${range} | ${users}.\nWith the reason of: ${reason}`, - commandModerationOutputWithReasonPlural: ({ range, users, reason }) => - `${GREENTICK} Created cases ${range} | ${users}.\nWith the reason of: ${reason}`, - commandModerationFailed: ({ users }) => `${REDCROSS} Failed to moderate user:\n${users}`, - commandModerationFailedPlural: ({ users }) => `${REDCROSS} Failed to moderate users:\n${users}`, - commandModerationDmFooter: 'To disable moderation DMs, write `toggleModerationDM`.', - commandModerationDmDescription: ({ guild, title }) => [ - `**❯ Server**: ${guild}`, // - `**❯ Type**: ${title}`, - `**❯ Reason**: None specified` - ], - commandModerationDmDescriptionWithReason: ({ guild, title, reason }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Reason**: ${reason}` - ], - commandModerationDmDescriptionWithDuration: ({ guild, title, duration: pDuration }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Duration**: ${this.duration(pDuration!)}`, - `**❯ Reason**: None specified` - ], - commandModerationDmDescriptionWithReasonWithDuration: ({ guild, title, reason, duration: pDuration }) => [ - `**❯ Server**: ${guild}`, - `**❯ Type**: ${title}`, - `**❯ Duration**: ${this.duration(pDuration!)}`, - `**❯ Reason**: ${reason}` - ], - commandModerationDays: 'd[ií]as?', - - /** - * ############### - * SOCIAL COMMANDS - */ - - commandAutoRolePointsRequired: 'You must input a valid amount of points.', - commandAutoRoleUpdateConfigured: 'This role is already configured as an autorole. Use the remove type instead.', - commandAutoRoleUpdateUnconfigured: 'This role is not configured as an autorole. Use the add type instead.', - commandAutoRoleUpdate: ({ role, points, before }) => - `Updated autorole: ${role.name} (${role.id}). Points required: ${points} (before: ${before})`, - commandAutoRoleRemove: ({ role, before }) => `Removed the autorole: ${role.name} (${role.id}), which required ${before} points.`, - commandAutoRoleAdd: ({ role, points }) => `Added new autorole: ${role.name} (${role.id}). Points required: ${points}`, - commandAutoRoleListEmpty: 'There is no role configured as an autorole in this server.', - commandAutoRoleUnknownRole: ({ role }) => `Unknown role: ${role}`, - commandBalance: ({ user, amount }) => `The user ${user} has a total of ${amount}${SHINY}`, - commandBalanceSelf: ({ amount }) => `You have a total of ${amount}${SHINY}`, - commandBalanceBots: `I think they have 5 gears as much, bots don't have ${SHINY}`, - commandSocialMemberNotexists: `${REDCROSS} The member is not in this server, and is not in my database either.`, - commandSocialAdd: ({ user, amount, count }) => `${GREENTICK} Successfully added ${count} point to ${user}. Current amount: ${amount}.`, - commandSocialAddPlural: ({ user, amount, count }) => `${GREENTICK} Successfully added ${count} points to ${user}. Current amount: ${amount}.`, - commandSocialRemove: ({ user, amount, count }) => `${GREENTICK} Successfully removed ${count} point to ${user}. Current amount: ${amount}.`, - commandSocialRemovePlural: ({ user, amount, count }) => - `${GREENTICK} Successfully removed ${count} points to ${user}. Current amount: ${amount}.`, - commandSocialUnchanged: ({ user }) => `${REDCROSS} The user ${user} already had the given amount of points, no update was needed.`, - commandSocialReset: ({ user }) => `${GREENTICK} The user ${user} got his points removed.`, - commandBannerMissing: ({ type }) => `You must specify a banner id to ${type}.`, - commandBannerNotexists: ({ prefix }) => - `This banner id does not exist. Please check \`${prefix}banner list\` for a list of banners you can buy.`, - commandBannerUserlistEmpty: ({ prefix }) => `You did not buy a banner yet. Check \`${prefix}banner list\` for a list of banners you can buy.`, - commandBannerResetDefault: 'You are already using the default banner.', - commandBannerReset: 'Your banner has been reset to the default.', - commandBannerSetNotBought: 'You did not buy this banner yet.', - commandBannerSet: ({ banner }) => `${GREENTICK} **Success**. You have set your banner to: __${banner}__`, - commandBannerBought: ({ prefix, banner }) => - `You already have this banner, you may want to use \`${prefix}banner set ${banner}\` to make it visible in your profile.`, - commandBannerMoney: ({ money, cost }) => - `You do not have enough money to buy this banner. You have ${money}${SHINY}, the banner costs ${cost}${SHINY}`, - commandBannerPaymentCancelled: `${REDCROSS} The payment has been cancelled.`, - commandBannerBuy: ({ banner }) => `${GREENTICK} **Success**. You have bought the banner: __${banner}__`, - commandBannerPrompt: - 'Reply to this message choosing an option:\n`all` to check a list of all available banners.\n`user` to check a list of all bought banners.', - commandToggleDarkModeEnabled: `${GREENTICK} Successfully enabled the dark mode.`, - commandToggleDarkModeDisabled: `${GREENTICK} Successfully disabled the dark mode.`, - commandDailyTime: ({ time }) => `El siguiente pago está disponible en: ${this.duration(time)}`, - commandDailyTimeSuccess: ({ amount }) => `¡Yuhu! ¡Has obtenido ${amount}${SHINY}! Siguiente pago en: 12 horas.`, - commandDailyGrace: ({ remaining }) => [ - '¿Te gustaría recibir el pago temprano? El tiempo restante será añadido al periodo normal de espera, de 12 horas.', - `Tiempo restante: ${this.duration(remaining)}` - ], - commandDailyGraceAccepted: ({ amount, remaining }) => - `¡Dinero dinero! ¡Has recibido ${amount}${SHINY}! Siguiente pago en: ${this.duration(remaining)}`, - commandDailyGraceDenied: '¡De acuerdo! ¡Vuelve pronto!', - commandDailyCollect: 'Collect dailies', - commandLevel: { - level: 'Nivel', - experience: 'Experiencia', - nextIn: 'Siguiente nivel en' - }, - commandDivorceSelf: 'I am sorry, but you cannot divorce yourself.', - commandDivorceNotTaken: 'Who would you divorce? You are not even taken!', - commandDivorcePrompt: 'Ooh... that sounds quite bad 💔... are you 100% sure about this?', - commandDivorceCancel: 'Oh lord. I am very glad you will continue with your partner!', - commandDivorceDm: ({ user }) => `Pardon... but... do you remember ${user}? He decided to break up with you 💔!`, - commandDivorceSuccess: ({ user }) => `Successful divorce 💔... You are no longer married to ${user}!`, - commandMarryWith: ({ users }) => `Dear, how could you forget it... You are currently married to ${this.list(users, 'y')}!`, - commandMarryNotTaken: 'Uh... I am sorry, but I am not aware of you being married... have you tried proposing to somebody?', - commandMarrySkyra: 'I am sorry, I know you love me, but I am already taken by a brave man I love 💞!', - commandMarryAelia: 'In your dreams. She is my sister, I am not letting somebody harm her!', - commandMarryBots: 'Oh no! You should not be marrying bots! They still do not understand what true love is, and they are not warm!', - commandMarrySelf: 'No! This is not how this works! You cannot marry yourself, who would you spend your life with? 💔', - commandMarryAuthorTaken: ({ author }) => - `You are already married. Is your love big enough for two people? <@${author.id}>, reply with **yes** to confirm!`, - commandMarryAuthorMultipleCancel: ({ user }) => `Cancelling. Your commitment to ${user} is admirable.`, - commandMarryTaken: () => `This user is already married to someone. Would you like to join their harem?`, - commandMarryTakenPlural: ({ count: spousesCount }) => - `This user is already married to ${spousesCount} people. Would you like to join their harem?`, - commandMarryAlreadyMarried: ({ user }) => `You are already married with ${user}, did you forget it?`, - commandMarryAuthorTooMany: ({ limit }) => `${REDCROSS} Ya estás casado con demasiadas personas, ¡tu límite de casamientos es ${limit}!`, - commandMarryTargetTooMany: ({ limit }) => - `${REDCROSS} La persona a la que intentas casarte ya está casada con demasiadas personas, ¡su límite de casamientos es ${limit}!`, - commandMarryMultipleCancel: "Cancelling. Don't worry, you'll find someone you don't have to share!", - commandMarryPetition: ({ author, user }) => - `Fresh pair of eyes! ${author.username} is proposing to ${user.username}! 💞 <@${user.id}>, reply with **yes** to accept!`, - commandMarryNoreply: 'The user did not reply on time... Maybe it was a hard decision?', - commandMarryDenied: 'O-oh... The user rejected your proposal! 💔', - commandMarryAccepted: ({ author, user }) => `Congratulations dear ${author}! You're now officially married with ${user}! ❤`, - commandMylevel: ({ points, next, user }) => `The user ${user} has a total of ${points} points.${next}`, - commandMylevelSelf: ({ points, next }) => `You have a total of ${points} points.${next}`, - commandMylevelNext: ({ remaining, next }) => `Points for next rank: **${remaining}** (at ${next} points).`, - commandPayMissingMoney: ({ needed, has }) => `I am sorry, but you need ${needed}${SHINY} and you have ${has}${SHINY}`, - commandPayPrompt: ({ user, amount }) => `You are about to pay ${user} ${amount}${SHINY}, are you sure you want to proceed?`, - commandPayPromptAccept: ({ user, amount }) => `Payment accepted, ${amount}${SHINY} has been sent to ${user}'s profile.`, - commandPayPromptDeny: 'Payment denied.', - commandPaySelf: 'If I taxed this, you would lose money, therefore, do not try to pay yourself.', - commandSocialPayBot: 'Oh, sorry, but money is meaningless for bots, I am pretty sure a human would take advantage of it better.', - commandProfile: { - globalRank: 'Posición Mundial', - credits: 'Créditos | Bóveda', - reputation: 'Reputación', - experience: 'Experiencia', - level: 'Nivel' - }, - commandRemindmeCreate: ({ id }) => `A reminder with ID \`${id}\` has been created.`, - commandRemindmeCreateNoDuration: 'You must tell me what you want me to remind you and when.', - commandRemindmeCreateNoDescription: 'Algo, no me dijiste qué.', - commandRemindmeDeleteNoId: "To delete a previously created reminder, you must type 'delete' followed by the ID.", - commandRemindmeDelete: ({ task, id }) => - `The reminder with ID \`${id}\` and with a remaining time of **${this.duration( - task.time.getTime() - Date.now() - )}** has been successfully deleted.`, - commandRemindmeListEmpty: 'You do not have any active reminder', - commandRemindmeShowFooter: ({ id }) => `ID: ${id} | Ends at:`, - commandRemindmeInvalidId: 'I am sorry, but the ID provided does not seem to be valid.', - commandRemindmeNotfound: 'I cannot find something here. The reminder either never existed or it ended.', - - commandReputationTime: ({ remaining }) => `You can give a reputation point in ${this.duration(remaining)}`, - commandReputationUsable: 'You can give a reputation point now.', - commandReputationUserNotfound: 'You must mention a user to give a reputation point.', - commandReputationSelf: 'You cannot give a reputation point to yourself.', - commandReputationBots: 'You cannot give a reputation point to bots.', - commandReputationGive: ({ user }) => `You have given a reputation point to **${user}**!`, - commandReputationsBots: 'Bots cannot have reputation points...', - commandReputationsSelf: ({ points }) => `You have a total of ${points} reputation points.`, - commandReputation: ({ count }) => `${count} reputation point`, - commandReputationPlural: ({ count }) => `${count} reputation points`, - commandReputations: ({ user, points }) => `The user ${user} has a total of ${points}.`, - commandRequireRole: 'I am sorry, but you must provide a role for this command.', - commandScoreboardPosition: ({ position }) => `Your placing position is: ${position}`, - commandSetColor: ({ color }) => `Color changed to ${color}`, - - /** - * ################## - * STARBOARD COMMANDS - */ - - commandStarNostars: 'There is no starred message.', - commandStarNoChannel: `I'm sorry, but a starboard channel hasn't been set up.`, - commandStarStats: 'Starboard Stats', - commandStarMessages: ({ count }) => `${count} message`, - commandStarMessagesPlural: ({ count }) => `${count} messages`, - commandStars: ({ count }) => `${count} star`, - commandStarsPlural: ({ count }) => `${count} stars`, - commandStarStatsDescription: ({ messages, stars }) => `${messages} starred with a total of ${stars}`, - commandStarTopstarred: 'Top Starred Posts', - commandStarTopstarredDescription: ({ medal, id, count }) => `${medal}: ${id} (${count} star)`, - commandStarTopstarredDescriptionPlural: ({ medal, id, count }) => `${medal}: ${id} (${count} stars)`, - commandStarTopreceivers: 'Top Star Receivers', - commandStarTopreceiversDescription: ({ medal, id, count }) => `${medal}: <@${id}> (${count} star)`, - commandStarTopreceiversDescriptionPlural: ({ medal, id, count }) => `${medal}: <@${id}> (${count} stars)`, - - /** - * #################### - * SUGGESTIONS COMMANDS - */ - - commandSuggestDescription: 'Manda una sugerencia para el servidor.', - commandSuggestExtended: { - extendedHelp: 'Publica una recomendación en el canal de recomendaciones del servidor', - explainedUsage: [['suggestion', 'Su recomendación']], - examples: ['Crear un canal de música.'], - reminder: - 'Debe tener una configuración de canal de sugerencias para que este comando funcione. Si eres un administrador, se le dará la opción de hacerlo al invocar el comando.' - }, - commandSuggestNoSetup: ({ username }) => - `Lo siento ${username}, pero no los administradores no han configurado un canal de texto para las sugerencias.`, - commandSuggestNoSetupAsk: ({ username }) => - `Lo siento ${username}, pero no se ha configurado un canal de texto para las sugerencias... ¿Quieres hacerlo ahora?`, - commandSuggestNoSetupAbort: '¡Entendido! Puede usar este comando si cambia de opinión.', - commandSuggestNopermissions: ({ username, channel }) => - `Lo siento ${username}, pero los administradores no me dieron permisos para enviar mensajes en ${channel}.`, - commandSuggestChannelPrompt: 'Mencione el canal de texto o escriba su nombre o ID que en el que quiere que se publiquen las sugerencias.', - commandSuggestTitle: ({ id }) => `Recomendación #${id}`, - commandSuggestSuccess: ({ channel }) => `¡Gracias por su sugerencia! Lo he publicado en ${channel}!`, - commandResolveSuggestionDescription: 'Modifica el estado de la sugerencia.', - commandResolveSuggestionExtended: { - extendedHelp: 'Este comando le permite actualizar el estado de una sugerencia, marcándola como aceptada, considerada o denegada', - examples: [ - '1 accept ¡Gracias por su recomendación!', - '1 a ¡Gracias por su recomendación!', - '1 consider Hmm... podemos hacer esto, pero es una prioridad realmente baja.', - '1 c Hmm... podemos hacer esto, pero es una prioridad realmente baja.', - '1 deny De ninguna manera de que esto suceda.', - '1 d De ninguna manera de que esto suceda.' - ], - reminder: [ - 'Se puede configurar para enviar un mensaje directo al autor con respecto al estado de su recomendación, con la configuración `suggestions.on-action.dm`.', - 'Además, en caso de que desee preservar el anonimato, puede ocultar su nombre utilizando la configuración `suggestions.on-action`, que puede anteponerse con las señales `--hide-author` y `--show-author`.' - ], - multiline: true - }, - commandResolveSuggestionInvalidId: `${REDCROSS} ¡Eso no era un número! Por favor vuelva a ejecutar el comando pero con el numerito del título de la sugerencia.`, - commandResolveSuggestionMessageNotFound: `${REDCROSS} No pude recuperar la sugerencia ya que su mensaje ha sido eliminado.`, - commandResolveSuggestionIdNotFound: `${REDCROSS} ¡No pude encontrar la recomendación! ¿Estás seguro/a de que no te confundiste de numerito?`, - commandResolveSuggestionDefaultComment: 'Ningún comentario.', - commandResolveSuggestionAuthorAdmin: 'Un administrador', - commandResolveSuggestionAuthorModerator: 'Un moderador', - commandResolveSuggestionActions: ({ author }) => ({ - accept: `${author} ha aceptado esta sugerencia:`, - consider: `${author} ha considerado esta sugerencia:`, - deny: `${author} ha negado esta sugerencia:` - }), - commandResolveSuggestionActionsDms: ({ author, guild }) => ({ - accept: `${author} ha aceptado su sugerencia en ${guild}:`, - consider: `${author} ha considerado su sugerencia en ${guild}:`, - deny: `${author} ha negado su sugerencia en ${guild}:` - }), - commandResolveSuggestionDmFail: `${REDCROSS} No pude enviar el mensaje directo al usuario. ¿Están cerrados sus mensajes directos?`, - commandResolveSuggestionSuccess: ({ id, actionText }) => `${GREENTICK} Recomendación \`${id}\` ${actionText} con éxito!`, - commandResolveSuggestionSuccessAcceptedText: 'aceptada', - commandResolveSuggestionSuccessDeniedText: 'denegada', - commandResolveSuggestionSuccessConsideredText: 'considerada', - - /** - * ############### - * SYSTEM COMMANDS - */ - - commandEvalTimeout: ({ seconds }) => `TIMEOUT: Took longer than ${seconds} seconds.`, - commandEvalError: ({ time, output, type }) => `**Error**:${output}\n**Type**:${type}\n${time}`, - - commandStatsTitles: { - stats: 'Statistics', - uptime: 'Uptime', - serverUsage: 'Server Usage' - }, - commandStatsFields: ({ stats, uptime, usage }) => ({ - stats: [ - `• **Users**: ${stats.users}`, - `• **Guilds**: ${stats.guilds}`, - `• **Channels**: ${stats.channels}`, - `• **Discord.js**: ${stats.version}`, - `• **Node.js**: ${stats.nodeJs}`, - `• **Klasa**: ${klasaVersion}` - ], - uptime: [ - `• **Host**: ${this.duration(uptime.host, 2)}`, - `• **Total**: ${this.duration(uptime.total, 2)}`, - `• **Client**: ${this.duration(uptime.client, 2)}` - ], - serverUsage: [`• **CPU Load**: ${usage.cpuLoad.join('% | ')}%`, `• **Heap**: ${usage.ramUsed} (Total: ${usage.ramTotal})`] - }), - - /** - * ############# - * TAGS COMMANDS - */ - - commandTagDescription: "Manage this guilds' tags.", - commandTagExtended: { - extendedHelp: [ - 'Tags, also known as custom commands, can give you a chunk of text stored under a specific name.', - 'For example after adding a tag with `Skyra, tag add rule1 ` you can use it with `Skyra, rule1` or `Skyra, tag rule1`', - "When adding tags you can customize the final look by adding flags to the tag content (these won't show up in the tag itself!):", - '❯ Add `--embed` to have Skyra send the tag embedded.', - 'The content will be in the description, so you can use all the markdown you wish. for example, adding [masked links](https://skyra.pw).', - '❯ Add `--color=` or `--colour=` to have Skyra colourize the embed. Does nothing unless also specifying `--embed`.', - 'Colours can be RGB, HSL, HEX or Decimal.' - ], - explainedUsage: [ - [ - 'action', - `The action to perform: ${this.list( - [ - '`add` to add new tags', - '`remove` to delete a tag', - '`edit` to edit a tag', - '`source` to get the source of a tag', - '`list` to list all known tags', - '`show` to show a tag' - ], - 'o' - )}.` - ], - ['tag', "The tag's name."], - ['contents', 'Required for the actions `add` and `edit`, specifies the content for the tag.'] - ], - examples: [ - 'add rule1 Respect other users. Harassment, hatespeech, etc... will not be tolerated.', - 'add rule1 --embed --color=#1E88E5 Respect other users. Harassment, hatespeech, etc... will not be tolerated.', - 'edit rule1 Just be respectful with the others.', - 'rule1', - 'source rule1', - 'remove rule1', - 'list' - ], - multiline: true - }, - commandTagPermissionlevel: 'Debe ser miembro del personal, moderador o administrador para poder administrar las etiquetas.', - commandTagNameNotAllowed: 'Un nombre de etiqueta puede no tener un acento grave ni caracteres invisibles.', - commandTagNameTooLong: 'El nombre de una etiqueta debe tener 50 caracteres o menos.', - commandTagExists: ({ tag }) => `La etiqueta \`${tag}\` ya existe.`, - commandTagContentRequired: 'Debe proporcionar un contenido para esta etiqueta.', - commandTagAdded: ({ name, content }) => `Se agregó con éxito una nueva etiqueta: **${name}** con un contenido de:\n${content}`, - commandTagRemoved: ({ name }) => `Se eliminó con éxito la etiqueta **${name}**.`, - commandTagNotexists: ({ tag }) => `La etiqueta \`${tag}\` no existe.`, - commandTagEdited: ({ name, content }) => `Se editó correctamente la etiqueta **${name}** con un contenido de:\n${content}`, - commandTagListEmpty: 'La lista de etiquetas para este servidor está vacía.', - commandTagReset: 'Todas las etiquetas se han eliminado con éxito de este servidor.', - - /** - * ############## - * TOOLS COMMANDS - */ - - commandAvatarNone: 'El usuario no tiene ninguna foto de perfil puesta.', - commandColor: ({ hex, rgb, hsl }) => [`HEX: **${hex}**`, `RGB: **${rgb}**`, `HSL: **${hsl}**`], - commandEmojiCustom: ({ emoji, id }) => [ - `→ ${inlineCodeBlock('Emoji ::')} **${emoji}**`, - `→ ${inlineCodeBlock('Type ::')} **Personalizado**`, - `→ ${inlineCodeBlock('ID ::')} **${id}**` - ], - commandEmojiTwemoji: ({ emoji, id }) => [ - `→ ${inlineCodeBlock('Emoji ::')} \`${emoji}\``, - `→ ${inlineCodeBlock('Type ::')} **Twemoji**`, - `→ ${inlineCodeBlock('ID ::')} **${id}**` - ], - commandEmojiInvalid: `El argumento que escribiste no es un emoji válido.`, - commandEmojiTooLarge: ({ emoji }) => - `'${emoji}' es tan pesado que los hámsters no pudieron con su peso. ¿Quizá prueba con un emoji más pequeño?ç`, - commandCountryDescription: 'Shows information about a country.', - commandCountryExtended: { - extendedHelp: 'This command uses https://restcountries.eu to get information on the provided country.', - explainedUsage: [['country', 'The name of the country.']], - examples: ['United Kingdom'] - }, - commandCountryTitles: { - OVERVIEW: 'Overview', - LANGUAGES: 'Languages', - OTHER: 'Other' - }, - commandCountryFields: { - overview: { - officialName: 'Official Name', - capital: 'Capital', - population: 'Population' - }, - other: { - demonym: 'Demonym', - area: 'Area', - currencies: 'Currencies' - } - }, - commandEshopDescription: 'Solicite información para cualquier tienda digital estadounidense de Nintendo', - commandEshopExtended: { - extendedHelp: 'Este comando consulta a Nintendo of America para mostrar los datos del juego que solicitas.', - explainedUsage: [['Solicitud', 'El nombre del juego que estás buscando..']], - examples: ['Breath of the Wild', 'Pokémon', 'Splatoon'] - }, - commandEshopNotInDatabase: 'Ninguno disponible', - commandEshopTitles: { - price: 'Precio', - availability: 'Disponibilidad', - releaseDate: 'Fecha de lanzamiento', - numberOfPlayers: 'Número de jugadores', - platform: 'Plataforma', - categories: 'Categorías', - noCategories: 'Este juego no se ha ordenado en ninguna categoría.', - nsuid: 'NSUID', - esrb: 'ESRB' - }, - commandEshopPricePaid: ({ price }) => `$${price} USD`, - commandEshopPriceFree: 'Gratis', - commandHoroscopeDescription: 'Obtén tu último horóscopo', - commandHoroscopeExtended: { - extendedHelp: 'Obtiene el horóscopo de un signo solar dado de The Astrologer de Kelli Fox.', - explainedUsage: [ - ['sunsign', 'El signo solar para el que quieres obtener el horóscopo'], - [ - 'today|tomorrow|yesterday', - '(Opcional, el valor predeterminado es "today") Si desea obtener el horóscopo de yesterday o de tomorrow, puede especificarlo.' - ] - ], - examples: ['pisces', 'virgo tomorrow', 'gemini yesterday', 'aries today'] - }, - commandHoroscopeInvalidSunsign: ({ sign, maybe }) => `${sign} es un signo solar no válido, ¿tal vez intente con ${maybe}`, - commandHoroscopeTitles: ({ sign, intensity, keywords, mood, rating }) => ({ - dailyHoroscope: `Horóscopo diario para ${sign}`, - metadataTitle: 'Metadatos', - metadata: [ - `**Intensidad:** ${intensity}`, - `**Palabras clave:** ${this.list(keywords, 'y')}`, - `**Estado anímico:** ${mood}`, - `**Rating:** ${rating}` - ] - }), - commandIgdbDescription: 'Busca en IGDB (Internet Game Database) tus juegos favoritos', - commandIgdbExtended: { - extendedHelp: 'Este comando consulta la API IGDB para mostrar datos de sus juegos favoritos.', - explainedUsage: [['query', 'El nombre del juego']], - examples: ['Breath of the Wild', 'Borderlands 3'] - }, - commandIgdbTitles: { - userScore: 'Puntuación del usuario', - ageRating: 'Calificación de edad', - releaseDate: 'Fecha de lanzamiento', - genres: 'Género(s)', - developers: 'Desarrollador(es)', - platform: 'Plataforma(s)' - }, - commandIgdbData: { - noDevelopers: 'Desarrollador(es) desconocidos', - noPlatforms: 'Plataforma(s) desconocidas', - noReleaseDate: 'Fecha de lanzamiento desconocida', - noRating: 'Ninguna calificación de usuario', - noSummary: 'No hay resumen del juego disponible.', - noGenres: 'No hay géneros conocidos.', - noAgeRatings: 'No hay clasificaciones de edad disponibles.' - }, - commandItunesDescription: 'Busca en la API de iTunes pistas de música', - commandItunesExtended: { - extendedHelp: 'Este comando consulta la API de iTunes de Apple para mostrar datos sobre la música que solicita.', - explainedUsage: [['consulta', 'El nombre de la cancion']], - examples: ['Apocalyptica feat. Brent Smith', "You're Gonna Go Far, Kid"] - }, - commandItunesTitles: { - artist: 'Artista', - collection: 'Colección', - collectionPrice: 'Precio de colección', - trackPrice: 'Precio de canción', - trackReleaseDate: 'Fecha de lanzamiento de la canción', - numberOfTracksInCollection: 'Canciones en coleccion', - primaryGenre: 'Genero primario', - preview: 'Avance', - previewLabel: 'Haga clic aquí' - }, - commandLmgtfyClick: 'Haga clic en mí para buscar', - commandMoviesDescription: 'Busca en TheMovieDatabase cualquier película', - commandMoviesExtended: { - extendedHelp: [ - 'Este comando consulta la API de TheMovieDatabase para obtener datos sobre sus películas favoritas', - "Consejo: Puede usar el filtro 'y:' para reducir sus resultados por año. Ejemplo: 'Star Wars y: 1977'." - ], - explainedUsage: [['consulta', 'El nombre de la pelicula']], - examples: ["Ocean's Eleven y:2001", 'Star Wars Revenge of the Sith', 'Spirited Away'], - multiline: true - }, - commandMoviesTitles: { - runtime: 'Tiempo de ejecución', - userScore: 'Puntuación del usuario', - status: 'Estado', - releaseDate: 'Fecha de lanzamiento', - imdbPage: 'Página de IMDB', - homePage: 'Página de inicio', - collection: 'Colección', - genres: 'Géneros' - }, - commandMoviesData: { - variableRuntime: 'Variable', - movieInProduction: 'Película en producción', - linkClickHere: 'Haga clic aquí', - none: 'Ninguno', - notPartOfCollection: 'No es parte de una colección.', - noGenres: 'Ninguno en TheMovieDB' - }, - commandShowsDescription: 'Busca en la base de datos de películas cualquier programa', - commandShowsExtended: { - extendedHelp: 'Este comando consulta la base de datos de películas para obtener información sobre tus programas favoritos', - explainedUsage: [['consulta', 'El nombre del show.']], - examples: ['Final Space', 'Gravity Falls', 'Rick and Morty'] - }, - commandShowsTitles: { - episodeRuntime: 'Tiempo de ejecución del episodio', - userScore: 'Puntuación del usuario', - status: 'Estado', - firstAirDate: 'Primera fecha de emisión', - genres: 'Géneros' - }, - commandShowsData: { - variableRuntime: 'Variable', - unknownUserScore: 'Sin puntaje de usuario', - noGenres: 'Ninguno en TheMovieDB' - }, - commandPriceCurrency: ({ fromCurrency, fromAmount, worths }) => - `**${fromAmount}** ${fromCurrency.toUpperCase()} vale ${this.list(worths, 'y')}.`, - commandPriceCurrencyNotFound: '¡Ha habido un error! Por favor, revise de nuevo la ortografía y que especificaste una moneda válida.', - commandQuoteMessage: 'Esto es muy raro, pero dicho mensaje no tiene ni contenido ni imagen.', - commandRolesListEmpty: '¡Este servidor no tiene ningún rol público!', - commandRolesAbort: ({ prefix }) => - `He buscado en todos los rincones pero no he encontrado lo que buscabas. ¡Por favor escribe \`${prefix}roles\` para recibir la lista completa!`, - commandRolesListTitle: 'Lista de roles públicos', - commandRolesAdded: ({ roles }) => `Los siguientes roles han sido añadidos a tu perfil: \`${roles}\``, - commandRolesRemoved: ({ roles }) => `Los siguientes roles han sido removidos de tu perfil: \`${roles}\``, - commandRolesNotPublic: ({ roles }) => `Los siguientes roles no son públicos: \`${roles}\``, - commandRolesNotManageable: ({ roles }) => `Los siguientes roles no se pudieron entregar debido a la posición jerárquica: \`${roles}\``, - commandRolesAuditlog: "Autorización: Administración de Roles Públicos | Comando 'Roles'.", - commandDuckDuckGoNotfound: 'Lo siento, pero la API de DuckDuckGo ha devuelto una respuesta en blanco. Prueba de nuevo con otras palabras.', - commandDuckDuckGoLookalso: 'Temas Relacionados:', - - commandUrbanNotFound: 'Lo siento, la palabra que buscabas no parece estar definida en UrbanDictionary. ¿Prueba con otra palabra?', - commandUrbanIndexNotfound: 'Quizás quieras probar con un número de página más pequeño.', - systemTextTruncated: ({ definition, url }) => `${definition}... [continúa leyendo](${url})`, - commandWhoisMemberTitles: { - joined: 'Fecha Ingreso', - createdAt: 'Fecha Creación' - }, - commandWhoisMemberFields: ({ member }) => ({ - joinedWithTimestamp: `Hace ${timestamp.displayUTC(member.joinedTimestamp!)}\n${this.duration(Date.now() - member.joinedTimestamp!, 2)}`, - joinedUnknown: 'Desconocido', - createdAt: `${timestamp.displayUTC(member.user.createdAt)}\nHace ${this.duration(Date.now() - member.user.createdTimestamp, 2)}`, - footer: `ID: ${member.id}` - }), - commandWhoisMemberRoles: () => 'Rol [1]', - commandWhoisMemberRolesPlural: ({ count }) => `Roles [${count}]`, - commandWhoisMemberPermissions: 'Permisos Clave', - commandWhoisMemberPermissionsAll: 'Todos los Permisos', - commandWhoisUserTitles: { - createdAt: 'Fecha Creación' - }, - commandWhoisUserFields: ({ user }) => ({ - createdAt: `${timestamp.displayUTC(user.createdAt)}\nHace ${this.duration(Date.now() - user.createdTimestamp, 2)}`, - footer: `ID: ${user.id}` - }), - commandFollowage: ({ user, channel, time }) => `${user} ha estado siguiendo ${channel} durante ${this.duration(time, 2)}.`, - commandFollowageMissingEntries: 'Either the user or the channel do not exist.', - commandFollowageNotFollowing: 'The user is not following the specified channel.', - commandTwitchNoEntries: 'There are no entries, are you sure you wrote the user name correctly?', - commandTwitchTitles: { - followers: 'Followers', - views: 'Views', - clickToVisit: "Click to go to streamer's channel", - partner: 'Partner' - }, - commandTwitchPartnershipWithoutAffiliate: 'This channel is not part of the Twitch affiliate program.', - commandTwitchAffiliateStatus: { - affiliated: 'This is an affiliated channel.', - partnered: 'This is a partnered channel.' - }, - commandTwitchCreatedAt: 'Created At:', - commandTwitchSubscriptionRequiredStreamer: `${REDCROSS} Debes darme el nombre de un canal para subscribirte.`, - commandTwitchSubscriptionStreamerNotFound: `${REDCROSS} Perdona, pero no pude encontrar el canal, ¿lo escribiste bien?`, - commandTwitchSubscriptionRequiredChannel: `${REDCROSS} Debes decirme adónde quieres que mande los mensajes.`, - commandTwitchSubscriptionRequiredStatus: `${REDCROSS} Debes decirme qué tipo de notificaciones quieres, las opciones son "online" y "offline".`, - commandTwitchSubscriptionStatusValues: ['online', 'offline'], - commandTwitchSubscriptionInvalidStatus: `${REDCROSS} Eh, esperaba o "online" o "offline", pero no pude entender lo que me dijiste.`, - commandTwitchSubscriptionRequiredContent: `${REDCROSS} Mhmm, me pregunto qué quieres que mande cuando el usuario se conecta o algo, ¿puedes darme una pista?`, - commandTwitchSubscriptionAddDuplicated: `${REDCROSS} Ya estás subscrito/a a este canal para el canal de texto y estado que especificaste.`, - commandTwitchSubscriptionAddSuccessOffline: ({ name, channel }) => - `${GREENTICK} ¡Oído cocina! Cuando ${name} se desconecte, mandaré un mensaje nuevo en el canal ${channel}.`, - commandTwitchSubscriptionAddSuccessLive: ({ name, channel }) => - `${GREENTICK} ¡Oído cocina! Cuando ${name} se conecte, mandaré un mensaje nuevo en el canal ${channel}.`, - commandTwitchSubscriptionRemoveStreamerNotSubscribed: `${REDCROSS} Perdona, no puedes desubscribirte de un canal en el cual no estás subscrito/a. Por favor, subscríbete para poder desubscribirte.`, - commandTwitchSubscriptionRemoveEntryNotExists: `${REDCROSS} Perdona, ya estás subscrito/a a este usuario, pero sus subscripciones no son publicadas en el canal de texto que especificaste.`, - commandTwitchSubscriptionRemoveSuccessOffline: ({ name, channel }) => - `${GREENTICK} ¡Hecho! No mandaré más mensajes en el canal ${channel} cuando ${name} se desconecte.`, - commandTwitchSubscriptionRemoveSuccessLive: ({ name, channel }) => - `${GREENTICK} ¡Hecho! No mandaré más mensajes en el canal ${channel} cuando ${name} se conecte.`, - commandTwitchSubscriptionResetEmpty: `${REDCROSS} You were not subscribed to any streamer, mission abort!`, - commandTwitchSubscriptionResetSuccess: ({ count }) => `${GREENTICK} Success! ${count} subscription has been removed from this server.`, - commandTwitchSubscriptionResetSuccessPlural: ({ count }) => - `${GREENTICK} Success! ${count} subscriptions have been removed from this server.`, - commandTwitchSubscriptionResetStreamerNotSubscribed: `${REDCROSS} You were not subscribed to this streamer, are you sure you got the right one?`, - commandTwitchSubscriptionResetChannelSuccess: ({ name, count }) => - `${GREENTICK} Success! Removed ${count} subscription from the streamer ${name}.`, - commandTwitchSubscriptionResetChannelSuccessPlural: ({ name, count }) => - `${GREENTICK} Success! Removed ${count} subscriptions from the streamer ${name}.`, - commandTwitchSubscriptionShowStreamerNotSubscribed: `${REDCROSS} You wanted to see all subscriptions from this streamer, but there are none!`, - commandTwitchSubscriptionShowStatus: ['Online', 'Offline'], - commandTwitchSubscriptionShowEmpty: `${REDCROSS} There are no subscriptions, who will be the first?`, - commandTwitchSubscriptionShowUnknownUser: 'Unknown', - commandWikipediaNotfound: 'Lo siento, pero no he podido encontrar algo que coincida con el término que buscas a través de Wikipedia.', - commandYoutubeNotfound: 'Lo siento, pero no he podido encontrar algo que coincida con el término que buscas a través de YouTube.', - commandYoutubeIndexNotfound: 'Quizá quieras probar con un índice de página menor, porque no soy capaz de encontrar algo en éste.', - commandDefineDescription: 'Busca la definición de una palabra en inglés.', - commandDefineExtended: { - extendedHelp: `¿Qué significa "heel"?`, - explainedUsage: [['Word', 'La palabra o frase cuya definición quieres buscar.']], - examples: ['heel'] - }, - commandDefineNotfound: 'No pude encontrar la definición de esta palabra.', - commandDefinePronounciation: 'Pronunciación', - commandDefineUnknown: 'Desconocido', - - /** - * ############# - * WEEB COMMANDS - */ - - commandWbang: ({ user }) => `Ey ${user}... ¡bang!`, - commandWbanghead: '¡Golpeo de cabeza en progreso!', - commandWbite: ({ user }) => `¡Mordiendo ${user}!`, - commandWblush: '¡Le/a ruborizaste! 😊', - commandWcry: ({ user }) => `Querido ${user}, ¿le/a hiciste llorar? 💔`, - commandWcuddle: ({ user }) => `Ahí va un abracito para tí, ${user} 💞`, - commandWdance: '¡Olé! 💃', - commandWgreet: ({ user }) => `¡Buenas ${user}!`, - commandWhug: ({ user }) => `¡Un abrazo! ${user} ❤`, - commandWkiss: ({ user }) => `¡Un besito! ${user} 💜`, - commandWlewd: '¡Demasiado lujurioso!', - commandWlick: ({ user }) => `Lamiendo ${user} 👅`, - commandWnom: 'Nom, nom, nom! 😊', - commandWneko: 'Miau! 🐱', - commandWpat: ({ user }) => `\\*Da palmaditas en la cabeza de ${user}\\* ❤`, - commandWpout: '¿Oh?', - commandWpunch: ({ user }) => `¡Dando un puñetazo a ${user}!`, - commandWslap: ({ user }) => `¡Abofeteando ${user}!`, - commandWsleepy: 'Durmiéndose...', - commandWsmile: '¡Mostrando una risa radiante!', - commandWsmug: '\\*Sonríe con superioridad\\*', - commandWstare: ({ user }) => `Querido ${user}... hay alguien observándote 👀`, - commandWthumbsup: '¡Tienes su pulgar hacia arriba!', - commandWtickle: ({ user }) => `Cosquillitas para tí, ${user}!`, - - /** - * ################################# - * # MONITORS # - * ################################# - */ - - constMonitorInvitelink: 'Enlace Invitación', - constMonitorLink: 'Link Filtrado', - constMonitorNms: '[NOMENTIONSPAM]', - constMonitorWordfilter: 'Palabra Filtrada', - constMonitorCapsfilter: 'Demasiadas Mayúsculas', - constMonitorAttachmentfilter: 'Demasiados Documentos', - constMonitorMessagefilter: 'Too Many Message Duplicates', - constMonitorNewlinefilter: 'Too Many Lines', - constMonitorReactionfilter: 'Reacción Eliminada', - moderationMonitorAttachments: '[Auto-Moderation] Triggered attachment filter, no threshold.', - moderationMonitorAttachmentsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered attachment filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorCapitals: '[Auto-Moderation] Triggered capital filter, no threshold.', - moderationMonitorCapitalsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered capital filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorInvites: '[Auto-Moderation] Triggered invite filter, no threshold.', - moderationMonitorInvitesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered invite filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorLinks: '[Auto-Moderation] Triggered link filter, no threshold.', - moderationMonitorLinksWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered link filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorMessages: '[Auto-Moderation] Triggered duplicated message filter, no threshold.', - moderationMonitorMessagesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered duplicated message filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorNewlines: '[Auto-Moderation] Triggered newline filter, no threshold.', - moderationMonitorNewlinesWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered newline filter, reached ${amount} out of ${maximum} infractions.`, - moderationMonitorWords: '[Auto-Moderation] Triggered word filter, no threshold.', - moderationMonitorWordsWithMaximum: ({ amount, maximum }) => - `[Auto-Moderation] Triggered word filter, reached ${amount} out of ${maximum} infractions.`, - monitorAttachmentFilter: ({ user }) => `${REDCROSS} Dear ${user}, file attachments aren't allowed here.`, - monitorInviteFilterAlert: ({ user }) => `${REDCROSS} Querido ${user}, los enlaces de invitación no están permitidos aquí.`, - monitorInviteFilterLog: ({ links }) => `**Enlace**: ${this.list(links, 'y')}`, - monitorInviteFilterLogPlural: ({ links }) => `**Enlaces**: ${this.list(links, 'y')}`, - monitorNolink: ({ user }) => `${REDCROSS} Perdona ${user}, los enlaces no están permitidos en este servidor.`, - monitorWordFilterDm: ({ filtered }) => - `¡Parece que dijiste algo malo! Pero como te esforzaste en escribir el mensaje, te lo he mandado por aquí:\n${filtered}`, - monitorCapsFilterDm: ({ message }) => `Speak lower! I know you need to express your thoughts. There is the message I deleted:\n${message}`, - monitorWordFilter: ({ user }) => `${REDCROSS} Perdona, querido/a ${user}, pero has escrito algo que no está permitido en este servidor.`, - monitorCapsFilter: ({ user }) => `${REDCROSS} ¡EEEEEEH ${user}! ¡POR FAVOR NO GRITE EN ESTE SITIO! ¡HAS SUPERADO EL LÍMITE DE MAYÚSCULAS!`, - monitorMessageFilter: ({ user }) => `${REDCROSS} Woah woah woah, please stop re-posting so much ${user}!`, - monitorNewlineFilter: ({ user }) => `${REDCROSS} Wall of text incoming from ${user}, wall of text taken down!`, - monitorReactionsFilter: ({ user }) => `${REDCROSS} Hey ${user}, please do not add that reaction!`, - monitorNmsMessage: ({ user }) => [ - `El MJOLNIR ha aterrizado y ahora, el usuario ${user.tag} cuya ID es ${user.id} ha sido baneado por spamming de menciones.`, - '¡No te preocupes! ¡Estoy aquí para ayudarte! 😄' - ], - monitorNmsModlog: ({ threshold }) => `[NOMENTIONSPAM] Automático: Límite de Spam de Menciones alcanzado.\nLímite: ${threshold}.`, - monitorNmsAlert: - 'Ten cuidado con mencionar otra vez más, estás a punto de ser expulsado por exceder el límite de spam de menciones de este servidor.', - monitorSocialAchievement: '¡Felicidades %MEMBER! ¡Has logrado el rol %ROLE%!', - - /** - * ################################# - * # INHIBITORS # - * ################################# - */ - - inhibitorSpam: ({ channel }) => - `¿Podemos movernos al canal ${channel}, por favor? Este comando puede ser muy molesto y arruinar las conversaciones de otras personas.`, - - /** - * ################################# - * # GAMES # - * ################################# - */ - - hgBloodbath: [ - '{1} grabs a shovel.', - '{1} grabs a backpack and retreats.', - '{1} and {2} fight for a bag. {1} gives up and retreats.', - '{1} and {2} fight for a bag. {2} gives up and retreats.', - '{1} finds a bow, some arrows, and a quiver.', - '{1} runs into the cornucopia and hides.', - '{1} takes a handful of throwing knives.', - "{1} rips a mace out of {2}'s hands.", - '{1} finds a canteen full of water.', - '{1} stays at the cornucopia for resources.', - '{1} gathers as much food as they can.', - '{1} grabs a sword.', - '{1} takes a spear from inside the cornucopia.', - '{1} finds a bag full of explosives.', - '{1} clutches a first aid kit and runs away.', - '{1} takes a sickle from inside the cornucopia.', - '{1}, {2}, and {3} work together to get as many supplies as possible.', - '{1} runs away with a lighter and some rope.', - '{1} snatches a bottle of alcohol and a rag.', - '{1} finds a backpack full of camping equipment.', - '{1} grabs a backpack, not realizing it is empty.', - "{1} breaks {2}'s nose for a basket of bread.", - '{1}, {2}, {3}, and {4} share everything they gathered before running.', - '{1} retrieves a trident from inside the cornucopia.', - '{1} grabs a jar of fishing bait while {2} gets fishing gear.', - '{1} scares {2} away from the cornucopia.', - '{1} grabs a shield leaning on the cornucopia.', - '{1} snatches a pair of sais.', - '{1} grabs a lone pair of pants.', - '{1T} steps off their podium too soon and blows up.', - "{1} throws a knife into {2T}'s head.", - '{1T} accidently steps on a landmine.', - '{1} catches {2T} off guard and kills them.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - "{1} snaps {2T}'s neck.", - '{1} decapitates {2T} with a sword.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1} stabs {2T} with a tree branch.', - '{1} stabs {2T} in the back with a trident.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} finds {2T} hiding in the cornucopia and kills them.', - '{1T} finds {2} hiding in the cornucopia, but {2} kills them.', - '{1} kills {2T} with a sickle.', - '{1} and {2T} fight for a bag. {1} strangles {2T} with the straps and runs.', - '{1T} and {2} fight for a bag. {2} strangles {1T} with the straps and runs.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1T} trips over while running from the cornucopia, and is killed by {2}.', - '{1} trips over while running from the cornucopia, {2} picks them up, they run off together.', - "{1} aims an arrow at {2}'s head and shoots, {3T} jumps in the way and sacrifies their life to save them." - ], - hgDay: [ - '{1} goes hunting.', - '{1} injures themself.', - '{1} explores the arena.', - '{1} scares {2} off.', - "{1} diverts {2}'s attention and runs away.", - '{1} stalks {2}.', - '{1} fishes.', - '{1} camouflauges themself in the bushes.', - "{1} steals from {2} while they aren't looking.", - '{1} makes a wooden spear.', - '{1} discovers a cave.', - '{1} attacks {2}, but they manage to escape.', - '{1} chases {2}.', - '{1} runs away from {2}.', - '{1} collects fruit from a tree.', - '{1} receives a hatchet from an unknown sponsor.', - '{1} receives clean water from an unknown sponsor.', - '{1} receives medical supplies from an unknown sponsor.', - '{1} receives fresh food from an unknown sponsor.', - '{1} searches for a water source.', - '{1} defeats {2} in a fight, but spares their life.', - '{1} and {2} work together for the day.', - '{1} begs for {2} to kill them. They refuse, keeping {1} alive.', - '{1} tries to sleep through the entire day.', - "{1}, {2}, {3}, and {4} raid {5}'s camp while they are hunting.", - '{1} constructs a shack.', - '{1} overhears {2} and {3} talking in the distance.', - '{1} practices their archery.', - '{1} thinks about home.', - '{1} is pricked by thorns while picking berries.', - '{1} tries to spear fish with a trident.', - '{1} searches for firewood.', - '{1} and {2} split up to search for resources.', - '{1} picks flowers.', - "{1} tends to {2}'s wounds.", - '{1} sees smoke rising in the distance, but decides not to investigate.', - '{1} sprains their ankle while running away from {2}.', - '{1} makes a slingshot.', - '{1} travels to higher ground.', - '{1} discovers a river.', - '{1} hunts for other tributes.', - '{1} and {2} hunt for other tributes.', - '{1}, {2}, and {3} hunt for other tributes.', - '{1}, {2}, {3}, and {4} hunt for other tributes.', - '{1}, {2}, {3}, {4}, and {5} hunt for other tributes.', - '{1} receives an explosive from an unknown sponsor.', - '{1} questions their sanity.', - '{1} forces {2} to eat pant.', - '{1} forces {2T} to eat pant. {2T} chokes and dies.', - '{1} catches {2T} off guard and kills them.', - "{1} throws a knife into {2T}'s head.", - '{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} bleeds out due to untreated injuries.', - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - '{1T} unknowingly eats toxic berries.', - "{1} silently snaps {2T}'s neck.", - "{1} taints {2T}'s food, killing them.", - '{1} decapitates {2T} with a sword.', - '{1T} dies from an infection.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1T} attempts to climb a tree, but falls to their death.', - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - "{1}'s trap kills {2T}.", - '{1} kills {2T} while they are resting.', - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1T} dies from hypothermia.', - '{1T} dies from hunger.', - '{1T} dies from thirst.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} dies trying to escape the arena.', - '{1T} dies of dysentery.', - '{1T} accidently detonates a land mine while trying to arm it.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} ambushes {2T} and kills them.', - '{1T} accidently steps on a landmine.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.', - '{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.', - '{1} stabs {2T} with a tree branch.', - '{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.', - '{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.', - '{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.', - "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", - "{1} poisons {2T}'s drink. They drink it and die.", - '{1} stabs {2T} in the back with a trident.', - '{1T} attempts to climb a tree, but falls on {2T}, killing them both.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} kills {2T} with a sickle.', - '{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.', - '{1}, {2}, {3}, and {4} track down and kill {5T}.', - '{1}, {2}, and {3} track down and kill {4T}.', - '{1} and {2} track down and kill {3T}.', - '{1} tracks down and kills {2T}.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1} doodles in the dirt.', - '{1} chases a butterfly.', - '{1T} falls off a cliff, and is impaled by a stick.', - '{1} runs into {2}, they decide to team up.', - '{1} sees {2} through the trees, and plans on killing them.', - '{1} sneaks up behind {2T}, and snaps their neck.', - '{1T} challenges {2} to a fight, and promptly dies.', - '{1} murders their partner, {2T}, to have more supplies for themself.' - ], - hgNight: [ - '{1} starts a fire.', - '{1} sets up camp for the night.', - '{1} loses sight of where they are.', - '{1} climbs a tree to rest.', - '{1} goes to sleep.', - '{1} and {2} tell stories about themselves to each other.', - '{1}, {2}, {3}, and {4} sleep in shifts.', - '{1}, {2}, and {3} sleep in shifts.', - '{1} and {2} sleep in shifts.', - '{1} tends to their wounds.', - '{1} sees a fire, but stays hidden.', - '{1} screams for help.', - '{1} stays awake all night.', - '{1} passes out from exhaustion.', - '{1} cooks their food before putting their fire out.', - '{1} and {2} run into each other and decide to truce for the night.', - '{1} fends {2}, {3}, and {4} away from their fire.', - '{1}, {2}, and {3} discuss the games and what might happen in the morning.', - '{1} cries themself to sleep.', - '{1} tries to treat their infection.', - '{1} and {2} talk about the tributes still alive.', - '{1} is awoken by nightmares.', - '{1} and {2} huddle for warmth.', - '{1} thinks about winning.', - '{1}, {2}, {3}, and {4} tell each other ghost stories to lighten the mood.', - '{1} looks at the night sky.', - '{1} defeats {2} in a fight, but spares their life.', - '{1} begs for {2} to kill them. They refuse, keeping {1} alive.', - "{1} destroys {2}'s supplies while they are asleep.", - '{1}, {2}, {3}, {4}, and {5} sleep in shifts.', - '{1} lets {2} into their shelter.', - '{1} receives a hatchet from an unknown sponsor.', - '{1} receives clean water from an unknown sponsor.', - '{1} receives medical supplies from an unknown sponsor.', - '{1} receives fresh food from an unknown sponsor.', - '{1} tries to sing themself to sleep.', - '{1} attempts to start a fire, but is unsuccessful.', - '{1} thinks about home.', - "{1} tends to {2}'s wounds.", - '{1} quietly hums.', - '{1}, {2}, and {3} cheerfully sing songs together.', - '{1} is unable to start a fire and sleeps without warmth.', - '{1} and {2} hold hands.', - '{1} convinces {2} to snuggle with them.', - '{1} receives an explosive from an unknown sponsor.', - '{1} questions their sanity.', - '{1} forces {2} to eat pant.', - '{1} forces {2T} to eat pant. {2T} chokes and dies.', - '{1} catches {2T} off guard and kills them.', - "{1} throws a knife into {2T}'s head.", - '{1T} begs for {2} to kill them. They reluctantly oblige, killing {1T}.', - '{1} and {2} work together to drown {3T}.', - '{1} strangles {2T} after engaging in a fist fight.', - "{1} shoots an arrow into {2T}'s head.", - '{1T} bleeds out due to untreated injuries.', - '{1T} cannot handle the circumstances and commits suicide.', - "{1} bashes {2T}'s head against a rock several times.", - '{1T} unknowingly eats toxic berries.', - "{1} silently snaps {2T}'s neck.", - "{1} taints {2T}'s food, killing them.", - '{1} decapitates {2T} with a sword.', - '{1T} dies from an infection.', - '{1} spears {2T} in the abdomen.', - '{1} sets {2T} on fire with a molotov.', - '{1T} falls into a pit and dies.', - '{1} stabs {2T} while their back is turned.', - '{1} severely injures {2T}, but puts them out of their misery.', - '{1} severely injures {2T} and leaves them to die.', - "{1} bashes {2T}'s head in with a mace.", - '{1T} attempts to climb a tree, but falls to their death.', - '{1} pushes {2T} off a cliff during a knife fight.', - "{1} throws a knife into {2T}'s chest.", - "{1}'s trap kills {2T}.", - '{1} kills {2T} while they are sleeping.', - '{1T} is unable to convince {2} to not kill them.', - '{1} convinces {2T} to not kill them, only to kill {2T} instead.', - '{1T} falls into a frozen lake and drowns.', - '{1}, {2}, and {3T} start fighting, but {2} runs away as {1} kills {3T}.', - '{1} kills {2T} with their own weapon.', - '{1} overpowers {2T}, killing them.', - '{1} sets an explosive off, killing {2T}.', - '{1} sets an explosive off, killing {2T}, and {3T}.', - '{1} sets an explosive off, killing {2T}, {3T}, and {4T}.', - '{1} sets an explosive off, killing {2T}, {3T}, {4T} and {5T}.', - '{1} kills {2T} as they try to run.', - '{1T} and {2T} threaten a double suicide. It fails and they die.', - '{1T}, {2T}, {3T}, and {4T} form a suicide pact, killing themselves.', - '{1T} dies from hypothermia.', - '{1T} dies from hunger.', - '{1T} dies from thirst.', - '{1} kills {2T} with a hatchet.', - '{1} and {2} fight {3T} and {4T}. {1} and {2} survive.', - '{1T} and {2T} fight {3} and {4}. {3} and {4} survive.', - '{1T} dies trying to escape the arena.', - '{1T} dies of dysentery.', - '{1T} accidently detonates a land mine while trying to arm it.', - '{1T} attacks {2}, but {3} protects them, killing {1T}.', - '{1} ambushes {2T} and kills them.', - '{1T} accidently steps on a landmine.', - '{1} severely slices {2T} with a sword.', - '{1} strangles {2T} with a rope.', - '{1} kills {2T} for their supplies.', - '{1} shoots an arrow at {2}, but misses and kills {3T} instead.', - "{1} shoots a poisonous blow dart into {2T}'s neck, slowly killing them.", - '{1}, {2}, and {3} successfully ambush and kill {4T}, {5T}, and {6T}.', - '{1T}, {2T}, and {3T} unsuccessfully ambush {4}, {5}, and {6}, who kill them instead.', - '{1} stabs {2T} with a tree branch.', - '{1} forces {2} to kill {3T} or {4}. They decide to kill {3T}.', - '{1} forces {2} to kill {3} or {4T}. They decide to kill {4T}.', - '{1} forces {2T} to kill {3} or {4}. They refuse to kill, so {1} kills them instead.', - "{1T} poisons {2}'s drink, but mistakes it for their own and dies.", - "{1} poisons {2T}'s drink. They drink it and die.", - '{1} stabs {2T} in the back with a trident.', - '{1T} attempts to climb a tree, but falls on {2T}, killing them both.', - '{1}, {2T}, and {3T} get into a fight. {1} triumphantly kills them both.', - '{1T}, {2}, and {3T} get into a fight. {2} triumphantly kills them both.', - '{1T}, {2T}, and {3} get into a fight. {3} triumphantly kills them both.', - '{1} kills {2T} with a sickle.', - '{1}, {2}, {3}, {4}, and {5} track down and kill {6T}.', - '{1}, {2}, {3}, and {4} track down and kill {5T}.', - '{1}, {2}, and {3} track down and kill {4T}.', - '{1} and {2} track down and kill {3T}.', - '{1} tracks down and kills {2T}.', - '{1} repeatedly stabs {2T} to death with sais.', - '{1} writes in their journal.', - '{1} watches {2} sitting at their campfire, and considers killing them.' - ], - - /** - * ################################# - * # SERIALIZERS # - * ################################# - */ - - serializerAutoRoleInvalid: 'Invalid autorole data.', - serializerCommandAutoDeleteInvalid: 'Invalid command auto-delete data.', - serializerPermissionNodeDuplicatedCommand: ({ command }) => `You have set \`${command}\` twice, either allow it, or deny it.`, - serializerPermissionNodeInvalidCommand: ({ command }) => `The command \`${command}\` does not exist or is invalid.`, - serializerPermissionNodeInvalidTarget: 'No data could be found from the ID.', - serializerPermissionNodeInvalid: 'Invalid data.', - serializerPermissionNodeSecurityEveryoneAllows: 'For security, the everyone role cannot have allows.', - serializerPermissionNodeSecurityGuarded: ({ command }) => - `For security and for me to work properly, you cannot deny the usage for the command \`${command}\`.`, - serializerPermissionNodeSecurityOwner: 'You cannot set permission overrides on the server owner.', - serializerReactionRoleInvalid: 'Invalid reaction role data.', - serializerStickyRoleInvalid: 'Invalid sticky role data.', - serializerTriggerAliasInvalid: 'Invalid trigger alias data.', - serializerTriggerIncludeInvalid: 'Invalid trigger includes data.', - serializerTriggerIncludeInvalidAction: 'Invalid trigger action.', - serializerTwitchSubscriptionInvalidStreamer: 'Invalid data streamer.', - serializerTwitchSubscriptionInvalid: 'Invalid data.', - serializerUniqueRoleSetInvalid: 'Invalid unique role set data.', - serializerUnsupported: 'This configuration key cannot be updated via Discord at the moment, please use the dashboard at !', - serializerCustomCommandInvalidId: 'The property "id" must be a string.', - serializerCustomCommandInvalidEmbed: 'The property "embed" must be a boolean.', - serializerCustomCommandInvalidColor: 'The property "color" must be a number.', - serializerCustomCommandInvalidContent: 'The property "content" must be a string.', - serializerCustomCommandInvalidArgs: 'The property "args" must be an array of strings.', - serializerDisabledCommandChannelsChannelsDoesNotExist: 'The channel does not exist.', - serializerDisabledCommandChannelsChannelsCommandDoesNotExist: ({ name }) => `The command \`${name}\` does not exist.`, - - /** - * ################################# - * # NOTIFICATIONS # - * ################################# - */ - notificationsTwitchNoGameName: '*Nombre del juego no establecido*', - notificationsTwitchEmbedDescription: ({ userName }) => `${userName} ya está en vivo!`, - notificationsTwitchEmbedDescriptionWithGame: ({ userName, gameName }) => `${userName} ya está en vivo - ¡transmitiendo ${gameName}!`, - notificationTwitchEmbedFooter: 'Skyra Twitch Notificaciones', - - /** - * ################################# - * # UTILS # - * ################################# - */ - - selfModerationCommandInvalidMissingAction: ({ name }) => - `${REDCROSS} Action must be any of the following: \`enable\`, \`disable\`, \`action\`, \`punish\`, \`punish-duration\`, \`threshold-maximum\`, \`threshold-duration\`, or \`show\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidMissingArguments: ({ name }) => - `${REDCROSS} The specified action requires an extra argument to be passed. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidSoftaction: ({ name }) => - `${REDCROSS} Value must be any of the following: \`alert\`, \`log\`, or \`delete\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandInvalidHardaction: ({ name }) => - `${REDCROSS} Value must be any of the following: \`none\`, \`warn\`, \`mute\`, \`kick\`, \`softban\`, or \`ban\`. Check \`Skyra, help ${name}\` for more information.`, - selfModerationCommandEnabled: `${GREENTICK} Successfully enabled sub-system.`, - selfModerationCommandDisabled: `${GREENTICK} Successfully disabled sub-system.`, - selfModerationCommandSoftAction: `${GREENTICK} Successfully disabled actions.`, - selfModerationCommandSoftActionWithValue: ({ value }) => `${GREENTICK} Successfully set actions to: \`${value}\``, - selfModerationCommandHardAction: ({ value }) => `${GREENTICK} Successfully set punishment: ${value}`, - selfModerationCommandHardActionDuration: `${GREENTICK} Successfully removed the punishment appeal timer.`, - selfModerationCommandHardActionDurationWithValue: ({ value }) => - `${GREENTICK} Successfully set the punishment appeal timer to: ${this.duration(value)}`, - selfModerationCommandThresholdMaximum: `${GREENTICK} Successfully removed the threshold maximum, punishment will take place instantly if set.`, - selfModerationCommandThresholdMaximumWithValue: ({ value }) => `${GREENTICK} Successfully set the threshold maximum to: ${value}`, - selfModerationCommandThresholdDuration: `${GREENTICK} Successfully removed the threshold duration, punishments will take place instantly if set.`, - selfModerationCommandThresholdDurationWithValue: ({ value }) => - `${GREENTICK} Successfully set the threshold duration to: ${this.duration(value)}`, - selfModerationCommandShow: ({ - kEnabled, - kAlert, - kLog, - kDelete, - kHardAction, - hardActionDurationText, - thresholdMaximumText, - thresholdDurationText - }) => [ - `Enabled : ${kEnabled}`, - 'Action', - ` - Alert : ${kAlert}`, - ` - Log : ${kLog}`, - ` - Delete : ${kDelete}`, - 'Punishment', - ` - Type : ${kHardAction}`, - ` - Duration : ${hardActionDurationText}`, - 'Threshold', - ` - Maximum : ${thresholdMaximumText}`, - ` - Duration : ${thresholdDurationText}` - ], - selfModerationCommandShowDurationPermanent: 'Permanent', - selfModerationCommandShowUnset: 'Unset', - selfModerationSoftActionAlert: 'Alert', - selfModerationSoftActionLog: 'Log', - selfModerationSoftActionDelete: 'Delete', - selfModerationHardActionBan: 'Ban', - selfModerationHardActionKick: 'Kick', - selfModerationHardActionMute: 'Mute', - selfModerationHardActionSoftban: 'SoftBan', - selfModerationHardActionWarning: 'Warning', - selfModerationHardActionNone: 'None', - selfModerationEnabled: 'Yes', - selfModerationDisabled: 'No', - selfModerationMaximumTooShort: ({ minimum, value }) => `${REDCROSS} The value (${value}) was too short, expected at least ${minimum}.`, - selfModerationMaximumTooLong: ({ maximum, value }) => `${REDCROSS} The value (${value}) was too long, expected maximum ${maximum}.`, - selfModerationDurationTooShort: ({ minimum, value }) => - `${REDCROSS} The value (${this.duration(value)}) was too short, expected at least ${this.duration(minimum)}.`, - selfModerationDurationTooLong: ({ maximum, value }) => - `${REDCROSS} The value (${this.duration(value)}) was too long, expected maximum ${this.duration(maximum)}.`, - - moderationActions: { - addRole: 'Added Role', - mute: 'Mute', - ban: 'Ban', - kick: 'Kick', - softban: 'Softban', - vkick: 'Voice Kick', - vmute: 'Voice Mute', - restrictedReact: 'Reaction Restriction', - restrictedEmbed: 'Embed Restriction', - restrictedAttachment: 'Attachment Restriction', - restrictedVoice: 'Voice Restriction', - setNickname: 'Set Nickname', - removeRole: 'Remove Role' - }, - actionApplyReason: ({ action, reason }) => `[Action] Applied ${action} | Reason: ${reason}`, - actionApplyNoReason: ({ action }) => `[Action] Applied ${action}`, - actionRevokeReason: ({ action, reason }) => `[Action] Revoked ${action} | Reason: ${reason}`, - actionRevokeNoReason: ({ action }) => `[Action] Revoked ${action}`, - actionSetNicknameSet: ({ reason }) => `[Action] Set Nickname | Reason: ${reason}`, - actionSetNicknameRemoved: ({ reason }) => `[Action] Removed Nickname | Reason: ${reason}`, - actionSetNicknameNoReasonSet: `[Action] Set Nickname.`, - actionSetNicknameNoReasonRemoved: `[Action] Removed Nickname.`, - actionSoftbanNoReason: '[Action] Applying Softban.', - actionSoftbanReason: ({ reason }) => `[Action] Applying Softban | Reason: ${reason}`, - actionUnSoftbanNoReason: '[Action] Applied Softban.', - actionUnSoftbanReason: ({ reason }) => `[Action] Applied Softban | Reason: ${reason}`, - actionRequiredMember: 'The user does not exist or is not in this server.', - actionSetupMuteExists: '**Cancelando la creación del rol de silenciado**: Ya existe un rol de silenciado.', - actionSetupRestrictionExists: '**Cancelando la creación del rol de restricción**: Ya existe un rol de restricción.', - actionSetupTooManyRoles: '**Cancelando la creación del rol**: Hay 250 roles en este servidor, necesitas borrar uno.', - actionSharedRoleSetupExisting: 'I could not find a configured role. Do you want to configure an existing one?', - actionSharedRoleSetupExistingName: 'Please give me the name of the role you want to use for further actions of this type.', - actionSharedRoleSetupNew: 'Do you want me to create a new role and configure it automatically?', - actionSharedRoleSetupAsk: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channel to apply the role ${role} the following permission: ${permissions}?`, - actionSharedRoleSetupAskMultipleChannels: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channels to apply the role ${role} the following permission: ${permissions}?`, - actionSharedRoleSetupAskMultiplePermissions: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channel to apply the role ${role} the following permissions: ${permissions}?`, - actionSharedRoleSetupAskMultipleChannelsMultiplePermissions: ({ role, channels, permissions }) => - `${LOADING} Can I modify ${channels} channels to apply the role ${role} the following permissions: ${permissions}?`, - muteNotConfigured: 'The muted role must be configured for this action to happen.', - restrictionNotConfigured: 'The restriction role must be configured for this action to happen', - muteNotInMember: 'The muted role is not set in the member.', - muteLowHierarchy: 'I cannot mute a user which higher role hierarchy than me.', - muteCannotManageRoles: `I must have **${this.PERMISSIONS.MANAGE_ROLES}** permissions to be able to mute.`, - muteNotExists: 'The specified user is not muted.', - - resolverDateSuffix: ' segundos', - resolverPositiveAmount: 'You must give me a positive number.', - systemPoweredByWeebsh: 'Powered by weeb.sh', - prefixReminder: ({ prefix }) => `El prefijo de este servidor está configurado a: \`${prefix}\``, - - unexpectedIssue: '¡Algo inesperado pasó! Cancelando este comando...', - - commandDmNotSent: 'No te he podido enviar el mensaje en mensaje directo... ¿me has bloqueado?', - commandDmSent: 'Te he enviado la información a través de un mensaje directo.', - commandRoleHigherSkyra: 'El miembro seleccionado tiene una posición jerárquica más alta o igual que el mío.', - commandRoleHigher: 'El miembro seleccionado tiene una posición jerárquica más alta o igual al tuyo.', - commandSuccess: 'Ejecutado el comando con éxito.', - commandToskyra: '¿Por qué...? ¡Pensaba que me amabas! 💔', - commandUserself: '¿Por qué te harías eso a tí mismo?', - - systemParseError: `${REDCROSS} I failed to process the data I was given, sorry~!`, - systemHighestRole: 'La posición del rol es más alta o equivalente al mío, por lo tanto no puedo concederlo a nadie.', - systemChannelNotPostable: 'No tengo permisos para mandar mensajes a éste canal.', - systemFetchbansFail: `He fallado al buscar la lista de baneos. ¿Tengo el permiso **${this.PERMISSIONS.BAN_MEMBERS}**?`, - systemLoading: [ - `${LOADING} Observando a los hamsters correr...`, - `${LOADING} Encontrando a los jugadores en el escondite...`, - `${LOADING} Intentando resolver este comando...`, - `${LOADING} Buscando data desde la nube...`, - `${LOADING} Calibrando lentes...`, - `${LOADING} Jugando a Piedra, Papel, Tijeras...` - ], - systemError: `¡Algo malo sucedio! Inténtalo de nuevo, o si el problema continúa, únete al servidor de soporte (sugerencia: usa \`Skyra, support\`)`, - systemDatabaseError: `¡No pude conseguir eso en mi base de datos! Inténtalo de nuevo, o si el problema continúa, únete al servidor de soporte (sugerencia: usa \`Skyra, support\`)`, - systemDiscordAborterror: 'He tenido un pequeño error de red al mandar un mensaje a Discord, ¡por favor ejecuta el comando de nuevo!', - systemMessageNotFound: 'Lo siento, pero la id del mensaje que escribiste no era correcto, o el mensaje fue borrado.', - systemNotenoughParameters: 'Lo siento, pero no proporcionaste suficientes parámetros...', - systemQueryFail: 'Lo siento, pero la aplicación no pudo resolver su solicitud. ¿Estás seguro/a que escribiste el nombre correctamente?', - systemNoResults: 'No pude encontrar ningún resultado para esa consulta', - systemCannotAccessChannel: 'Lo siento, pero no tienes permiso para ver ese canal.', - systemExceededLengthOutput: ({ output }) => `**Salida**:${output}`, - systemExceededLengthOutputWithTypeAndTime: ({ output, time, type }) => `**Salida**:${output}\n**Type**:${type}\n${time}`, - systemExceededLengthOutputConsole: ({}) => `Enviado el resultado a la consola.`, - systemExceededLengthOutputConsoleWithTypeAndTime: ({ time, type }) => `Enviado el resultado a la consola.\n**Type**:${type}\n${time}`, - systemExceededLengthOutputFile: ({}) => `Enviado el resultado como un archivo.`, - systemExceededLengthOutputFileWithTypeAndTime: ({ time, type }) => `Enviado el resultado como un archivo.\n**Type**:${type}\n${time}`, - systemExceededLengthOutputHastebin: ({ url }) => `Enviado el resultado a hastebin: ${url}`, - systemExceededLengthOutputHastebinWithTypeAndTime: ({ url, time, type }) => - `Enviado el resultado a hastebin: ${url}\n**Type**:${type}\n${time}`, - systemExceededLengthChooseOutput: ({ output }) => `Elija una de las siguientes opciones: ${this.list(output, 'o')}`, - systemExternalServerError: 'El servicio externo que utilizamos no pudo procesar nuestro mensaje, por favor, inténtelo de nuevo más tarde.', - systemPokedexExternalResource: 'Recursos Externos', - - jumpTo: 'Salta al Mensaje ►', - - resolverInvalidChannelName: ({ name }) => `${name} debe ser una mención, nombre, o id válido de un canal.`, - resolverInvalidRoleName: ({ name }) => `${name} debe ser una mención, nombre, o id válido de un rol.`, - resolverInvalidUsername: ({ name }) => `${name} debe ser una mención, nombre, o id válido de un usuario.`, - resolverChannelNotInGuild: 'Lo siento, pero ese comando solo se puede ejecutar en un servidor.', - resolverChannelNotInGuildSubcommand: ({ command, subcommand }) => - `${REDCROSS} Lo siento, pero la subcommandos \`${subcommand}\` para el comando \`${command}\` solo se puede ejecutar en un servidor.`, - resolverMembernameUserLeftDuringPrompt: 'El usuario salió durante la selección de usuarios.', - - listifyPage: ({ page, pageCount, results }) => `Página ${page} / ${pageCount} | ${results} Resultados`, - - moderationLogAppealed: `${REDCROSS} Lo siento, pero el caso de moderación ha expirado o no se puede temporizar.`, - moderationLogExpiresIn: ({ duration }) => `\n❯ **Caduca en**: ${this.duration(duration)}`, - moderationLogDescription: ({ data: { caseID, formattedDuration, prefix, reason, type, userDiscriminator, userID, userName } }) => - [ - `❯ **Tipo**: ${type}`, - `❯ **Usuario:** ${userName}#${userDiscriminator} (${userID})`, - `❯ **Razón:** ${reason || `Por favor use \`${prefix}reason ${caseID} \` para establecer la razón.`}${formattedDuration}` - ].join('\n'), - moderationLogFooter: ({ caseID }) => `Caso ${caseID}`, - moderationCaseNotExists: () => `${REDCROSS} Lo siento, pero el caso de moderación seleccionado no existe.`, - ModerationCaseNotExistsPlural: () => `${REDCROSS} Lo siento, pero los casos de moderación seleccionados no existen.`, - - guildSettingsChannelsMod: 'Necesitas configurar un canal de moderación. Utiliza `Skyra, settings set channels.modlog `.', - guildSettingsRolesRestricted: ({ prefix, path }) => - `${REDCROSS} You need to configure a role for this action, use \`${prefix}settings set ${path} \` to set it up.`, - guildMuteNotFound: - 'He fallado al buscar un caso de moderación que justifique el mute del usuario. O el usuario nunca ha sido muteado, o todos sus muteos están reclamados.', - guildBansEmpty: 'No hay baneos registrados en este servidor.', - guildBansNotFound: 'Intenté y fallé al buscar el usuario. ¿Estás seguro de que está expulsado/a?.', - channelNotReadable: `Lo siento, pero necesito los permisos **${this.PERMISSIONS.VIEW_CHANNEL}** y **${this.PERMISSIONS.READ_MESSAGE_HISTORY}** para poder leer los mensajes.`, - - userNotInGuild: 'El usuario no está en este servidor.', - userNotExistent: 'El usuario no parece existir. ¿Estás seguro/a que es una ID de usuario válida?', - - eventsGuildMemberAdd: 'Nuevo Usuario', - eventsGuildMemberAddMute: 'Nuevo Usuario Muteado', - eventsGuildMemberAddDescription: ({ mention, time }) => `${mention} | **Se Unió a Discord**: Hace ${this.duration(time, 2)}.`, - eventsGuildMemberRemove: 'Usuario Salió', - eventsGuildMemberKicked: 'Usuario Pateado', - eventsGuildMemberBanned: 'Usuario Baneado', - eventsGuildMemberSoftBanned: 'Usuario Levemente Baneado', - eventsGuildMemberRemoveDescription: ({ mention }) => `${mention} | **Se Unió al Servidor**: Desconocido.`, - eventsGuildMemberRemoveDescriptionWithJoinedAt: ({ mention, time }) => - `${mention} | **Se Unió al Servidor**: Hace ${this.duration(time, 2)}.`, - eventsGuildMemberUpdateNickname: ({ previous, current }) => `Actualizado el apodo de **${previous}** a **${current}**`, - eventsGuildMemberAddedNickname: ({ current }) => `Añadido un nuevo apodo **${current}**`, - eventsGuildMemberRemovedNickname: ({ previous }) => `Eliminado el apodo **${previous}**`, - eventsNicknameUpdate: 'Nickname Edited', - eventsUsernameUpdate: 'Username Edited', - eventsNameUpdatePreviousWasSet: ({ previousName }) => `**Previous**: \`${previousName}\``, - eventsNameUpdatePreviousWasNotSet: () => `**Previous**: Unset`, - eventsNameUpdateNextWasSet: ({ nextName }) => `**Next**: \`${nextName}\``, - eventsNameUpdateNextWasNotSet: () => `**Next**: Unset`, - eventsGuildMemberNoUpdate: 'No update detected', - eventsGuildMemberAddedRoles: ({ addedRoles }) => `**Added role**: ${addedRoles}`, - eventsGuildMemberAddedRolesPlural: ({ addedRoles }) => `**Added roles**: ${addedRoles}`, - eventsGuildMemberRemovedRoles: ({ removedRoles }) => `**Removed role**: ${removedRoles}`, - eventsGuildMemberRemovedRolesPlural: ({ removedRoles }) => `**Removed roles**: ${removedRoles}`, - eventsRoleUpdate: 'Roles Edited', - eventsMessageUpdate: 'Mensaje Editado', - eventsMessageDelete: 'Mensaje Eliminado', - eventsReaction: 'Reacción Añadida', - eventsCommand: ({ command }) => `Comando Usado: ${command}`, - - settingsDeleteChannelsDefault: 'Restablecido el valor para la clave `channels.default`', - settingsDeleteRolesInitial: 'Restablecido el valor para la clave `roles.initial`', - settingsDeleteRolesMute: 'Restablecido el valor para la clave `roles.muted`', - - modlogTimed: ({ remaining }) => `Este caso de moderación ya había sido temporizado. Expira en ${this.duration(remaining)}`, - - guildWarnNotFound: 'Fallé al buscar el caso de moderación para su reclamación. O no existe, o no es una advertencia, o ya estaba reclamada.', - guildMemberNotVoicechannel: 'No puedo tomar acción en un miembro que no está conectado a un canal de voz.', - - promptlistMultipleChoice: ({ list, count }) => - `He encontrado ${count} resultado. Por favor escriba un número entre 1 y ${count}, o escriba **"CANCELAR"** para cancelar la solicitud.\n${list}`, - promptlistMultipleChoicePlural: ({ list, count }) => - `He encontrado ${count} resultados. Por favor escriba un número entre 1 y ${count}, o escriba **"CANCELAR"** para cancelar la solicitud.\n${list}`, - promptlistAttemptFailed: ({ list, attempt, maxAttempts }) => `Valor inválido. Intento **${attempt}** de **${maxAttempts}**\n${list}`, - promptlistAborted: 'Cancelada la solicitud con éxito.', - - fuzzySearchMatches: ({ matches, codeblock }) => - `¡Encontré múltiples resultados! **Por favor selecciona un número entre 0 y ${matches}**:\n${codeblock}\nEscribe **ABORT** para cancelar la solicitud.`, - fuzzySearchAborted: 'Successfully aborted the prompt.', - fuzzySearchInvalidNumber: 'Esperaba que me dieras un número de un dígito, pero recibí una patata.', - fuzzySearchInvalidIndex: 'Cancelando solicitud... El número no estaba dentro del rango.', - - eventsErrorWtf: '¡Vaya fallo más terrible! ¡Lo siento!', - eventsErrorString: ({ mention, message }) => `Querido ${mention}, ${message}`, - - constUsers: 'Usuarios', - unknownChannel: 'Canal desconocido', - unknownRole: 'Rol desconocido', - unknownUser: 'Usuario desconocido' - }; - - public async init() { - // noop - } -} diff --git a/src/languages/es-ES/arguments/range.json b/src/languages/es-ES/arguments/range.json new file mode 100644 index 00000000000..1f331252133 --- /dev/null +++ b/src/languages/es-ES/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} debe ser un número o un rango de números.", + "max_plural": "{{name}} acepta un máximo de {{maximum}} números", + "max": "{{name}} acepta un máximo de {{maximum}} número" +} diff --git a/src/languages/es-ES/commands/admin.json b/src/languages/es-ES/commands/admin.json new file mode 100644 index 00000000000..9e98a8d488c --- /dev/null +++ b/src/languages/es-ES/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "Debes proporcionar el nombre de una clave de configuración", + "confNoValue": "Debes proporcionar un valor", + "confGuarded": "{{name, toTitleCase}} no puede ser deshabilitado.", + "confUpdated": "Se actualizó correctamente la clave **{{key}}**: `{{response}}`", + "confKeyNotArray": "Esta clave no acepta múltiples valores. Usa la acción 'reset' en su lugar.", + "confGetNoExt": "La clave **{{key}}** parece no existir.", + "confGet": "El valor para la clave **{{key}}** es: `{{value}}`", + "confReset": "La clave **{{key}}** ha sido restablecida a: `{{value}}`", + "confNochange": "El valor de **{{key}}** ya era de ese valor.", + "confServerDescription": "Define los ajustes por servidor.", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**Configuración del servidor {{key}}**\n{{list}}", + "confUserDescription": "Define los ajustes del usuario.", + "confDashboardOnlyKey": "`{{key}}` sólo puede configurarse a través del panel web ()", + "confUser": "", + "confSettingNotSet": "", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/es-ES/commands/animal.json b/src/languages/es-ES/commands/animal.json new file mode 100644 index 00000000000..11272732b1a --- /dev/null +++ b/src/languages/es-ES/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "Permítanme que les diga un hecho gatuno misterioso.", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "Hecho Gatuno", + "dogDescription": "¡Perritos lindos! ❤", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "¡Permítame mostrarte una imagen de un zorro!", + "foxExtended": { + "extendedHelp": "Este comando da una imagen aleatoria de [randomfox.ca](https://randomfox.ca/)." + }, + "kittyDescription": "¡GATITOS!", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "¡Shibas monos!", + "shibeExtended": { + "extendedHelp": "Todo el mundo ama a los shibas, ¡y yo también! Son tan adorables ❤" + } +} diff --git a/src/languages/es-ES/commands/anime.json b/src/languages/es-ES/commands/anime.json new file mode 100644 index 00000000000..4b1d462edba --- /dev/null +++ b/src/languages/es-ES/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "Busca tu anime favorito por su título con este comando.", + "animeExtended": { + "extendedHelp": "Este comando consulta Kitsu.io para mostrar los datos del anime que usted solicite.", + "explainedUsage": [ + [ + "consulta", + "El nombre del anime que estás buscando." + ] + ], + "examples": [ + "One Piece" + ] + }, + "mangaDescription": "Busca tu manga favorito por su título con este comando.", + "mangaExtended": { + "extendedHelp": "Este comando consulta Kitsu.io para mostrar los datos del manga que usted solicite.", + "explainedUsage": [ + [ + "consulta", + "El nombre del manga que estás buscando." + ] + ], + "examples": [ + "Stone Ocean", + "One Piece" + ] + }, + "waifuDescription": "Publica una imagen de una waifu generada al azar.", + "waifuExtended": { + "extendedHelp": "Este comando publica un waifu aleatorio generado por " + }, + "animeTypes": { + "tv": "📺 TV", + "movie": "🎥 Película", + "ova": "📼 Animación original de vídeo", + "special": "🎴 Especial" + }, + "animeInvalidChoice": "¡Esa es una opción no válida! Por favor, inténtalo con otra opción.", + "animeOutputDescription": "**Título en inglés:** {{englishTitle}}\n**Título japonés:** {{japaneseTitle}}\n**Título canónico:** {{canonicalTitle}}\n{{synopsis}}", + "animeNoSynopsis": "No hay ninguna aplicación disponible para este título.", + "animeEmbedData": { + "type": "Tipo", + "score": "Puntuación", + "episodes": "Episodio(s)", + "episodeLength": "Longitud del episodio", + "ageRating": "Clasificación por edad", + "firstAirDate": "Primera fecha de emisión", + "watchIt": "Véalo aquí:", + "stillAiring": "Sigue emitiendo" + }, + "mangaOutputDescription": "**Título en inglés:** {{englishTitle}}\n**Título japonés:** {{japaneseTitle}}\n**Título canónico:** {{canonicalTitle}}\n{{synopsis}}", + "mangaTypes": { + "manga": "📘 Manga", + "novel": "📕 Novel", + "manhwa": "🇰🇷 Manhwa", + "oneShot": "☄ One Shot", + "special": "🎴 Especial" + }, + "mangaEmbedData": { + "ageRating": "Clasificación por edad", + "firstPublishDate": "Publicado originalmente", + "readIt": "Léalo aquí:", + "score": "Puntuación", + "type": "Subtipo", + "none": "Ninguno" + }, + "waifuFooter": "Hecho posible gracias a thiswaifudoesnotexist.net" +} diff --git a/src/languages/es-ES/commands/announcement.json b/src/languages/es-ES/commands/announcement.json new file mode 100644 index 00000000000..8c2d79f0881 --- /dev/null +++ b/src/languages/es-ES/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "El mensaje ha sido cancelado.", + "announcementDescription": "Envía nuevos anuncios, mencionando el rol de anuncio.", + "announcementEmbedMentions": "{{header}}:", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "anuncio", + "El texto del anuncio a publicar." + ] + ], + "examples": [ + "¡Me complace anunciar que tenemos un bot capaz de enviar anuncios seguros para nuestros suscriptores!" + ], + "reminder": "Si quieres editar el mensaje que enviaste en un anuncio, edita el mensaje que usaste para que Skyra envíe ese anuncio. Skyra editará el mensaje que envió anteriormente. Puedes hacer esto hasta 15 minutos después del anuncio inicial, ¡así que asegúrese de no esperar mucho tiempo!" + }, + "announcementPrompt": "Este será el mensaje enviado en el canal de anuncios. ¿Está de acuerdo con esto?", + "announcementSuccess": "Se ha publicado un nuevo anuncio con éxito.", + "subscribeDescription": "Suscríbete a los anuncios de este servidor.", + "subscribeExtended": { + "extendedHelp": "Este comando sirve el propósito de **dar** el rol del suscriptor, que debe ser configurado por los administradores del servidor. Cuando un moderador o administrador use el comando **anuncio**, se te mencionará. Esta función está diseñada para reemplazar las etiquetas @everyone/@here y mencionar sólo a los usuarios interesados." + }, + "subscribeNoChannel": "Este servidor no tiene un canal de anuncio configurado.", + "subscribeNoRole": "Este servidor no tiene un rol de anuncio configurado.", + "subscribeSuccess": "Se ha otorgado correctamente el rol: **{{role}}**", + "unsubscribeDescription": "Darse de baja a los anuncios de este servidor.", + "unsubscribeExtended": { + "extendedHelp": "Este comando sirve el propósito de **quitar** el rol del suscriptor, que debe ser configurado por los administradores del servidor. Cuando un moderador o administrador use el comando **anuncio**, **no** se te mencionará. Esta función está diseñada para reemplazar las etiquetas @everyone/@here y mencionar sólo a los usuarios interesados." + }, + "unsubscribeSuccess": "Se ha eliminado correctamente el rol: **{{role}}**" +} diff --git a/src/languages/es-ES/commands/developer.json b/src/languages/es-ES/commands/developer.json new file mode 100644 index 00000000000..be912891320 --- /dev/null +++ b/src/languages/es-ES/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "Responde con información sobre un paquete NodeJS usando el registro de paquetes Yarn", + "yarnExtended": { + "extendedHelp": "Esto es para desarrolladores de NodeJS que quieren encontrar rápidamente información sobre un paquete publicado en [npm](https://npmjs.com)", + "explainedUsage": [ + [ + "paquete", + "El nombre del paquete a buscar, tiene que ser una coincidencia exacta" + ] + ], + "examples": [ + "@skyra/char", + "@skyra/saelem", + "@skyra/eslint-config" + ] + }, + "yarnEmbedDescriptionAuthor": "❯ Autor: {{author}}", + "yarnEmbedDescriptionDateCreated": "❯ Fecha de creación: **{{dateCreated}}**", + "yarnEmbedDescriptionDateModified": "❯ Fecha de modificación **{{dateModified}}**", + "yarnEmbedDescriptionDependenciesLabel": "__*Dependencias:*__", + "yarnEmbedDescriptionDependenciesNoDeps": "¡No hay dependencias {{GREENTICK}}!", + "yarnEmbedDescriptionDeprecated": "❯ Aviso de desaprobación: **{{deprecated}}**", + "yarnEmbedDescriptionLatestVersion": "❯ Última versión: **{{latestVersionNumber}}**", + "yarnEmbedDescriptionLicense": "❯ Licencia: **{{license}}**", + "yarnEmbedDescriptionMainFile": "❯ Archivo principal: **{{mainFile}}**", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "más...", + "yarnNoPackage": "{{REDCROSS}} Lo siento, pero tienes que darme el nombre de un paquete para buscar.", + "yarnPackageNotFound": "Lo siento, pero no he podido encontrar ningún paquete con el nombre de `{{pkg}}` en el registro.", + "yarnUnpublishedPackage": "¡Qué desarrollador tonto que hizo {{pkg}}! ¡Han despublicado su paquete!" +} diff --git a/src/languages/es-ES/commands/fun.json b/src/languages/es-ES/commands/fun.json new file mode 100644 index 00000000000..48c17f29cf1 --- /dev/null +++ b/src/languages/es-ES/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "Skyra leerá la Santa Biblia para encontrar la respuesta correcta para tu pregunta.", + "8ballExtended": { + "extendedHelp": "Este comando te proporciona una pregunta aleatoria basada en el tipo de tus preguntas. Ten cuidado, puede ser demasiado inteligente.", + "explainedUsage": [ + [ + "pregunta", + "La Sagrada Pregunta" + ] + ], + "examples": [ + "¿Por qué cruzó la carretera el pollo?" + ] + }, + "choiceDescription": "Pito pito, gorgorito, ¿dónde vas tú tan bonito?...", + "choiceExtended": { + "extendedHelp": "Tengo una duda existencial... ¿debo lavar los platos o tirarlos por la ventana? La búsqueda continúa. Liste los elementos separados por coma y elegiré uno. Postdata, no soy responsable de lo que sucede después.", + "explainedUsage": [ + [ + "palabras", + "Una lista de palabras separadas por coma." + ] + ], + "examples": [ + "Lavar los platos, Lanzar los platos a la ventana", + "Gato, Perro" + ] + }, + "changemymindDescription": "Skyra es la mejor, convénceme de lo contrario.", + "changemymindExtended": { + "extendedHelp": "Sigo pensando que soy la mejor, convénceme de lo opuesto. Hago una foto con tu avatar y un poco de texto en un cartel.", + "explainedUsage": [ + [ + "texto", + "La frase que desea." + ] + ], + "examples": [ + "Skyra es el mejor bot de este servidor" + ] + }, + "diceDescription": "Lanza los dados usando la sintaxis d20.", + "diceExtended": { + "extendedHelp": "Las mecánicas de este comando son fáciles. Tienes un dado, luego lo tiras __x__ veces, pero los dados también pueden configurarse para tener __y__ lados. Por defecto, este comando tira un dado con 6 lados una vez. Sin embargo, puedes cambiar la cantidad de tiradas para los dados, y este comando \"tirará\" (obtener un número aleatorio entre 1 y la cantidad de lados). Por ejemplo, tirar un dado con 6 lados 3 veces dejará una secuencia aleatoria de tres números aleatorios entre 1 y 6, por ejemplo: 3, 1, 6; lo cual hará que este comando devuelva 10 como salida.", + "examples": [ + "370d24", + "100d6", + "" + ] + }, + "escaperopeDescription": "Usa la Cuerda Huida de Pokemon.", + "escaperopeExtended": { + "extendedHelp": "**Skyra** utilizó **Cuerda Huida**." + }, + "howToFlirtDescription": "Capitán América, usted no sabe cómo coquetear.", + "howToFlirtExtended": { + "extendedHelp": "Déjenme mostrarles cómo coquetear eficazmente con alguien utilizando el estilo de Tony Stark para el Capitán América, puedo garantizarle que lo conseguirá.", + "explainedUsage": [ + [ + "usuario", + "El usuario con el que coquetear." + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "Medidor de amor, ¡en línea!", + "loveExtended": { + "extendedHelp": "¡Hola! ¿Quieres probar el medidor de amor? Sé que es una máquina ridícula, ¡pero a muchos humanos les encanta! ¡No seas tímido y pruébalo!", + "explainedUsage": [ + [ + "usuario", + "El usuario a calificar." + ] + ], + "examples": [ + "Skyra" + ] + }, + "markovDescription": "Genera una cadena de Markov desde el canal de texto.", + "markovExtended": { + "extendedHelp": "Una cadena Markov es una co... ¿qué? Vale, algo que una teoría de probabilidad hecha por un matemático ruso, comprueba Wikipedia para más información. **En resumen**: Generaré un mensaje aleatorio dado el contenido de los mensajes en el canal." + }, + "norrisDescription": "Disfruta tu día leyendo las bromas de Chuck Norris.", + "norrisExtended": { + "extendedHelp": "¿Sabías que Chuck norris **no** llama al número equivocado, sino que tú **respondes** al teléfono equivocado? Ostras, ¡mi cabeza explotó! También lanzó un cartón de leche y creó la Vía Láctea. Este comando consulta chucknorris.io y recupera un hecho (no asuma que son falsos, no delante de él) así que puedes leerlo" + }, + "rateDescription": "Deja que los robots tengan opiniones y valore a alguien.", + "rateExtended": { + "extendedHelp": "Sólo porque soy un robot no significa que no pueda calificarte correctamente. Yo puedo calificarte con un generador de números aleatorios para facilitar el proceso. ¡Vaaale! No es justo, pero también quiero decir... también puedo darte 💯.", + "explainedUsage": [ + [ + "usuario", + "El usuario a calificar." + ] + ], + "examples": [ + "Skyra", + "yo" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "Lee comics de XKCD.", + "xkcdExtended": { + "extendedHelp": "**xkcd** es un archivo de cómics repleto de matemáticas, ciencias, sarcasmo e idiomas. Si usted no proporciona ningún argumento, obtendré un cómic aleatorio de xkcd. Si en cambio, usted proporciona un número, yo le mostraré el cómic con dicho número. Pero si proporcionas un título/texto/tema, buscaré un cómic que coincida con tu entrada y lo mostraré. Por ejemplo, `Skyra, xkcd Curiosity` mostrará el cómic número 1091.", + "explainedUsage": [ + [ + "consulta", + "O bien el número del cómic o bien un título para buscar." + ] + ], + "examples": [ + "1091", + "Curiosidad" + ] + }, + "punDescription": "The muestra un chiste aleatorio.", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "¿Descripciones útiles? No hacemos eso aquí", + "wakandaExtended": { + "extendedHelp": "Genera una imagen usando la plantilla [No Hacemos Eso Aquí](https://knowyourmeme.com/memes/we-dont-do-that-here) con el usuario dado." + }, + "8ballOutput": "🎱 Pregunta de {{author}}: *{{question}}*\n{{response}}", + "8ballQuestions": { + "When": "cuándo", + "What": "qué", + "HowMuch": "cuánto", + "HowMany": "cuántos", + "Why": "por qué", + "Who": "quién" + }, + "8ballWhen": [ + "Pronto™", + "Tal vez mañana.", + "Tal vez el año que viene...", + "Ahora mismo.", + "En unos pocos meses." + ], + "8ballWhat": [ + "Un avión.", + "¿Qué? Pregunte de nuevo.", + "Un regalo.", + "Nada.", + "Un anillo.", + "No sé, tal vez algo." + ], + "8ballHowMuch": [ + "Mucho.", + "Un poco.", + "Un poco.", + "Pregúntame mañana.", + "No lo sé, pregúntele a un físico.", + "Nada.", + "", + "", + "2 o 3 litros, no me recuerdo.", + "Infinito.", + "1010 litros." + ], + "8ballHowMany": [ + "Mucho.", + "Un poco.", + "Un poco.", + "Pregúntame mañana.", + "No lo sé, pregúntele a un físico.", + "Nada.", + "", + "", + "2 o 3 litros, no me recuerdo.", + "Infinito", + "1010." + ], + "8ballWhy": [ + "Tal vez la genética.", + "Porque alguien lo decidió.", + "¡Por la gloria de Satán, por supuesto!", + "No sé, tal vez sea el destino.", + "Porque así lo dije.", + "No tengo ni idea.", + "Pregunte al dueño de este servidor.", + "Pregunta de nuevo.", + "Para llegar al otro lado.", + "Así lo dice en la Biblia." + ], + "8ballWho": [ + "Un ser humano.", + "Un robot.", + "Un avión.", + "Un ave.", + "Una composición del carbono.", + "Un puñado de ceros y otros.", + "No tengo ni idea de ello, ¿es material?", + "Eso no es lógico." + ], + "8ballElse": [ + "Muy probablemente.", + "Para nada.", + "¡SÍ!", + "Tal vez.", + "Como yo lo veo, sí", + "Pregúntame mañana.", + "No lo sé, pregúntele a un físico.", + "Mejor no decírtelo ahora.", + "No cuentes con ello.", + "Eso es cierto.", + "Es decididamente así.", + "Mis fuentes dicen que no.", + "Las perspectivas no son buenas.", + "Las perspectivas son buenas.", + "Respuesta confusa, intenta otra vez.", + "Las señales indican que si.", + "Lo dudo mucho.", + "Sin duda alguna.", + "Sí, sin duda alguna.", + "Puedes confiar en ello." + ], + "choiceOutput": "", + "choiceMissing": "Por favor, escriba al menos dos opciones separadas por coma.", + "choiceDuplicates": "¿Por qué aceptaría palabras duplicadas? \"{{words}}\".", + "diceOutput": "¡Has tirado los dados! Has obtenido: **{{result}}**", + "diceRollsError": "Cantidad de lanzamientos debe ser un número entre 1 y 1024.", + "diceSidesError": "Cantidad de lados debe ser un número entre 3 y 1024.", + "escaperopeOutput": "**{{user}}** utilizó **Cuerda Huida**", + "loveLess45": "Inténtalo de nuevo la próxima vez...", + "loveLess75": "¡Suficientemente bueno!", + "loveLess100": "¡Buena pareja!", + "love100": "¡Pareja perfecta!", + "loveItself": "Eres una persona especial y te deberías amar más que a nadie más en este mundo <3", + "loveResult": "Resultado", + "markovTimer": "Procesado en {{timer}}.", + "markovNoMessages": "El canal o usuario no tiene mensajes.", + "norrisOutput": "Chuck Norris", + "rateOutput": "**{{author}}**, le daría a **{{userToRate}}** un **{{rate}}**/100 {{emoji}}", + "rateMyself": [ + ". Me amo un montón 😊", + "yo mismo" + ], + "rateOwners": [ + ". Me encanta mucho a mis desarrolladores 🥰", + "mis desarrolladores" + ], + "punError": "Se ha producido un error. Por favor, inténtelo más tarde.", + "xkcdComics": "Solo hay {{amount}} cómics.", + "xkcdNotfound": "He buscado mucho, pero no tuve suerte en encontrar este cómic, ¡intente de nuevo más tarde o pruebe otro!" +} diff --git a/src/languages/es-ES/commands/game.json b/src/languages/es-ES/commands/game.json new file mode 100644 index 00000000000..895a0c406a7 --- /dev/null +++ b/src/languages/es-ES/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "**Antes**: {{previous, number}} {{SHINY}}\n**Después**: {{next, number}} {{SHINY}}" +} diff --git a/src/languages/es-ES/commands/gameIntegration.json b/src/languages/es-ES/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/es-ES/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/es-ES/commands/general.json b/src/languages/es-ES/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/es-ES/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/es-ES/commands/giveaway.json b/src/languages/es-ES/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/es-ES/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/es-ES/commands/google.json b/src/languages/es-ES/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/es-ES/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/es-ES/commands/management.json b/src/languages/es-ES/commands/management.json new file mode 100644 index 00000000000..f3dc9238188 --- /dev/null +++ b/src/languages/es-ES/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "Apodo borrado.", + "permissionNodesHigher": "{{REDCROSS}} No puedes modificar ni previsualizar los nodos de permiso para este objetivo.", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "{{GREENTICK}} Se ha añadido correctamente el comando al nodo de permisos.", + "permissionNodesNodeNotExists": "{{REDCROSS}} El nodo de permiso seleccionado no existe.", + "permissionNodesCommandNotExists": "{{REDCROSS}} El comando seleccionado no existe en el nodo de permiso.", + "permissionNodesRemove": "{{GREENTICK}} Se ha eliminado correctamente el comando del nodo de permisos.", + "permissionNodesReset": "{{GREENTICK}} Se han eliminado correctamente todos los comandos del nodo de permisos.", + "permissionNodesShowName": "Permisos para: __{{name}}__", + "permissionNodesShowAllow": "**Permitidos**: {{allow}}", + "permissionNodesShowDeny": "", + "triggersNotype": "Necesitas insertar un tipo de disparador (**alias**|**reacción**)", + "triggersNooutput": "Necesita insertar la salida del disparador.", + "triggersInvalidreaction": "Esta reacción no me parece válida, o bien no es unicode válido o no tengo acceso a ella.", + "triggersInvalidalias": "No existe un comando con este nombre.", + "triggersRemoveNottaken": "No hay ningún disparador con esta entrada.", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/es-ES/commands/misc.json b/src/languages/es-ES/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/es-ES/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/es-ES/commands/moderation.json b/src/languages/es-ES/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/es-ES/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/es-ES/commands/music.json b/src/languages/es-ES/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/es-ES/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/es-ES/commands/pokemon.json b/src/languages/es-ES/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/es-ES/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/es-ES/commands/social.json b/src/languages/es-ES/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/es-ES/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/es-ES/commands/starboard.json b/src/languages/es-ES/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/es-ES/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/es-ES/commands/suggestion.json b/src/languages/es-ES/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/es-ES/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/es-ES/commands/system.json b/src/languages/es-ES/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/es-ES/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/es-ES/commands/tags.json b/src/languages/es-ES/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/es-ES/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/es-ES/commands/tools.json b/src/languages/es-ES/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/es-ES/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/es-ES/commands/twitch.json b/src/languages/es-ES/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/es-ES/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/es-ES/commands/weeb.json b/src/languages/es-ES/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/es-ES/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/es-ES/constants.ts b/src/languages/es-ES/constants.ts new file mode 100644 index 00000000000..a53bb25f6e5 --- /dev/null +++ b/src/languages/es-ES/constants.ts @@ -0,0 +1,62 @@ +import { Handler } from '#lib/structures/i18n/Handler'; +import { TimeTypes } from '@sapphire/time-utilities'; + +export class ExtendedHandler extends Handler { + public constructor() { + super({ + name: 'es-ES', + duration: { + [TimeTypes.Year]: { + 1: 'año', + DEFAULT: 'años' + }, + [TimeTypes.Month]: { + 1: 'mes', + DEFAULT: 'meses' + }, + [TimeTypes.Week]: { + 1: 'semana', + DEFAULT: 'semanas' + }, + [TimeTypes.Day]: { + 1: 'día', + DEFAULT: 'días' + }, + [TimeTypes.Hour]: { + 1: 'hora', + DEFAULT: 'horas' + }, + [TimeTypes.Minute]: { + 1: 'minuto', + DEFAULT: 'minutos' + }, + [TimeTypes.Second]: { + 1: 'segundo', + DEFAULT: 'segundos' + } + } + }); + } + + public ordinal(cardinal: number) { + const dec = cardinal % 10; + + switch (dec) { + case 1: + return `${cardinal}ro`; + case 2: + return `${cardinal}do`; + case 3: + return `${cardinal}ro`; + case 0: + case 7: + return `${cardinal}mo`; + case 8: + return `${cardinal}vo`; + case 9: + return `${cardinal}no`; + default: + return `${cardinal}to`; + } + } +} diff --git a/src/languages/es-ES/errors.json b/src/languages/es-ES/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/events.json b/src/languages/es-ES/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/fuzzySearch.json b/src/languages/es-ES/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/giveaway.json b/src/languages/es-ES/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/globals.json b/src/languages/es-ES/globals.json new file mode 100644 index 00000000000..4e9ce330e49 --- /dev/null +++ b/src/languages/es-ES/globals.json @@ -0,0 +1,11 @@ +{ + "and": "y", + "default": "La clave {{key}} aún no ha sido traducido para es-ES.", + "defaultLanguage": "Idioma predeterminado", + "is": "es", + "no": "No", + "none": "Ninguno", + "or": "o", + "unknown": "desconocido", + "yes": "Sí" +} diff --git a/src/languages/es-ES/humanLevels.json b/src/languages/es-ES/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/inhibitors.json b/src/languages/es-ES/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/klasa.json b/src/languages/es-ES/klasa.json new file mode 100644 index 00000000000..0ba88ebbd56 --- /dev/null +++ b/src/languages/es-ES/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "Faltan uno o más argumentos requeridos después del final de la entrada.", + "commandMessageMissingOptionals": "Falta una opción requerida: ({{possibles}})", + "commandMessageMissingRequired": "{{name}} es un argumento requerido.", + "commandMessageNoMatch": "Tu opción no coincide con ninguna de las posibilidades: ({{possibles}})", + "messagePromptTimeout": "El tiempo de espera de la solicitud ha sido agotado.", + "monitorCommandHandlerAborted": "Cancelado", + "monitorCommandHandlerRepeatingReprompt": "{{tag}} | **{{name}}** es un argumento repetitivo | Tienes **{{time}}** segundos para responder a este prompt con argumentos válidos adicionales. Escribe **{{cancelOptions}}** para cancelar esta petición.", + "monitorCommandHandlerReprompt": "{{tag}} | **{{name}}** | Tienes **{{time}}** segundos para responder a este mensaje con un argumento válido. Escribe **{{cancelOptions}}** para abortar esta petición.", + "reactionhandlerPrompt": "¿A qué página le gustaría saltar?", + "textPromptAbortOptions": [ + "abortar", + "cancelar", + "parar" + ] +} diff --git a/src/languages/es-ES/moderation.json b/src/languages/es-ES/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/moderationActions.json b/src/languages/es-ES/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/es-ES/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/es-ES/monitors.json b/src/languages/es-ES/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/musicManager.json b/src/languages/es-ES/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/notifications.json b/src/languages/es-ES/notifications.json new file mode 100644 index 00000000000..339397dd1aa --- /dev/null +++ b/src/languages/es-ES/notifications.json @@ -0,0 +1,6 @@ +{ + "twitchEmbedDescription": "¡{{userName}} está ahora en directo!", + "twitchEmbedDescriptionWithGame": "{{userName}} ahora está en directo - ¡Transmitiendo {{gameName}}!", + "twitchNoGameName": "*Nombre del juego no establecido*", + "twitchEmbedFooter": "Notificaciones Twitch de Skyra" +} diff --git a/src/languages/es-ES/permissions.json b/src/languages/es-ES/permissions.json new file mode 100644 index 00000000000..9621a116edb --- /dev/null +++ b/src/languages/es-ES/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Administrador", + "VIEW_AUDIT_LOG": "Ver el Registro de Auditoría", + "MANAGE_GUILD": "Gestionar Servidor", + "MANAGE_ROLES": "Gestionar Roles", + "MANAGE_CHANNELS": "Gestionar Canales", + "KICK_MEMBERS": "Expulsar a Miembros", + "BAN_MEMBERS": "Banear miembros", + "CREATE_INSTANT_INVITE": "Crear Invitación Instantánea", + "CHANGE_NICKNAME": "Cambiar Apodo", + "MANAGE_NICKNAMES": "Gestionar Apodos", + "MANAGE_EMOJIS": "Gestionar Emojis", + "MANAGE_WEBHOOKS": "Gestionar Webhooks", + "VIEW_CHANNEL": "Leer Mensajes", + "SEND_MESSAGES": "Enviar Mensajes", + "SEND_TTS_MESSAGES": "Enviar Mensajes de Texto a Voz", + "MANAGE_MESSAGES": "Gestionar Mensajes", + "EMBED_LINKS": "Insertar Enlaces", + "ATTACH_FILES": "Adjuntar Archivos", + "READ_MESSAGE_HISTORY": "Leer el Historial de Mensajes", + "MENTION_EVERYONE": "Mencionar a Todos", + "USE_EXTERNAL_EMOJIS": "Usar Emojis Externos", + "ADD_REACTIONS": "Añadir Reacciones", + "CONNECT": "Conectar", + "SPEAK": "Hablar", + "STREAM": "Vídeo", + "MUTE_MEMBERS": "Silenciar Miembros", + "DEAFEN_MEMBERS": "Ensordecer Miembros", + "MOVE_MEMBERS": "Mover Miembros", + "USE_VAD": "Usar Actividad de Voz", + "PRIORITY_SPEAKER": "Prioridad de Palabra", + "VIEW_GUILD_INSIGHTS": "Ver Información del Servidor" +} diff --git a/src/languages/es-ES/promptList.json b/src/languages/es-ES/promptList.json new file mode 100644 index 00000000000..8aa5db0ac38 --- /dev/null +++ b/src/languages/es-ES/promptList.json @@ -0,0 +1,6 @@ +{ + "aborted": "Se ha abortado la petición con éxito.", + "attemptFailed": "Entrada no válida. Intento **{{attempt}}** de **{{maxAttempts}}**\n{{list}}", + "multipleChoice_plural": "Hay {{count}} resultados. Por favor, elige un número entre 1 y {{count}}, o escribe **`CANCEL`** para cancelar la solicitud.\n{{list}}", + "multipleChoice": "Hay {{count}} resultado. Por favor, elige un número entre 1 y {{count}}, o escribe **`CANCEL`** para cancelar la solicitud.\n{{list}}" +} diff --git a/src/languages/es-ES/resolvers.json b/src/languages/es-ES/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/es-ES/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/es-ES/selfModeration.json b/src/languages/es-ES/selfModeration.json new file mode 100644 index 00000000000..41361ce0b4c --- /dev/null +++ b/src/languages/es-ES/selfModeration.json @@ -0,0 +1,34 @@ +{ + "commandDisabled": "{{GREENTICK}} Sub-sistema deshabilitado con éxito.", + "commandEnabled": "{{GREENTICK}} Sub-sistema habilitado con éxito.", + "commandHardAction": "{{GREENTICK}} Castigo establecido con éxito: {{value}}", + "commandHardActionDuration": "{{GREENTICK}} Se eliminó con éxito el temporizador de apelación del castigo.", + "commandHardActionDurationWithValue": "{{GREENTICK}} Se ha establecido correctamente el temporizador de apelación de castigo a: {{value, duration}}", + "commandInvalidHardaction": "{{REDCROSS}} El valor debe ser cualquiera de los siguientes: `none`, `warn`, `mute`, `kick`, `softban`, o `ban`. Consulta `Skyra, help {{name}}` para más información.", + "commandInvalidMissingAction": "{{REDCROSS}} La acción debe ser cualquieraa de las siguientes: `enable`, `disable`, `action`, `punish`, `punish-duration`, `threshold-maximum`, `threshold-duration` o `show`. Consulta `Skyra, help {{name}}` para más información.", + "commandInvalidMissingArguments": "{{REDCROSS}} La acción especificada requiere que se pase un argumento extra. Revisa `Skyra, help {{name}}` para más información.", + "commandInvalidSoftaction": "{{REDCROSS}} El valor debe ser cualquiera de los siguientes: `alert`, `log` o `delete`. Consulta `Skyra, help {{name}}` para más información.", + "commandShowDurationPermanent": "Permanente", + "commandShowUnset": "Sin definir", + "commandSoftAction": "{{GREENTICK}} Acciones deshabilitadas con éxito.", + "commandSoftActionWithValue": "{{GREENTICK}} Acciones establecidas con éxito a: `{{value}}`", + "commandThresholdDuration": "{{GREENTICK}} Se ha eliminado correctamente la duración del umbral, los castigos se aplicarán al instante si éste fue establecido.", + "commandThresholdDurationWithValue": "{{GREENTICK}} Se estableció correctamente la duración del umbral a: {{value, duration}}", + "commandThresholdMaximum": "{{GREENTICK}} Se ha eliminado correctamente el umbral máximo, los castigos se aplicarán al instante si éste fue establecido.", + "commandThresholdMaximumWithValue": "{{GREENTICK}} Se estableció correctamente la duración del umbral a: {{value}}", + "disabled": "No", + "durationTooLong": "{{REDCROSS}} El valor ({{value, duration}}) era demasiado largo, se esperaba un máximo {{maximum, duration}}.", + "durationTooShort": "{{REDCROSS}} El valor ({{value, duration}}) era demasiado corto, esperaba al menos {{minimum, duration}}.", + "enabled": "Sí", + "hardActionBan": "Banear", + "hardActionKick": "Expulsar", + "hardActionMute": "Silenciar", + "hardActionNone": "Ninguno", + "hardActionSoftban": "SoftBan", + "hardActionWarning": "Advertencia", + "maximumTooLong": "{{REDCROSS}} El valor ({{value}}) era demasiado largo, se esperaba un máximo {{maximum}}.", + "maximumTooShort": "{{REDCROSS}} El valor ({{value}}) era demasiado corto, esperaba al menos {{minimum}}.", + "softActionAlert": "Notificación", + "softActionDelete": "Borrar", + "softActionLog": "Informe" +} diff --git a/src/languages/es-ES/serializers.json b/src/languages/es-ES/serializers.json new file mode 100644 index 00000000000..2577bf0a3a0 --- /dev/null +++ b/src/languages/es-ES/serializers.json @@ -0,0 +1,27 @@ +{ + "autoRoleInvalid": "Los datos del rol automático no son inválidos.", + "commandAutoDeleteInvalid": "Los datos de la eliminación automática de comandos no son válidos.", + "customCommandInvalidArgs": "La propiedad \"args\" debe ser un conjunto de textos.", + "customCommandInvalidColor": "La propiedad \"color\" debe ser un número.", + "customCommandInvalidContent": "La propiedad \"contenido\" debe ser un texto.", + "customCommandInvalidEmbed": "La propiedad \"embed\" debe ser un booleano.", + "customCommandInvalidId": "La propiedad \"id\" debe ser un texto.", + "disabledCommandChannelsChannelsCommandDoesNotExist": "El comando `{{name}}` no existe.", + "disabledCommandChannelsChannelsDoesNotExist": "Ese canal de chat no existe.", + "permissionNodeDuplicatedCommand": "Has establecido `{{command}}` dos veces, o lo permites, o lo niegas.", + "permissionNodeInvalid": "Datos no válidos.", + "permissionNodeInvalidCommand": "El comando `{{command}}` no existe o no es válido.", + "permissionNodeInvalidTarget": "No se pudo encontrar ningún dato del ID.", + "permissionNodeSecurityEveryoneAllows": "Por lo que respecta a la seguridad, el rol everyone no puede tener permisos extras.", + "permissionNodeSecurityGuarded": "Por seguridad y para mi correcto funcionamiento, no se puede negar el uso para el comando `{{command}}`.", + "permissionNodeSecurityOwner": "No puedes denegar permisos al propietario del servidor.", + "reactionRoleInvalid": "Los datos del rol de reacción no son inválidos.", + "stickyRoleInvalid": "Los datos de rol pegajoso no son válidos.", + "triggerAliasInvalid": "Los datos del disparador de alias no son válidos.", + "triggerIncludeInvalid": "Los datos del disparador de inclusión de texto no son válidos.", + "triggerIncludeInvalidAction": "La acción del disparador no es válida.", + "twitchSubscriptionInvalid": "Los datos no son válidos.", + "twitchSubscriptionInvalidStreamer": "Los datos del streamer no son válidos.", + "uniqueRoleSetInvalid": "Los datos del conjunto de roles único no son válidos.", + "unsupported": "Esta clave de configuración no puede ser actualizada a través de Discord en este momento, ¡Por favor, usa el panel de control en !" +} diff --git a/src/languages/es-ES/settings.json b/src/languages/es-ES/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/es-ES/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/es-ES/system.json b/src/languages/es-ES/system.json new file mode 100644 index 00000000000..793521be10f --- /dev/null +++ b/src/languages/es-ES/system.json @@ -0,0 +1,44 @@ +{ + "cannotAccessChannel": "Lo siento, pero usted no tiene permiso para ver ese canal.", + "channelNotPostable": "No estoy autorizado a enviar mensajes a este canal.", + "databaseError": "¡No pude obtenerlo en mi base de datos! Por favor, inténtelo de nuevo, o si el problema sigue ocurriendo, únase al servidor de soporte (pista: use `Skyra, support`)", + "discordAbortError": "Tuve un pequeño error de red al enviar el mensaje a Discord, ¡por favor ejecuta este comando de nuevo!", + "error": "¡Algo malo ha sucedido! Por favor, inténtalo de nuevo, o si el problema sigue ocurriendo, únase al servidor de soporte (pista: usa `Skyra, support`)", + "exceededLengthChooseOutput": "Elija una de las siguientes opciones: {{output, orList}}", + "exceededLengthOutput": "**Salida**:{{output}}", + "exceededLengthOutputConsole": "Se envió el resultado a la consola.", + "exceededLengthOutputConsoleWithTypeAndTime": "Se envió el resultado a la consola.\n**Tipo**:{{type}}\n{{time}}", + "exceededLengthOutputFile": "Enviado el resultado como un archivo.", + "exceededLengthOutputFileWithTypeAndTime": "Se envió el resultado como un archivo.\n**Tipo**:{{type}}\n{{time}}", + "exceededLengthOutputHastebin": "Se envió el resultado a hastebin: {{url}}", + "exceededLengthOutputHastebinWithTypeAndTime": "Se envió el resultado a hastebin: {{url}}\n**Tipo**:{{type}}\n{{time}}", + "exceededLengthOutputWithTypeAndTime": "**Salida**:{{output}}\n**Tipo**:{{type}}\n{{time}}", + "externalServerError": "El servicio externo que utilizamos no ha podido procesar nuestro mensaje. Inténtalo de nuevo más tarde.", + "fetchBansFail": "Error al obtener la información de los baneos. ¿Tengo el permiso **{{ADMINISTRATOR, permissions}}**?", + "helpTitles": { + "explainedUsage": "⚙ | ***Uso explicado***", + "possibleFormats": "🔢 | ***Formatos posibles***", + "examples": "🔗 | ***Ejemplos***", + "reminders": "⏰ | ***Recordatorio***" + }, + "highestRole": "La posición jerárquica de este rol es mayor o igual que yo, no puedo concederla a nadie.", + "jumpTo": "Saltar al Mensaje ►", + "loading": [ + "{{LOADING}} Viendo hámsters correr...", + "{{LOADING}} Buscando personas en el escondite...", + "{{LOADING}} Tratando de averiguar este comando...", + "{{LOADING}} Obteniendo datos desde la nube...", + "{{LOADING}} Calibrando lentes...", + "{{LOADING}} Jugando piedra, papel, tijeras...", + "{{LOADING}} Ajustando a las frecuencias correctas...", + "{{LOADING}} Reticulando curvas..." + ], + "messageNotFound": "Lo siento, pero o bien escribiste la ID de mensaje incorrectamente o se eliminó.", + "noResults": "No pude encontrar resultados para esa consulta", + "notEnoughParameters": "Lo siento, pero no has proporcionado suficientes parámetros...", + "parseError": "{{REDCROSS}} No he podido procesar los datos que me has proporcionado, ¡lo siento~!", + "pokedexExternalResource": "Recursos Externos", + "poweredByWeebSh": "Hecho posible gracias a weeb.sh", + "prefixReminder": "El prefijo de este servidor es: `{{prefix}}`", + "queryFail": "Lo siento, la aplicación no ha podido resolver tu solicitud. ¿Estás seguro de que has escrito el nombre correctamente?" +} diff --git a/src/languages/fr-FR/arguments/range.json b/src/languages/fr-FR/arguments/range.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/arguments/range.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/commands/admin.json b/src/languages/fr-FR/commands/admin.json new file mode 100644 index 00000000000..f4b2ba18e0c --- /dev/null +++ b/src/languages/fr-FR/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "", + "confNoValue": "", + "confGuarded": "", + "confUpdated": "", + "confKeyNotArray": "", + "confGetNoExt": "", + "confGet": "", + "confReset": "", + "confNochange": "", + "confServerDescription": "", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "", + "confUserDescription": "", + "confDashboardOnlyKey": "", + "confUser": "", + "confSettingNotSet": "", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/fr-FR/commands/animal.json b/src/languages/fr-FR/commands/animal.json new file mode 100644 index 00000000000..1853c9a0440 --- /dev/null +++ b/src/languages/fr-FR/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/fr-FR/commands/anime.json b/src/languages/fr-FR/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/fr-FR/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/fr-FR/commands/announcement.json b/src/languages/fr-FR/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/fr-FR/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/fr-FR/commands/developer.json b/src/languages/fr-FR/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/fr-FR/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/fr-FR/commands/fun.json b/src/languages/fr-FR/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/fr-FR/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/fr-FR/commands/game.json b/src/languages/fr-FR/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/fr-FR/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/fr-FR/commands/gameIntegration.json b/src/languages/fr-FR/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/fr-FR/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/fr-FR/commands/general.json b/src/languages/fr-FR/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/fr-FR/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/fr-FR/commands/giveaway.json b/src/languages/fr-FR/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/fr-FR/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/fr-FR/commands/google.json b/src/languages/fr-FR/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/fr-FR/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/fr-FR/commands/management.json b/src/languages/fr-FR/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/fr-FR/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/fr-FR/commands/misc.json b/src/languages/fr-FR/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/fr-FR/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/fr-FR/commands/moderation.json b/src/languages/fr-FR/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/fr-FR/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/fr-FR/commands/music.json b/src/languages/fr-FR/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/fr-FR/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/fr-FR/commands/pokemon.json b/src/languages/fr-FR/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/fr-FR/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/fr-FR/commands/social.json b/src/languages/fr-FR/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/fr-FR/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/fr-FR/commands/starboard.json b/src/languages/fr-FR/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/fr-FR/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/fr-FR/commands/suggestion.json b/src/languages/fr-FR/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/fr-FR/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/fr-FR/commands/system.json b/src/languages/fr-FR/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/fr-FR/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/fr-FR/commands/tags.json b/src/languages/fr-FR/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/fr-FR/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/fr-FR/commands/tools.json b/src/languages/fr-FR/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/fr-FR/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/fr-FR/commands/twitch.json b/src/languages/fr-FR/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/fr-FR/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/fr-FR/commands/weeb.json b/src/languages/fr-FR/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/fr-FR/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/fr-FR/errors.json b/src/languages/fr-FR/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/events.json b/src/languages/fr-FR/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/fuzzySearch.json b/src/languages/fr-FR/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/giveaway.json b/src/languages/fr-FR/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/globals.json b/src/languages/fr-FR/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/humanLevels.json b/src/languages/fr-FR/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/inhibitors.json b/src/languages/fr-FR/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/klasa.json b/src/languages/fr-FR/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/fr-FR/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/fr-FR/moderation.json b/src/languages/fr-FR/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/moderationActions.json b/src/languages/fr-FR/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/fr-FR/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/fr-FR/monitors.json b/src/languages/fr-FR/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/musicManager.json b/src/languages/fr-FR/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/notifications.json b/src/languages/fr-FR/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/permissions.json b/src/languages/fr-FR/permissions.json new file mode 100644 index 00000000000..c99fd3d6c3c --- /dev/null +++ b/src/languages/fr-FR/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Administrateur", + "VIEW_AUDIT_LOG": "Voir les logs du serveur", + "MANAGE_GUILD": "Gérer le serveur", + "MANAGE_ROLES": "Gérer les rôles", + "MANAGE_CHANNELS": "Gérer les salons", + "KICK_MEMBERS": "Expulser des membres", + "BAN_MEMBERS": "Bannir des membres", + "CREATE_INSTANT_INVITE": "Créer une invitation", + "CHANGE_NICKNAME": "Changer le pseudo", + "MANAGE_NICKNAMES": "Gérer les pseudos", + "MANAGE_EMOJIS": "Gérer les émojis", + "MANAGE_WEBHOOKS": "Gérer les webhooks", + "VIEW_CHANNEL": "Lire les messages", + "SEND_MESSAGES": "Envoyer des messages", + "SEND_TTS_MESSAGES": "Envoyer des messages TTS", + "MANAGE_MESSAGES": "Gérer les messages", + "EMBED_LINKS": "Intégrer des liens", + "ATTACH_FILES": "Joindre des fichiers", + "READ_MESSAGE_HISTORY": "Voir les anciens messages", + "MENTION_EVERYONE": "Mentionner tout le monde", + "USE_EXTERNAL_EMOJIS": "Utiliser des émojis externes", + "ADD_REACTIONS": "Ajouter des réactions", + "CONNECT": "Se connecter", + "SPEAK": "Parler", + "STREAM": "Vidéo", + "MUTE_MEMBERS": "Couper le micro de membres", + "DEAFEN_MEMBERS": "Mettre en sourdine des membres", + "MOVE_MEMBERS": "Déplacer des membres", + "USE_VAD": "Utiliser la détection d’activité vocale", + "PRIORITY_SPEAKER": "Voix prioritaire", + "VIEW_GUILD_INSIGHTS": "Voir les analyses de serveur" +} diff --git a/src/languages/fr-FR/promptList.json b/src/languages/fr-FR/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/resolvers.json b/src/languages/fr-FR/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/fr-FR/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/fr-FR/selfModeration.json b/src/languages/fr-FR/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/serializers.json b/src/languages/fr-FR/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/fr-FR/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/fr-FR/settings.json b/src/languages/fr-FR/settings.json new file mode 100644 index 00000000000..83498325963 --- /dev/null +++ b/src/languages/fr-FR/settings.json @@ -0,0 +1,21 @@ +{ + "channelsAnnouncements": "Le canal pour les annonces. À côté de la clé `roles.subscriber`, ceci est requis pour la commande announce.", + "channelsFarewell": "Le canal sur lequel je vais faire des adieux. Il faut activer les évènements et configurer les messages dans d'autres catégories.", + "channelsGreeting": "Le canal sur lequel je vais faire de petits coucous aux nouveaux membres. Il faut activer les évènements et configurer les messages dans d'autres catégories.", + "channelsIgnoreAll": "Les canaux que je devrais ignorer pour tous les types de logging.", + "channelsIgnoreMessageDelete": "Les canaux que je devrais ignorer quand les messages sont supprimés.", + "channelsIgnoreMessageEdit": "Les canaux que je devrais ignorer quand les messages sont modifiés.", + "channelsIgnoreReactionAdd": "Les canaux que je devrais ignorer quand des réactions sont ajoutées aux messages.", + "channelsImageLogs": "Le canal sur lequel je vais envoyer toutes les images que je vois.", + "channelsMemberLogs": "Le canaux pour les logs des membres. Il faut activer l'évènement `events.memberAdd` pour les nouveaux membres et `events.memberRemove` pour ceux qui ont quitté le serveur.", + "channelsMessageLogs": "Le canal pour les logs des messages SFW. Il faut activer l'évènement `events.messageDelete` pour les messages supprimés et `events.messageEdit` pour les messages modifiés.", + "channelsModerationLogs": "Le canal pour les logs de modération. Une fois configuré, je vais poster des entrées de modération public sur ce canal. Si vous avez activé l'évènement `events.banRemove`, je vais aussi poster des entrées anonymes.", + "channelsNsfwMessageLogs": "Le canal pour les logs des messages NSFW; cette option est la même que `channelsMessageLogs` sauf pour les messages NSFW.", + "channelsPruneLogs": "Le canal pour les logs des messages élagués ; cette option est la même que `channelsMessageLogs` sauf pour les annonces des messages élagués.", + "channelsReactionLogs": "Le canal pour les logs des réactions ; cette option est la même que `channelsMessageLogs` sauf pour les réactions ajoutées aux messages. Si vous voulez que j'ignore les Twemoji (les émojis par défauts), vous pouvez désactiver `events.twemoji-reactions`.", + "channelsRoles": "Le canal pour les rôles de réaction ; ajouter une réaction vous donnera un rôle configuré.", + "channelsSpam": "Le canal vers lequel je devrais rediriger les utilisateurs quand ils utilisent des commandes que je considère comme spammy.", + "dashboardOnlyKey": "Cette clé ne peut être configurée que via [le tableau de bord web](https://skyra.pw)", + "disabledChannels": "La liste des canaux où les commandes sont désactivées ; par exemple, ajouter le canal general va interdire l'utilisation des commandes là. Les modérateurs ne sont pas soumis à cette restriction.", + "disabledCommands": "Les commandes désactivées. Les commandes de base ne peuvent pas être désactivées et les modérateurs peuvent encore les utiliser. Les noms des commandes doivent être en minuscule." +} diff --git a/src/languages/fr-FR/system.json b/src/languages/fr-FR/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/fr-FR/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/hi-IN/arguments/range.json b/src/languages/hi-IN/arguments/range.json new file mode 100644 index 00000000000..e305248e6f5 --- /dev/null +++ b/src/languages/hi-IN/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} एक संख्या या सीमा होनी चाहिए।", + "max_plural": "{{name}} यह ज्यादा से ज्यादा {{maximum}} अंको के सीमा तक अंक स्वीकर करते है", + "max": "{{name}} यह ज्यादा से ज्यादा {{maximum}} अंको के सीमा तक स्वीकर करते है" +} diff --git a/src/languages/hi-IN/commands/admin.json b/src/languages/hi-IN/commands/admin.json new file mode 100644 index 00000000000..cb43f5d2d1b --- /dev/null +++ b/src/languages/hi-IN/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "आपको एक कुंजी देनी होगी।", + "confNoValue": "आपको एक मूल्य देना होगा।", + "confGuarded": "{{name, toTitleCase}} अक्षम नहीं हो सकता", + "confUpdated": "{{key}} की सफलता पूर्वक अपडेट हो चुकी है।{{response}}", + "confKeyNotArray": "यह कुंजी अथवा की किसी भी सरणी का प्रकार नहीं है। इसके बजाय 'reset' कार्य का उपयोग करे।", + "confGetNoExt": "{{key}} यह कुंजी मौजूद नहीं है।", + "confGet": "{{key}} इस कुंजी का मूल्य {{value}} के बराबर है।", + "confReset": "{{key}} कुंजी का मूल्य {{value}} के बराबर स्थापित किया गया है।", + "confNochange": "{{key}} कुंजी का मूल्य पहले से दिए गए मूल्य के अनुसार है।", + "confServerDescription": "सर्वर सेटिंग्स के अनुसार निश्चित करे।", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**सर्वर सेटिंग्स {{key}}**\n{{list}}", + "confUserDescription": "यूजर सेटिंग्स के अनुसार निश्चित करे।", + "confDashboardOnlyKey": "{{key}} केवल वेब डैशबोर्ड () माध्यम से ही इसे रूप दिया जा सकता हैं।", + "confUser": "**यूजर सेटिंग्स {{key}}**\n{{list}}", + "confSettingNotSet": "निर्धारित नहीं है", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "विविध किरदार संच का प्रबंध करे।", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "जोड़े", + "एक नया किरदार संच बनाए अथवा मौजूदा किसी संच में किरदार को जोड़े।" + ], + [ + "हटाएं", + "मौजूदा किरदार संच में से कोई एक किरदार हटाएं।" + ], + [ + "पुन: विस्थापन", + "किसी एक किरदार संच में से सभी किरदार हटाए, अथवा निश्चित ना होने पर, सभी किरदार संच।" + ], + [ + "सूची", + "सभी भूमिकाओं को सूचीबद्ध करता है।" + ], + [ + "स्वत:", + "किसी एक किरदार संच को जोड़ता या फिर हटता है।" + ] + ], + "examples": [ + "अमेरिका विभाग को जोड़ता है", + "आफ्रीका अमेरिका आशिया यूरोप विभाग को जोड़ता है।", + "अमेरिका विभाग को हटता है।", + "मूल स्थिति पर लाना", + "विभाग को पुन: स्थापित करे।", + "सूची", + "अमेरिका विभाग", + "आफ्रीका अमेरिका आशिया यूरोप विभाग" + ], + "reminder": "यह आदेश विभिन्न किरदार को जोड़ और/अथवा हटा साकता है।" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "आप {{name}} विशिष्ट संच को नहीं निकाल सकते क्योंकि यह संच मौजूद नहीं है।", + "rolesetRemoved": "", + "rolesetResetEmpty": "{{REDCROSS}} इस समूह में कोई किरदार संच परिभाषित नहीं है।", + "rolesetResetAll": "{{GREENTICK}} सभी किरदार सफलापूर्वक हटाएं गए है।", + "rolesetResetNotExists": "{{REDCROSS}} {{name}} यह किरदार संच इस सर्वर मे मौजूद नहीं है।", + "rolesetResetGroup": "{{GREENTICK}} सफला पूर्वक {{name}} किरदार संच हटाया गया है।", + "rolesetUpdated": "{{name}} इस किरदार को सफलता पूर्वक अद्यतन किया गया है।", + "rolesetNoRolesets": "आपके पास कोई भी किरदार संच नहीं है।", + "confMenuNopermissions": "इस मेनू को चलाने के लिए मुझे {{ADD_REACTIONS, permissions}} और {{MANAGE_MESSAGES, permissions}} अनुमति कि जरूरत है।", + "confMenuRenderAtFolder": "अभी फिलाल {{path}} में है।", + "confMenuRenderAtPiece": "अभी फिलाल ⚙️ {{path}} में है।", + "confMenuRenderNokeys": "इस फोल्डर के लिए कोई भी परिभाषित की नहीं है।", + "confMenuRenderSelect": "कृपया कोई भी प्रविष्टियो का नाम लिखे।", + "confMenuRenderTctitle": "टेक्स्ट s:", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "वर्तमान मूल्य: **``{{value}}``**", + "confMenuRenderBack": "पिछे जाने के लिए ◀ दबाए।", + "confMenuInvalidKey": "अवैध की, कृपया दिए गए पर्याय से पुन: प्रयास करें।", + "confMenuInvalidAction": "अवैध कृती, कृपया दिए गए पर्याय से पुन: प्रयास करें।", + "confMenuSaved": "सफलतापूर्वक सभी बदलाव किए जा चुके है।", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hi-IN/commands/animal.json b/src/languages/hi-IN/commands/animal.json new file mode 100644 index 00000000000..2d3a896aab8 --- /dev/null +++ b/src/languages/hi-IN/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "मैं आपको एक रहस्यमय बिल्ली तथ्य बताता हूं।", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "बिल्लियों के तथ्य", + "dogDescription": "प्यारे कुत्ते! ❤", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hi-IN/commands/anime.json b/src/languages/hi-IN/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/hi-IN/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/hi-IN/commands/announcement.json b/src/languages/hi-IN/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/hi-IN/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/hi-IN/commands/developer.json b/src/languages/hi-IN/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/hi-IN/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/hi-IN/commands/fun.json b/src/languages/hi-IN/commands/fun.json new file mode 100644 index 00000000000..3993253cd7a --- /dev/null +++ b/src/languages/hi-IN/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "स्कायरा आपके प्रश्न का सही उत्तर खोजने के लिए पवित्र ग्रंथ 'बाइबल' पढ़ेगी |", + "8ballExtended": { + "extendedHelp": "यह आदेश आपके प्रश्न के प्रकारानुसार एक यादृच्छिक प्रश्न प्रदान करता है | सावधान रहें, यह जरूरत से ज्यादा समझदार हो सकता है |", + "explainedUsage": [ + [ + "प्रश्न", + "पवित्र प्रश्न" + ] + ], + "examples": [ + "मुर्गी ने सड़क क्यों पार की?" + ] + }, + "choiceDescription": "अक्कड़ बक्कड़ बम्बे बो, अस्सी नब्बे पूरे सौ...", + "choiceExtended": { + "extendedHelp": "मुझे अपने अस्तित्व से जुड़ा एक संदेह है... क्या मुझे बर्तनों को धोना चाहिए या उन्हें खिड़की से बाहर फेंक देना चाहिए? ख़ोज जारी है | मुझे अल्पविराम से अलग की हुई चीज़ों की एक सूची दीजिये और मैं उनमें से एक चुनुंगी | आगे जो भी होगा उसकी जिम्मेदारी मेरी नहीं होगी |", + "explainedUsage": [ + [ + "शब्द", + "अल्पविराम द्वारा अलग-अलग किये शब्दों की एक सूची |" + ] + ], + "examples": [ + "बर्तनों को धोना चाहिए, बर्तनों को खिड़की से बाहर फेंक देना चाहिए", + "बिल्ली, कुत्ता" + ] + }, + "changemymindDescription": "स्कायरा सबसे अच्छी है, मेरी इस सोच को बदलकर दिखाओ |", + "changemymindExtended": { + "extendedHelp": "मुझे अभी भी लगता है कि मैं सबसे अच्छी हूँ, मेरी इस सोच को बदलकर दिखाओ | मैं आपके अवतार से कागज़ पर कुछ शब्दों के साथ एक तस्वीर बनाउंगी |", + "explainedUsage": [ + [ + "वाक्यांश", + "जो वाक्यांश आपको चाहिए |" + ] + ], + "examples": [ + "स्कायरा इस सर्वर की सर्वश्रेष्ठ बौट है |" + ] + }, + "diceDescription": "पासे को डी२० रूप में भेजें |", + "diceExtended": { + "extendedHelp": "इस आदेश के काम करने का तरीका सरल है | आपके पास एक पासा है, आप उसे __x__ बार फेंकते है, और पासा __y__ अंक दे सकता है | अतिरिक्त निर्देश के बिना, यह आदेश एक बार वह पासा फेंकता है जिस पर ६ अंक हैं | पासा कितनी बार फेंका जाएगा इसे आप अपनी इच्छानुसार बदल सकते हैं (ऐसा करने पर यह १ और पासे-पर-जितने-अंक-हैं उनके बीच के किसी अंक बार फेंका जाएगा) | उदाहरण के तौर पर, ६ अंकों वाले पासे को ३ बार फेंकने पर ३ अंक एक अनियमित क्रम में मिलेंगे, जो कि १ से ६ के बीच में होंगे | अगर वह अंक ३, १ और ६ हैं, तब यह आदेश १० देगा |", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "पोकेमौन कार्यक्रम की \"एस्केप रस्सी\" का उपयोग करें |", + "escaperopeExtended": { + "extendedHelp": "**स्कायरा** ने **भागने-वाली-रस्सी** का उपयोग किया |" + }, + "howToFlirtDescription": "कप्तान अमरीका, आपको फ़्लर्ट (इश्कबाजी) करना नहीं आता है |", + "howToFlirtExtended": { + "extendedHelp": "मैं आपको दिखाती हूँ की प्रभावशाली रूप में किसी के साथ इश्कबाजी कैसे करते हैं, टोनी स्टार्क के अंदाज़ में कप्तान अमरीका के साथ | मुझे पूरा भरोसा है की यह काम करेगा |", + "explainedUsage": [ + [ + "उपयोगकर्ता", + "जिस व्यक्ति के साथ इश्कबाजी करनी है |" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "प्रेम-मापक, इंटरनेट पर !", + "loveExtended": { + "extendedHelp": "सुनिए ! क्या आप प्रेम-मापक का उपयोग करना चाहेंगे? मैं जानती हूँ की यह हंसी-मज़ाक के लिए है, किन्तु कई लोगों को बहुत पसंद है | शर्माने की जरूरत नहीं है, एक बार कोशिश कर के देखिये !", + "explainedUsage": [ + [ + "व्यक्ति", + "जिस व्यक्ति का मूल्यांकन करना है |" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "इस चैनल में भेजे गए संदेशों से एक 'मार्कोव चैन' उत्पन्न कीजिये |", + "markovExtended": { + "extendedHelp": "एक मार्कोव चैन एक स्तोका... क्या? ठीक है, कुछ कुछ एक सिद्धांत जैसा है जो की संभावनाओं से जुड़ा है और इसे एक रुसी गणितज्ञ बनाया था, अधिक जानकारी के लिए विकिपीडिया देखें | **सीधे शब्दों में**: मैं इस चैनल में भेजे गए संदेशों से एक नया सन्देश बनाउंगी |" + }, + "norrisDescription": "'चक नौर्रिस' के चुटकुले पढ़ते हुए अपने दिन का आनंद लें |", + "norrisExtended": { + "extendedHelp": "क्या आप जानते हैं कि चक नौर्रिस कभी गलत नंबर पर कॉल **नहीं** करता है, आप **गलत** फ़ोन उठाते हैं? वाह, सर चकरा गया | उन्होंने एक दूध का कनस्तर फेंका था और उससे 'मिल्की वे' आकाशगंगा बनी थी | यह आदेश chucknorris.io से तथ्य लाता है (यह मत मानिए की ये झूठ है, उनके सामने तो कदापि नहीं) ताकि आप इन्हें पढ़ सकें |" + }, + "rateDescription": "बौट्स को राय देने व लोगों का मूल्यांकन करने कि अनुमति दें |", + "rateExtended": { + "extendedHelp": "मेरे एक बौट होने का यह मतलब नहीं है कि मैं आपका सही मूल्यांकन नहीं कर सकती | यह और सरल हो जाएगा अगर मैं एक यादृच्छिक संख्या देने वाले यंत्र का प्रयोग करूं | ठीक ठीक, यह सही नहीं है, लेकिन... मैं आपको एक 💯 भी दे सकती हूँ |", + "explainedUsage": [ + [ + "व्यक्ति", + "जिस व्यक्ति का मूल्यांकन करना है |" + ] + ], + "examples": [ + "", + "मुझे" + ] + }, + "shindeiruDescription": "ओमाए वा मोउ शिन्देईरु |", + "shindeiruExtended": { + "extendedHelp": "\"तुम पहले ही मर चुके हो\" जापानी: お前はもう死んでいる; ओमाए वा मोउ शिन्देईरु, जापानी माँगा और एनीमे 'फिस्ट ऑफ़ द नॉर्थ स्टार' का एक कथन है | यह आदेश एक हास्य-पत्रिका से लिया एक हिस्सा दिखाता है, जिसमें पात्र के ऐसा कहने पर उसका प्रतिद्वंदी जवाब में \"नानी?\" (क्या?) कहता है |" + }, + "xkcdDescription": "XKCD से हास्य-पत्रिकाएँ पढ़ें |", + "xkcdExtended": { + "extendedHelp": "**xkcd** एक गणित, विज्ञान, व्यंग तथा भाषाओं की हास्य-सामग्री का एक संग्रह है | अगर आप और कुछ नहीं लिखते हैं, तो मैं कोई भी एक हास्य-पत्र ले आउंगी | अगर आप मुझे एक संख्या देते हैं, तो मैं उस संख्या की पत्रिका लाऊंगी | लेकिन अगर आप मुझे नाम/वाक्यांश/विषय देते हैं, तो मैं उससे मेल-खाती पत्रिका प्रस्तुत करूंगी | उदाहरण के तौर पर, `Skyra, xkcd Curiosity` लिखने पर १०९१ संख्या की पत्रिका दिखाई जायेगी |", + "explainedUsage": [ + [ + "निर्देश", + "हास्य-पत्रिका की संख्या अथवा एक नाम जो ढूँढा जा सके |" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "कोई भी एक यमक दिखाया जाएगा |", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "सहायक विवरण? हम ऐसी चीज़ें यहाँ नहीं करते", + "wakandaExtended": { + "extendedHelp": "एक तस्वीर बनायी जायेगी [हम यहाँ ये नहीं करते वाला मजाक](https://knowyourmeme.com/memes/we-dont-do-that-here) उपयोगकर्ता की तरफ से |" + }, + "8ballOutput": "🎱प्रश्नकर्ता {{author}}: *{{question}}*\n{{response}}", + "8ballQuestions": { + "When": "जब", + "What": "क्या", + "HowMuch": "कितना", + "HowMany": "कितने", + "Why": "क्यों", + "Who": "कौन" + }, + "8ballWhen": [ + "जल्द ही™", + "शायद कल |", + "शायद अगले साल...", + "अभी", + "कुछ महीनों में |" + ], + "8ballWhat": [ + "एक हवाई जहाज |", + "क्या? फिर से पूछिए |", + "एक उपहार |", + "कुछ नहीं |", + "एक अंगूठी |", + "मुझे नहीं पता, शायद कुछ हो सकता है |" + ], + "8ballHowMuch": [ + "बहुत |", + "थोड़ा सा |", + "थोड़े से |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "कुछ नहीं |", + "", + "", + "२ या ३ लीटर, मुझे अच्छे से याद नहीं है |", + "अनंत", + "१०१० लीटर |" + ], + "8ballHowMany": [ + "बहुत |", + "थोड़ा सा |", + "थोड़े से |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "कुछ नहीं |", + "१० से १००० के बीच में |", + "", + "२ या ३, मुझे अच्छे से याद नहीं है |", + "अनंत", + "१०१०" + ], + "8ballWhy": [ + "शायद अनुवांशिक |", + "क्योंकि किसी ने ऐसा निर्णय लिया है |", + "शैतान के लिए, और क्या !", + "मुझे नहीं पता, शायद यह नियति है |", + "क्योंकि मैंने ऐसा कहा है |", + "मुझे नहीं पता।", + "इस सर्वर के मालिक से पूछो |", + "फिर से पूछिए |", + "दूसरी तरफ़ जाने के लिए |", + "ऐसा बाइबल में कहा गया है |" + ], + "8ballWho": [ + "एक मनुष्य |", + "एक रोबोट |", + "एक हवाई जहाज |", + "एक पक्षी |", + "एक कार्बन कि रचना |", + "शून्य और एक का समूह |", + "मुझे इस के बारे में कुछ नहीं पता, क्या यह कोई पदार्थ है ?", + "यह तर्कसंगत नहीं है |" + ], + "8ballElse": [ + "ऐसा होने की काफ़ी संभावना है |", + "नहीं |", + "बिल्कुल !", + "शायद |", + "मुझे ऐसा लगता है |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "यह बात अभी न बताना ही अच्छा होगा |", + "उस पर भरोसा मत करना |", + "अवश्य |", + "ऐसा ही निश्चित किया गया है |", + "मेरे गुप्तचरों के अनुसार ऐसा नहीं है |", + "ज्यादा उम्मीद नहीं है |", + "उम्मीद है |", + "पता नहीं चल पाया, फिर से प्रयास करें |", + "संकेतों के अनुसार ये सही है |", + "संदेहास्पद |", + "कोई संदेह नहीं है |", + "हाँ - बिल्कुल |", + "आप चाहें तो उसपर भरोसा कर सकते हैं |" + ], + "choiceOutput": "", + "choiceMissing": "कृपया कम-से-कम दो विकल्प अल्पविराम से अलग कर लिखें |", + "choiceDuplicates": "मैं एक ही शब्द दोबारा क्यों स्वीकार करूं ? \"{{words}}\" |", + "diceOutput": "आपने पासा फेंका ! अंक आया: **{{result}}**", + "diceRollsError": "पासा १ से १०२४ बार ही फेंका जा सकता है |", + "diceSidesError": "पासे पर ३ से १०२४ अंक हो सकते हैं |", + "escaperopeOutput": "**{{user}}** ने **भागने वाली रस्सी** का उपयोग किया |", + "loveLess45": "पुनः प्रयास करें...", + "loveLess75": "काफी बढ़िया !", + "loveLess100": "जोड़ी जम रही है !", + "love100": "ये जोड़ी अति-उत्तम है!", + "loveItself": "आप एक बहुत ही विशेष व्यक्ति हैं और आपको स्वयं से सबसे ज्यादा प्रेम करना चाहिए <3", + "loveResult": "परिणाम", + "markovTimer": "समय लगा {{timer}} |", + "markovNoMessages": "व्यक्ति ने कोई संदेश नहीं भेजा है अथवा चैनल में कोई संदेश नहीं है |", + "norrisOutput": "चक नौर्रिस", + "rateOutput": "**{{author}}**, मैं **{{userToRate}}** को देती हूँ **{{rate}}**/100 {{emoji}}", + "rateMyself": [ + "| मैं खुद से बहुत प्यार करती हूँ 😊", + "अपने आप को" + ], + "rateOwners": [ + "| मैं अपने डेवलपर्स से बहुत प्यार करती हूँ 🥰", + "मेरे डेवलपर्स" + ], + "punError": "कुछ गलत हो गया। कृपया बाद में पुनः प्रयास करें।", + "xkcdComics": "सिर्फ {{amount}} हास्यास्पद-पत्रिकाएँ हैं |", + "xkcdNotfound": "मैंने इस पत्रिका की खोज दूर-दूर तक की, परन्तु मुझे यह नहीं मिली, कृपया कुछ समय पश्चात पुनः प्रयास करें या दूसरी पत्रिका ढूँढें !" +} diff --git a/src/languages/hi-IN/commands/game.json b/src/languages/hi-IN/commands/game.json new file mode 100644 index 00000000000..ddda0995017 --- /dev/null +++ b/src/languages/hi-IN/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "किसी के साथ कनेक्ट-फोर खेलें |", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "यह कॉलम भर चुका है | कृपया फिर से प्रयास करें | ", + "c4GameDraw": "यह मुकाबला **बराबरी** का था |", + "c4GameNext": "बारी है: {{user}} (लाल) |", + "c4GameNextTurn0": "बारी है: {{user}} (नीला) |", + "c4GameWin": "{{user}} (लाल) की जीत हुई !", + "c4GameWinTurn0": "{{user}} (नीला) की जीत हुई !", + "c4Prompt": "प्रिय {{challengee}}}, {{{{challenger}} ने आपको कनेक्ट-फोर मुकाबले कि चुनौती दी है | उत्तर में **हाँ** लिखें चुनौती स्वीकार करने के लिए !", + "c4Start": "खेल शुरू किया जाए ! बारी है: **{{player}}** |", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "चित्त", + "पट्ट" + ], + "coinFlipDescription": "सिक्का उछालें !", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "चित्त ५०", + "पट्ट २००" + ] + }, + "coinFlipInvalidCoinname": "सुनिए, {{arg}} सिक्के का चेहरा नहीं है!", + "coinFlipLoseDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था |", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/hi-IN/commands/gameIntegration.json b/src/languages/hi-IN/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/hi-IN/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/hi-IN/commands/general.json b/src/languages/hi-IN/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/hi-IN/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/hi-IN/commands/giveaway.json b/src/languages/hi-IN/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/hi-IN/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/hi-IN/commands/google.json b/src/languages/hi-IN/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/hi-IN/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/hi-IN/commands/management.json b/src/languages/hi-IN/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/hi-IN/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/hi-IN/commands/misc.json b/src/languages/hi-IN/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/hi-IN/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/hi-IN/commands/moderation.json b/src/languages/hi-IN/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/hi-IN/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/hi-IN/commands/music.json b/src/languages/hi-IN/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/hi-IN/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/hi-IN/commands/pokemon.json b/src/languages/hi-IN/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/hi-IN/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/hi-IN/commands/social.json b/src/languages/hi-IN/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/hi-IN/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/hi-IN/commands/starboard.json b/src/languages/hi-IN/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/hi-IN/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/hi-IN/commands/suggestion.json b/src/languages/hi-IN/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/hi-IN/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/hi-IN/commands/system.json b/src/languages/hi-IN/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/hi-IN/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hi-IN/commands/tags.json b/src/languages/hi-IN/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/hi-IN/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/hi-IN/commands/tools.json b/src/languages/hi-IN/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/hi-IN/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/hi-IN/commands/twitch.json b/src/languages/hi-IN/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/hi-IN/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/hi-IN/commands/weeb.json b/src/languages/hi-IN/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/hi-IN/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/hi-IN/errors.json b/src/languages/hi-IN/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/events.json b/src/languages/hi-IN/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/fuzzySearch.json b/src/languages/hi-IN/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/giveaway.json b/src/languages/hi-IN/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/globals.json b/src/languages/hi-IN/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/humanLevels.json b/src/languages/hi-IN/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/inhibitors.json b/src/languages/hi-IN/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/klasa.json b/src/languages/hi-IN/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/hi-IN/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/hi-IN/moderation.json b/src/languages/hi-IN/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/moderationActions.json b/src/languages/hi-IN/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/hi-IN/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/hi-IN/monitors.json b/src/languages/hi-IN/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/musicManager.json b/src/languages/hi-IN/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/notifications.json b/src/languages/hi-IN/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/permissions.json b/src/languages/hi-IN/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/promptList.json b/src/languages/hi-IN/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/resolvers.json b/src/languages/hi-IN/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/hi-IN/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/hi-IN/selfModeration.json b/src/languages/hi-IN/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/serializers.json b/src/languages/hi-IN/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/settings.json b/src/languages/hi-IN/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hi-IN/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hi-IN/system.json b/src/languages/hi-IN/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/hi-IN/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/hin-IN/arguments/range.json b/src/languages/hin-IN/arguments/range.json new file mode 100644 index 00000000000..b5a9e6bf1ed --- /dev/null +++ b/src/languages/hin-IN/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} ek number ya phir a number ki sunkhya honi chahiye.", + "max_plural": "{{name}} yeh bade aakdo ki range leta hai\n{{maximum}}", + "max": "{{name}} yeh bade aakdo ki range leta hai\n{{maximum}}" +} diff --git a/src/languages/hin-IN/commands/admin.json b/src/languages/hin-IN/commands/admin.json new file mode 100644 index 00000000000..da61b5e7742 --- /dev/null +++ b/src/languages/hin-IN/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "Ek key provide karo", + "confNoValue": "Tumhe a value deni hai", + "confGuarded": "{{name, toTitleCase}} band nahi hona chahiye.", + "confUpdated": "{{key}} की सफलता पूर्वक अपडेट हो चुकी है।{{response}}", + "confKeyNotArray": "यह कुंजी अथवा की किसी भी सरणी का प्रकार नहीं है। इसके बजाय 'reset' कार्य का उपयोग करे।", + "confGetNoExt": "{{key}} यह कुंजी मौजूद नहीं है।", + "confGet": "{{key}} इस कुंजी का मूल्य {{value}} के बराबर है।", + "confReset": "{{key}} कुंजी का मूल्य {{value}} के बराबर स्थापित किया गया है।", + "confNochange": "{{key}} कुंजी का मूल्य पहले से दिए गए मूल्य के अनुसार है।", + "confServerDescription": "सर्वर सेटिंग्स के अनुसार निश्चित करे।", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**सर्वर सेटिंग्स {{key}}**\n{{list}}", + "confUserDescription": "यूजर सेटिंग्स के अनुसार निश्चित करे।", + "confDashboardOnlyKey": "{{key}} केवल वेब डैशबोर्ड () माध्यम से ही इसे रूप दिया जा सकता हैं।", + "confUser": "**यूजर सेटिंग्स {{key}}**\n{{list}}", + "confSettingNotSet": "निर्धारित नहीं है", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "विविध किरदार संच का प्रबंध करे।", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "जोड़े", + "एक नया किरदार संच बनाए अथवा मौजूदा किसी संच में किरदार को जोड़े।" + ], + [ + "हटाएं", + "मौजूदा किरदार संच में से कोई एक किरदार हटाएं।" + ], + [ + "पुन: विस्थापन", + "किसी एक किरदार संच में से सभी किरदार हटाए, अथवा निश्चित ना होने पर, सभी किरदार संच।" + ], + [ + "सूची", + "सभी भूमिकाओं को सूचीबद्ध करता है।" + ], + [ + "स्वत:", + "किसी एक किरदार संच को जोड़ता या फिर हटता है।" + ] + ], + "examples": [ + "अमेरिका विभाग को जोड़ता है", + "आफ्रीका अमेरिका आशिया यूरोप विभाग को जोड़ता है।", + "अमेरिका विभाग को हटता है।", + "मूल स्थिति पर लाना", + "विभाग को पुन: स्थापित करे।", + "सूची", + "अमेरिका विभाग", + "आफ्रीका अमेरिका आशिया यूरोप विभाग" + ], + "reminder": "यह आदेश विभिन्न किरदार को जोड़ और/अथवा हटा साकता है।" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "आप {{name}} विशिष्ट संच को नहीं निकाल सकते क्योंकि यह संच मौजूद नहीं है।", + "rolesetRemoved": "", + "rolesetResetEmpty": "{{REDCROSS}} इस समूह में कोई किरदार संच परिभाषित नहीं है।", + "rolesetResetAll": "{{GREENTICK}} सभी किरदार सफलापूर्वक हटाएं गए है।", + "rolesetResetNotExists": "{{REDCROSS}} {{name}} यह किरदार संच इस सर्वर मे मौजूद नहीं है।", + "rolesetResetGroup": "{{GREENTICK}} सफला पूर्वक {{name}} किरदार संच हटाया गया है।", + "rolesetUpdated": "{{name}} इस किरदार को सफलता पूर्वक अद्यतन किया गया है।", + "rolesetNoRolesets": "आपके पास कोई भी किरदार संच नहीं है।", + "confMenuNopermissions": "इस मेनू को चलाने के लिए मुझे {{ADD_REACTIONS, permissions}} और {{MANAGE_MESSAGES, permissions}} अनुमति कि जरूरत है।", + "confMenuRenderAtFolder": "अभी फिलाल {{path}} में है।", + "confMenuRenderAtPiece": "अभी फिलाल ⚙️ {{path}} में है।", + "confMenuRenderNokeys": "इस फोल्डर के लिए कोई भी परिभाषित की नहीं है।", + "confMenuRenderSelect": "कृपया कोई भी प्रविष्टियो का नाम लिखे।", + "confMenuRenderTctitle": "टेक्स्ट s:", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "वर्तमान मूल्य: **``{{value}}``**", + "confMenuRenderBack": "पिछे जाने के लिए ◀ दबाए।", + "confMenuInvalidKey": "अवैध की, कृपया दिए गए पर्याय से पुन: प्रयास करें।", + "confMenuInvalidAction": "अवैध कृती, कृपया दिए गए पर्याय से पुन: प्रयास करें।", + "confMenuSaved": "सफलतापूर्वक सभी बदलाव किए जा चुके है।", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hin-IN/commands/animal.json b/src/languages/hin-IN/commands/animal.json new file mode 100644 index 00000000000..2d3a896aab8 --- /dev/null +++ b/src/languages/hin-IN/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "मैं आपको एक रहस्यमय बिल्ली तथ्य बताता हूं।", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "बिल्लियों के तथ्य", + "dogDescription": "प्यारे कुत्ते! ❤", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hin-IN/commands/anime.json b/src/languages/hin-IN/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/hin-IN/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/hin-IN/commands/announcement.json b/src/languages/hin-IN/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/hin-IN/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/hin-IN/commands/developer.json b/src/languages/hin-IN/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/hin-IN/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/hin-IN/commands/fun.json b/src/languages/hin-IN/commands/fun.json new file mode 100644 index 00000000000..3993253cd7a --- /dev/null +++ b/src/languages/hin-IN/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "स्कायरा आपके प्रश्न का सही उत्तर खोजने के लिए पवित्र ग्रंथ 'बाइबल' पढ़ेगी |", + "8ballExtended": { + "extendedHelp": "यह आदेश आपके प्रश्न के प्रकारानुसार एक यादृच्छिक प्रश्न प्रदान करता है | सावधान रहें, यह जरूरत से ज्यादा समझदार हो सकता है |", + "explainedUsage": [ + [ + "प्रश्न", + "पवित्र प्रश्न" + ] + ], + "examples": [ + "मुर्गी ने सड़क क्यों पार की?" + ] + }, + "choiceDescription": "अक्कड़ बक्कड़ बम्बे बो, अस्सी नब्बे पूरे सौ...", + "choiceExtended": { + "extendedHelp": "मुझे अपने अस्तित्व से जुड़ा एक संदेह है... क्या मुझे बर्तनों को धोना चाहिए या उन्हें खिड़की से बाहर फेंक देना चाहिए? ख़ोज जारी है | मुझे अल्पविराम से अलग की हुई चीज़ों की एक सूची दीजिये और मैं उनमें से एक चुनुंगी | आगे जो भी होगा उसकी जिम्मेदारी मेरी नहीं होगी |", + "explainedUsage": [ + [ + "शब्द", + "अल्पविराम द्वारा अलग-अलग किये शब्दों की एक सूची |" + ] + ], + "examples": [ + "बर्तनों को धोना चाहिए, बर्तनों को खिड़की से बाहर फेंक देना चाहिए", + "बिल्ली, कुत्ता" + ] + }, + "changemymindDescription": "स्कायरा सबसे अच्छी है, मेरी इस सोच को बदलकर दिखाओ |", + "changemymindExtended": { + "extendedHelp": "मुझे अभी भी लगता है कि मैं सबसे अच्छी हूँ, मेरी इस सोच को बदलकर दिखाओ | मैं आपके अवतार से कागज़ पर कुछ शब्दों के साथ एक तस्वीर बनाउंगी |", + "explainedUsage": [ + [ + "वाक्यांश", + "जो वाक्यांश आपको चाहिए |" + ] + ], + "examples": [ + "स्कायरा इस सर्वर की सर्वश्रेष्ठ बौट है |" + ] + }, + "diceDescription": "पासे को डी२० रूप में भेजें |", + "diceExtended": { + "extendedHelp": "इस आदेश के काम करने का तरीका सरल है | आपके पास एक पासा है, आप उसे __x__ बार फेंकते है, और पासा __y__ अंक दे सकता है | अतिरिक्त निर्देश के बिना, यह आदेश एक बार वह पासा फेंकता है जिस पर ६ अंक हैं | पासा कितनी बार फेंका जाएगा इसे आप अपनी इच्छानुसार बदल सकते हैं (ऐसा करने पर यह १ और पासे-पर-जितने-अंक-हैं उनके बीच के किसी अंक बार फेंका जाएगा) | उदाहरण के तौर पर, ६ अंकों वाले पासे को ३ बार फेंकने पर ३ अंक एक अनियमित क्रम में मिलेंगे, जो कि १ से ६ के बीच में होंगे | अगर वह अंक ३, १ और ६ हैं, तब यह आदेश १० देगा |", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "पोकेमौन कार्यक्रम की \"एस्केप रस्सी\" का उपयोग करें |", + "escaperopeExtended": { + "extendedHelp": "**स्कायरा** ने **भागने-वाली-रस्सी** का उपयोग किया |" + }, + "howToFlirtDescription": "कप्तान अमरीका, आपको फ़्लर्ट (इश्कबाजी) करना नहीं आता है |", + "howToFlirtExtended": { + "extendedHelp": "मैं आपको दिखाती हूँ की प्रभावशाली रूप में किसी के साथ इश्कबाजी कैसे करते हैं, टोनी स्टार्क के अंदाज़ में कप्तान अमरीका के साथ | मुझे पूरा भरोसा है की यह काम करेगा |", + "explainedUsage": [ + [ + "उपयोगकर्ता", + "जिस व्यक्ति के साथ इश्कबाजी करनी है |" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "प्रेम-मापक, इंटरनेट पर !", + "loveExtended": { + "extendedHelp": "सुनिए ! क्या आप प्रेम-मापक का उपयोग करना चाहेंगे? मैं जानती हूँ की यह हंसी-मज़ाक के लिए है, किन्तु कई लोगों को बहुत पसंद है | शर्माने की जरूरत नहीं है, एक बार कोशिश कर के देखिये !", + "explainedUsage": [ + [ + "व्यक्ति", + "जिस व्यक्ति का मूल्यांकन करना है |" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "इस चैनल में भेजे गए संदेशों से एक 'मार्कोव चैन' उत्पन्न कीजिये |", + "markovExtended": { + "extendedHelp": "एक मार्कोव चैन एक स्तोका... क्या? ठीक है, कुछ कुछ एक सिद्धांत जैसा है जो की संभावनाओं से जुड़ा है और इसे एक रुसी गणितज्ञ बनाया था, अधिक जानकारी के लिए विकिपीडिया देखें | **सीधे शब्दों में**: मैं इस चैनल में भेजे गए संदेशों से एक नया सन्देश बनाउंगी |" + }, + "norrisDescription": "'चक नौर्रिस' के चुटकुले पढ़ते हुए अपने दिन का आनंद लें |", + "norrisExtended": { + "extendedHelp": "क्या आप जानते हैं कि चक नौर्रिस कभी गलत नंबर पर कॉल **नहीं** करता है, आप **गलत** फ़ोन उठाते हैं? वाह, सर चकरा गया | उन्होंने एक दूध का कनस्तर फेंका था और उससे 'मिल्की वे' आकाशगंगा बनी थी | यह आदेश chucknorris.io से तथ्य लाता है (यह मत मानिए की ये झूठ है, उनके सामने तो कदापि नहीं) ताकि आप इन्हें पढ़ सकें |" + }, + "rateDescription": "बौट्स को राय देने व लोगों का मूल्यांकन करने कि अनुमति दें |", + "rateExtended": { + "extendedHelp": "मेरे एक बौट होने का यह मतलब नहीं है कि मैं आपका सही मूल्यांकन नहीं कर सकती | यह और सरल हो जाएगा अगर मैं एक यादृच्छिक संख्या देने वाले यंत्र का प्रयोग करूं | ठीक ठीक, यह सही नहीं है, लेकिन... मैं आपको एक 💯 भी दे सकती हूँ |", + "explainedUsage": [ + [ + "व्यक्ति", + "जिस व्यक्ति का मूल्यांकन करना है |" + ] + ], + "examples": [ + "", + "मुझे" + ] + }, + "shindeiruDescription": "ओमाए वा मोउ शिन्देईरु |", + "shindeiruExtended": { + "extendedHelp": "\"तुम पहले ही मर चुके हो\" जापानी: お前はもう死んでいる; ओमाए वा मोउ शिन्देईरु, जापानी माँगा और एनीमे 'फिस्ट ऑफ़ द नॉर्थ स्टार' का एक कथन है | यह आदेश एक हास्य-पत्रिका से लिया एक हिस्सा दिखाता है, जिसमें पात्र के ऐसा कहने पर उसका प्रतिद्वंदी जवाब में \"नानी?\" (क्या?) कहता है |" + }, + "xkcdDescription": "XKCD से हास्य-पत्रिकाएँ पढ़ें |", + "xkcdExtended": { + "extendedHelp": "**xkcd** एक गणित, विज्ञान, व्यंग तथा भाषाओं की हास्य-सामग्री का एक संग्रह है | अगर आप और कुछ नहीं लिखते हैं, तो मैं कोई भी एक हास्य-पत्र ले आउंगी | अगर आप मुझे एक संख्या देते हैं, तो मैं उस संख्या की पत्रिका लाऊंगी | लेकिन अगर आप मुझे नाम/वाक्यांश/विषय देते हैं, तो मैं उससे मेल-खाती पत्रिका प्रस्तुत करूंगी | उदाहरण के तौर पर, `Skyra, xkcd Curiosity` लिखने पर १०९१ संख्या की पत्रिका दिखाई जायेगी |", + "explainedUsage": [ + [ + "निर्देश", + "हास्य-पत्रिका की संख्या अथवा एक नाम जो ढूँढा जा सके |" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "कोई भी एक यमक दिखाया जाएगा |", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "सहायक विवरण? हम ऐसी चीज़ें यहाँ नहीं करते", + "wakandaExtended": { + "extendedHelp": "एक तस्वीर बनायी जायेगी [हम यहाँ ये नहीं करते वाला मजाक](https://knowyourmeme.com/memes/we-dont-do-that-here) उपयोगकर्ता की तरफ से |" + }, + "8ballOutput": "🎱प्रश्नकर्ता {{author}}: *{{question}}*\n{{response}}", + "8ballQuestions": { + "When": "जब", + "What": "क्या", + "HowMuch": "कितना", + "HowMany": "कितने", + "Why": "क्यों", + "Who": "कौन" + }, + "8ballWhen": [ + "जल्द ही™", + "शायद कल |", + "शायद अगले साल...", + "अभी", + "कुछ महीनों में |" + ], + "8ballWhat": [ + "एक हवाई जहाज |", + "क्या? फिर से पूछिए |", + "एक उपहार |", + "कुछ नहीं |", + "एक अंगूठी |", + "मुझे नहीं पता, शायद कुछ हो सकता है |" + ], + "8ballHowMuch": [ + "बहुत |", + "थोड़ा सा |", + "थोड़े से |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "कुछ नहीं |", + "", + "", + "२ या ३ लीटर, मुझे अच्छे से याद नहीं है |", + "अनंत", + "१०१० लीटर |" + ], + "8ballHowMany": [ + "बहुत |", + "थोड़ा सा |", + "थोड़े से |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "कुछ नहीं |", + "१० से १००० के बीच में |", + "", + "२ या ३, मुझे अच्छे से याद नहीं है |", + "अनंत", + "१०१०" + ], + "8ballWhy": [ + "शायद अनुवांशिक |", + "क्योंकि किसी ने ऐसा निर्णय लिया है |", + "शैतान के लिए, और क्या !", + "मुझे नहीं पता, शायद यह नियति है |", + "क्योंकि मैंने ऐसा कहा है |", + "मुझे नहीं पता।", + "इस सर्वर के मालिक से पूछो |", + "फिर से पूछिए |", + "दूसरी तरफ़ जाने के लिए |", + "ऐसा बाइबल में कहा गया है |" + ], + "8ballWho": [ + "एक मनुष्य |", + "एक रोबोट |", + "एक हवाई जहाज |", + "एक पक्षी |", + "एक कार्बन कि रचना |", + "शून्य और एक का समूह |", + "मुझे इस के बारे में कुछ नहीं पता, क्या यह कोई पदार्थ है ?", + "यह तर्कसंगत नहीं है |" + ], + "8ballElse": [ + "ऐसा होने की काफ़ी संभावना है |", + "नहीं |", + "बिल्कुल !", + "शायद |", + "मुझे ऐसा लगता है |", + "कल पूछना |", + "मुझे नहीं पता, एक भौतिक शास्त्री से पूछो |", + "यह बात अभी न बताना ही अच्छा होगा |", + "उस पर भरोसा मत करना |", + "अवश्य |", + "ऐसा ही निश्चित किया गया है |", + "मेरे गुप्तचरों के अनुसार ऐसा नहीं है |", + "ज्यादा उम्मीद नहीं है |", + "उम्मीद है |", + "पता नहीं चल पाया, फिर से प्रयास करें |", + "संकेतों के अनुसार ये सही है |", + "संदेहास्पद |", + "कोई संदेह नहीं है |", + "हाँ - बिल्कुल |", + "आप चाहें तो उसपर भरोसा कर सकते हैं |" + ], + "choiceOutput": "", + "choiceMissing": "कृपया कम-से-कम दो विकल्प अल्पविराम से अलग कर लिखें |", + "choiceDuplicates": "मैं एक ही शब्द दोबारा क्यों स्वीकार करूं ? \"{{words}}\" |", + "diceOutput": "आपने पासा फेंका ! अंक आया: **{{result}}**", + "diceRollsError": "पासा १ से १०२४ बार ही फेंका जा सकता है |", + "diceSidesError": "पासे पर ३ से १०२४ अंक हो सकते हैं |", + "escaperopeOutput": "**{{user}}** ने **भागने वाली रस्सी** का उपयोग किया |", + "loveLess45": "पुनः प्रयास करें...", + "loveLess75": "काफी बढ़िया !", + "loveLess100": "जोड़ी जम रही है !", + "love100": "ये जोड़ी अति-उत्तम है!", + "loveItself": "आप एक बहुत ही विशेष व्यक्ति हैं और आपको स्वयं से सबसे ज्यादा प्रेम करना चाहिए <3", + "loveResult": "परिणाम", + "markovTimer": "समय लगा {{timer}} |", + "markovNoMessages": "व्यक्ति ने कोई संदेश नहीं भेजा है अथवा चैनल में कोई संदेश नहीं है |", + "norrisOutput": "चक नौर्रिस", + "rateOutput": "**{{author}}**, मैं **{{userToRate}}** को देती हूँ **{{rate}}**/100 {{emoji}}", + "rateMyself": [ + "| मैं खुद से बहुत प्यार करती हूँ 😊", + "अपने आप को" + ], + "rateOwners": [ + "| मैं अपने डेवलपर्स से बहुत प्यार करती हूँ 🥰", + "मेरे डेवलपर्स" + ], + "punError": "कुछ गलत हो गया। कृपया बाद में पुनः प्रयास करें।", + "xkcdComics": "सिर्फ {{amount}} हास्यास्पद-पत्रिकाएँ हैं |", + "xkcdNotfound": "मैंने इस पत्रिका की खोज दूर-दूर तक की, परन्तु मुझे यह नहीं मिली, कृपया कुछ समय पश्चात पुनः प्रयास करें या दूसरी पत्रिका ढूँढें !" +} diff --git a/src/languages/hin-IN/commands/game.json b/src/languages/hin-IN/commands/game.json new file mode 100644 index 00000000000..ddda0995017 --- /dev/null +++ b/src/languages/hin-IN/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "किसी के साथ कनेक्ट-फोर खेलें |", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "यह कॉलम भर चुका है | कृपया फिर से प्रयास करें | ", + "c4GameDraw": "यह मुकाबला **बराबरी** का था |", + "c4GameNext": "बारी है: {{user}} (लाल) |", + "c4GameNextTurn0": "बारी है: {{user}} (नीला) |", + "c4GameWin": "{{user}} (लाल) की जीत हुई !", + "c4GameWinTurn0": "{{user}} (नीला) की जीत हुई !", + "c4Prompt": "प्रिय {{challengee}}}, {{{{challenger}} ने आपको कनेक्ट-फोर मुकाबले कि चुनौती दी है | उत्तर में **हाँ** लिखें चुनौती स्वीकार करने के लिए !", + "c4Start": "खेल शुरू किया जाए ! बारी है: **{{player}}** |", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "चित्त", + "पट्ट" + ], + "coinFlipDescription": "सिक्का उछालें !", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "चित्त ५०", + "पट्ट २००" + ] + }, + "coinFlipInvalidCoinname": "सुनिए, {{arg}} सिक्के का चेहरा नहीं है!", + "coinFlipLoseDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था |", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/hin-IN/commands/gameIntegration.json b/src/languages/hin-IN/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/hin-IN/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/hin-IN/commands/general.json b/src/languages/hin-IN/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/hin-IN/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/hin-IN/commands/giveaway.json b/src/languages/hin-IN/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/hin-IN/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/hin-IN/commands/google.json b/src/languages/hin-IN/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/hin-IN/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/hin-IN/commands/management.json b/src/languages/hin-IN/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/hin-IN/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/hin-IN/commands/misc.json b/src/languages/hin-IN/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/hin-IN/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/hin-IN/commands/moderation.json b/src/languages/hin-IN/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/hin-IN/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/hin-IN/commands/music.json b/src/languages/hin-IN/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/hin-IN/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/hin-IN/commands/pokemon.json b/src/languages/hin-IN/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/hin-IN/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/hin-IN/commands/social.json b/src/languages/hin-IN/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/hin-IN/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/hin-IN/commands/starboard.json b/src/languages/hin-IN/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/hin-IN/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/hin-IN/commands/suggestion.json b/src/languages/hin-IN/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/hin-IN/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/hin-IN/commands/system.json b/src/languages/hin-IN/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/hin-IN/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/hin-IN/commands/tags.json b/src/languages/hin-IN/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/hin-IN/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/hin-IN/commands/tools.json b/src/languages/hin-IN/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/hin-IN/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/hin-IN/commands/twitch.json b/src/languages/hin-IN/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/hin-IN/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/hin-IN/commands/weeb.json b/src/languages/hin-IN/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/hin-IN/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/hin-IN/errors.json b/src/languages/hin-IN/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/events.json b/src/languages/hin-IN/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/fuzzySearch.json b/src/languages/hin-IN/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/giveaway.json b/src/languages/hin-IN/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/globals.json b/src/languages/hin-IN/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/humanLevels.json b/src/languages/hin-IN/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/inhibitors.json b/src/languages/hin-IN/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/klasa.json b/src/languages/hin-IN/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/hin-IN/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/hin-IN/moderation.json b/src/languages/hin-IN/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/moderationActions.json b/src/languages/hin-IN/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/hin-IN/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/hin-IN/monitors.json b/src/languages/hin-IN/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/musicManager.json b/src/languages/hin-IN/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/notifications.json b/src/languages/hin-IN/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/permissions.json b/src/languages/hin-IN/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/promptList.json b/src/languages/hin-IN/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/resolvers.json b/src/languages/hin-IN/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/hin-IN/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/hin-IN/selfModeration.json b/src/languages/hin-IN/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/serializers.json b/src/languages/hin-IN/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/settings.json b/src/languages/hin-IN/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/hin-IN/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/hin-IN/system.json b/src/languages/hin-IN/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/hin-IN/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/index.ts b/src/languages/index.ts new file mode 100644 index 00000000000..5bbccb689cd --- /dev/null +++ b/src/languages/index.ts @@ -0,0 +1,16 @@ +import { Handler } from '#lib/structures/i18n/Handler'; +import { ExtendedHandler as EnGbHandler } from './en-GB/constants'; +import { ExtendedHandler as EnUsHandler } from './en-US/constants'; +import { ExtendedHandler as EsEsHandler } from './es-ES/constants'; +import { ExtendedHandler as NlNlHandler } from './nl-NL/constants'; + +export const handlers = new Map([ + ['en-US', new EnUsHandler()], + ['en-GB', new EnGbHandler()], + ['es-ES', new EsEsHandler()], + ['nl-NL', new NlNlHandler()] +]); + +export function getHandler(name: string): Handler { + return handlers.get(name) ?? handlers.get('en-US')!; +} diff --git a/src/languages/nl-NL/arguments/range.json b/src/languages/nl-NL/arguments/range.json new file mode 100644 index 00000000000..227f4466aa8 --- /dev/null +++ b/src/languages/nl-NL/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} moet een getal of een bereik van getallen zijn.", + "max_plural": "{{name}} accepteert een bereik van maximaal {{maximum}} getallen", + "max": "{{name}} accepteert een bereik van maximaal {{maximum}} getal" +} diff --git a/src/languages/nl-NL/commands/admin.json b/src/languages/nl-NL/commands/admin.json new file mode 100644 index 00000000000..b60fe9cbc3c --- /dev/null +++ b/src/languages/nl-NL/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "Blokkeer gebruikers die mij misbruiken om in de toekomst mij verder te misbruiken, stoute, stoute mensen!" + }, + "blocklistResetSuccess": "{{GREENTICK}} Geblokkeerde gebruikers en gildes succesvol gereset", + "blocklistSaveSuccess": "{{GREENTICK}} Geblokkeerde gebruikers en gildes succesvol geüpdate", + "confNoKey": "Je moet een key opgeven", + "confNoValue": "Een waarde is vereist", + "confGuarded": "{{name, toTitleCase}} mag niet worden gedeactiveerd.", + "confUpdated": "**{{key}}** is succesvol bijgewerkt: `{{response}}`", + "confKeyNotArray": "De waarde is niet van type lijst. Gebruik in plaats daarvan de 'reset' actie.", + "confGetNoExt": "De sleutel **{{key}}** lijkt niet te bestaan.", + "confGet": "De waarde voor **{{key}}** is: `{{value}}`", + "confReset": "**{{key}}** is gereset naar: `{{value}}`", + "confNochange": "De waarde voor **{{key}}** is hetzelfde gebleven.", + "confServerDescription": "Definieer instellingen per server.", + "confServerExtended": { + "extendedHelp": "Maakt het mogelijk om Skyra te configureren in Discord, als een snel alternatief voor het web dashboard ()." + }, + "confServer": "**Server Instelling {{key}}**\n{{list}}", + "confUserDescription": "Definieer instellingen per gebruiker.", + "confDashboardOnlyKey": "`{{key}}` kan alleen worden geconfigureerd via het web dashboard ()", + "confUser": "**Gebruiker Instelling {{key}}**\n{{list}}", + "confSettingNotSet": "Niet ingesteld", + "heapSnapshotDescription": "Maakt een heapdump voor het vinden van geheugenlekken.", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "Beheer unieke rolesets.", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "toevoegen", + "Maak een nieuwe rol groep of voeg een bestaande toe." + ], + [ + "verwijderen", + "Een rol van een bestaande rol groep verwijderen." + ], + [ + "reset", + "Verwijder alle rollen van een rol groep of, wanneer niet gespecificeerd, alle bestaande rol groepen." + ], + [ + "lijst", + "Geeft alle rollen weer." + ], + [ + "automatisch", + "Voeg rol groep to of verwijder een rol groep." + ] + ], + "examples": [ + "add regions Amerika", + "add regions Afrika Amerika Azië Europa", + "remove regions Amerika", + "reset", + "reset regions", + "lijst", + "regions Amerika", + "regions Afrika Amerika Azië Europe" + ], + "reminder": "Dit commando kan meerdere rollen tegelijkertijd toevoegen en/of verwijderen." + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "Je hebt geen rolesets.", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/nl-NL/commands/animal.json b/src/languages/nl-NL/commands/animal.json new file mode 100644 index 00000000000..b3e3c87ef5b --- /dev/null +++ b/src/languages/nl-NL/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "Laat ik jou een mysterieus kattenfeit vertellen.", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/nl-NL/commands/anime.json b/src/languages/nl-NL/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/nl-NL/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/nl-NL/commands/announcement.json b/src/languages/nl-NL/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/nl-NL/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/nl-NL/commands/developer.json b/src/languages/nl-NL/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/nl-NL/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/nl-NL/commands/fun.json b/src/languages/nl-NL/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/nl-NL/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/nl-NL/commands/game.json b/src/languages/nl-NL/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/nl-NL/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/nl-NL/commands/gameIntegration.json b/src/languages/nl-NL/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/nl-NL/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/nl-NL/commands/general.json b/src/languages/nl-NL/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/nl-NL/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/nl-NL/commands/giveaway.json b/src/languages/nl-NL/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/nl-NL/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/nl-NL/commands/google.json b/src/languages/nl-NL/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/nl-NL/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/nl-NL/commands/management.json b/src/languages/nl-NL/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/nl-NL/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/nl-NL/commands/misc.json b/src/languages/nl-NL/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/nl-NL/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/nl-NL/commands/moderation.json b/src/languages/nl-NL/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/nl-NL/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/nl-NL/commands/music.json b/src/languages/nl-NL/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/nl-NL/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/nl-NL/commands/pokemon.json b/src/languages/nl-NL/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/nl-NL/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/nl-NL/commands/social.json b/src/languages/nl-NL/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/nl-NL/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/nl-NL/commands/starboard.json b/src/languages/nl-NL/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/nl-NL/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/nl-NL/commands/suggestion.json b/src/languages/nl-NL/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/nl-NL/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/nl-NL/commands/system.json b/src/languages/nl-NL/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/nl-NL/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/nl-NL/commands/tags.json b/src/languages/nl-NL/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/nl-NL/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/nl-NL/commands/tools.json b/src/languages/nl-NL/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/nl-NL/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/nl-NL/commands/twitch.json b/src/languages/nl-NL/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/nl-NL/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/nl-NL/commands/weeb.json b/src/languages/nl-NL/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/nl-NL/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/nl-NL/constants.ts b/src/languages/nl-NL/constants.ts new file mode 100644 index 00000000000..91a36085a10 --- /dev/null +++ b/src/languages/nl-NL/constants.ts @@ -0,0 +1,44 @@ +import { Handler } from '#lib/structures/i18n/Handler'; +import { TimeTypes } from '@sapphire/time-utilities'; + +export class ExtendedHandler extends Handler { + public constructor() { + super({ + name: 'nl-NL', + duration: { + [TimeTypes.Year]: { + 1: 'jaar', + DEFAULT: 'jaren' + }, + [TimeTypes.Month]: { + 1: 'maand', + DEFAULT: 'maanden' + }, + [TimeTypes.Week]: { + 1: 'week', + DEFAULT: 'weken' + }, + [TimeTypes.Day]: { + 1: 'dag', + DEFAULT: 'dagen' + }, + [TimeTypes.Hour]: { + 1: 'uur', + DEFAULT: 'uren' + }, + [TimeTypes.Minute]: { + 1: 'minuut', + DEFAULT: 'minuten' + }, + [TimeTypes.Second]: { + 1: 'seconde', + DEFAULT: 'seconden' + } + } + }); + } + + public ordinal(cardinal: number): string { + return `${cardinal}e`; + } +} diff --git a/src/languages/nl-NL/errors.json b/src/languages/nl-NL/errors.json new file mode 100644 index 00000000000..2390d476bb8 --- /dev/null +++ b/src/languages/nl-NL/errors.json @@ -0,0 +1,11 @@ +{ + "channelNotReadable": "Het spijt me, maar ik heb de permissies **{{VIEW_CHANNEL, permissions}}** en **{{READ_MESSAGE_HISTORY, permissions}} ** nodig", + "guildBansEmpty": "Er zijn geen verbanningen geregistreerd in deze server.", + "guildBansNotFound": "Ik heb geprobeerd en het is niet gelukt om deze gebruiker uit de bloklijst te vinden. Weet je zeker dat deze gebruiker geblokkeerd is?", + "guildMemberNotVoicechannel": "Ik kan deze actie niet uitvoeren op een lid dat niet verbonden is met een spraakkanaal.", + "guildWarnNotFound": "Het is me niet gelukt om die waarschuwing op te halen. De waarschuwing bestaat niet, het is geen waarschuwing, of hij is al teruggedraaid.", + "modlogTimed": "Deze moderatie log is al tijdelijk gezet. Deze verloopt in {{remaining, duration}}", + "unexpectedIssue": "Er is een onverwachte fout opgetreden! Deze opdracht wordt gestopt...", + "userNotExistent": "Deze gebruiker bestaat niet. Weet je zeker dat je een geldige gebruikers ID hebt gebruikt?", + "userNotInGuild": "Deze gebruiker is niet in deze server." +} diff --git a/src/languages/nl-NL/events.json b/src/languages/nl-NL/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/fuzzySearch.json b/src/languages/nl-NL/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/giveaway.json b/src/languages/nl-NL/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/globals.json b/src/languages/nl-NL/globals.json new file mode 100644 index 00000000000..804551ab973 --- /dev/null +++ b/src/languages/nl-NL/globals.json @@ -0,0 +1,19 @@ +{ + "and": "en", + "default": "{{key}} is nog niet gelokaliseerd voor nl-NL.", + "defaultLanguage": "Standaard taal", + "is": "is", + "no": "Nee", + "none": "Geen", + "or": "of", + "unknown": "onbekend", + "yes": "Ja", + "ordinalValue": "{{value, ordinal}}", + "durationValue": "{{value, duration}}", + "numberValue": "{{value, number}}", + "numberCompactValue": "{{value, numberCompact}}", + "timeDateValue": "{{value, timeDate}}", + "timeFullValue": "{{value, timeFull}}", + "andListValue": "{{value, andList}}", + "orListValue": "{{value, orList}}" +} diff --git a/src/languages/nl-NL/humanLevels.json b/src/languages/nl-NL/humanLevels.json new file mode 100644 index 00000000000..35d8655fee2 --- /dev/null +++ b/src/languages/nl-NL/humanLevels.json @@ -0,0 +1,7 @@ +{ + "NONE": "Geen", + "LOW": "Laag", + "MEDIUM": "Gemiddeld", + "HIGH": "Hoog", + "VERY_HIGH": "Hoogste" +} diff --git a/src/languages/nl-NL/inhibitors.json b/src/languages/nl-NL/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/klasa.json b/src/languages/nl-NL/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/nl-NL/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/nl-NL/moderation.json b/src/languages/nl-NL/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/moderationActions.json b/src/languages/nl-NL/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/nl-NL/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/nl-NL/monitors.json b/src/languages/nl-NL/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/musicManager.json b/src/languages/nl-NL/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/notifications.json b/src/languages/nl-NL/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/permissions.json b/src/languages/nl-NL/permissions.json new file mode 100644 index 00000000000..d0f36ed1528 --- /dev/null +++ b/src/languages/nl-NL/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Beheerder", + "VIEW_AUDIT_LOG": "Audit-logboek weergeven", + "MANAGE_GUILD": "Server beheren", + "MANAGE_ROLES": "Rollen beheren", + "MANAGE_CHANNELS": "Kanalen beheren", + "KICK_MEMBERS": "Leden verwijderen", + "BAN_MEMBERS": "Leden verbannen", + "CREATE_INSTANT_INVITE": "Uitnodiging creëren", + "CHANGE_NICKNAME": "Verander gebruikersnaam", + "MANAGE_NICKNAMES": "Gebruikersnamen beheren", + "MANAGE_EMOJIS": "Emojis beheren", + "MANAGE_WEBHOOKS": "Webhooks beheren", + "VIEW_CHANNEL": "Berichten verzenden", + "SEND_MESSAGES": "Berichten verzenden", + "SEND_TTS_MESSAGES": "Tekst-naar-spraakberichten verzenden", + "MANAGE_MESSAGES": "Berichten beheren", + "EMBED_LINKS": "Ingesloten links", + "ATTACH_FILES": "Bestanden bijvoegen", + "READ_MESSAGE_HISTORY": "Berichtgeschiedenis lezen", + "MENTION_EVERYONE": "Vemeld @everyone, @here en alle rollen", + "USE_EXTERNAL_EMOJIS": "Externe emoji gebruiken", + "ADD_REACTIONS": "Reacties toevoegen", + "CONNECT": "Verbinden", + "SPEAK": "Spreken", + "STREAM": "Video", + "MUTE_MEMBERS": "Microfoon van leden dempen", + "DEAFEN_MEMBERS": "Geluid van leden dempen", + "MOVE_MEMBERS": "Leden verplaatsen", + "USE_VAD": "Spraakactivatie gebruiken", + "PRIORITY_SPEAKER": "Prioriteitsspreker", + "VIEW_GUILD_INSIGHTS": "Serverinzichten bekijken" +} diff --git a/src/languages/nl-NL/promptList.json b/src/languages/nl-NL/promptList.json new file mode 100644 index 00000000000..8b9002f82ad --- /dev/null +++ b/src/languages/nl-NL/promptList.json @@ -0,0 +1,6 @@ +{ + "aborted": "De vraag is succesvol afgebroken.", + "attemptFailed": "Ongeldige invoer. Poging **{{attempt}}** van **{{maxAttempts}}**\n{{list}}", + "multipleChoice_plural": "Er zijn {{count}} resultaten. Kies een getal tussen 1 en {{count}}, of schrijf **`CANCEL`** om het bericht te annuleren.\n{{list}}", + "multipleChoice": "Er is {{count}} resultaat. Kies een getal tussen 1 en {{count}}, of schrijf **`CANCEL`** om het bericht te annuleren.\n{{list}}" +} diff --git a/src/languages/nl-NL/resolvers.json b/src/languages/nl-NL/resolvers.json new file mode 100644 index 00000000000..53e85e6df4e --- /dev/null +++ b/src/languages/nl-NL/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "Uitgeschakeld", + "boolEnabled": "Ingeschakeld", + "boolFalseOptions": [ + "onwaar", + "o", + "nee", + "n", + "uit", + "uitschakelen", + "uitgeschakeld", + "0", + "-" + ], + "boolTrueOptions": [ + "waar", + "t", + "ja", + "j", + "aan", + "inschakelen", + "ingeschakeld", + "1", + "+" + ], + "channelNotInGuild": "Het spijt me, maar dat commando kan alleen in een server worden uitgevoerd.", + "channelNotInGuildSubCommand": "{{REDCROSS}} Het spijt me, maar het subcommando `{{subcommand}}` voor het commando `{{command}}` kan alleen gebruikt worden in een server.", + "dateSuffix": " seconden", + "invalidBool": "{{name}} moet waar of onwaar zijn.", + "invalidChannel": "{{name}} moet een kanaal tag of een geldig kanaal id zijn.", + "invalidChannelName": "{{name}} moet een geldige kanaalnaam, -id of -tag zijn.", + "invalidCustom": "{{name}} moet een geldige {{type}} zijn.", + "invalidDate": "{{name}} moet een geldige datum zijn.", + "invalidDuration": "{{name}} moet een geldige tijdsduur zijn.", + "invalidEmoji": "{{name}} moet een server emoji tag of een geldig emoji id zijn.", + "invalidFloat": "{{name}} moet een geldig getal zijn.", + "invalidGuild": "{{name}} moet een geldig server ID zijn.", + "invalidInt": "{{name}} moet een geheel getal zijn.", + "invalidInvite": "{{name}} moet een geldige uitnodigingslink zijn.", + "invalidLiteral": "Je optie komt niet overeen met de enige mogelijkheid: {{name}}", + "invalidLanguage": "{{name}} moet een geldig en ondersteunde taal zijn.\n**Hint**: de volgende talen worden ondersteund: {{possibles, andList}}.\nOverigens kun je meer talen toevoegen, of de bestaande talen verbeteren via !", + "invalidMember": "{{name}} moet een vermelding of een geldig gebruikers-id zijn.", + "invalidMessage": "{{name}} moet een geldig bericht-id zijn.", + "invalidPiece": "{{name}} moet een geldige {{piece}} naam zijn.", + "invalidRegexMatch": "{{name}} moet het regex patroon \"{{pattern}} \" volgen.", + "invalidRole": "{{name}} moet een rol vermelding of rol-id zijn.", + "invalidRoleName": "{{name}} moet een geldige rolnaam, id of vermelding zijn.", + "invalidSnowflake": "{{name}} moet een geldige Discord snowflake zijn.", + "invalidStore": "{{store}} moet een geldige store zijn.", + "invalidString": "{{name}} moet een geldige tekst zijn.", + "invalidTime": "{{name}} moet een geldige tijdsduur of datum zijn.", + "invalidUrl": "{{name}} moet een geldige URL zijn.", + "invalidUser": "{{name}} moet een vermelding of een geldig gebruikers-id zijn.", + "invalidUsername": "{{name}} moet een geldige gebruikersnaam, id of vermeldings zijn.", + "invalidWager": "Het spijt me, maar {{bet}} {{SHINY}} is een ongeldig bedrag om te wedden. Je kunt met één van de {{validAmounts, orList}} wedden.", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/nl-NL/selfModeration.json b/src/languages/nl-NL/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/serializers.json b/src/languages/nl-NL/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/settings.json b/src/languages/nl-NL/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/nl-NL/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/nl-NL/system.json b/src/languages/nl-NL/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/nl-NL/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/ro-RO/arguments/range.json b/src/languages/ro-RO/arguments/range.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/arguments/range.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/commands/admin.json b/src/languages/ro-RO/commands/admin.json new file mode 100644 index 00000000000..3dbe173d770 --- /dev/null +++ b/src/languages/ro-RO/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "Trebuie să furnizați o cheie", + "confNoValue": "Trebuie să furnizați o valoare", + "confGuarded": "{{name, toTitleCase}} nu poate fi dezactivat(ă).", + "confUpdated": "S-a actualizat cu succes cheia **{{key}}**: `{{response}}`", + "confKeyNotArray": "Această cheie nu este o listă. Utilizați în schimb acțiunea \"reset\".", + "confGetNoExt": "Cheia **{{key}}** nu pare să existe.", + "confGet": "Valoarea cheii **{{key}}** este: `{{value}}`", + "confReset": "Cheia **{{key}}** a fost resetată la: `{{value}}`", + "confNochange": "Cheia **{{key}}** are deja această valoare.", + "confServerDescription": "", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "", + "confUserDescription": "", + "confDashboardOnlyKey": "", + "confUser": "", + "confSettingNotSet": "", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ro-RO/commands/animal.json b/src/languages/ro-RO/commands/animal.json new file mode 100644 index 00000000000..1853c9a0440 --- /dev/null +++ b/src/languages/ro-RO/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ro-RO/commands/anime.json b/src/languages/ro-RO/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/ro-RO/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/ro-RO/commands/announcement.json b/src/languages/ro-RO/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/ro-RO/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/ro-RO/commands/developer.json b/src/languages/ro-RO/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/ro-RO/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/ro-RO/commands/fun.json b/src/languages/ro-RO/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/ro-RO/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/ro-RO/commands/game.json b/src/languages/ro-RO/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/ro-RO/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/ro-RO/commands/gameIntegration.json b/src/languages/ro-RO/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/ro-RO/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/ro-RO/commands/general.json b/src/languages/ro-RO/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/ro-RO/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/ro-RO/commands/giveaway.json b/src/languages/ro-RO/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/ro-RO/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/ro-RO/commands/google.json b/src/languages/ro-RO/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/ro-RO/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/ro-RO/commands/management.json b/src/languages/ro-RO/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/ro-RO/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/ro-RO/commands/misc.json b/src/languages/ro-RO/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/ro-RO/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/ro-RO/commands/moderation.json b/src/languages/ro-RO/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/ro-RO/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/ro-RO/commands/music.json b/src/languages/ro-RO/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/ro-RO/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/ro-RO/commands/pokemon.json b/src/languages/ro-RO/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/ro-RO/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/ro-RO/commands/social.json b/src/languages/ro-RO/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/ro-RO/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/ro-RO/commands/starboard.json b/src/languages/ro-RO/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/ro-RO/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/ro-RO/commands/suggestion.json b/src/languages/ro-RO/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/ro-RO/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/ro-RO/commands/system.json b/src/languages/ro-RO/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/ro-RO/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ro-RO/commands/tags.json b/src/languages/ro-RO/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/ro-RO/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/ro-RO/commands/tools.json b/src/languages/ro-RO/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/ro-RO/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/ro-RO/commands/twitch.json b/src/languages/ro-RO/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/ro-RO/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/ro-RO/commands/weeb.json b/src/languages/ro-RO/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/ro-RO/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/ro-RO/errors.json b/src/languages/ro-RO/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/events.json b/src/languages/ro-RO/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/fuzzySearch.json b/src/languages/ro-RO/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/giveaway.json b/src/languages/ro-RO/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/globals.json b/src/languages/ro-RO/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/humanLevels.json b/src/languages/ro-RO/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/inhibitors.json b/src/languages/ro-RO/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/klasa.json b/src/languages/ro-RO/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/ro-RO/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/ro-RO/moderation.json b/src/languages/ro-RO/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/moderationActions.json b/src/languages/ro-RO/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/ro-RO/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/ro-RO/monitors.json b/src/languages/ro-RO/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/musicManager.json b/src/languages/ro-RO/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/notifications.json b/src/languages/ro-RO/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/permissions.json b/src/languages/ro-RO/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/promptList.json b/src/languages/ro-RO/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/resolvers.json b/src/languages/ro-RO/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/ro-RO/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/ro-RO/selfModeration.json b/src/languages/ro-RO/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/serializers.json b/src/languages/ro-RO/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/settings.json b/src/languages/ro-RO/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ro-RO/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ro-RO/system.json b/src/languages/ro-RO/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/ro-RO/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/ru-RU/arguments/range.json b/src/languages/ru-RU/arguments/range.json new file mode 100644 index 00000000000..504861a47f3 --- /dev/null +++ b/src/languages/ru-RU/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "Значение «{{name}} » должно быть числом или диапазоном чисел.", + "max_plural": "{{name}} принимает диапазон макс. {{maximum}} чисел", + "max": "{{name}} принимает диапазон максимум {{maximum}} чисел" +} diff --git a/src/languages/ru-RU/commands/admin.json b/src/languages/ru-RU/commands/admin.json new file mode 100644 index 00000000000..28f7d5852a7 --- /dev/null +++ b/src/languages/ru-RU/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "Вы должны предоставить ключ", + "confNoValue": "Вы должны указать значение", + "confGuarded": "{{name, toTitleCase}} не может быть отключен.", + "confUpdated": "Ключ **{{key}}**: `{{response}} ` успешно обновлен", + "confKeyNotArray": "Этот ключ не является типом массива. Используйте действие \"сбросить\" вместо этого.", + "confGetNoExt": "Кнопка **{{key}}** не существует.", + "confGet": "Значение ключа **{{key}}**: `{{value}}`", + "confReset": "Кнопка **{{key}}** была сброшена на: `{{value}}`", + "confNochange": "Значение **{{key}}** уже соответствует этому значению.", + "confServerDescription": "Определить параметры для сервера.", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**Настройки сервера {{key}}**\n{{list}}", + "confUserDescription": "Определить настройки для каждого пользователя.", + "confDashboardOnlyKey": "`{{key}}` можно настроить только через веб-панель инструментов ()", + "confUser": "**Пользовательские настройки {{key}}**\n{{list}}", + "confSettingNotSet": "Не задано", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "Управление уникальными наборами ролей.", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "добавить", + "Создать новый набор ролей или добавить роль к уже существующему." + ], + [ + "удалить", + "Удалить роль из существующего набора ролей." + ], + [ + "сброс", + "Удаляет все роли из набора ролей или, если не указано, все существующие наборы ролей." + ], + [ + "список", + "Список все наборов ролей." + ], + [ + "авто", + "Добавляет или удаляет набор ролей." + ] + ], + "examples": [ + "добавить регионы Америки", + "добавить регионы Африка Азия Европа", + "удалять регионы Америка", + "сброс", + "сбросить регионы", + "список", + "регионы Америки", + "регионы Африка Америка Азия Европа" + ], + "reminder": "Эта команда может добавлять и/или удалять несколько ролей одновременно." + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "Вы не можете удалить набор уникальных {{name}} ролей, так как он не существует.", + "rolesetRemoved": "", + "rolesetResetEmpty": "{{REDCROSS}} В этой группе отсутствуют роли.", + "rolesetResetAll": "{{GREENTICK}} успешно удалены все роли.", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ru-RU/commands/animal.json b/src/languages/ru-RU/commands/animal.json new file mode 100644 index 00000000000..ba1fe4d17dd --- /dev/null +++ b/src/languages/ru-RU/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "Факт о кошках", + "dogDescription": "Милые собачки! ❤", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "Позвольте мне показать вам изображение лисицы!", + "foxExtended": { + "extendedHelp": "Эта команда выдаёт случайное изображение с [randomfox.ca](https://randomfox.ca/)" + }, + "kittyDescription": "КОТЯТА!", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ru-RU/commands/anime.json b/src/languages/ru-RU/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/ru-RU/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/ru-RU/commands/announcement.json b/src/languages/ru-RU/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/ru-RU/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/ru-RU/commands/developer.json b/src/languages/ru-RU/commands/developer.json new file mode 100644 index 00000000000..efb0b275295 --- /dev/null +++ b/src/languages/ru-RU/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "❯ Автор: {{author}}", + "yarnEmbedDescriptionDateCreated": "❯ Дата создания: **{{dateCreated}}**", + "yarnEmbedDescriptionDateModified": "❯ Дата изменения: **{{dateModified}}**", + "yarnEmbedDescriptionDependenciesLabel": "__*Зависимости:*__", + "yarnEmbedDescriptionDependenciesNoDeps": "Нет зависимостей {{GREENTICK}}!", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "❯ Последняя версия: **{{latestVersionNumber}}**", + "yarnEmbedDescriptionLicense": "❯ Лицензия: **{{license}}**", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/ru-RU/commands/fun.json b/src/languages/ru-RU/commands/fun.json new file mode 100644 index 00000000000..7d7b78d37f7 --- /dev/null +++ b/src/languages/ru-RU/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "Может быть, завтра.", + "Может быть, в следующем году...", + "Прямо сейчас.", + "Через несколько месяцев." + ], + "8ballWhat": [ + "Самолёт.", + "", + "Подарок.", + "Ничего.", + "Кольцо.", + "" + ], + "8ballHowMuch": [ + "Много.", + "", + "", + "Спросите меня завтра.", + "", + "", + "", + "", + "2 или 3 литра, я не помню.", + "", + "1010 литров." + ], + "8ballHowMany": [ + "Много.", + "", + "", + "Спросите меня завтра.", + "", + "", + "", + "", + "2 или 3, я не помню.", + "", + "1010." + ], + "8ballWhy": [ + "", + "", + "", + "", + "Потому что я так сказала.", + "", + "Спросите владельца этого сервера.", + "", + "", + "Так сказано в Библии." + ], + "8ballWho": [ + "Человек.", + "Робот.", + "Самолёт.", + "Птица.", + "", + "", + "", + "Это нелогично." + ], + "8ballElse": [ + "Скорее всего.", + "", + "ДА!", + "Может быть.", + "", + "Спросите меня завтра.", + "", + "", + "Не рассчитывайте на это.", + "", + "", + "", + "", + "", + "", + "", + "Весьма сомнительно.", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "Результат", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/ru-RU/commands/game.json b/src/languages/ru-RU/commands/game.json new file mode 100644 index 00000000000..4e22332a6db --- /dev/null +++ b/src/languages/ru-RU/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "Подбросьте монетку!", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "Вы проиграли.", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "Вы подбросили монетку.", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "Вы выиграли!", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "{1} хватает лопату.", + "{1} хватает рюкзак и отступает.", + "", + "", + "{1} находит лук, несколько стрел и колчан.", + "", + "", + "", + "", + "", + "{1} собирает столько еды, сколько может.", + "{1} хватает меч.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} отпугивает {2} от Рога изобилия.", + "", + "", + "", + "", + "{1} бросает нож в голову {2T}.", + "", + "{1} застаёт {2T} врасплох и убивает его/её.", + "", + "", + "", + "", + "", + "", + "{1} обезглавливает {2T} мечом.", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} бросает нож в грудь {2T}.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} убивает {2T} топором.", + "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", + "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", + "{1T} атакует {2}, но {3} защищает его/её, убивая {1T}.", + "", + "{1} душит {2T} верёвкой.", + "", + "", + "", + "", + "{1} вонзает трезубец в спину {2T}.", + "", + "", + "", + "", + "", + "{1} убивает {2T} серпом.", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "{1} идёт на охоту.", + "", + "", + "", + "", + "{1} преследует {2}.", + "{1} рыбачит.", + "{1} маскируется в кустах.", + "", + "{1} делает деревянное копьё.", + "{1} обнаруживает пещеру.", + "", + "", + "{1} убегает от {2}.", + "{1} собирает фрукты с дерева.", + "{1} получает топор от неизвестного спонсора.", + "{1} получает чистую воду от неизвестного спонсора.", + "", + "", + "{1} ищет источник воды.", + "", + "", + "", + "", + "", + "", + "", + "{1} практикуется в стрельбе из лука.", + "{1} думает о доме.", + "", + "", + "", + "", + "{1} собирает цветы.", + "", + "", + "", + "", + "", + "{1} обнаруживает реку.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} застаёт {2T} врасплох и убивает его/её.", + "{1} бросает нож в голову {2T}.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} обезглавливает {2T} мечом.", + "{1T} умирает от инфекции.", + "", + "", + "", + "", + "", + "{1} тяжело ранит {2T} и оставляет его/её умирать.", + "", + "", + "", + "{1} бросает нож в грудь {2T}.", + "Ловушка {1} убивает {2T}.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1T} умирает от переохлаждения.", + "{1T} умирает от голода.", + "{1T} умирает от жажды.", + "{1} убивает {2T} топором.", + "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", + "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", + "", + "{1T} умирает от дизентерии.", + "", + "{1T} атакует {2}, но {3} защищает его/её, убивая {1T}.", + "", + "", + "", + "{1} душит {2T} верёвкой.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} вонзает трезубец в спину {2T}.", + "", + "", + "", + "", + "{1} убивает {2T} серпом.", + "{1}, {2}, {3}, {4} и {5} выслеживают и убивают {6T}.", + "{1}, {2}, {3} и {4} выслеживают и убивают {5T}.", + "{1}, {2} и {3} выслеживают и убивают {4T}.", + "{1} и {2} выслеживают и убивают {3T}.", + "{1} выслеживает и убивает {2T}.", + "", + "", + "", + "", + "{1} сталкивается с {2}, они решают объединиться.", + "{1} видит {2} сквозь деревья и планирует убить его/её.", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "{1} забирается на дерево, чтобы отдохнуть.", + "", + "{1} и {2} рассказывают друг другу истории о себе.", + "{1}, {2}, {3} и {4} спят по очереди.", + "{1}, {2} и {3} спят по очереди.", + "{1} и {2} спят по очереди.", + "", + "", + "", + "{1} бодрствует всю ночь.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1} думает о победе.", + "", + "{1} смотрит на ночное небо.", + "", + "", + "", + "{1}, {2}, {3}, {4} и {5} спят по очереди.", + "", + "{1} получает топор от неизвестного спонсора.", + "{1} получает чистую воду от неизвестного спонсора.", + "", + "", + "", + "", + "{1} думает о доме.", + "", + "", + "", + "", + "{1} и {2} держатся за руки.", + "", + "", + "", + "", + "", + "", + "{1} бросает нож в голову {2T}.", + "", + "", + "", + "", + "", + "{1T} не может справиться с обстоятельствами и совершает самоубийство.", + "", + "", + "", + "", + "{1} обезглавливает {2T} мечом.", + "{1T} умирает от инфекции.", + "", + "", + "", + "", + "", + "{1} тяжело ранит {2T} и оставляет его/её умирать.", + "", + "", + "", + "{1} бросает нож в грудь {2T}.", + "Ловушка {1} убивает {2T}.", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "{1T} умирает от переохлаждения.", + "{1T} умирает от голода.", + "{1T} умирает от жажды.", + "{1} убивает {2T} топором.", + "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", + "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", + "", + "{1T} умирает от дизентерии.", + "", + "", + "", + "", + "", + "{1} душит {2T} верёвкой.", + "", + "", + "", + "", + "", + "{1} вонзает в {2T} ветку дерева.", + "", + "", + "", + "", + "", + "{1} вонзает трезубец в спину {2T}.", + "", + "", + "", + "", + "{1} убивает {2T} серпом.", + "{1}, {2}, {3}, {4} и {5} выслеживают и убивают {6T}.", + "{1}, {2}, {3} и {4} выслеживают и убивают {5T}.", + "{1}, {2} и {3} выслеживают и убивают {4T}.", + "{1} и {2} выслеживают и убивают {3T}.", + "{1} выслеживает и убивает {2T}.", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "Удачи в следующий раз!", + "title": "Вы проиграли!" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "Вы выиграли!" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "Ночь {{game.turn}}", + "hungerGamesResultHeaderSun": "День {{game.turn}}", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "Вы проиграли", + "slotmachineCanvasTextWon": "Вы выиграли", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "Вы проиграли", + "wheelOfFortuneCanvasTextWon": "Вы выиграли", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/ru-RU/commands/gameIntegration.json b/src/languages/ru-RU/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/ru-RU/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/ru-RU/commands/general.json b/src/languages/ru-RU/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/ru-RU/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/ru-RU/commands/giveaway.json b/src/languages/ru-RU/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/ru-RU/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/ru-RU/commands/google.json b/src/languages/ru-RU/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/ru-RU/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/ru-RU/commands/management.json b/src/languages/ru-RU/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/ru-RU/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/ru-RU/commands/misc.json b/src/languages/ru-RU/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/ru-RU/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/ru-RU/commands/moderation.json b/src/languages/ru-RU/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/ru-RU/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/ru-RU/commands/music.json b/src/languages/ru-RU/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/ru-RU/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/ru-RU/commands/pokemon.json b/src/languages/ru-RU/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/ru-RU/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/ru-RU/commands/social.json b/src/languages/ru-RU/commands/social.json new file mode 100644 index 00000000000..6040c2daf22 --- /dev/null +++ b/src/languages/ru-RU/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "Вы ещё не купили этот баннер.", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "Простите... но... вы помните {{user}}? Он/а решил/а расстаться с вами 💔!", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "Вы уже состоите в браке с {{user}}, вы забыли об этом?", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "Цвет изменён на {{color}}", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "Проверьте, с кем вы состоите в браке.", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/ru-RU/commands/starboard.json b/src/languages/ru-RU/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/ru-RU/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/ru-RU/commands/suggestion.json b/src/languages/ru-RU/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/ru-RU/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/ru-RU/commands/system.json b/src/languages/ru-RU/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/ru-RU/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/ru-RU/commands/tags.json b/src/languages/ru-RU/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/ru-RU/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/ru-RU/commands/tools.json b/src/languages/ru-RU/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/ru-RU/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/ru-RU/commands/twitch.json b/src/languages/ru-RU/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/ru-RU/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/ru-RU/commands/weeb.json b/src/languages/ru-RU/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/ru-RU/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/ru-RU/errors.json b/src/languages/ru-RU/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/events.json b/src/languages/ru-RU/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/fuzzySearch.json b/src/languages/ru-RU/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/giveaway.json b/src/languages/ru-RU/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/globals.json b/src/languages/ru-RU/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/humanLevels.json b/src/languages/ru-RU/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/inhibitors.json b/src/languages/ru-RU/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/klasa.json b/src/languages/ru-RU/klasa.json new file mode 100644 index 00000000000..716081c6efa --- /dev/null +++ b/src/languages/ru-RU/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "На какую страницу вы хотели бы перейти?", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/ru-RU/moderation.json b/src/languages/ru-RU/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/moderationActions.json b/src/languages/ru-RU/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/ru-RU/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/ru-RU/monitors.json b/src/languages/ru-RU/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/musicManager.json b/src/languages/ru-RU/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/notifications.json b/src/languages/ru-RU/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/permissions.json b/src/languages/ru-RU/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/promptList.json b/src/languages/ru-RU/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/resolvers.json b/src/languages/ru-RU/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/ru-RU/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/ru-RU/selfModeration.json b/src/languages/ru-RU/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/serializers.json b/src/languages/ru-RU/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/settings.json b/src/languages/ru-RU/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/ru-RU/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/ru-RU/system.json b/src/languages/ru-RU/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/ru-RU/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/sl-SI/arguments/range.json b/src/languages/sl-SI/arguments/range.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/arguments/range.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/commands/admin.json b/src/languages/sl-SI/commands/admin.json new file mode 100644 index 00000000000..f4b2ba18e0c --- /dev/null +++ b/src/languages/sl-SI/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "", + "confNoValue": "", + "confGuarded": "", + "confUpdated": "", + "confKeyNotArray": "", + "confGetNoExt": "", + "confGet": "", + "confReset": "", + "confNochange": "", + "confServerDescription": "", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "", + "confUserDescription": "", + "confDashboardOnlyKey": "", + "confUser": "", + "confSettingNotSet": "", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/sl-SI/commands/animal.json b/src/languages/sl-SI/commands/animal.json new file mode 100644 index 00000000000..1853c9a0440 --- /dev/null +++ b/src/languages/sl-SI/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/sl-SI/commands/anime.json b/src/languages/sl-SI/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/sl-SI/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/sl-SI/commands/announcement.json b/src/languages/sl-SI/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/sl-SI/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/sl-SI/commands/developer.json b/src/languages/sl-SI/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/sl-SI/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/sl-SI/commands/fun.json b/src/languages/sl-SI/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/sl-SI/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/sl-SI/commands/game.json b/src/languages/sl-SI/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/sl-SI/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/sl-SI/commands/gameIntegration.json b/src/languages/sl-SI/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/sl-SI/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/sl-SI/commands/general.json b/src/languages/sl-SI/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/sl-SI/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/sl-SI/commands/giveaway.json b/src/languages/sl-SI/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/sl-SI/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/sl-SI/commands/google.json b/src/languages/sl-SI/commands/google.json new file mode 100644 index 00000000000..9fa9c384e19 --- /dev/null +++ b/src/languages/sl-SI/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "location", + "" + ] + ], + "examples": [ + "Antarktika", + "Arizona" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "Trenutni Čas", + "currentDate": "Trenutni Datum", + "country": "Država", + "gmsOffset": "GMT Odmik", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "Discord", + "Skyra" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "Discord", + "Skyra" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "query", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "city", + "" + ] + ], + "examples": [ + "Antarktika", + "Arizona" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/sl-SI/commands/management.json b/src/languages/sl-SI/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/sl-SI/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/sl-SI/commands/misc.json b/src/languages/sl-SI/commands/misc.json new file mode 100644 index 00000000000..31f9919199f --- /dev/null +++ b/src/languages/sl-SI/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "zelo nizko", + "nizko", + "srednje", + "visoko", + "zelo visoko", + "zelo visoko" + ], + "redditUserInvalidUser": "`{{user}}` ni veljavno Reddit uporabniško ime", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "uporabnik", + "" + ] + ], + "examples": [ + "Skyra" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "uporabnik", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/sl-SI/commands/moderation.json b/src/languages/sl-SI/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/sl-SI/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/sl-SI/commands/music.json b/src/languages/sl-SI/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/sl-SI/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/sl-SI/commands/pokemon.json b/src/languages/sl-SI/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/sl-SI/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/sl-SI/commands/social.json b/src/languages/sl-SI/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/sl-SI/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/sl-SI/commands/starboard.json b/src/languages/sl-SI/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/sl-SI/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/sl-SI/commands/suggestion.json b/src/languages/sl-SI/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/sl-SI/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/sl-SI/commands/system.json b/src/languages/sl-SI/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/sl-SI/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/sl-SI/commands/tags.json b/src/languages/sl-SI/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/sl-SI/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/sl-SI/commands/tools.json b/src/languages/sl-SI/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/sl-SI/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/sl-SI/commands/twitch.json b/src/languages/sl-SI/commands/twitch.json new file mode 100644 index 00000000000..7ad962e4cfc --- /dev/null +++ b/src/languages/sl-SI/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "Partner" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "Ustvarjeno ob:", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "Neznano", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "riotgames" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "add favna #twitch online --embed", + "add favna #twitch online %USER_NAME% je šel v živo | %TITLE%", + "remove kyranet #twitch online", + "reset kyranet", + "reset", + "show kyranet", + "show" + ] + } +} diff --git a/src/languages/sl-SI/commands/weeb.json b/src/languages/sl-SI/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/sl-SI/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/sl-SI/errors.json b/src/languages/sl-SI/errors.json new file mode 100644 index 00000000000..bb0ad3bde8c --- /dev/null +++ b/src/languages/sl-SI/errors.json @@ -0,0 +1,3 @@ +{ + "userNotInGuild": "Ta uporabnik ni v tem serverju." +} diff --git a/src/languages/sl-SI/events.json b/src/languages/sl-SI/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/fuzzySearch.json b/src/languages/sl-SI/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/giveaway.json b/src/languages/sl-SI/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/globals.json b/src/languages/sl-SI/globals.json new file mode 100644 index 00000000000..92becb2a0a2 --- /dev/null +++ b/src/languages/sl-SI/globals.json @@ -0,0 +1,19 @@ +{ + "and": "in", + "default": "{{key}} še ni lokaliziran za sl-SI.", + "defaultLanguage": "Prevzeti Jezik", + "is": "je", + "no": "Ne", + "none": "Nič", + "or": "ali", + "unknown": "neznano", + "yes": "Da", + "ordinalValue": "{{value, ordinal}}", + "durationValue": "{{value, duration}}", + "numberValue": "{{value, number}}", + "numberCompactValue": "{{value, numberCompact}}", + "timeDateValue": "{{value, timeDate}}", + "timeFullValue": "{{value, timeFull}}", + "andListValue": "{{value, andList}}", + "orListValue": "{{value, orList}}" +} diff --git a/src/languages/sl-SI/humanLevels.json b/src/languages/sl-SI/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/inhibitors.json b/src/languages/sl-SI/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/klasa.json b/src/languages/sl-SI/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/sl-SI/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/sl-SI/moderation.json b/src/languages/sl-SI/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/moderationActions.json b/src/languages/sl-SI/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/sl-SI/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/sl-SI/monitors.json b/src/languages/sl-SI/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/musicManager.json b/src/languages/sl-SI/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/notifications.json b/src/languages/sl-SI/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/permissions.json b/src/languages/sl-SI/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/promptList.json b/src/languages/sl-SI/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/resolvers.json b/src/languages/sl-SI/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/sl-SI/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/sl-SI/selfModeration.json b/src/languages/sl-SI/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/serializers.json b/src/languages/sl-SI/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/settings.json b/src/languages/sl-SI/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/sl-SI/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/sl-SI/system.json b/src/languages/sl-SI/system.json new file mode 100644 index 00000000000..0655d428b8b --- /dev/null +++ b/src/languages/sl-SI/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "Poslala rezultat v konzolo.", + "exceededLengthOutputConsoleWithTypeAndTime": "Poslala rezultat v konzolo.\n**Tip**:{{type}}\n{{time}}", + "exceededLengthOutputFile": "Poslala rezultat kot datoteko.", + "exceededLengthOutputFileWithTypeAndTime": "Poslala rezultat kot datoteko.\n**Tip**:{{type}}\n{{time}}", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "⚙ | ***Razložena uporaba***", + "possibleFormats": "🔢 | ***Možni formati***", + "examples": "🔗 | ***Primeri***", + "reminders": "⏰ | ***Opomnik***" + }, + "highestRole": "", + "jumpTo": "Skoči do Sporočila ►", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "Zunanji Viri", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/languages/tr-TR/arguments/range.json b/src/languages/tr-TR/arguments/range.json new file mode 100644 index 00000000000..87b10253627 --- /dev/null +++ b/src/languages/tr-TR/arguments/range.json @@ -0,0 +1,5 @@ +{ + "invalid": "{{name}} bir sayı veya bir sayı aralığı olmalıdır.", + "max_plural": "{{name}} sadece {{maximum}} sayıların aralığını kabul eder", + "max": "{{name}} sadece {{maximum}} sayı aralığını kabul eder" +} diff --git a/src/languages/tr-TR/commands/admin.json b/src/languages/tr-TR/commands/admin.json new file mode 100644 index 00000000000..67e53dd11eb --- /dev/null +++ b/src/languages/tr-TR/commands/admin.json @@ -0,0 +1,96 @@ +{ + "blocklistDescription": "", + "blocklistExtended": { + "extendedHelp": "" + }, + "blocklistResetSuccess": "", + "blocklistSaveSuccess": "", + "confNoKey": "Bir anahtar sağlamanız gerekir", + "confNoValue": "Bir değer sağlamanız gerekir", + "confGuarded": "{{name, toTitleCase}} devre dışı bırakılamaz.", + "confUpdated": "Anahtar başarıyla güncellendi **{{key}}**: `{{response}}`", + "confKeyNotArray": "Bu anahtarın türü bir dizi değildir. Bunun yerine 'reset' eylemini kullanın.", + "confGetNoExt": "**{{key}}** anahtarı mevcut görünmüyor.", + "confGet": "**{{key}}** anahtarının değeri: `{{value}}`", + "confReset": "**{{key}}** anahtarı şuna sıfırlandı: `{{value}}`", + "confNochange": "**{{key}}** değeri zaten buydu.", + "confServerDescription": "Sunucuların ayarlarını düzenleyin.", + "confServerExtended": { + "extendedHelp": "" + }, + "confServer": "**Sunucu Ayarı {{key}}**\n {{list}}", + "confUserDescription": "Kullanıcıların ayarlarını düzenleyin.", + "confDashboardOnlyKey": "`{{key}}` yalnızca web kontrol paneli () üzerinden yapılandırılabilir", + "confUser": "**Kullanıcı Ayarı {{key}}**\n {{list}}", + "confSettingNotSet": "Ayarlanmamış", + "heapSnapshotDescription": "", + "heapSnapshotExtended": { + "extendedHelp": "" + }, + "rolesetDescription": "", + "rolesetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "rolesetCreated": "", + "rolesetAdded": "", + "rolesetInvalidName": "", + "rolesetRemoved": "", + "rolesetResetEmpty": "", + "rolesetResetAll": "", + "rolesetResetNotExists": "", + "rolesetResetGroup": "", + "rolesetUpdated": "", + "rolesetNoRolesets": "", + "confMenuNopermissions": "", + "confMenuRenderAtFolder": "", + "confMenuRenderAtPiece": "", + "confMenuRenderNokeys": "", + "confMenuRenderSelect": "", + "confMenuRenderTctitle": "", + "confMenuRenderUpdate": "", + "confMenuRenderRemove": "", + "confMenuRenderReset": "", + "confMenuRenderUndo": "", + "confMenuRenderCvalue": "", + "confMenuRenderBack": "", + "confMenuInvalidKey": "", + "confMenuInvalidAction": "", + "confMenuSaved": "", + "updateDescription": "", + "updateExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/tr-TR/commands/animal.json b/src/languages/tr-TR/commands/animal.json new file mode 100644 index 00000000000..1853c9a0440 --- /dev/null +++ b/src/languages/tr-TR/commands/animal.json @@ -0,0 +1,23 @@ +{ + "catfactDescription": "", + "catfactExtended": { + "extendedHelp": "" + }, + "catfactTitle": "", + "dogDescription": "", + "dogExtended": { + "extendedHelp": "" + }, + "foxDescription": "", + "foxExtended": { + "extendedHelp": "" + }, + "kittyDescription": "", + "kittyExtended": { + "extendedHelp": "" + }, + "shibeDescription": "", + "shibeExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/tr-TR/commands/anime.json b/src/languages/tr-TR/commands/anime.json new file mode 100644 index 00000000000..9fbb1732caa --- /dev/null +++ b/src/languages/tr-TR/commands/anime.json @@ -0,0 +1,69 @@ +{ + "animeDescription": "", + "animeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "mangaDescription": "", + "mangaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "waifuDescription": "", + "waifuExtended": { + "extendedHelp": "" + }, + "animeTypes": { + "tv": "", + "movie": "", + "ova": "", + "special": "" + }, + "animeInvalidChoice": "", + "animeOutputDescription": "", + "animeNoSynopsis": "", + "animeEmbedData": { + "type": "", + "score": "", + "episodes": "", + "episodeLength": "", + "ageRating": "", + "firstAirDate": "", + "watchIt": "", + "stillAiring": "" + }, + "mangaOutputDescription": "", + "mangaTypes": { + "manga": "", + "novel": "", + "manhwa": "", + "oneShot": "", + "special": "" + }, + "mangaEmbedData": { + "ageRating": "", + "firstPublishDate": "", + "readIt": "", + "score": "", + "type": "", + "none": "" + }, + "waifuFooter": "" +} diff --git a/src/languages/tr-TR/commands/announcement.json b/src/languages/tr-TR/commands/announcement.json new file mode 100644 index 00000000000..0d972ee8ef7 --- /dev/null +++ b/src/languages/tr-TR/commands/announcement.json @@ -0,0 +1,34 @@ +{ + "announcementHeader": "", + "announcementCancelled": "", + "announcementDescription": "", + "announcementEmbedMentions": "", + "announcementEmbedMentionsWithMentions": "", + "announcementExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "announcementPrompt": "", + "announcementSuccess": "", + "subscribeDescription": "", + "subscribeExtended": { + "extendedHelp": "" + }, + "subscribeNoChannel": "", + "subscribeNoRole": "", + "subscribeSuccess": "", + "unsubscribeDescription": "", + "unsubscribeExtended": { + "extendedHelp": "" + }, + "unsubscribeSuccess": "" +} diff --git a/src/languages/tr-TR/commands/developer.json b/src/languages/tr-TR/commands/developer.json new file mode 100644 index 00000000000..95eaf95acc0 --- /dev/null +++ b/src/languages/tr-TR/commands/developer.json @@ -0,0 +1,31 @@ +{ + "yarnDescription": "", + "yarnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "yarnEmbedDescriptionAuthor": "", + "yarnEmbedDescriptionDateCreated": "", + "yarnEmbedDescriptionDateModified": "", + "yarnEmbedDescriptionDependenciesLabel": "", + "yarnEmbedDescriptionDependenciesNoDeps": "", + "yarnEmbedDescriptionDeprecated": "", + "yarnEmbedDescriptionLatestVersion": "", + "yarnEmbedDescriptionLicense": "", + "yarnEmbedDescriptionMainFile": "", + "yarnEmbedDescriptionMaintainers": "", + "yarnEmbedMoreText": "", + "yarnNoPackage": "", + "yarnPackageNotFound": "", + "yarnUnpublishedPackage": "" +} diff --git a/src/languages/tr-TR/commands/fun.json b/src/languages/tr-TR/commands/fun.json new file mode 100644 index 00000000000..b0bf7f43a98 --- /dev/null +++ b/src/languages/tr-TR/commands/fun.json @@ -0,0 +1,251 @@ +{ + "8ballDescription": "", + "8ballExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "choiceDescription": "", + "choiceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "changemymindDescription": "", + "changemymindExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "diceDescription": "", + "diceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "escaperopeDescription": "", + "escaperopeExtended": { + "extendedHelp": "" + }, + "howToFlirtDescription": "", + "howToFlirtExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "loveDescription": "", + "loveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "markovDescription": "", + "markovExtended": { + "extendedHelp": "" + }, + "norrisDescription": "", + "norrisExtended": { + "extendedHelp": "" + }, + "rateDescription": "", + "rateExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "" + }, + "xkcdDescription": "", + "xkcdExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "punDescription": "", + "punExtended": { + "extendedHelp": "" + }, + "wakandaDescription": "", + "wakandaExtended": { + "extendedHelp": "" + }, + "8ballOutput": "", + "8ballQuestions": { + "When": "", + "What": "", + "HowMuch": "", + "HowMany": "", + "Why": "", + "Who": "" + }, + "8ballWhen": [ + "", + "", + "", + "", + "" + ], + "8ballWhat": [ + "", + "", + "", + "", + "", + "" + ], + "8ballHowMuch": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballHowMany": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWhy": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballWho": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "8ballElse": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "choiceOutput": "", + "choiceMissing": "", + "choiceDuplicates": "", + "diceOutput": "", + "diceRollsError": "", + "diceSidesError": "", + "escaperopeOutput": "", + "loveLess45": "", + "loveLess75": "", + "loveLess100": "", + "love100": "", + "loveItself": "", + "loveResult": "", + "markovTimer": "", + "markovNoMessages": "", + "norrisOutput": "", + "rateOutput": "", + "rateMyself": [ + "", + "" + ], + "rateOwners": [ + "", + "" + ], + "punError": "", + "xkcdComics": "", + "xkcdNotfound": "" +} diff --git a/src/languages/tr-TR/commands/game.json b/src/languages/tr-TR/commands/game.json new file mode 100644 index 00000000000..99d61b76d4b --- /dev/null +++ b/src/languages/tr-TR/commands/game.json @@ -0,0 +1,504 @@ +{ + "c4Description": "", + "c4Extended": { + "extendedHelp": "" + }, + "c4GameColumnFull": "", + "c4GameDraw": "", + "c4GameNext": "", + "c4GameNextTurn0": "", + "c4GameWin": "", + "c4GameWinTurn0": "", + "c4Prompt": "", + "c4Start": "", + "cannotHaveNegativeMoney": "", + "coinFlipCoinnames": [ + "", + "" + ], + "coinFlipDescription": "", + "coinFlipExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "coinFlipInvalidCoinname": "", + "coinFlipLoseDescription": "", + "coinFlipLoseDescriptionWithWager": "", + "coinFlipLoseTitle": "", + "coinFlipNoguessDescription": "", + "coinFlipNoguessTitle": "", + "coinFlipWinDescription": "", + "coinFlipWinDescriptionWithWager": "", + "coinFlipWinTitle": "", + "gamesBot": "", + "gamesNoPlayers": "", + "gamesProgress": "", + "gamesPromptDeny": "", + "gamesPromptTimeout": "", + "gamesRepeat": "", + "gamesSelf": "", + "gamesSkyra": "", + "gamesTimeout": "", + "gamesTooManyOrFew": "", + "hgBloodbath": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgDay": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "hgNight": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "higherLowerCancel": { + "description": "", + "title": "" + }, + "higherLowerCashout": "", + "higherLowerDescription": "", + "higherLowerEmbed": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerExtended": { + "extendedHelp": "" + }, + "higherLowerLoading": "", + "higherLowerLose": { + "description": "", + "footer": "", + "title": "" + }, + "higherLowerNewround": "", + "higherLowerWin": { + "description": "", + "footer": "", + "title": "" + }, + "hungerGamesDescription": "", + "hungerGamesExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "hungerGamesResultDeaths": "", + "hungerGamesResultDeathsPlural": "", + "hungerGamesResultHeaderBloodbath": "", + "hungerGamesResultHeaderMoon": "", + "hungerGamesResultHeaderSun": "", + "hungerGamesResultProceed": "", + "hungerGamesStop": "", + "hungerGamesWinner": "", + "notEnoughMoney": "", + "slotmachineCanvasTextLost": "", + "slotmachineCanvasTextWon": "", + "slotmachineDescription": "", + "slotmachineExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "extendedHelp": "", + "reminder": "" + }, + "slotmachinesLoss": "", + "slotmachinesWin": "", + "ticTacToeDescription": "", + "ticTacToeDraw": "", + "ticTacToeExtended": { + "extendedHelp": "" + }, + "ticTacToePrompt": "", + "ticTacToeTurn": "", + "ticTacToeWinner": "", + "triviaActiveGame": "", + "triviaDescription": "", + "triviaEmbedTitles": { + "difficulty": "", + "trivia": "" + }, + "triviaExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "triviaIncorrect": "", + "triviaInvalidCategory": "", + "triviaNoAnswer": "", + "triviaWinner": "", + "wheelOfFortuneCanvasTextLost": "", + "wheelOfFortuneCanvasTextWon": "", + "wheelOfFortuneDescription": "", + "wheelOfFortuneExtended": { + "extendedHelp": "" + }, + "balanceDifference": "" +} diff --git a/src/languages/tr-TR/commands/gameIntegration.json b/src/languages/tr-TR/commands/gameIntegration.json new file mode 100644 index 00000000000..3ab9b56f31c --- /dev/null +++ b/src/languages/tr-TR/commands/gameIntegration.json @@ -0,0 +1,264 @@ +{ + "brawlstarsDescription": "", + "brawlstarsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "brawlstarsPlayerEmbedTitles": { + "trophies": "", + "events": "", + "exp": "", + "gamesModes": "", + "other": "" + }, + "brawlstarsPlayerEmbedFields": { + "total": "", + "personalBest": "", + "events": "", + "roboRumble": "", + "qualifiedForChamps": "", + "experienceLevel": "", + "victories3v3": "", + "victoriesSolo": "", + "victoriesDuo": "", + "club": "", + "brawlersUnlocked": "" + }, + "brawlstarsClubEmbedTitles": { + "totalTrophies": "", + "averageTrophies": "", + "requiredTrophies": "", + "members": "", + "type": "", + "top5Members": "", + "president": "" + }, + "brawlstarsClubEmbedFields": { + "noPresident": "" + }, + "clashofclansDescription": "", + "clashofclansExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "clashofclansPlayerEmbedTitles": { + "xpLevel": "", + "builderHallLevel": "", + "townhallLevel": "", + "townhallWeaponLevel": "", + "trophies": "", + "bestTrophies": "", + "warStars": "", + "attackWins": "", + "defenseWins": "", + "amountOfAchievements": "", + "versusTrophies": "", + "bestVersusTrophies": "", + "versusBattleWins": "", + "clanRole": "", + "clanName": "", + "leagueName": "", + "noTownhallWeaponLevel": "", + "noRole": "", + "noClan": "", + "noLeague": "" + }, + "clashofclansClanEmbedTitles": { + "clanLevel": "", + "clanPoints": "", + "clanVersusPoints": "", + "amountOfMembers": "", + "description": "", + "locationName": "", + "warFrequency": "", + "warWinStreak": "", + "warWins": "", + "warTies": "", + "warLosses": "", + "warLogPublic": "", + "unknown": "", + "warFrequencyDescr": { + "moreThanOncePerWeek": "", + "always": "", + "lessThanOncePerWeek": "", + "oncePerWeek": "", + "unknown": "" + } + }, + "brawlStarsInvalidPlayerTag": "", + "brawlStarsClansQueryFail": "", + "brawlStarsPlayersQueryFail": "", + "clashofclansInvalidPlayerTag": "", + "clashOfClansClansQueryFail": "", + "clashofclansPlayersQueryFail": "", + "FFXIVDescription": "", + "FFXIVExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "FFXIVCharacterFields": { + "serverAndDc": "", + "tribe": "", + "characterGender": "", + "nameday": "", + "guardian": "", + "cityState": "", + "grandCompany": "", + "rank": "", + "none": "", + "male": "", + "female": "", + "dowDomClasses": "", + "tank": "", + "healer": "", + "meleeDps": "", + "physicalRangedDps": "", + "magicalRangedDps": "", + "dohClasses": "", + "dolClasses": "" + }, + "FFXIVItemFields": { + "kind": "", + "category": "", + "levelEquip": "", + "none": "" + }, + "FFXIVNoCharacterFound": "", + "FFXIVInvalidServer": "", + "FFXIVNoItemFound": "", + "fortniteDescription": "", + "fortniteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "fortniteNoUser": "", + "fortniteEmbedTitle": "", + "fortniteEmbedSectionTitles": { + "lifetimeStats": "", + "solos": "", + "duos": "", + "squads": "" + }, + "fortniteEmbedStats": { + "wins": "", + "kills": "", + "kdr": "", + "matchesPlayed": "", + "top1s": "", + "top3s": "", + "top5s": "", + "top6s": "", + "top10s": "", + "top12s": "", + "top25s": "" + }, + "overwatchDescription": "", + "overwatchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "overwatchInvalidPlayerName": "", + "overwatchQueryFail": "", + "overwatchNoStats": "", + "overwatchNoAverage": "", + "overwatchEmbedDataStats": { + "finalBlows": "", + "deaths": "", + "damageDealt": "", + "healing": "", + "objectiveKills": "", + "soloKills": "", + "playTime": "", + "gamesWon": "", + "goldenMedals": "", + "silverMedals": "", + "bronzeMedals": "" + }, + "overwatchEmbedDataTopHero": "", + "overwatchEmbedData": { + "title": "", + "ratingsTitle": "", + "author": "", + "playerLevel": "", + "prestigeLevel": "", + "totalGamesWon": "", + "noGamesWon": "", + "headers": { + "account": "", + "quickplay": "", + "competitive": "", + "topHeroesQuickplay": "", + "topHeroesCompetitive": "" + } + } +} diff --git a/src/languages/tr-TR/commands/general.json b/src/languages/tr-TR/commands/general.json new file mode 100644 index 00000000000..a09b7f012e2 --- /dev/null +++ b/src/languages/tr-TR/commands/general.json @@ -0,0 +1,43 @@ +{ + "helpAllFlag": "", + "helpCommandCount": "", + "helpCommandCount_plural": "", + "helpData": { + "extended": "", + "footer": "", + "title": "", + "usage": "" + }, + "helpDescription": "", + "helpExtended": { + "extendedHelp": "", + "reminder": "" + }, + "helpDm": "", + "helpNodm": "", + "helpNoExtended": "", + "infoBody": "", + "infoDescription": "", + "infoExtended": { + "extendedHelp": "" + }, + "inviteDescription": "", + "inviteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "invitePermissionInviteText": "", + "invitePermissionsDescription": "", + "invitePermissionSupportServerText": "", + "ping": "", + "pingDescription": "", + "pingExtended": { + "extendedHelp": "" + }, + "pingPong": "" +} diff --git a/src/languages/tr-TR/commands/giveaway.json b/src/languages/tr-TR/commands/giveaway.json new file mode 100644 index 00000000000..eccba926c9e --- /dev/null +++ b/src/languages/tr-TR/commands/giveaway.json @@ -0,0 +1,71 @@ +{ + "giveawayDescription": "", + "giveawayExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "giveawayRerollDescription": "", + "giveawayRerollExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "giveawayScheduleDescription": "", + "giveawayScheduleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "giveawayRerollInvalid": "" +} diff --git a/src/languages/tr-TR/commands/google.json b/src/languages/tr-TR/commands/google.json new file mode 100644 index 00000000000..7ae7a160539 --- /dev/null +++ b/src/languages/tr-TR/commands/google.json @@ -0,0 +1,86 @@ +{ + "currentTimeDescription": "", + "currentTimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "currentTimeLocationNotFound": "", + "currentTimeTitles": { + "currentTime": "", + "currentDate": "", + "country": "", + "gmsOffset": "", + "dst": "" + }, + "currentTimeDst": "", + "currentTimeNoDst": "", + "gsearchDescription": "", + "gsearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "gimageDescription": "", + "gimageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "lmgtfyDescription": "", + "lmgtfyExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "lmgtfyClick": "", + "weatherDescription": "", + "weatherExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "reminder": "" + }, + "errorZeroResults": "", + "errorRequestDenied": "", + "errorInvalidRequest": "", + "errorOverQueryLimit": "", + "errorPermissionDenied": "", + "errorUnknown": "" +} diff --git a/src/languages/tr-TR/commands/management.json b/src/languages/tr-TR/commands/management.json new file mode 100644 index 00000000000..09372e61adf --- /dev/null +++ b/src/languages/tr-TR/commands/management.json @@ -0,0 +1,875 @@ +{ + "nickSet": "", + "nickCleared": "", + "permissionNodesHigher": "", + "permissionNodesInvalidType": "", + "permissionNodesAdd": "", + "permissionNodesNodeNotExists": "", + "permissionNodesCommandNotExists": "", + "permissionNodesRemove": "", + "permissionNodesReset": "", + "permissionNodesShowName": "", + "permissionNodesShowAllow": "", + "permissionNodesShowDeny": "", + "triggersNotype": "", + "triggersNooutput": "", + "triggersInvalidreaction": "", + "triggersInvalidalias": "", + "triggersRemoveNottaken": "", + "triggersRemove": "", + "triggersAddTaken": "", + "triggersAdd": "", + "triggersListEmpty": "", + "guildInfoTitles": { + "CHANNELS": "", + "MEMBERS": "", + "OTHER": "" + }, + "guildInfoRoles": "", + "guildInfoNoroles": "", + "guildInfoChannels": "", + "guildInfoChannelsAfkChannelText": "", + "guildInfoMembers": "", + "guildInfoOther": "", + "roleInfoTitles": { + "PERMISSIONS": "" + }, + "roleInfoData": "", + "roleInfoAll": "", + "roleInfoNoPermissions": "", + "filterUndefinedWord": "", + "filterAlreadyFiltered": "", + "filterNotFiltered": "", + "filterAdded": "", + "filterRemoved": "", + "filterReset": "", + "filterShowEmpty": "", + "filterShow": "", + "manageCommandAutoDeleteTextChannel": "", + "manageCommandAutoDeleteRequiredDuration": "", + "manageCommandAutoDeleteShowEmpty": "", + "manageCommandAutoDeleteShow": "", + "manageCommandAutoDeleteAdd": "", + "manageCommandAutoDeleteRemove": "", + "manageCommandAutoDeleteRemoveNotset": "", + "manageCommandAutoDeleteReset": "", + "manageCommandChannelTextChannel": "", + "manageCommandChannelRequiredCommand": "", + "manageCommandChannelShow": "", + "manageCommandChannelShowEmpty": "", + "manageCommandChannelAddAlreadyset": "", + "manageCommandChannelAdd": "", + "manageCommandChannelRemoveNotset": "", + "manageCommandChannelRemove": "", + "manageCommandChannelResetEmpty": "", + "manageCommandChannelReset": "", + "manageReactionRolesShowEmpty": "", + "manageReactionRolesAddChannel": "", + "manageReactionRolesAddPrompt": "", + "manageReactionRolesAddMissing": "", + "manageReactionRolesAdd": "", + "manageReactionRolesRemoveNotExists": "", + "manageReactionRolesRemove": "", + "manageReactionRolesResetEmpty": "", + "manageReactionRolesReset": "", + "setStarboardEmojiSet": "", + "configurationTextChannelRequired": "", + "configurationEquals": "", + "setIgnoreChannelsSet": "", + "setIgnoreChannelsRemoved": "", + "setImageLogsSet": "", + "setMemberLogsSet": "", + "setMessageLogsSet": "", + "setModLogsSet": "", + "setPrefixSet": "", + "stickyRolesRequiredUser": "", + "stickyRolesRequiredRole": "", + "stickyRolesNotExists": "", + "stickyRolesReset": "", + "stickyRolesRemove": "", + "stickyRolesAddExists": "", + "stickyRolesAdd": "", + "stickyRolesShowEmpty": "", + "stickyRolesShowSingle": "", + "createMuteDescription": "", + "createMuteExtended": { + "extendedHelp": "" + }, + "nickDescription": "", + "nickExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "permissionNodesDescription": "", + "permissionNodesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "triggersDescription": "", + "triggersExtended": { + "extendedHelp": "", + "reminder": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "managecommandautodeleteDescription": "", + "managecommandautodeleteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageCommandChannelDescription": "", + "manageCommandChannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "manageReactionRolesDescription": "", + "manageReactionRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setIgnoreChannelsDescription": "", + "setIgnoreChannelsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setImageLogsDescription": "", + "setImageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMemberLogsDescription": "", + "setMemberLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "setMessageLogsDescription": "", + "setMessageLogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setmodlogsDescription": "", + "setmodlogsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setprefixDescription": "", + "setprefixExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolechannelDescription": "", + "setrolechannelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "" + ] + }, + "setrolemessageDescription": "", + "setrolemessageExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "setStarboardEmojiDescription": "", + "setStarboardEmojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "" + ] + }, + "roleInfoDescription": "", + "roleInfoExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "guildInfoDescription": "", + "guildInfoExtended": { + "extendedHelp": "" + }, + "stickyRolesDescription": "", + "stickyRolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "attachmentsModeDescription": "", + "attachmentsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "capitalsModeDescription": "", + "capitalsModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "filterDescription": "", + "filterExtended": { + "extendedHelp": "" + }, + "filterModeDescription": "", + "filterModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "inviteModeDescription": "", + "inviteModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "linkModeDescription": "", + "linkModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "messageModeDescription": "", + "messageModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "newlineModeDescription": "", + "newlineModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "reactionModeDescription": "", + "reactionModeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "rolesDescription": "", + "rolesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "" + ] + } +} diff --git a/src/languages/tr-TR/commands/misc.json b/src/languages/tr-TR/commands/misc.json new file mode 100644 index 00000000000..bb674e9357f --- /dev/null +++ b/src/languages/tr-TR/commands/misc.json @@ -0,0 +1,288 @@ +{ + "randRedditRequiredReddit": "", + "randRedditInvalidArgument": "", + "randRedditBanned": "", + "randRedditFail": "", + "randRedditAllNsfw": "", + "randRedditAllNsfl": "", + "randRedditMessage": "", + "randRedditErrorPrivate": "", + "randRedditErrorQuarantined": "", + "randRedditErrorNotFound": "", + "randRedditErrorBanned": "", + "redditUserComplexityLevels": [ + "", + "", + "", + "", + "", + "" + ], + "redditUserInvalidUser": "", + "redditUserQueryFailed": "", + "redditUserTitles": { + "linkKarma": "", + "commentKarma": "", + "totalComments": "", + "totalSubmissions": "", + "commentControversiality": "", + "textComplexity": "", + "top5Subreddits": "", + "bySubmissions": "", + "byComments": "", + "bestComment": "", + "worstComment": "" + }, + "redditUserData": { + "overviewFor": "", + "permalink": "", + "dataAvailableFor": "", + "joinedReddit": "" + }, + "snipeEmpty": "", + "snipeTitle": "", + "upvoteMessage": "", + "vaporwaveOutput": "", + "cuddleDescription": "", + "cuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "deletthisDescription": "", + "deletthisExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "fDescription": "", + "fExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goodnightDescription": "", + "goodnightExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "goofytimeDescription": "", + "goofytimeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "hugDescription": "", + "hugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "ineedhealingDescription": "", + "ineedhealingExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "randRedditDescription": "", + "randRedditExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "redditUserDescription": "", + "redditUserExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shipDescription": "", + "shipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "shipData": { + "title": "", + "description": "" + }, + "chaseDescription": "", + "chaseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "shindeiruDescription": "", + "shindeiruExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "peepoloveDescription": "", + "peepoloveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "slapDescription": "", + "slapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "snipeDescription": "", + "snipeExtended": { + "extendedHelp": "" + }, + "thesearchDescription": "", + "thesearchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "triggeredDescription": "", + "triggeredExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "upvoteDescription": "", + "upvoteExtended": { + "extendedHelp": "" + }, + "vaporwaveDescription": "", + "vaporwaveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + } +} diff --git a/src/languages/tr-TR/commands/moderation.json b/src/languages/tr-TR/commands/moderation.json new file mode 100644 index 00000000000..149b1a5d530 --- /dev/null +++ b/src/languages/tr-TR/commands/moderation.json @@ -0,0 +1,475 @@ +{ + "permissions": "", + "permissionsAll": "", + "flow": "", + "timeTimed": "", + "timeUndefinedTime": "", + "timeUnsupportedType": "", + "timeNotScheduled": "", + "timeAborted": "", + "timeScheduled": "", + "slowmodeSet": "", + "slowmodeReset": "", + "slowmodeTooLong": "", + "timeDescription": "", + "timeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "banNotBannable": "", + "dehoistStarting": "", + "dehoistProgress": "", + "dehoistEmbed": { + "title": "", + "descriptionNoone": "", + "descriptionWithError": "", + "descriptionWithMultipleErrors": "", + "description": "", + "descriptionMultipleMembers": "", + "fieldErrorTitle": "" + }, + "kickNotKickable": "", + "lockdownLock": "", + "lockdownLocking": "", + "lockdownLocked": "", + "lockdownUnlocked": "", + "lockdownOpen": "", + "muteLowlevel": "", + "muteConfigureCancelled": "", + "muteConfigure": "", + "muteConfigureToomanyRoles": "", + "muteMuted": "", + "muteUserNotMuted": "", + "muteUnconfigured": "", + "mutecreateMissingPermission": "", + "restrictLowlevel": "", + "pruneInvalid": "", + "pruneAlert": "", + "pruneAlert_plural": "", + "pruneInvalidPosition": "", + "pruneInvalidFilter": "", + "pruneNoDeletes": "", + "pruneLogHeader": "", + "pruneLogMessage": "", + "pruneLogMessage_plural": "", + "reasonMissingCase": "", + "reasonNotExists": "", + "reasonUpdated": [ + "", + "" + ], + "reasonUpdated_plural": [ + "", + "" + ], + "toggleModerationDmToggledEnabled": "", + "toggleModerationDmToggledDisabled": "", + "unbanMissingPermission": "", + "unmuteMissingPermission": "", + "vmuteMissingPermission": "", + "vmuteUserNotMuted": "", + "warnDm": "", + "warnMessage": "", + "moderationOutput": "", + "moderationOutput_plural": "", + "moderationOutputWithReason": "", + "moderationOutputWithReason_plural": "", + "moderationFailed": "", + "moderationFailed_plural": "", + "moderationDmFooter": "", + "moderationDmDescription": "", + "moderationDmDescriptionWithReason": "", + "moderationDmDescriptionWithDuration": "", + "moderationDmDescriptionWithReasonWithDuration": "", + "moderationDays": "", + "historyDescription": "", + "historyExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "historyFooterNew": "", + "historyFooterWarning": "", + "historyFooterWarning_plural": "", + "historyFooterMutes": "", + "historyFooterMutes_plural": "", + "historyFooterKicks": "", + "historyFooterKicks_plural": "", + "historyFooterBans": "", + "historyFooterBans_plural": "", + "moderationsDescription": "", + "moderationsExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "moderationsEmpty": "", + "moderationsAmount": "", + "moderationsAmount_plural": "", + "mutesDescription": "", + "mutesExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warningsDescription": "", + "warningsExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "slowmodeDescription": "", + "slowmodeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "banDescription": "", + "banExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "dehoistDescription": "", + "dehoistExtended": { + "extendedHelp": "", + "reminder": "" + }, + "kickDescription": "", + "kickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "lockdownDescription": "", + "lockdownExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "muteDescription": "", + "muteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "setNicknameDescription": "", + "setNicknameExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "addRoleDescription": "", + "addRoleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "removeroleDescription": "", + "removeroleExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "pruneDescription": "", + "pruneExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ], + "reminder": "" + }, + "caseDescription": "", + "caseExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "permissionsDescription": "", + "permissionsExtended": { + "extendedHelp": "" + }, + "flowDescription": "", + "flowExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "reasonDescription": "", + "reasonExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "restrictAttachmentDescription": "", + "restrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmbedDescription": "", + "restrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictEmojiDescription": "", + "restrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "restrictReactionDescription": "", + "restrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "restrictVoiceDescription": "", + "restrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "softBanDescription": "", + "softBanExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "toggleModerationDmDescription": "", + "toggleModerationDmExtended": { + "extendedHelp": "" + }, + "unbanDescription": "", + "unbanExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unmuteDescription": "", + "unmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "unrestrictAttachmentDescription": "", + "unrestrictAttachmentExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmbedDescription": "", + "unrestrictEmbedExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictEmojiDescription": "", + "unrestrictEmojiExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictReactionDescription": "", + "unrestrictReactionExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unrestrictVoiceDescription": "", + "unrestrictVoiceExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "unwarnDescription": "", + "unwarnExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vmuteDescription": "", + "vmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "voiceKickDescription": "", + "voiceKickExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "vunmuteDescription": "", + "vunmuteExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ] + }, + "warnDescription": "", + "warnExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + } +} diff --git a/src/languages/tr-TR/commands/music.json b/src/languages/tr-TR/commands/music.json new file mode 100644 index 00000000000..78f5b575815 --- /dev/null +++ b/src/languages/tr-TR/commands/music.json @@ -0,0 +1,208 @@ +{ + "addDescription": "", + "addExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "addPlaylist": "", + "addPlaylistSongs": "", + "addPlaylistSongsPlural": "", + "addSong": "", + "clearDescription": "", + "clearExtended": { + "extendedHelp": "", + "reminder": "" + }, + "clearDenied": "", + "clearSuccess": "", + "clearSuccessPlural": "", + "exportQueueDescription": "", + "exportQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "exportQueueSuccess": "", + "importQueueDescription": "", + "importQueueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinDescription": "", + "joinExtended": { + "extendedHelp": "", + "reminder": "" + }, + "joinNoMember": "", + "joinNoVoicechannel": "", + "joinSuccess": "", + "joinVoiceDifferent": "", + "joinVoiceFull": "", + "joinVoiceNoConnect": "", + "joinVoiceNoSpeak": "", + "joinVoiceSame": "", + "joinFailed": "", + "leaveDescription": "", + "leaveExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "leaveSuccess": "", + "pauseDescription": "", + "pauseExtended": { + "extendedHelp": "", + "reminder": "" + }, + "pauseSuccess": "", + "playDescription": "", + "playExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "playEnd": "", + "playNext": "", + "playQueuePaused": "", + "playQueuePlaying": "", + "playQueueEmpty": "", + "playingDescription": "", + "playingExtended": { + "extendedHelp": "", + "reminder": "" + }, + "playingDuration": "", + "playingQueueEmpty": "", + "playingQueueNotPlaying": "", + "repeatDescription": "", + "repeatExtended": { + "extendedHelp": "", + "reminder": "" + }, + "repeatSuccessEnabled": "", + "repeatSuccessDisabled": "", + "queueDescription": "", + "queueExtended": { + "extendedHelp": "", + "reminder": "" + }, + "queueLast": "", + "queueTitle": "", + "queueLine": "", + "queueNowplaying": "", + "queueNowplayingLiveStream": "", + "queueNowplayingTimeRemaining": "", + "queueNowplayingTitle": "", + "queueTotalTitle": "", + "queueTotal": "", + "queueEmpty": "", + "queueDashboardInfo": "", + "removeDescription": "", + "removeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "removeIndexInvalid": "", + "removeIndexOutOfBounds": "", + "removeDenied": "", + "removeSuccess": "", + "seekDescription": "", + "seekExtended": { + "extendedHelp": "", + "reminder": "" + }, + "seekSuccess": "", + "resumeDescription": "", + "resumeExtended": { + "extendedHelp": "", + "reminder": "" + }, + "resumeSuccess": "", + "shuffleDescription": "", + "shuffleExtended": { + "extendedHelp": "", + "reminder": "" + }, + "shuffleSuccess": "", + "skipDescription": "", + "skipExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "skipPermissions": "", + "skipVotesVoted": "", + "skipVotesTotal": "", + "skipSuccess": "", + "playingTimeDescription": "", + "playingTimeQueueEmpty": "", + "promoteDescription": "", + "promoteExtended": { + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "promoteSuccess": "", + "volumeDescription": "", + "volumeExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "" + ] + }, + "volumeSuccess": "", + "volumeChanged": "", + "volumeChangedExtreme": "", + "volumeChangedTexts": [ + "", + "", + "" + ] +} diff --git a/src/languages/tr-TR/commands/pokemon.json b/src/languages/tr-TR/commands/pokemon.json new file mode 100644 index 00000000000..fc209bd01af --- /dev/null +++ b/src/languages/tr-TR/commands/pokemon.json @@ -0,0 +1,197 @@ +{ + "abilityDescription": "", + "abilityExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "abilityEmbedTitles": { + "authorTitle": "", + "fieldEffectTitle": "" + }, + "abilityQueryFail": "", + "flavorsDescription": "", + "flavorsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "flavorsQueryFail": "", + "itemDescription": "", + "itemExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itemEmbedData": { + "ITEM": "", + "generationIntroduced": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "" + }, + "itemQueryFail": "", + "learnDescription": "", + "learnExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "learnMethodTypes": { + "levelUpMoves": "", + "eventMoves": "", + "tutorMoves": "", + "eggMoves": "", + "virtualTransferMoves": "", + "tmMoves": "", + "dreamworldMoves": "" + }, + "learnInvalidGeneration": "", + "learnMethod": "", + "learnQueryFailed": "", + "learnCannotLearn": "", + "learnTitle": "", + "moveDescription": "", + "moveExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "moveEmbedData": { + "move": "", + "types": "", + "basePower": "", + "pp": "", + "category": "", + "accuracy": "", + "priority": "", + "target": "", + "contestCondition": "", + "zCrystal": "", + "gmaxPokemon": "", + "availableInGeneration8Title": "", + "availableInGeneration8Data": "", + "none": "", + "maxMovePower": "", + "zMovePower": "", + "fieldMoveEffectTitle": "" + }, + "moveQueryFail": "", + "pokedexDescription": "", + "pokedexExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ], + "reminder": "" + }, + "pokedexEmbedData": { + "types": "", + "abilities": "", + "genderRatio": "", + "smogonTier": "", + "uknownSmogonTier": "", + "height": "", + "weight": "", + "eggGroups": "", + "evolutionaryLine": "", + "baseStats": "", + "baseStatsTotal": "", + "flavourText": "", + "otherFormesTitle": "", + "cosmeticFormesTitle": "", + "otherFormesList": "", + "cosmeticFormesList": "" + }, + "pokedexQueryFail": "", + "typeDescription": "", + "typeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "typeEmbedData": { + "offensive": "", + "defensive": "", + "superEffectiveAgainst": "", + "dealsNormalDamageTo": "", + "doesNotAffect": "", + "notVeryEffectiveAgainst": "", + "vulnerableTo": "", + "takesNormalDamageFrom": "", + "resists": "", + "notAffectedBy": "", + "typeEffectivenessFor": "" + }, + "typeTooManyTypes": "", + "typeNotAType": "", + "typeQueryFail": "" +} diff --git a/src/languages/tr-TR/commands/social.json b/src/languages/tr-TR/commands/social.json new file mode 100644 index 00000000000..18445adac67 --- /dev/null +++ b/src/languages/tr-TR/commands/social.json @@ -0,0 +1,384 @@ +{ + "autoRolePointsRequired": "", + "autoRoleUpdateConfigured": "", + "autoRoleUpdateUnconfigured": "", + "autoRoleUpdate": "", + "autoRoleRemove": "", + "autoRoleAdd": "", + "autoRoleListEmpty": "", + "autoRoleUnknownRole": "", + "balance": "", + "balanceSelf": "", + "balanceBots": "", + "socialMemberNotexists": "", + "socialAdd": "", + "socialAdd_plural": "", + "socialRemove": "", + "socialRemove_plural": "", + "socialUnchanged": "", + "socialReset": "", + "bannerMissing": "", + "bannerNotexists": "", + "bannerUserlistEmpty": "", + "bannerResetDefault": "", + "bannerReset": "", + "bannerSetNotBought": "", + "bannerSet": "", + "bannerBought": "", + "bannerMoney": "", + "bannerPaymentCancelled": "", + "bannerBuy": "", + "bannerPrompt": "", + "toggleDarkModeEnabled": "", + "toggleDarkModeDisabled": "", + "dailyTime": "", + "dailyTimeSuccess": "", + "dailyGrace": "", + "dailyGraceAccepted": "", + "dailyGraceDenied": "", + "dailyCollect": "", + "level": { + "level": "", + "experience": "", + "nextIn": "" + }, + "divorceSelf": "", + "divorceNotTaken": "", + "divorcePrompt": "", + "divorceCancel": "", + "divorceDm": "", + "divorceSuccess": "", + "marryWith": "", + "marryNotTaken": "", + "marrySkyra": "", + "marryAelia": "", + "marryBots": "", + "marrySelf": "", + "marryAuthorTaken": "", + "marryAuthorMultipleCancel": "", + "marryTaken": "", + "marryTaken_plural": "", + "marryAlreadyMarried": "", + "marryAuthorTooMany": "", + "marryTargetTooMany": "", + "marryMultipleCancel": "", + "marryPetition": "", + "marryNoreply": "", + "marryDenied": "", + "marryAccepted": "", + "mylevel": "", + "mylevelSelf": "", + "mylevelNext": "", + "payMissingMoney": "", + "payPrompt": "", + "payPromptAccept": "", + "payPromptDeny": "", + "paySelf": "", + "socialPayBot": "", + "profile": { + "globalRank": "", + "credits": "", + "reputation": "", + "experience": "", + "level": "" + }, + "profileMoney": "", + "remindmeCreate": "", + "remindmeCreateNoDuration": "", + "remindmeCreateNoDescription": "", + "remindmeDeleteNoId": "", + "remindmeDelete": "", + "remindmeListEmpty": "", + "remindmeShowFooter": "", + "remindmeInvalidId": "", + "remindmeNotfound": "", + "reputationTime": "", + "reputationUsable": "", + "reputationUserNotfound": "", + "reputationSelf": "", + "reputationBots": "", + "reputationGive": "", + "reputationsBots": "", + "reputationsSelf": "", + "reputation": "", + "reputation_plural": "", + "reputations": "", + "autoRoleRequireRole": "", + "scoreboardPosition": "", + "setColor": "", + "socialDescription": "", + "socialExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "bannerDescription": "", + "bannerExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "toggleDarkModeDescription": "", + "toggleDarkModeExtended": { + "extendedHelp": "" + }, + "autoRoleDescription": "", + "autoRoleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "" + ] + }, + "balanceDescription": "", + "balanceExtended": { + "extendedHelp": "" + }, + "dailyDescription": "", + "dailyExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardDescription": "", + "leaderboardExtended": { + "extendedHelp": "", + "reminder": "" + }, + "leaderboardListifyPage": "", + "levelDescription": "", + "levelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "divorceDescription": "", + "divorceExtended": { + "extendedHelp": "" + }, + "marryDescription": "", + "marryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "marriedDescription": "", + "marriedExtended": { + "extendedHelp": "" + }, + "mylevelDescription": "", + "mylevelExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "payDescription": "", + "payExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "profileDescription": "", + "profileExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ] + }, + "remindmeDescription": "", + "remindmeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "reputationDescription": "", + "reputationExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "reminder": "", + "examples": [ + "", + "", + "", + "", + "" + ] + }, + "setColorDescription": "", + "setColorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "vaultDescription": "", + "vaultEmbedData": { + "accountMoney": "", + "accountVault": "", + "depositedDescription": "", + "showDescription": "", + "withdrewDescription": "" + }, + "vaultExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "vaultInvalidCoins": "", + "vaultNotEnoughInVault": "", + "vaultNotEnoughMoney": "" +} diff --git a/src/languages/tr-TR/commands/starboard.json b/src/languages/tr-TR/commands/starboard.json new file mode 100644 index 00000000000..e6fcad6d3bb --- /dev/null +++ b/src/languages/tr-TR/commands/starboard.json @@ -0,0 +1,20 @@ +{ + "starDescription": "", + "starExtended": { + "extendedHelp": "" + }, + "starMessages_plural": "", + "starMessages": "", + "starNoChannel": "", + "starNostars": "", + "stars_plural": "", + "stars": "", + "starStats": "", + "starStatsDescription": "", + "starTopreceivers": "", + "starTopreceiversDescription_plural": "", + "starTopreceiversDescription": "", + "starTopstarred": "", + "starTopstarredDescription_plural": "", + "starTopstarredDescription": "" +} diff --git a/src/languages/tr-TR/commands/suggestion.json b/src/languages/tr-TR/commands/suggestion.json new file mode 100644 index 00000000000..0fba8220e27 --- /dev/null +++ b/src/languages/tr-TR/commands/suggestion.json @@ -0,0 +1,57 @@ +{ + "suggestDescription": "", + "suggestExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ], + "reminder": "" + }, + "suggestNoSetup": "", + "suggestNoSetupAsk": "", + "suggestNoSetupAbort": "", + "suggestNopermissions": "", + "suggestChannelPrompt": "", + "suggestTitle": "", + "suggestSuccess": "", + "resolveSuggestionDescription": "", + "resolveSuggestionExtended": { + "extendedHelp": "", + "examples": [ + "", + "", + "", + "", + "", + "" + ], + "reminder": "" + }, + "resolveSuggestionInvalidId": "", + "resolveSuggestionMessageNotFound": "", + "resolveSuggestionIdNotFound": "", + "resolveSuggestionDefaultComment": "", + "resolveSuggestionAuthorAdmin": "", + "resolveSuggestionAuthorModerator": "", + "resolveSuggestionActions": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionActionsDms": { + "accept": "", + "consider": "", + "deny": "" + }, + "resolveSuggestionDmFail": "", + "resolveSuggestionSuccess": "", + "resolveSuggestionSuccessAcceptedText": "", + "resolveSuggestionSuccessDeniedText": "", + "resolveSuggestionSuccessConsideredText": "" +} diff --git a/src/languages/tr-TR/commands/system.json b/src/languages/tr-TR/commands/system.json new file mode 100644 index 00000000000..29aa463b55b --- /dev/null +++ b/src/languages/tr-TR/commands/system.json @@ -0,0 +1,101 @@ +{ + "dmDescription": "", + "dmExtended": { + "extendedHelp": "", + "reminder": "" + }, + "evalDescription": "", + "evalExtended": { + "extendedHelp": "", + "examples": [ + "", + "" + ], + "reminder": "" + }, + "execDescription": "", + "execExtended": { + "extendedHelp": "" + }, + "setAvatarDescription": "", + "setAvatarExtended": { + "extendedHelp": "", + "reminder": "" + }, + "donateDescription": "", + "donateExtended": { + "extendedHelp": "" + }, + "echoDescription": "", + "echoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "feedbackDescription": "", + "feedbackExtended": { + "extendedHelp": "" + }, + "statsDescription": "", + "statsExtended": { + "extendedHelp": "" + }, + "evalTimeout": "", + "evalError": "", + "statsTitles": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "statsFields": { + "stats": "", + "uptime": "", + "serverUsage": "" + }, + "disable": "", + "disableDescription": "", + "disableExtended": { + "extendedHelp": "" + }, + "disableWarn": "", + "dmNotSent": "", + "dmSent": "", + "enable": "", + "enableDescription": "", + "enableExtended": { + "extendedHelp": "" + }, + "load": "", + "loadDescription": "", + "loadExtended": { + "extendedHelp": "" + }, + "loadError": "", + "loadFail": "", + "reboot": "", + "rebootDescription": "", + "rebootExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reload": "", + "reloadAll": "", + "reloadDescription": "", + "reloadExtended": { + "extendedHelp": "", + "reminder": "" + }, + "reloadEverything": "", + "reloadFailed": "", + "unload": "", + "unloadDescription": "", + "unloadExtended": { + "extendedHelp": "" + }, + "unloadWarn": "", + "supportDescription": "", + "supportEmbedDescription": "", + "supportEmbedTitle": "", + "supportExtended": { + "extendedHelp": "" + } +} diff --git a/src/languages/tr-TR/commands/tags.json b/src/languages/tr-TR/commands/tags.json new file mode 100644 index 00000000000..4f58332e8f8 --- /dev/null +++ b/src/languages/tr-TR/commands/tags.json @@ -0,0 +1,40 @@ +{ + "added": "", + "contentRequired": "", + "description": "", + "edited": "", + "exists": "", + "extended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + }, + "listEmpty": "", + "nameNotAllowed": "", + "nameTooLong": "", + "notexists": "", + "permissionlevel": "", + "removed": "", + "reset": "" +} diff --git a/src/languages/tr-TR/commands/tools.json b/src/languages/tr-TR/commands/tools.json new file mode 100644 index 00000000000..07d5b874d1f --- /dev/null +++ b/src/languages/tr-TR/commands/tools.json @@ -0,0 +1,445 @@ +{ + "avatarDescription": "", + "avatarExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "avatarNone": "", + "color": "", + "colorDescription": "", + "colorExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ], + "possibleFormats": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "contentDescription": "", + "contentExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "countryDescription": "", + "countryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "countryFields": { + "other": { + "area": "", + "currencies": "", + "demonym": "" + }, + "overview": { + "capital": "", + "officialName": "", + "population": "" + } + }, + "countryTitles": { + "LANGUAGES": "", + "OTHER": "", + "OVERVIEW": "" + }, + "defineDescription": "", + "defineExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "defineNotfound": "", + "definePronounciation": "", + "defineUnknown": "", + "duckDuckGoDescription": "", + "duckDuckGoExtended": { + "extendedHelp": "", + "reminder": "" + }, + "duckDuckGoLookalso": "", + "duckDuckGoNotfound": "", + "emojiCustom": "", + "emojiDescription": "", + "emojiExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "reminder": "" + }, + "emojiInvalid": "", + "emojiTooLarge": "", + "emojiTwemoji": "", + "emotesDescription": "", + "emotesExtended": { + "extendedHelp": "" + }, + "emotesTitle": "", + "eshopDescription": "", + "eshopExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "eshopNotInDatabase": "", + "eshopPriceFree": "", + "eshopPricePaid": "", + "eshopTitles": { + "availability": "", + "categories": "", + "esrb": "", + "noCategories": "", + "nsuid": "", + "numberOfPlayers": "", + "platform": "", + "price": "", + "releaseDate": "" + }, + "horoscopeDescription": "", + "horoscopeExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "" + ] + }, + "horoscopeInvalidSunsign": "", + "horoscopeTitles": { + "dailyHoroscope": "", + "metadata": [ + "", + "", + "", + "" + ], + "metadataTitle": "" + }, + "igdbData": { + "noAgeRatings": "", + "noDevelopers": "", + "noGenres": "", + "noPlatforms": "", + "noRating": "", + "noReleaseDate": "", + "noSummary": "" + }, + "igdbDescription": "", + "igdbExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "igdbTitles": { + "ageRating": "", + "developers": "", + "genres": "", + "platform": "", + "releaseDate": "", + "userScore": "" + }, + "itunesDescription": "", + "itunesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "" + ] + }, + "itunesTitles": { + "artist": "", + "collection": "", + "collectionPrice": "", + "numberOfTracksInCollection": "", + "preview": "", + "previewLabel": "", + "primaryGenre": "", + "trackPrice": "", + "trackReleaseDate": "" + }, + "moviesData": { + "linkClickHere": "", + "movieInProduction": "", + "noGenres": "", + "none": "", + "notPartOfCollection": "", + "variableRuntime": "" + }, + "moviesDescription": "", + "moviesExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "moviesTitles": { + "collection": "", + "genres": "", + "homePage": "", + "imdbPage": "", + "releaseDate": "", + "runtime": "", + "status": "", + "userScore": "" + }, + "pollDescription": "", + "pollExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "pollReactionLimit": "", + "priceCurrency": "", + "priceCurrencyNotFound": "", + "priceDescription": "", + "priceExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "quoteDescription": "", + "quoteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ] + }, + "quoteMessage": "", + "rolesAbort": "", + "rolesAdded": "", + "rolesAuditlog": "", + "rolesListEmpty": "", + "rolesListTitle": "", + "rolesNotManageable": "", + "rolesNotPublic": "", + "rolesRemoved": "", + "showsData": { + "noGenres": "", + "unknownUserScore": "", + "variableRuntime": "" + }, + "showsDescription": "", + "showsExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "" + ] + }, + "showsTitles": { + "episodeRuntime": "", + "firstAirDate": "", + "genres": "", + "status": "", + "userScore": "" + }, + "systemTextTruncated": "", + "topInvitesDescription": "", + "topInvitesEmbedData": { + "channel": "", + "createdAt": "", + "createdAtUnknown": "", + "expiresIn": "", + "link": "", + "neverExpress": "", + "temporary": "", + "uses": "" + }, + "topInvitesExtended": { + "extendedHelp": "" + }, + "topInvitesNoInvites": "", + "topInvitesTop10InvitesFor": "", + "urbanDescription": "", + "urbanExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "urbanIndexNotfound": "", + "urbanNotFound": "", + "voteDescription": "", + "voteExtended": { + "examples": [ + "" + ] + }, + "whoisDescription": "", + "whoisExtended": { + "extendedHelp": "" + }, + "whoisMemberFields": { + "createdAt": "", + "footer": "", + "joinedUnknown": "", + "joinedWithTimestamp": "" + }, + "whoisMemberPermissions": "", + "whoisMemberPermissionsAll": "", + "whoisMemberRoles": "", + "whoisMemberRoles_plural": "", + "whoisMemberTitles": { + "createdAt": "", + "joined": "" + }, + "whoisUserFields": { + "createdAt": "", + "footer": "" + }, + "whoisUserTitles": { + "createdAt": "" + }, + "wikipediaDescription": "", + "wikipediaExtended": { + "extendedHelp": "", + "reminder": "" + }, + "wikipediaNotfound": "", + "youtubeDescription": "", + "youtubeExtended": { + "extendedHelp": "" + }, + "youtubeIndexNotfound": "", + "youtubeNotfound": "" +} diff --git a/src/languages/tr-TR/commands/twitch.json b/src/languages/tr-TR/commands/twitch.json new file mode 100644 index 00000000000..424da43f5c2 --- /dev/null +++ b/src/languages/tr-TR/commands/twitch.json @@ -0,0 +1,93 @@ +{ + "followage": "", + "followageMissingEntries": "", + "followageNotFollowing": "", + "twitchNoEntries": "", + "twitchTitles": { + "followers": "", + "views": "", + "clickToVisit": "", + "partner": "" + }, + "twitchPartnershipWithoutAffiliate": "", + "twitchAffiliateStatus": { + "affiliated": "", + "partnered": "" + }, + "twitchCreatedAt": "", + "twitchSubscriptionRequiredStreamer": "", + "twitchSubscriptionStreamerNotFound": "", + "twitchSubscriptionRequiredChannel": "", + "twitchSubscriptionRequiredStatus": "", + "twitchSubscriptionStatusValues": [ + "", + "" + ], + "twitchSubscriptionInvalidStatus": "", + "twitchSubscriptionRequiredContent": "", + "twitchSubscriptionAddDuplicated": "", + "twitchSubscriptionAddSuccessOffline": "", + "twitchSubscriptionAddSuccessLive": "", + "twitchSubscriptionRemoveStreamerNotSubscribed": "", + "twitchSubscriptionRemoveEntryNotExists": "", + "twitchSubscriptionRemoveSuccessOffline": "", + "twitchSubscriptionRemoveSuccessLive": "", + "twitchSubscriptionResetEmpty": "", + "twitchSubscriptionResetSuccess": "", + "twitchSubscriptionResetSuccess_plural": "", + "twitchSubscriptionResetStreamerNotSubscribed": "", + "twitchSubscriptionResetChannelSuccess": "", + "twitchSubscriptionResetChannelSuccess_plural": "", + "twitchSubscriptionShowStreamerNotSubscribed": "", + "twitchSubscriptionShowStatus": [ + "", + "" + ], + "twitchSubscriptionShowEmpty": "", + "twitchSubscriptionShowUnknownUser": "", + "followageDescription": "", + "followageExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchDescription": "", + "twitchExtended": { + "extendedHelp": "", + "examples": [ + "" + ] + }, + "twitchSubscriptionDescription": "", + "twitchSubscriptionExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ], + [ + "", + "" + ] + ], + "examples": [ + "", + "", + "", + "", + "", + "", + "" + ] + } +} diff --git a/src/languages/tr-TR/commands/weeb.json b/src/languages/tr-TR/commands/weeb.json new file mode 100644 index 00000000000..0c96d7e1857 --- /dev/null +++ b/src/languages/tr-TR/commands/weeb.json @@ -0,0 +1,241 @@ +{ + "wblushDescription": "", + "wblushExtended": { + "extendedHelp": "" + }, + "wcryDescription": "", + "wcryExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wcuddleDescription": "", + "wcuddleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wdanceDescription": "", + "wdanceExtended": { + "extendedHelp": "" + }, + "whugDescription": "", + "whugExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wkissDescription": "", + "wkissExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlickDescription": "", + "wlickExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wnomDescription": "", + "wnomExtended": { + "extendedHelp": "" + }, + "wnekoDescription": "", + "wnekoExtended": { + "extendedHelp": "" + }, + "wpatDescription": "", + "wpatExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wpoutDescription": "", + "wpoutExtended": { + "extendedHelp": "" + }, + "wslapDescription": "", + "wslapExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsmugDescription": "", + "wsmugExtended": { + "extendedHelp": "" + }, + "wstareDescription": "", + "wstareExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wtickleDescription": "", + "wtickleExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "weebUnavailableError": "", + "weebUnexpectedError": "", + "wbangDescription": "", + "wbangExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wbangheadDescription": "", + "wbangheadExtended": { + "extendedHelp": "" + }, + "wbiteDescription": "", + "wbiteExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wgreetDescription": "", + "wgreetExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wlewdDescription": "", + "wlewdExtended": { + "extendedHelp": "" + }, + "wpunchDescription": "", + "wpunchExtended": { + "extendedHelp": "", + "explainedUsage": [ + [ + "", + "" + ] + ], + "examples": [ + "" + ] + }, + "wsleepyDescription": "", + "wsleepyExtended": { + "extendedHelp": "" + }, + "wsmileDescription": "", + "wsmileExtended": { + "extendedHelp": "" + }, + "wthumbsupDescription": "", + "wthumbsupExtended": { + "extendedHelp": "" + }, + "wbang": "", + "wbanghead": "", + "wbite": "", + "wblush": "", + "wcry": "", + "wcuddle": "", + "wdance": "", + "wgreet": "", + "whug": "", + "wkiss": "", + "wlewd": "", + "wlick": "", + "wnom": "", + "wneko": "", + "wpat": "", + "wpout": "", + "wpunch": "", + "wslap": "", + "wsleepy": "", + "wsmile": "", + "wsmug": "", + "wstare": "", + "wthumbsup": "", + "wtickle": "" +} diff --git a/src/languages/tr-TR/errors.json b/src/languages/tr-TR/errors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/errors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/events.json b/src/languages/tr-TR/events.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/events.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/fuzzySearch.json b/src/languages/tr-TR/fuzzySearch.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/fuzzySearch.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/giveaway.json b/src/languages/tr-TR/giveaway.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/giveaway.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/globals.json b/src/languages/tr-TR/globals.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/globals.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/humanLevels.json b/src/languages/tr-TR/humanLevels.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/humanLevels.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/inhibitors.json b/src/languages/tr-TR/inhibitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/inhibitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/klasa.json b/src/languages/tr-TR/klasa.json new file mode 100644 index 00000000000..c03462ec1f5 --- /dev/null +++ b/src/languages/tr-TR/klasa.json @@ -0,0 +1,16 @@ +{ + "commandMessageMissing": "", + "commandMessageMissingOptionals": "", + "commandMessageMissingRequired": "", + "commandMessageNoMatch": "", + "messagePromptTimeout": "", + "monitorCommandHandlerAborted": "", + "monitorCommandHandlerRepeatingReprompt": "", + "monitorCommandHandlerReprompt": "", + "reactionhandlerPrompt": "", + "textPromptAbortOptions": [ + "", + "", + "" + ] +} diff --git a/src/languages/tr-TR/moderation.json b/src/languages/tr-TR/moderation.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/moderation.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/moderationActions.json b/src/languages/tr-TR/moderationActions.json new file mode 100644 index 00000000000..91de55e4047 --- /dev/null +++ b/src/languages/tr-TR/moderationActions.json @@ -0,0 +1,40 @@ +{ + "actions": { + "addRole": "", + "ban": "", + "kick": "", + "mute": "", + "removeRole": "", + "restrictedAttachment": "", + "restrictedEmbed": "", + "restrictedReact": "", + "restrictedVoice": "", + "setNickname": "", + "softban": "", + "vkick": "", + "vmute": "" + }, + "applyNoReason": "", + "applyReason": "", + "requiredMember": "", + "revokeNoReason": "", + "revokeReason": "", + "setNicknameNoReasonRemoved": "", + "setNicknameNoReasonSet": "", + "setNicknameRemoved": "", + "setNicknameSet": "", + "setupMuteExists": "", + "setupRestrictionExists": "", + "setupTooManyRoles": "", + "sharedRoleSetupAsk": "", + "sharedRoleSetupAskMultipleChannels": "", + "sharedRoleSetupAskMultipleChannelsMultiplePermissions": "", + "sharedRoleSetupAskMultiplePermissions": "", + "sharedRoleSetupExisting": "", + "sharedRoleSetupExistingName": "", + "sharedRoleSetupNew": "", + "softbanNoReason": "", + "softbanReason": "", + "unSoftbanNoReason": "", + "unSoftbanReason": "" +} diff --git a/src/languages/tr-TR/monitors.json b/src/languages/tr-TR/monitors.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/monitors.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/musicManager.json b/src/languages/tr-TR/musicManager.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/musicManager.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/notifications.json b/src/languages/tr-TR/notifications.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/notifications.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/permissions.json b/src/languages/tr-TR/permissions.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/permissions.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/promptList.json b/src/languages/tr-TR/promptList.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/promptList.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/resolvers.json b/src/languages/tr-TR/resolvers.json new file mode 100644 index 00000000000..e267ef40c8e --- /dev/null +++ b/src/languages/tr-TR/resolvers.json @@ -0,0 +1,71 @@ +{ + "boolDisabled": "", + "boolEnabled": "", + "boolFalseOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "boolTrueOptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "channelNotInGuild": "", + "channelNotInGuildSubCommand": "", + "dateSuffix": "", + "invalidBool": "", + "invalidChannel": "", + "invalidChannelName": "", + "invalidCustom": "", + "invalidDate": "", + "invalidDuration": "", + "invalidEmoji": "", + "invalidFloat": "", + "invalidGuild": "", + "invalidInt": "", + "invalidInvite": "", + "invalidLiteral": "", + "invalidLanguage": "", + "invalidMember": "", + "invalidMessage": "", + "invalidPiece": "", + "invalidRegexMatch": "", + "invalidRole": "", + "invalidRoleName": "", + "invalidSnowflake": "", + "invalidStore": "", + "invalidString": "", + "invalidTime": "", + "invalidUrl": "", + "invalidUser": "", + "invalidUsername": "", + "invalidWager": "", + "memberNameUserLeftDuringPrompt": "", + "minmaxBothExclusive": "", + "minmaxBothInclusive": "", + "minmaxExactlyExclusive": "", + "minmaxExactlyInclusive": "", + "minmaxMaxExclusive": "", + "minmaxMaxInclusive": "", + "minmaxMinExclusive": "", + "minmaxMinInclusive": "", + "multiTooFew": "", + "positiveAmount": "", + "stringSuffix": "", + "unknownChannel": "", + "unknownRole": "", + "unknownUser": "" +} diff --git a/src/languages/tr-TR/selfModeration.json b/src/languages/tr-TR/selfModeration.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/selfModeration.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/serializers.json b/src/languages/tr-TR/serializers.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/serializers.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/settings.json b/src/languages/tr-TR/settings.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/src/languages/tr-TR/settings.json @@ -0,0 +1 @@ +{} diff --git a/src/languages/tr-TR/system.json b/src/languages/tr-TR/system.json new file mode 100644 index 00000000000..aebfdff14dc --- /dev/null +++ b/src/languages/tr-TR/system.json @@ -0,0 +1,35 @@ +{ + "cannotAccessChannel": "", + "channelNotPostable": "", + "databaseError": "", + "discordAbortError": "", + "error": "", + "exceededLengthChooseOutput": "", + "exceededLengthOutput": "", + "exceededLengthOutputConsole": "", + "exceededLengthOutputConsoleWithTypeAndTime": "", + "exceededLengthOutputFile": "", + "exceededLengthOutputFileWithTypeAndTime": "", + "exceededLengthOutputHastebin": "", + "exceededLengthOutputHastebinWithTypeAndTime": "", + "exceededLengthOutputWithTypeAndTime": "", + "externalServerError": "", + "fetchBansFail": "", + "helpTitles": { + "explainedUsage": "", + "possibleFormats": "", + "examples": "", + "reminders": "" + }, + "highestRole": "", + "jumpTo": "", + "loading": ["", "", "", "", "", "", "", ""], + "messageNotFound": "", + "noResults": "", + "notEnoughParameters": "", + "parseError": "", + "pokedexExternalResource": "", + "poweredByWeebSh": "", + "prefixReminder": "", + "queryFail": "" +} diff --git a/src/lib/SkyraClient.ts b/src/lib/SkyraClient.ts index c6ccb9f39d2..18dc7335fe1 100644 --- a/src/lib/SkyraClient.ts +++ b/src/lib/SkyraClient.ts @@ -2,9 +2,9 @@ // Import all dependencies import { container } from 'tsyringe'; import { DashboardClient } from 'klasa-dashboard-hooks'; -import { KlasaClient, KlasaClientOptions, KlasaMessage } from 'klasa'; +import { KlasaClient, KlasaClientOptions } from 'klasa'; import { mergeDefault } from '@sapphire/utilities'; -import { Webhook } from 'discord.js'; +import { Message, Webhook } from 'discord.js'; // Import all structures import { GiveawayManager } from './structures/managers/GiveawayManager'; @@ -25,14 +25,14 @@ import { CLIENT_OPTIONS, ENABLE_INFLUX, VERSION, WEBHOOK_DATABASE, WEBHOOK_ERROR import './extensions'; // Import setup files -import './setup/PermissionsLevels'; -import './setup/Canvas'; +import './setup'; import { InviteStore } from './structures/InviteStore'; import { WebsocketHandler } from './websocket/WebsocketHandler'; import { AnalyticsData } from '#utils/Tracking/Analytics/structures/AnalyticsData'; import { QueueClient } from '#lib/audio'; import { GuildSettings, SettingsManager } from '#lib/database'; import { GuildMemberFetchQueue } from './discord/GuildMemberFetchQueue'; +import { I18nextHandler } from '@sapphire/plugin-i18next'; export class SkyraClient extends KlasaClient { /** @@ -101,10 +101,13 @@ export class SkyraClient extends KlasaClient { @enumerable(false) public twitch: Twitch = new Twitch(); + @enumerable(false) + public i18n: I18nextHandler = new I18nextHandler(this.options.i18n); + public websocket = new WebsocketHandler(this); public constructor() { - // @ts-expect-error 2589 https://github.com/microsoft/TypeScript/issues/34933 + // @ts-ignore Shut the fuck up TS super(mergeDefault(clientOptions, CLIENT_OPTIONS) as KlasaClientOptions); this.audio = new QueueClient(this.options.audio, (guildID, packet) => { const guild = this.guilds.cache.get(guildID); @@ -116,6 +119,7 @@ export class SkyraClient extends KlasaClient { } public async login(token?: string) { + await this.i18n.init(); await this.schedules.init(); return super.login(token); } @@ -124,7 +128,7 @@ export class SkyraClient extends KlasaClient { * Retrieves the prefix for the guild. * @param message The message that gives context. */ - public fetchPrefix(message: KlasaMessage) { + public fetchPrefix(message: Message) { if (!message.guild) return this.options.prefix; return message.guild.readSettings(GuildSettings.Prefix); } @@ -133,9 +137,8 @@ export class SkyraClient extends KlasaClient { * Retrieves the language key for the message. * @param message The message that gives context. */ - public fetchLanguage(message: KlasaMessage) { - if (!message.guild) return Promise.resolve(this.options.language ?? 'en-US'); - return message.guild.readSettings(GuildSettings.Language); + public async fetchLanguage(message: Message) { + return message.guild ? message.guild.readSettings(GuildSettings.Language) : 'en-US'; } } diff --git a/src/lib/database/entities/GiveawayEntity.ts b/src/lib/database/entities/GiveawayEntity.ts index ddeddae627c..60bdac44f6d 100644 --- a/src/lib/database/entities/GiveawayEntity.ts +++ b/src/lib/database/entities/GiveawayEntity.ts @@ -7,9 +7,9 @@ import { CLIENT_ID } from '#root/config'; import { Time } from '#utils/constants'; import { api } from '#utils/Models/Api'; import { fetchReactionUsers, resolveEmoji } from '#utils/util'; -import { RESTJSONErrorCodes } from 'discord-api-types/v6'; +import { APIEmbed, RESTJSONErrorCodes, RESTPatchAPIChannelMessageJSONBody } from 'discord-api-types/v6'; import { Client, DiscordAPIError, HTTPError, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { FetchError } from 'node-fetch'; import { BaseEntity, Check, Column, Entity, PrimaryColumn } from 'typeorm'; @@ -161,11 +161,14 @@ export class GiveawayEntity extends BaseEntity { // Skip early if it's already rendering if (this.#paused) return this; + const data = await this.getData(); + if (data === null) return this.finish(); + try { await api(this.#client) .channels(this.channelID) .messages(this.messageID!) - .patch({ data: await this.getData() }); + .patch({ data }); } catch (error) { if (error instanceof DiscordAPIError && kGiveawayBlockListEditErrors.includes(error.code)) { await this.finish(); @@ -177,27 +180,27 @@ export class GiveawayEntity extends BaseEntity { return this; } - private async getData() { + private async getData(): Promise { const { state, guild } = this; - if (!guild) return; + if (!guild) return null; - const language = await guild.fetchLanguage(); + const t = await guild.fetchT(); if (state === States.Finished) { this.#winners = await this.pickWinners(); - await this.announceWinners(language); + await this.announceWinners(t); await this.finish(); } else { this.#refreshAt = this.calculateNextRefresh(); } - const content = GiveawayEntity.getContent(state, language); - const embed = this.getEmbed(state, language); + const content = GiveawayEntity.getContent(state, t); + const embed = this.getEmbed(state, t); return { content, embed }; } - private async announceWinners(language: Language) { + private async announceWinners(t: TFunction) { const content = this.#winners - ? language.get(LanguageKeys.Giveaway.EndedMessage, { title: this.title, winners: this.#winners.map((winner) => `<@${winner}>`) }) - : language.get(LanguageKeys.Giveaway.EndedMessageNoWinner, { title: this.title }); + ? t(LanguageKeys.Giveaway.EndedMessage, { title: this.title, winners: this.#winners.map((winner) => `<@${winner}>`) }) + : t(LanguageKeys.Giveaway.EndedMessageNoWinner, { title: this.title }); try { await api(this.#client) .channels(this.channelID) @@ -207,34 +210,29 @@ export class GiveawayEntity extends BaseEntity { } } - private getEmbed(state: States, language: Language) { - const description = this.getDescription(state, language); - const footer = GiveawayEntity.getFooter(state, language); + private getEmbed(state: States, t: TFunction): APIEmbed { return new MessageEmbed() .setColor(GiveawayEntity.getColor(state)) .setTitle(this.title) - .setDescription(description) - .setFooter(footer) + .setDescription(this.getDescription(state, t)) + .setFooter(GiveawayEntity.getFooter(state, t)) .setTimestamp(this.endsAt) .toJSON(); } - private getDescription(state: States, language: Language) { + private getDescription(state: States, t: TFunction): string { switch (state) { case States.Finished: return this.#winners?.length - ? language.get(this.#winners.length === 1 ? LanguageKeys.Giveaway.Ended : LanguageKeys.Giveaway.EndedPlural, { - winners: language.list( - this.#winners.map((winner) => `<@${winner}>`), - language.get(LanguageKeys.Globals.And) - ), + ? t(LanguageKeys.Giveaway.Ended, { + winners: this.#winners.map((winner) => `<@${winner}>`), count: this.#winners.length }) - : language.get(LanguageKeys.Giveaway.EndedNoWinner); + : t(LanguageKeys.Giveaway.EndedNoWinner); case States.LastChance: - return language.get(LanguageKeys.Giveaway.Lastchance, { time: this.remaining }); + return t(LanguageKeys.Giveaway.LastChance, { time: this.remaining }); default: - return language.get(LanguageKeys.Giveaway.Duration, { time: this.remaining }); + return t(LanguageKeys.Giveaway.Duration, { time: this.remaining }); } } @@ -277,14 +275,14 @@ export class GiveawayEntity extends BaseEntity { } } - private static getContent(state: States, language: Language) { + private static getContent(state: States, t: TFunction): string { switch (state) { case States.Finished: - return language.get(LanguageKeys.Giveaway.EndedTitle); + return t(LanguageKeys.Giveaway.EndedTitle); case States.LastChance: - return language.get(LanguageKeys.Giveaway.LastchanceTitle); + return t(LanguageKeys.Giveaway.LastChanceTitle); default: - return language.get(LanguageKeys.Giveaway.Title); + return t(LanguageKeys.Giveaway.Title); } } @@ -299,7 +297,7 @@ export class GiveawayEntity extends BaseEntity { } } - private static getFooter(state: States, language: Language) { - return state === States.Running ? language.get(LanguageKeys.Giveaway.EndsAt) : language.get(LanguageKeys.Giveaway.EndedAt); + private static getFooter(state: States, t: TFunction) { + return state === States.Running ? t(LanguageKeys.Giveaway.EndsAt) : t(LanguageKeys.Giveaway.EndedAt); } } diff --git a/src/lib/database/entities/GuildEntity.ts b/src/lib/database/entities/GuildEntity.ts index 7a123950de2..a39c235d3f2 100644 --- a/src/lib/database/entities/GuildEntity.ts +++ b/src/lib/database/entities/GuildEntity.ts @@ -1,5 +1,4 @@ import { ConfigurableKey, configurableKeys } from '#lib/database/settings/ConfigurableKey'; -import { isNullish } from '#lib/misc'; import { SkyraClient } from '#lib/SkyraClient'; import { AnyObject } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; @@ -7,7 +6,8 @@ import { PREFIX } from '#root/config'; import { Time } from '#utils/constants'; import { create } from '#utils/Security/RegexCreator'; import { arrayStrictEquals } from '@sapphire/utilities'; -import { Language, RateLimitManager } from 'klasa'; +import { TFunction } from 'i18next'; +import { RateLimitManager } from 'klasa'; import { container } from 'tsyringe'; import { AfterInsert, AfterLoad, AfterRemove, AfterUpdate, BaseEntity, Check, Column, Entity, PrimaryColumn } from 'typeorm'; import { AdderManager } from '../settings/structures/AdderManager'; @@ -55,7 +55,7 @@ export class GuildEntity extends BaseEntity { public prefix = PREFIX; @ConfigurableKey({ description: LanguageKeys.Settings.Language, type: 'language' }) - @Column('varchar', { name: 'language', length: 5, default: 'en-US' }) + @Column('varchar', { name: 'language', default: 'en-US' }) public language = 'en-US'; @ConfigurableKey({ description: LanguageKeys.Settings.DisableNaturalPrefix }) @@ -736,10 +736,8 @@ export class GuildEntity extends BaseEntity { /** * Gets the [[Language]] for this entity. */ - public getLanguage(): Language { - const language = this.client.languages.get(this.language); - if (isNullish(language)) throw new Error(`${this.language} does not exist.`); - return language; + public getLanguage(): TFunction { + return this.client.i18n.fetchT(this.language); } /** diff --git a/src/lib/database/entities/ModerationEntity.ts b/src/lib/database/entities/ModerationEntity.ts index 13f937301ee..8d909d535bf 100644 --- a/src/lib/database/entities/ModerationEntity.ts +++ b/src/lib/database/entities/ModerationEntity.ts @@ -218,7 +218,7 @@ export class ModerationEntity extends BaseEntity { const before = Date.now() - Time.Minute; const type = this.typeVariation; - const checkSoftban = type === Moderation.TypeVariation.Ban; + const checkSoftBan = type === Moderation.TypeVariation.Ban; for (const entry of this.#manager.values()) { // If it's not the same user target or if it's at least 1 minute old, skip if (this.userID !== entry.userID || before > entry.createdTimestamp) continue; @@ -227,7 +227,7 @@ export class ModerationEntity extends BaseEntity { if (type === entry.typeVariation) return false; // If this log is a ban or an unban, but the user was softbanned recently, abort - if (checkSoftban && entry.type === Moderation.TypeCodes.Softban) return false; + if (checkSoftBan && entry.type === Moderation.TypeCodes.SoftBan) return false; } // For all other cases, it should send @@ -307,29 +307,35 @@ export class ModerationEntity extends BaseEntity { const [user, moderator] = await Promise.all([this.fetchUser(), this.fetchModerator()]); - const [prefix, language] = await manager.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); - const formattedDuration = this.duration - ? language.get(LanguageKeys.Commands.Moderation.ModerationLogExpiresIn, { duration: this.duration }) - : ''; - const description = language.get(LanguageKeys.Commands.Moderation.ModerationLogDescription, { - data: { - type: this.title, - userName: user.username, - userDiscriminator: user.discriminator, - userID: this.userID, - reason: this.reason!, - prefix, - caseID: this.caseID, - formattedDuration + const [prefix, t] = await manager.guild.readSettings((settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); + const formattedDuration = this.duration ? t(LanguageKeys.Commands.Moderation.ModerationLogExpiresIn, { duration: this.duration }) : ''; + const descriptionData: Moderation.ModerationManagerDescriptionData = { + type: this.title, + userName: user.username, + userDiscriminator: user.discriminator, + userID: this.userID, + reason: this.reason, + prefix, + caseID: this.caseID, + formattedDuration + }; + + const body = t(LanguageKeys.Commands.Moderation.ModerationLogDescriptionTypeAndUser, { data: descriptionData }); + const reason = t( + this.reason + ? LanguageKeys.Commands.Moderation.ModerationLogDescriptionWithReason + : LanguageKeys.Commands.Moderation.ModerationLogDescriptionWithoutReason, + { + data: descriptionData } - }); + ); const embed = new MessageEmbed() .setColor(this.color) .setAuthor(moderator.tag, moderator.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setDescription(description) + .setDescription(`${body}\n${reason}`) .setFooter( - language.get(LanguageKeys.Commands.Moderation.ModerationLogFooter, { caseID: this.caseID }), + t(LanguageKeys.Commands.Moderation.ModerationLogFooter, { caseID: this.caseID }), this.#client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) ) .setTimestamp(this.createdTimestamp); diff --git a/src/lib/database/entities/StarboardEntity.ts b/src/lib/database/entities/StarboardEntity.ts index b2307c81218..9a53b321a4d 100644 --- a/src/lib/database/entities/StarboardEntity.ts +++ b/src/lib/database/entities/StarboardEntity.ts @@ -5,12 +5,11 @@ import { StarboardManager } from '#lib/structures/managers/StarboardManager'; import { GuildMessage } from '#lib/types'; import { Events } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import { debounce } from '#utils/debounce'; import { fetchReactionUsers, getImage } from '#utils/util'; -import { cutText } from '@sapphire/utilities'; +import { cutText, debounce } from '@sapphire/utilities'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { Client, DiscordAPIError, HTTPError, MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { BaseEntity, Check, Column, Entity, PrimaryColumn } from 'typeorm'; export const kColors = [ @@ -229,7 +228,7 @@ export class StarboardEntity extends BaseEntity { /** * The embed for the message */ - private getEmbed(language: Language) { + private getEmbed(t: TFunction) { if (this.#starMessage?.embeds.length) { return this.#starMessage.embeds[0].setColor(this.color); } @@ -238,7 +237,7 @@ export class StarboardEntity extends BaseEntity { return new MessageEmbed() .setAuthor(message.author.username, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) .setColor(this.color) - .setDescription(this.getContent(language)) + .setDescription(this.getContent(t)) .setTimestamp(message.createdAt) .setImage(getImage(message)!); } @@ -246,8 +245,8 @@ export class StarboardEntity extends BaseEntity { /** * The text */ - private getContent(language: Language) { - const url = `[${language.get(LanguageKeys.Misc.JumpTo)}](${this.#message.url})`; + private getContent(t: TFunction) { + const url = `[${t(LanguageKeys.Misc.JumpTo)}](${this.#message.url})`; return `${url}\n${cutText(this.#message.content, 1800)}`; } @@ -255,7 +254,7 @@ export class StarboardEntity extends BaseEntity { * Edits the message or sends a new one if it does not exist, includes full error handling */ private async updateStarMessage(): Promise { - const [minimum, channelID, language] = await this.#message.guild.readSettings((settings) => [ + const [minimum, channelID, t] = await this.#message.guild.readSettings((settings) => [ settings[GuildSettings.Starboard.Minimum], settings[GuildSettings.Starboard.Channel], settings.getLanguage() @@ -266,7 +265,7 @@ export class StarboardEntity extends BaseEntity { const content = `${this.emoji} **${this.stars}** ${this.#message.channel as TextChannel}`; if (this.#starMessage) { try { - await this.#starMessage.edit(content, this.getEmbed(language)); + await this.#starMessage.edit(content, this.getEmbed(t)); } catch (error) { if (!(error instanceof DiscordAPIError) || !(error instanceof HTTPError)) return; @@ -281,7 +280,7 @@ export class StarboardEntity extends BaseEntity { if (!channel) return; const promise = channel - .send(content, this.getEmbed(language)) + .send(content, this.getEmbed(t)) .then((message) => { this.#starMessage = message as GuildMessage; this.starMessageID = message.id; diff --git a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts b/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts index d553e55a562..56b7d1da0c2 100644 --- a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts +++ b/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts @@ -1,6 +1,6 @@ import { INFLUX_OPTIONS, INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET } from '#root/config'; import { AnalyticsSchema } from '#utils/Tracking/Analytics/AnalyticsSchema'; -import { InfluxDB, Point, WritePrecision } from '@influxdata/influxdb-client'; +import { InfluxDB, Point } from '@influxdata/influxdb-client'; import { BucketsAPI } from '@influxdata/influxdb-client-apis'; import { readFile } from 'fs/promises'; import { join } from 'path'; @@ -20,7 +20,7 @@ export class V13MigrateAnalytics1594757329224 implements MigrationInterface { const categories = new Map(JSON.parse(await readFile(join(__dirname, CATEGORIES_FILE), 'utf-8'))); const influx = new InfluxDB(INFLUX_OPTIONS); - const writer = influx.getWriteApi(INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET, WritePrecision.s); + const writer = influx.getWriteApi(INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET, 's'); const commandUses: CommandUsageStats = await queryRunner.query(/* sql */ `SELECT * FROM command_counter`); diff --git a/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts b/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts new file mode 100644 index 00000000000..b757d7c434e --- /dev/null +++ b/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class V33LimitLessLanguageCodes1610450637243 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER language TYPE varchar`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER language TYPE varchar(5)`); + } +} diff --git a/src/lib/database/settings/Utils.ts b/src/lib/database/settings/Utils.ts index 3fdcc162b61..2a9e413b05b 100644 --- a/src/lib/database/settings/Utils.ts +++ b/src/lib/database/settings/Utils.ts @@ -13,9 +13,9 @@ export function isSchemaKey(groupOrKey: ISchemaValue): groupOrKey is SchemaKey { } export async function set(settings: GuildEntity, key: SchemaKey, value: string) { - const language = settings.getLanguage(); + const t = settings.getLanguage(); - const parsed = await key.parse(settings, language, value); + const parsed = await key.parse(settings, t, value); if (key.array) { const values = Reflect.get(settings, key.property) as any[]; const { serializer } = key; @@ -26,30 +26,30 @@ export async function set(settings: GuildEntity, key: SchemaKey, value: string) const value = Reflect.get(settings, key.property); const { serializer } = key; if (serializer.equals(value, parsed)) { - throw language.get(LanguageKeys.Settings.Gateway.DuplicateValue, { + throw t(LanguageKeys.Settings.Gateway.DuplicateValue, { path: key.name, - value: key.stringify(settings, language, parsed) + value: key.stringify(settings, t, parsed) }); } Reflect.set(settings, key.property, parsed); } - return language; + return t; } export async function remove(settings: GuildEntity, key: SchemaKey, value: string) { - const language = settings.getLanguage(); + const t = settings.getLanguage(); - const parsed = await key.parse(settings, language, value); + const parsed = await key.parse(settings, t, value); if (key.array) { const values = Reflect.get(settings, key.property) as any[]; const { serializer } = key; const index = values.findIndex((value) => serializer.equals(value, parsed)); if (index === -1) { - throw language.get(LanguageKeys.Settings.Gateway.MissingValue, { + throw t(LanguageKeys.Settings.Gateway.MissingValue, { path: key.name, - value: key.stringify(settings, language, parsed) + value: key.stringify(settings, t, parsed) }); } @@ -58,7 +58,7 @@ export async function remove(settings: GuildEntity, key: SchemaKey, value: strin Reflect.set(settings, key.property, key.default); } - return language; + return t; } export function reset(settings: GuildEntity, key: SchemaKey) { diff --git a/src/lib/database/settings/base/ISchemaValue.d.ts b/src/lib/database/settings/base/ISchemaValue.d.ts index aaa4d0c8675..2e1c2bf2a53 100644 --- a/src/lib/database/settings/base/ISchemaValue.d.ts +++ b/src/lib/database/settings/base/ISchemaValue.d.ts @@ -1,11 +1,11 @@ import type { GuildEntity } from '#lib/database/entities/GuildEntity'; import type { SchemaGroup } from '#lib/database/settings/schema/SchemaGroup'; -import type { Language } from 'klasa'; +import type { TFunction } from 'i18next'; export interface ISchemaValue { readonly type: string; readonly name: string; readonly dashboardOnly: boolean; readonly parent: SchemaGroup | null; - display(settings: GuildEntity, language: Language): string; + display(settings: GuildEntity, language: TFunction): string; } diff --git a/src/lib/database/settings/schema/SchemaGroup.ts b/src/lib/database/settings/schema/SchemaGroup.ts index 6eb695c7d7b..2be668437ab 100644 --- a/src/lib/database/settings/schema/SchemaGroup.ts +++ b/src/lib/database/settings/schema/SchemaGroup.ts @@ -3,7 +3,7 @@ import type { ISchemaValue } from '#lib/database/settings/base/ISchemaValue'; import { isNullish } from '#lib/misc'; import Collection from '@discordjs/collection'; import { codeBlock, toTitleCase } from '@sapphire/utilities'; -import type { Language } from 'klasa'; +import type { TFunction } from 'i18next'; import type { SchemaKey } from './SchemaKey'; export type NonEmptyArray = [T, ...T[]]; @@ -62,7 +62,7 @@ export class SchemaGroup extends Collection implements ISc return this.getPathArray(key.split('.') as NonEmptyArray); } - public display(settings: GuildEntity, language: Language) { + public display(settings: GuildEntity, language: TFunction) { const folders: string[] = []; const sections = new Map(); let longest = 0; diff --git a/src/lib/database/settings/schema/SchemaKey.ts b/src/lib/database/settings/schema/SchemaKey.ts index 9ea5a688fdd..b303557e45a 100644 --- a/src/lib/database/settings/schema/SchemaKey.ts +++ b/src/lib/database/settings/schema/SchemaKey.ts @@ -5,7 +5,7 @@ import { isNullish } from '#lib/misc'; import type { SkyraClient } from '#lib/SkyraClient'; import type { AnyObject, CustomGet } from '#lib/types'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; -import type { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { container } from 'tsyringe'; import type { SchemaGroup } from './SchemaGroup'; @@ -94,24 +94,24 @@ export class SchemaKey implemen return value as Serializer; } - public async parse(settings: GuildEntity, language: Language, value: string): Promise { + public async parse(settings: GuildEntity, t: TFunction, value: string): Promise { const { serializer } = this; - const context = this.getContext(settings, language); + const context = this.getContext(settings, t); const result = await serializer.parse(value, context); if (result.success) return result.value; throw result.error.message; } - public stringify(settings: GuildEntity, language: Language, value: GuildEntity[K]): string { + public stringify(settings: GuildEntity, t: TFunction, value: GuildEntity[K]): string { const { serializer } = this; - const context = this.getContext(settings, language); + const context = this.getContext(settings, t); return serializer.stringify(value, context); } - public display(settings: GuildEntity, language: Language): string { + public display(settings: GuildEntity, t: TFunction): string { const { serializer } = this; - const context = this.getContext(settings, language); + const context = this.getContext(settings, t); if (this.array) { const values = settings[this.property] as readonly any[]; @@ -121,14 +121,14 @@ export class SchemaKey implemen } const value = settings[this.property]; - return isNullish(value) ? language.get(LanguageKeys.Commands.Admin.ConfSettingNotSet) : serializer.stringify(value, context); + return isNullish(value) ? t(LanguageKeys.Commands.Admin.ConfSettingNotSet) : serializer.stringify(value, context); } - public getContext(settings: GuildEntity, language: Language): SerializerUpdateContext { + public getContext(settings: GuildEntity, language: TFunction): SerializerUpdateContext { const context: SerializerUpdateContext = { entity: settings, guild: settings.guild, - language, + t: language, entry: this }; diff --git a/src/lib/database/settings/structures/PermissionNodeManager.ts b/src/lib/database/settings/structures/PermissionNodeManager.ts index e30ebe77d19..41a5b553138 100644 --- a/src/lib/database/settings/structures/PermissionNodeManager.ts +++ b/src/lib/database/settings/structures/PermissionNodeManager.ts @@ -55,7 +55,8 @@ export class PermissionNodeManager implements IBaseManager { } else { const previous = nodes[nodeIndex]; if ((action === 'allow' && previous.allow.includes(command)) || (action === 'deny' && previous.deny.includes(command))) { - throw this.#settings.getLanguage().get(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command }); + const t = this.#settings.getLanguage(); + throw t(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command }); } const node: Node = { @@ -72,13 +73,13 @@ export class PermissionNodeManager implements IBaseManager { const key = target instanceof Role ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; const nodes = this.#settings[key]; - const language = this.#settings.getLanguage(); + const t = this.#settings.getLanguage(); const nodeIndex = nodes.findIndex((n) => n.id === target.id); - if (nodeIndex === -1) throw language.get(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); + if (nodeIndex === -1) throw t(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); const previous = nodes[nodeIndex]; const commandIndex = previous[action].indexOf(command); - if (commandIndex === -1) throw language.get(LanguageKeys.Commands.Management.PermissionNodesCommandNotExists); + if (commandIndex === -1) throw t(LanguageKeys.Commands.Management.PermissionNodesCommandNotExists); const node: Nodes[number] = { id: target.id, @@ -97,8 +98,8 @@ export class PermissionNodeManager implements IBaseManager { const nodeIndex = nodes.findIndex((n) => n.id === target.id); if (nodeIndex === -1) { - const language = this.#settings.getLanguage(); - throw language.get(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); + const t = this.#settings.getLanguage(); + throw t(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); } this.#settings[key].splice(nodeIndex, 1); diff --git a/src/lib/database/settings/structures/Serializer.ts b/src/lib/database/settings/structures/Serializer.ts index c5bd8f5fa82..542ed4e5772 100644 --- a/src/lib/database/settings/structures/Serializer.ts +++ b/src/lib/database/settings/structures/Serializer.ts @@ -3,7 +3,8 @@ import type { SchemaKey } from '#lib/database/settings/schema/SchemaKey'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import type { Awaited } from '@sapphire/utilities'; import type { Guild } from 'discord.js'; -import { AliasPiece, constants, Language, MentionRegex } from 'klasa'; +import type { TFunction } from 'i18next'; +import { AliasPiece, constants, MentionRegex } from 'klasa'; export interface Ok { success: true; @@ -75,11 +76,7 @@ export abstract class Serializer extends AliasPiece { * @param entry The schema entry that manages the key * @param language The language that is used for this context */ - protected minOrMax( - value: T, - length: number, - { entry: { minimum, maximum, inclusive, name }, language }: SerializerUpdateContext - ): SerializerResult { + protected minOrMax(value: T, length: number, { entry: { minimum, maximum, inclusive, name }, t }: SerializerUpdateContext): SerializerResult { if (minimum !== null && maximum !== null) { if ((length >= minimum && length <= maximum && inclusive) || (length > minimum && length < maximum && !inclusive)) { return this.ok(value); @@ -87,7 +84,7 @@ export abstract class Serializer extends AliasPiece { if (minimum === maximum) { return this.error( - language.get(inclusive ? LanguageKeys.Resolvers.MinmaxExactlyInclusive : LanguageKeys.Resolvers.MinmaxExactlyExclusive, { + t(inclusive ? LanguageKeys.Resolvers.MinmaxExactlyInclusive : LanguageKeys.Resolvers.MinmaxExactlyExclusive, { name, min: minimum }) @@ -95,7 +92,7 @@ export abstract class Serializer extends AliasPiece { } return this.error( - language.get(inclusive ? LanguageKeys.Resolvers.MinmaxBothInclusive : LanguageKeys.Resolvers.MinmaxBothExclusive, { + t(inclusive ? LanguageKeys.Resolvers.MinmaxBothInclusive : LanguageKeys.Resolvers.MinmaxBothExclusive, { name, min: minimum, max: maximum @@ -109,7 +106,7 @@ export abstract class Serializer extends AliasPiece { } return this.error( - language.get(inclusive ? LanguageKeys.Resolvers.MinmaxMinInclusive : LanguageKeys.Resolvers.MinmaxMinExclusive, { + t(inclusive ? LanguageKeys.Resolvers.MinmaxMinInclusive : LanguageKeys.Resolvers.MinmaxMinExclusive, { name, min: minimum }) @@ -122,7 +119,7 @@ export abstract class Serializer extends AliasPiece { } return this.error( - language.get(inclusive ? LanguageKeys.Resolvers.MinmaxMaxInclusive : LanguageKeys.Resolvers.MinmaxMaxExclusive, { + t(inclusive ? LanguageKeys.Resolvers.MinmaxMaxInclusive : LanguageKeys.Resolvers.MinmaxMaxExclusive, { name, max: maximum }) @@ -142,5 +139,5 @@ export interface SerializerUpdateContext { entry: SchemaKey; entity: GuildEntity; guild: Guild; - language: Language; + t: TFunction; } diff --git a/src/lib/database/settings/structures/Task.ts b/src/lib/database/settings/structures/Task.ts index 5d5d9a3c906..89be251b3a0 100644 --- a/src/lib/database/settings/structures/Task.ts +++ b/src/lib/database/settings/structures/Task.ts @@ -1,6 +1,6 @@ -import { Piece } from 'klasa'; import type { PartialResponseValue } from '#lib/database'; import type { Awaited } from '@sapphire/utilities'; +import { Piece } from 'klasa'; export abstract class Task extends Piece { /** diff --git a/src/lib/extensions/SkyraDMChannel.ts b/src/lib/extensions/SkyraDMChannel.ts index 430de3f6b8a..8f93ec80dfa 100644 --- a/src/lib/extensions/SkyraDMChannel.ts +++ b/src/lib/extensions/SkyraDMChannel.ts @@ -1,14 +1,14 @@ /* eslint-disable @typescript-eslint/class-literal-property-style */ -import { Structures } from 'discord.js'; -import { Language } from 'klasa'; -import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtensions'; +import { cast } from '#utils/util'; +import { Message, Structures } from 'discord.js'; +import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtension'; export class SkyraDMChannel extends TextBasedExtension(Structures.get('DMChannel')) { public async fetchLanguage() { - const languageKey = await this.client.fetchLanguage({ channel: this, guild: null }); - const language = this.client.languages.get(languageKey); - if (language) return language; - throw new Error(`The language '${language}' is not available.`); + const lang: string = await this.client.fetchLanguage( + cast({ channel: this, guild: null }) + ); + return lang ?? this.client.i18n.options?.defaultName ?? 'en-US'; } public get attachable() { @@ -30,7 +30,7 @@ export class SkyraDMChannel extends TextBasedExtension(Structures.get('DMChannel declare module 'discord.js' { export interface DMChannel extends TextBasedExtensions { - fetchLanguage(): Promise; + fetchLanguage(): Promise; readonly attachable: boolean; readonly embedable: boolean; readonly postable: boolean; diff --git a/src/lib/extensions/SkyraGuild.ts b/src/lib/extensions/SkyraGuild.ts index e5dd8f4f173..80b759ae51a 100644 --- a/src/lib/extensions/SkyraGuild.ts +++ b/src/lib/extensions/SkyraGuild.ts @@ -5,9 +5,11 @@ import { StarboardManager } from '#lib/structures/managers/StarboardManager'; import { StickyRoleManager } from '#lib/structures/managers/StickyRoleManager'; import { CustomFunctionGet, CustomGet } from '#lib/types'; import { GuildSecurity } from '#utils/Security/GuildSecurity'; +import { cast } from '#utils/util'; +import { Primitive } from '@sapphire/utilities'; import type { GatewayGuildCreateDispatch } from 'discord-api-types/v6'; -import { Guild, Structures } from 'discord.js'; -import type { Language } from 'klasa'; +import { Message, Structures } from 'discord.js'; +import { TFunction } from 'i18next'; export class SkyraGuild extends Structures.get('Guild') { public readonly security: GuildSecurity = new GuildSecurity(this); @@ -19,15 +21,19 @@ export class SkyraGuild extends Structures.get('Guild') { return this.client.audio.queues!.get(this.id); } - public fetchLanguage(this: Guild): Promise { - return this.readSettings((entity) => this.client.languages.get(entity.language)!); + public async fetchLanguage() { + const lang: string = await this.client.fetchLanguage( + cast({ guild: this, channel: null }) + ); + return lang ?? this.preferredLocale ?? this.client.i18n.options?.defaultName ?? 'en-US'; } - public fetchLocale(value: CustomGet): Promise; - public fetchLocale(value: CustomFunctionGet, args: TArgs): Promise; - public async fetchLocale(value: any, args?: any) { - const language = await this.fetchLanguage(); - return language.get(value, args); + public async fetchT(): Promise { + return this.client.i18n.fetchT(await this.fetchLanguage()); + } + + public async resolveKey(key: string, ...values: readonly any[]): Promise { + return this.client.i18n.fetchLocale(await this.fetchLanguage(), key, ...values); } public readSettings(...args: readonly [any]): Promise { @@ -48,7 +54,14 @@ declare module 'discord.js' { readonly starboard: StarboardManager; readonly moderation: ModerationManager; readonly stickyRoles: StickyRoleManager; - fetchLanguage(): Promise; + + fetchLanguage(): Promise; + fetchT(): Promise; + resolveKey(value: CustomGet): Promise; + resolveKey( + value: CustomFunctionGet, + args: TArgs + ): Promise; readSettings(paths: readonly [K1]): Promise<[T[K1]]>; readSettings(paths: readonly [K1, K2]): Promise<[T[K1], T[K2]]>; @@ -155,9 +168,6 @@ declare module 'discord.js' { writeSettings(pairs: readonly [K, T[K]][]): Promise; writeSettings(cb: SettingsCollectionCallback): Promise; - fetchLocale(value: CustomGet): Promise; - fetchLocale(value: CustomFunctionGet, args: TArgs): Promise; - _patch(data: GatewayGuildCreateDispatch['d'] & { shardID: number }): void; } } diff --git a/src/lib/extensions/SkyraMessage.ts b/src/lib/extensions/SkyraMessage.ts index 039b724906e..2660df0fde6 100644 --- a/src/lib/extensions/SkyraMessage.ts +++ b/src/lib/extensions/SkyraMessage.ts @@ -4,8 +4,7 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { sleep } from '#utils/sleep'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { Message, MessageExtendablesAskOptions, MessageOptions, Permissions, Structures, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; -import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtensions'; +import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtension'; const OPTIONS = { time: 30000, max: 1 }; const REACTIONS = { YES: '🇾', NO: '🇳' }; @@ -13,17 +12,15 @@ const REG_ACCEPT = /^y|yes?|yeah?$/i; export class SkyraMessage extends TextBasedExtension(Structures.get('Message')) { public async fetchLanguage() { - const languageKey = await this.client.fetchLanguage(this); - const language = this.client.languages.get(languageKey); - if (language) return language; - throw new Error(`The language '${language}' is not available.`); + const lang: string = await this.client.fetchLanguage(this); + return lang ?? this.guild?.preferredLocale ?? this.client.i18n.options?.defaultName ?? 'en-US'; } public async prompt(content: string, time = 30000) { const message = await this.channel.send(content); const responses = await this.channel.awaitMessages((msg) => msg.author === this.author, { time, max: 1 }); message.nuke().catch((error) => this.client.emit(Events.ApiError, error)); - if (responses.size === 0) throw await this.fetchLocale(LanguageKeys.Misc.MessagePromptTimeout); + if (responses.size === 0) throw await this.resolveKey(LanguageKeys.Misc.MessagePromptTimeout); return responses.first()!; } @@ -103,10 +100,10 @@ declare module 'discord.js' { } interface Message extends TextBasedExtensions { - fetchLanguage(): Promise; + fetchLanguage(): Promise; prompt(content: string, time?: number): Promise; - ask(options?: MessageOptions, promptOptions?: MessageExtendablesAskOptions): Promise; ask(content: string, options?: MessageOptions, promptOptions?: MessageExtendablesAskOptions): Promise; + ask(options?: MessageOptions, promptOptions?: MessageExtendablesAskOptions): Promise; alert(content: string, timer?: number): Promise; alert(content: string, options?: number | MessageOptions, timer?: number): Promise; nuke(time?: number): Promise; diff --git a/src/lib/extensions/SkyraNewsChannel.ts b/src/lib/extensions/SkyraNewsChannel.ts index 77745a64516..9754a53208d 100644 --- a/src/lib/extensions/SkyraNewsChannel.ts +++ b/src/lib/extensions/SkyraNewsChannel.ts @@ -1,13 +1,13 @@ -import { Permissions, Structures } from 'discord.js'; -import { Language } from 'klasa'; -import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtensions'; +import { cast } from '#utils/util'; +import { Message, Permissions, Structures } from 'discord.js'; +import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtension'; export class SkyraNewsChannel extends TextBasedExtension(Structures.get('NewsChannel')) { public async fetchLanguage() { - const languageKey = await this.client.fetchLanguage({ channel: this, guild: this.guild }); - const language = this.client.languages.get(languageKey); - if (language) return language; - throw new Error(`The language '${language}' is not available.`); + const lang: string = await this.client.fetchLanguage( + cast({ channel: this, guild: this.guild }) + ); + return lang ?? this.guild?.preferredLocale ?? this.client.i18n.options?.defaultName ?? 'en-US'; } public get attachable() { @@ -29,7 +29,7 @@ export class SkyraNewsChannel extends TextBasedExtension(Structures.get('NewsCha declare module 'discord.js' { export interface NewsChannel extends TextBasedExtensions { - fetchLanguage(): Promise; + fetchLanguage(): Promise; readonly attachable: boolean; readonly embedable: boolean; readonly postable: boolean; diff --git a/src/lib/extensions/SkyraTextChannel.ts b/src/lib/extensions/SkyraTextChannel.ts index 41669607ecf..9d8e1b07627 100644 --- a/src/lib/extensions/SkyraTextChannel.ts +++ b/src/lib/extensions/SkyraTextChannel.ts @@ -1,10 +1,17 @@ +import { cast } from '#utils/util'; import { Message, Permissions, Structures, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; -import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtensions'; +import { TextBasedExtension, TextBasedExtensions } from './base/TextBasedExtension'; const snipes = new WeakMap(); export class SkyraTextChannel extends TextBasedExtension(Structures.get('TextChannel')) { + public async fetchLanguage() { + const lang: string = await this.client.fetchLanguage( + cast({ channel: this, guild: this.guild }) + ); + return lang ?? this.guild?.preferredLocale ?? this.client.i18n.options?.defaultName ?? 'en-US'; + } + public set sniped(value: Message | null) { const previous = snipes.get(this); if (typeof previous !== 'undefined') this.client.clearTimeout(previous.timeout); @@ -25,13 +32,6 @@ export class SkyraTextChannel extends TextBasedExtension(Structures.get('TextCha return typeof current === 'undefined' ? null : current.message; } - public async fetchLanguage() { - const languageKey = await this.client.fetchLanguage({ channel: this, guild: this.guild }); - const language = this.client.languages.get(languageKey); - if (language) return language; - throw new Error(`The language '${language}' is not available.`); - } - public get attachable() { return this.postable && this.permissionsFor(this.guild.me!)!.has(Permissions.FLAGS.ATTACH_FILES, false); } @@ -56,7 +56,7 @@ export interface SnipedMessage { declare module 'discord.js' { export interface TextChannel extends TextBasedExtensions { - fetchLanguage(): Promise; + fetchLanguage(): Promise; sniped: Message | null; readonly attachable: boolean; readonly embedable: boolean; diff --git a/src/lib/extensions/base/TextBasedExtension.ts b/src/lib/extensions/base/TextBasedExtension.ts new file mode 100644 index 00000000000..a402cf81586 --- /dev/null +++ b/src/lib/extensions/base/TextBasedExtension.ts @@ -0,0 +1,78 @@ +import { CustomFunctionGet, CustomGet, NonNullObject } from '#lib/types'; +import { Primitive } from '@sapphire/utilities'; +import { Client, Constructable, Message, MessageAdditions, MessageOptions, PartialTextBasedChannelFields, SplitOptions } from 'discord.js'; +import { TFunction } from 'i18next'; + +export interface ISendable { + client: Client; + send: PartialTextBasedChannelFields['send']; + fetchLanguage(): Promise; +} + +export function TextBasedExtension(Ctor: Constructable) { + // @ts-expect-error: Dumb TypeScript error + return class extends Ctor { + public async fetchT(): Promise { + return this.client.i18n.fetchT(await this.fetchLanguage()); + } + + public async resolveKey(key: string, ...values: readonly any[]): Promise { + return this.client.i18n.fetchLocale(await this.fetchLanguage(), key, ...values); + } + + public sendTranslated( + key: string, + values?: readonly unknown[], + options?: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions + ): Promise; + + public sendTranslated( + key: string, + values?: readonly unknown[], + options?: MessageOptions & { split: true | SplitOptions } + ): Promise; + + public sendTranslated(key: string, options?: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions): Promise; + public sendTranslated(key: string, options?: MessageOptions & { split: true | SplitOptions }): Promise; + public async sendTranslated( + key: string, + valuesOrOptions?: readonly unknown[] | MessageOptions | MessageAdditions, + rawOptions?: MessageOptions + ): Promise { + const [values, options]: [readonly unknown[], MessageOptions] = + valuesOrOptions === undefined || Array.isArray(valuesOrOptions) + ? [valuesOrOptions ?? [], rawOptions ?? {}] + : [[], valuesOrOptions as MessageOptions]; + return this.send(await this.resolveKey(key, ...values), options); + } + }; +} + +export interface TextBasedExtensions { + fetchT(): Promise; + + resolveKey(value: CustomGet): Promise; + resolveKey( + value: CustomFunctionGet, + args: TArgs + ): Promise; + + sendTranslated( + key: CustomFunctionGet, + values: [TArgs], + options?: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions + ): Promise; + sendTranslated( + key: CustomFunctionGet, + values: [TArgs], + options?: MessageOptions & { split: true | SplitOptions } + ): Promise; + sendTranslated( + key: CustomGet, + options?: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions + ): Promise; + sendTranslated( + key: CustomGet, + options?: MessageOptions & { split: true | SplitOptions } + ): Promise; +} diff --git a/src/lib/extensions/base/TextBasedExtensions.ts b/src/lib/extensions/base/TextBasedExtensions.ts deleted file mode 100644 index b3d6d4f594d..00000000000 --- a/src/lib/extensions/base/TextBasedExtensions.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { CustomFunctionGet, CustomGet, NonNullObject } from '#lib/types'; -import { APIMessage, Constructable, Message, MessageAdditions, MessageOptions, PartialTextBasedChannelFields, SplitOptions } from 'discord.js'; -import { Language } from 'klasa'; - -export interface ISendable { - send: PartialTextBasedChannelFields['send']; - fetchLanguage(): Promise; -} - -export function TextBasedExtension(Ctor: Constructable) { - // @ts-expect-error: Dumb TypeScript error - return class extends Ctor { - public async fetchLocale(key: string, ...localeArgs: readonly unknown[]) { - const language = await this.fetchLanguage(); - // @ts-expect-error: Some weird type error here - return language.get(key as any, ...localeArgs); - } - - public sendLocale(key: CustomGet, options?: MessageOptions | MessageAdditions): Promise; - public sendLocale( - key: CustomGet, - options?: (MessageOptions & { split?: false }) | MessageAdditions - ): Promise; - - public sendLocale( - key: CustomGet, - options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions - ): Promise; - - public sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - options?: MessageOptions | MessageAdditions - ): Promise; - - public sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - options?: (MessageOptions & { split?: false }) | MessageAdditions - ): Promise; - - public sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions - ): Promise; - - public async sendLocale(key: string, args: any = [], options: any = {}) { - if (!Array.isArray(args)) [options, args] = [args, []]; - // @ts-expect-error: Some weird type error here - return this.send(APIMessage.transformOptions(await this.fetchLocale(key, ...args), undefined, options)) as Promise; - } - }; -} - -export interface TextBasedExtensions { - fetchLocale(value: CustomGet): Promise; - fetchLocale(value: CustomFunctionGet, args: TArgs): Promise; - sendLocale(key: CustomGet, options?: MessageOptions | MessageAdditions): Promise; - sendLocale( - key: CustomGet, - // eslint-disable-next-line @typescript-eslint/unified-signatures - options?: (MessageOptions & { split?: false }) | MessageAdditions - ): Promise; - sendLocale( - key: CustomGet, - options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions - ): Promise; - sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - options?: MessageOptions | MessageAdditions - ): Promise; - sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - // eslint-disable-next-line @typescript-eslint/unified-signatures - options?: (MessageOptions & { split?: false }) | MessageAdditions - ): Promise; - sendLocale( - key: CustomFunctionGet, - localeArgs: [TArgs], - options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions - ): Promise; -} diff --git a/src/lib/games/base/BaseGame.ts b/src/lib/games/base/BaseGame.ts index e15e37e53c2..000d5e6fc60 100644 --- a/src/lib/games/base/BaseGame.ts +++ b/src/lib/games/base/BaseGame.ts @@ -1,5 +1,5 @@ import type { Client, Message } from 'discord.js'; -import type { Language } from 'klasa'; +import { TFunction } from 'i18next'; import type { BaseController } from './BaseController'; export const enum GameTurn { @@ -15,14 +15,13 @@ export const enum GameStatus { export abstract class BaseGame { public message: Message; - public language: Language; + public t: TFunction = null!; public readonly playerA: BaseController; public readonly playerB: BaseController; public turn: GameTurn; public constructor(message: Message, playerA: BaseController, playerB: BaseController, turn = BaseGame.getTurn()) { this.message = message; - this.language = message.client.languages.default; this.playerA = playerA.setTurn(GameTurn.PlayerA).setGame(this); this.playerB = playerB.setTurn(GameTurn.PlayerB).setGame(this); this.turn = turn; @@ -39,8 +38,8 @@ export abstract class BaseGame { } public async run() { + this.t = await this.message.fetchT(); await this.onStart(); - this.language = await this.message.fetchLanguage(); while (true) { // Read player's move: diff --git a/src/lib/games/base/BaseReactionGame.ts b/src/lib/games/base/BaseReactionGame.ts index 67d83f62438..e15de03314d 100644 --- a/src/lib/games/base/BaseReactionGame.ts +++ b/src/lib/games/base/BaseReactionGame.ts @@ -27,10 +27,10 @@ export abstract class BaseReactionGame extends BaseGame { protected async onStart(): Promise { try { - this.message = await this.message.send(pickRandom(this.language.get(LanguageKeys.System.Loading))); + this.message = await this.message.send(pickRandom(this.t(LanguageKeys.System.Loading))); for (const reaction of this.reactions) await this.message.react(reaction); } catch { - await this.message.sendLocale(LanguageKeys.Misc.UnexpectedIssue).catch((error) => this.client.emit(Events.ApiError, error)); + await this.message.sendTranslated(LanguageKeys.Misc.UnexpectedIssue).catch((error) => this.client.emit(Events.ApiError, error)); } return super.onStart(); diff --git a/src/lib/games/tic-tac-toe/TicTacToeGame.ts b/src/lib/games/tic-tac-toe/TicTacToeGame.ts index 9869ce36834..a0cc38c1472 100644 --- a/src/lib/games/tic-tac-toe/TicTacToeGame.ts +++ b/src/lib/games/tic-tac-toe/TicTacToeGame.ts @@ -27,15 +27,15 @@ export class TicTacToeGame extends BaseReactionGame { protected renderOnEnd() { const winner = this.check(); return winner === null - ? this.language.get(LanguageKeys.Commands.Games.TicTacToeDraw, { board: this.renderBoard() }) - : this.language.get(LanguageKeys.Commands.Games.TicTacToeWinner, { + ? this.t(LanguageKeys.Commands.Games.TicTacToeDraw, { board: this.renderBoard() }) + : this.t(LanguageKeys.Commands.Games.TicTacToeWinner, { winner: this.player.name, board: this.renderBoard() }); } protected renderOnUpdateOrStart(): string { - return this.language.get(LanguageKeys.Commands.Games.TicTacToeTurn, { + return this.t(LanguageKeys.Commands.Games.TicTacToeTurn, { icon: TicTacToeGame.kPlayer[this.turn], player: this.player.name, board: this.renderBoard() diff --git a/src/lib/setup/index.ts b/src/lib/setup/index.ts new file mode 100644 index 00000000000..d1c9e35fedb --- /dev/null +++ b/src/lib/setup/index.ts @@ -0,0 +1,2 @@ +import './Canvas'; +import './PermissionsLevels'; diff --git a/src/lib/structures/ChannelConfigurationCommand.ts b/src/lib/structures/ChannelConfigurationCommand.ts index f2de80a2cb4..752a1e753c7 100644 --- a/src/lib/structures/ChannelConfigurationCommand.ts +++ b/src/lib/structures/ChannelConfigurationCommand.ts @@ -34,20 +34,20 @@ export class ChannelConfigurationCommand extends SkyraCommand { if (channel === 'here') channel = message.channel as TextChannel; const channelID = channel.id; - const language = await message.guild.writeSettings((settings) => { - const language = settings.getLanguage(); + const t = await message.guild.writeSettings((settings) => { + const t = settings.getLanguage(); // If it's the same value, throw: if (settings[this.settingsKey] === channelID) { - throw language.get(LanguageKeys.Misc.ConfigurationEquals); + throw t(LanguageKeys.Misc.ConfigurationEquals); } // Else set the new value: settings[this.settingsKey] = channelID; - return language; + return t; }); - return message.send(language.get(this.responseKey, { channel: channel.toString() })); + return message.send(t(this.responseKey, { channel: channel.toString() })); } } diff --git a/src/lib/structures/ModerationCommand.ts b/src/lib/structures/ModerationCommand.ts index 3e94262d988..3c2a0a4100c 100644 --- a/src/lib/structures/ModerationCommand.ts +++ b/src/lib/structures/ModerationCommand.ts @@ -7,7 +7,8 @@ import { ModerationActionsSendOptions } from '#utils/Security/ModerationActions' import { cast, floatPromise } from '#utils/util'; import { isNullOrUndefined } from '@sapphire/utilities'; import { User } from 'discord.js'; -import { CommandStore, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { CommandStore } from 'klasa'; import { DbSet } from '../database/structures/DbSet'; import { SkyraCommand, SkyraCommandOptions } from './SkyraCommand'; @@ -53,7 +54,7 @@ export abstract class ModerationCommand extends SkyraCommand { const processed = [] as Array<{ log: ModerationEntity; target: User }>; const errored = [] as Array<{ error: Error | string; target: User }>; - const [shouldAutoDelete, shouldDisplayMessage, shouldDisplayReason, language] = await message.guild.readSettings((settings) => [ + const [shouldAutoDelete, shouldDisplayMessage, shouldDisplayReason, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Messages.ModerationAutoDelete], settings[GuildSettings.Messages.ModerationMessageDisplay], settings[GuildSettings.Messages.ModerationReasonDisplay], @@ -64,7 +65,7 @@ export abstract class ModerationCommand extends SkyraCommand { for (const target of new Set(targets)) { try { const handled = { ...handledRaw, target, preHandled }; - await this.checkModeratable(message, language, handled); + await this.checkModeratable(message, t, handled); const log = await this.handle(message, handled); processed.push({ log, target }); } catch (error) { @@ -92,17 +93,13 @@ export abstract class ModerationCommand extends SkyraCommand { const users = sorted.map(({ target }) => `\`${target.tag}\``); const range = cases.length === 1 ? cases[0] : `${cases[0]}..${cases[cases.length - 1]}`; const langKey = logReason - ? cases.length === 1 - ? LanguageKeys.Commands.Moderation.ModerationOutputWithReason - : LanguageKeys.Commands.Moderation.ModerationOutputWithReasonPlural - : cases.length === 1 - ? LanguageKeys.Commands.Moderation.ModerationOutput - : LanguageKeys.Commands.Moderation.ModerationOutputPlural; + ? LanguageKeys.Commands.Moderation.ModerationOutputWithReason + : LanguageKeys.Commands.Moderation.ModerationOutput; output.push( - language.get(langKey, { + t(langKey, { count: cases.length, range, - users: language.list(users, language.get(LanguageKeys.Globals.And)), + users, reason: logReason }) ); @@ -111,15 +108,10 @@ export abstract class ModerationCommand extends SkyraCommand { if (errored.length) { const users = errored.map(({ error, target }) => `- ${target.tag} → ${typeof error === 'string' ? error : error.message}`); output.push( - language.get( - users.length === 1 - ? LanguageKeys.Commands.Moderation.ModerationFailed - : LanguageKeys.Commands.Moderation.ModerationFailedPlural, - { - users: language.list(users, language.get(LanguageKeys.Globals.And)), - count: users.length - } - ) + t(LanguageKeys.Commands.Moderation.ModerationFailed, { + users, + count: users.length + }) ); } @@ -140,24 +132,24 @@ export abstract class ModerationCommand extends SkyraCommand { return null; } - protected async checkModeratable(message: GuildMessage, language: Language, context: HandledCommandContext) { + protected async checkModeratable(message: GuildMessage, t: TFunction, context: HandledCommandContext) { if (context.target.id === message.author.id) { - throw language.get(LanguageKeys.Misc.CommandUserself); + throw t(LanguageKeys.Commands.Moderation.UserSelf); } if (context.target.id === CLIENT_ID) { - throw language.get(LanguageKeys.Misc.CommandToskyra); + throw t(LanguageKeys.Commands.Moderation.ToSkyra); } const member = await message.guild.members.fetch(context.target.id).catch(() => { - if (this.requiredMember) throw language.get(LanguageKeys.Misc.UserNotInGuild); + if (this.requiredMember) throw t(LanguageKeys.Misc.UserNotInGuild); return null; }); if (member) { const targetHighestRolePosition = member.roles.highest.position; - if (targetHighestRolePosition >= message.guild.me!.roles.highest.position) throw language.get(LanguageKeys.Misc.CommandRoleHigherSkyra); - if (targetHighestRolePosition >= message.member.roles.highest.position) throw language.get(LanguageKeys.Misc.CommandRoleHigher); + if (targetHighestRolePosition >= message.guild.me!.roles.highest.position) throw t(LanguageKeys.Commands.Moderation.RoleHigherSkyra); + if (targetHighestRolePosition >= message.member.roles.highest.position) throw t(LanguageKeys.Commands.Moderation.RoleHigher); } return member; diff --git a/src/lib/structures/ModerationMonitor.ts b/src/lib/structures/ModerationMonitor.ts index cd754739d12..94f43c5ad5a 100644 --- a/src/lib/structures/ModerationMonitor.ts +++ b/src/lib/structures/ModerationMonitor.ts @@ -7,7 +7,8 @@ import { MessageLogsEnum } from '#utils/constants'; import { floatPromise } from '#utils/util'; import { Awaited } from '@sapphire/utilities'; import { GuildMember, MessageEmbed, TextChannel } from 'discord.js'; -import { KlasaMessage, Language, Monitor } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage, Monitor } from 'klasa'; import { SelfModeratorBitField, SelfModeratorHardActionFlags } from './SelfModeratorBitField'; export abstract class ModerationMonitor extends Monitor { @@ -52,7 +53,7 @@ export abstract class ModerationMonitor extends Monitor { ); } - protected processSoftPunishment(message: GuildMessage, language: Language, bitField: SelfModeratorBitField, preProcessed: T) { + protected processSoftPunishment(message: GuildMessage, language: TFunction, bitField: SelfModeratorBitField, preProcessed: T) { if (bitField.has(SelfModeratorBitField.FLAGS.DELETE) && message.deletable) { floatPromise(this, this.onDelete(message, language, preProcessed) as any); } @@ -66,7 +67,7 @@ export abstract class ModerationMonitor extends Monitor { } } - protected async processHardPunishment(message: GuildMessage, language: Language, points: number, maximum: number) { + protected async processHardPunishment(message: GuildMessage, language: TFunction, points: number, maximum: number) { const [action, duration] = await message.guild.readSettings([this.hardPunishmentPath.action, this.hardPunishmentPath.actionDuration]); switch (action) { case SelfModeratorHardActionFlags.Warning: @@ -87,73 +88,58 @@ export abstract class ModerationMonitor extends Monitor { } } - protected async onWarning(message: GuildMessage, language: Language, points: number, maximum: number, duration: number | null) { + protected async onWarning(message: GuildMessage, t: TFunction, points: number, maximum: number, duration: number | null) { await this.createActionAndSend(message, () => message.guild.security.actions.warning({ userID: message.author.id, moderatorID: CLIENT_ID, - reason: - maximum === 0 - ? language.get(this.reasonLanguageKey) - : language.get(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), + reason: maximum === 0 ? t(this.reasonLanguageKey) : t(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), duration }) ); } - protected async onKick(message: GuildMessage, language: Language, points: number, maximum: number) { + protected async onKick(message: GuildMessage, t: TFunction, points: number, maximum: number) { await this.createActionAndSend(message, () => message.guild.security.actions.kick({ userID: message.author.id, moderatorID: CLIENT_ID, - reason: - maximum === 0 - ? language.get(this.reasonLanguageKey) - : language.get(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }) + reason: maximum === 0 ? t(this.reasonLanguageKey) : t(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }) }) ); } - protected async onMute(message: GuildMessage, language: Language, points: number, maximum: number, duration: number | null) { + protected async onMute(message: GuildMessage, t: TFunction, points: number, maximum: number, duration: number | null) { await this.createActionAndSend(message, () => message.guild.security.actions.mute({ userID: message.author.id, moderatorID: CLIENT_ID, - reason: - maximum === 0 - ? language.get(this.reasonLanguageKey) - : language.get(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), + reason: maximum === 0 ? t(this.reasonLanguageKey) : t(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), duration }) ); } - protected async onSoftBan(message: GuildMessage, language: Language, points: number, maximum: number) { + protected async onSoftBan(message: GuildMessage, t: TFunction, points: number, maximum: number) { await this.createActionAndSend(message, () => message.guild.security.actions.softBan( { userID: message.author.id, moderatorID: CLIENT_ID, - reason: - maximum === 0 - ? language.get(this.reasonLanguageKey) - : language.get(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }) + reason: maximum === 0 ? t(this.reasonLanguageKey) : t(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }) }, 1 ) ); } - protected async onBan(message: GuildMessage, language: Language, points: number, maximum: number, duration: number | null) { + protected async onBan(message: GuildMessage, t: TFunction, points: number, maximum: number, duration: number | null) { await this.createActionAndSend(message, () => message.guild.security.actions.ban( { userID: message.author.id, moderatorID: CLIENT_ID, - reason: - maximum === 0 - ? language.get(this.reasonLanguageKey) - : language.get(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), + reason: maximum === 0 ? t(this.reasonLanguageKey) : t(this.reasonLanguageKeyWithMaximum, { amount: points, maximum }), duration }, 0 @@ -167,7 +153,7 @@ export abstract class ModerationMonitor extends Monitor { unlock(); } - protected onLog(message: GuildMessage, language: Language, value: T): Awaited { + protected onLog(message: GuildMessage, language: TFunction, value: T): Awaited { this.client.emit(Events.GuildMessageLog, MessageLogsEnum.Moderation, message.guild, this.onLogMessage.bind(this, message, language, value)); } @@ -181,9 +167,9 @@ export abstract class ModerationMonitor extends Monitor { protected abstract reasonLanguageKeyWithMaximum: CustomFunctionGet; protected abstract preProcess(message: GuildMessage): Promise | T | null; - protected abstract onDelete(message: GuildMessage, language: Language, value: T): Awaited; - protected abstract onAlert(message: GuildMessage, language: Language, value: T): Awaited; - protected abstract onLogMessage(message: GuildMessage, language: Language, value: T): Awaited; + protected abstract onDelete(message: GuildMessage, language: TFunction, value: T): Awaited; + protected abstract onAlert(message: GuildMessage, language: TFunction, value: T): Awaited; + protected abstract onLogMessage(message: GuildMessage, language: TFunction, value: T): Awaited; private checkPreRun(message: GuildMessage) { return message.guild.readSettings( diff --git a/src/lib/structures/MusicCommand.ts b/src/lib/structures/MusicCommand.ts index 0f211a9b875..e9f3202c505 100644 --- a/src/lib/structures/MusicCommand.ts +++ b/src/lib/structures/MusicCommand.ts @@ -3,7 +3,7 @@ import { CommandStore } from 'klasa'; import { SkyraCommand, SkyraCommandOptions } from './SkyraCommand'; export abstract class MusicCommand extends SkyraCommand { - protected constructor(store: CommandStore, file: string[], directory: string, options: MusicCommand.Options = {}) { + protected constructor(store: CommandStore, file: string[], directory: string, options: MusicCommand.Options) { super(store, file, directory, { ...options, runIn: ['text'] }); } diff --git a/src/lib/structures/RichDisplayCommand.ts b/src/lib/structures/RichDisplayCommand.ts index 62c7e46471d..04bd6bb1fce 100644 --- a/src/lib/structures/RichDisplayCommand.ts +++ b/src/lib/structures/RichDisplayCommand.ts @@ -4,7 +4,7 @@ import { CommandStore } from 'klasa'; import { SkyraCommand, SkyraCommandOptions } from './SkyraCommand'; export abstract class RichDisplayCommand extends SkyraCommand { - public constructor(store: CommandStore, file: string[], directory: string, options: SkyraCommandOptions = {}) { + public constructor(store: CommandStore, file: string[], directory: string, options: SkyraCommandOptions) { super(store, file, directory, { // Merge in all given options ...options, diff --git a/src/lib/structures/SelfModerationCommand.ts b/src/lib/structures/SelfModerationCommand.ts index 66d919c8378..2e75f6c23b8 100644 --- a/src/lib/structures/SelfModerationCommand.ts +++ b/src/lib/structures/SelfModerationCommand.ts @@ -3,9 +3,11 @@ import { GuildMessage } from '#lib/types'; import { PermissionLevels } from '#lib/types/Enums'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import type { KeyOfType } from '#lib/types/Utils'; -import { Command, CommandOptions, CommandStore, Duration, Language } from 'klasa'; -import { SelfModeratorBitField, SelfModeratorHardActionFlags } from './SelfModeratorBitField'; import { codeBlock } from '@sapphire/utilities'; +import { TFunction } from 'i18next'; +import { CommandStore, Duration } from 'klasa'; +import { SelfModeratorBitField, SelfModeratorHardActionFlags } from './SelfModeratorBitField'; +import { SkyraCommand, SkyraCommandOptions } from './SkyraCommand'; export enum AKeys { Enable, @@ -81,8 +83,8 @@ export const kHardActions = new Map([ ['ban', SelfModeratorHardActionFlags.Ban] ]); -export abstract class SelfModerationCommand extends Command { - protected constructor(store: CommandStore, file: string[], directory: string, options: CommandOptions = {}) { +export abstract class SelfModerationCommand extends SkyraCommand { + protected constructor(store: CommandStore, file: string[], directory: string, options: SkyraCommandOptions) { super(store, file, directory, { cooldown: 5, permissionLevel: PermissionLevels.Administrator, @@ -96,7 +98,7 @@ export abstract class SelfModerationCommand extends Command { if (typeof arg === 'undefined') return AKeys.Show; const action = kActions.get(arg.toLowerCase()); if (typeof action === 'undefined') { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidMissingAction, { name: this.name }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidMissingAction, { name: this.name }); } return action; @@ -105,13 +107,13 @@ export abstract class SelfModerationCommand extends Command { if (type === AKeys.Disable) return false; if (type === AKeys.Show) return null; if (!arg) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidMissingArguments, { name: this.name }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidMissingArguments, { name: this.name }); } if (type === AKeys.SoftAction) { const softAction = kSoftActions.get(arg.toLowerCase()); if (typeof softAction === 'undefined') { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidSoftaction, { name: this.name }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidSoftAction, { name: this.name }); } const previousSoftAction = await message.guild!.readSettings(this.keySoftAction); @@ -121,7 +123,7 @@ export abstract class SelfModerationCommand extends Command { if (type === AKeys.HardAction) { const hardAction = kHardActions.get(arg.toLowerCase()); if (typeof hardAction === 'undefined') { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidHardaction, { name: this.name }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticParameterInvalidHardAction, { name: this.name }); } return hardAction; @@ -151,18 +153,18 @@ export abstract class SelfModerationCommand extends Command { if (action === AKeys.Show) return this.show(message); const key = this.getProperty(action)!; - const language = await message.guild.writeSettings((settings) => { + const t = await message.guild.writeSettings((settings) => { Reflect.set(settings, key, value); return settings.getLanguage(); }); switch (action) { case AKeys.SoftAction: { - value = SelfModerationCommand.displaySoftAction(language, value as number).join('`, `'); + value = SelfModerationCommand.displaySoftAction(t, value as number).join('`, `'); break; } case AKeys.HardAction: { - value = language.get(SelfModerationCommand.displayHardAction(value as SelfModeratorHardActionFlags)); + value = t(SelfModerationCommand.displayHardAction(value as SelfModeratorHardActionFlags)); break; } case AKeys.Enable: @@ -173,11 +175,11 @@ export abstract class SelfModerationCommand extends Command { break; } - return message.send(SelfModerationCommand.getLanguageKey(language, action, value)); + return message.send(SelfModerationCommand.getLanguageKey(t, action, value)); } protected async show(message: GuildMessage) { - const [enabled, softAction, hardAction, hardActionDuration, adder, language] = await message.guild.readSettings((settings) => [ + const [enabled, softAction, hardAction, hardActionDuration, adder, t] = await message.guild.readSettings((settings) => [ settings[this.keyEnabled], settings[this.keySoftAction], settings[this.keyHardAction], @@ -186,27 +188,26 @@ export abstract class SelfModerationCommand extends Command { settings.getLanguage() ]); - const i18n = language.get.bind(language); - const duration = language.duration.bind(language); - const [yes, no] = [i18n(LanguageKeys.Resolvers.BoolEnabled), i18n(LanguageKeys.Resolvers.BoolDisabled)]; + const [yes, no] = [t(LanguageKeys.Resolvers.BoolEnabled), t(LanguageKeys.Resolvers.BoolDisabled)]; return message.send( codeBlock( 'prolog', - i18n(LanguageKeys.Commands.Moderation.AutomaticParameterShow, { + t(LanguageKeys.Commands.Moderation.AutomaticParameterShow, { kEnabled: enabled ? yes : no, kAlert: SelfModerationCommand.has(softAction, ASKeys.Alert) ? yes : no, kLog: SelfModerationCommand.has(softAction, ASKeys.Log) ? yes : no, kDelete: SelfModerationCommand.has(softAction, ASKeys.Delete) ? yes : no, - kHardAction: i18n(SelfModerationCommand.displayHardAction(hardAction)), + kHardAction: t(SelfModerationCommand.displayHardAction(hardAction)), hardActionDurationText: hardActionDuration === null - ? i18n(LanguageKeys.Commands.Moderation.AutomaticParameterShowDurationPermanent) - : duration(hardActionDuration), - thresholdMaximumText: adder?.maximum ? adder.maximum : i18n(LanguageKeys.Commands.Moderation.AutomaticParameterShowUnset), + ? t(LanguageKeys.Commands.Moderation.AutomaticParameterShowDurationPermanent) + : t(LanguageKeys.Globals.DurationValue, { value: hardActionDuration }), + thresholdMaximumText: adder?.maximum ? adder.maximum : t(LanguageKeys.Commands.Moderation.AutomaticParameterShowUnset), thresholdDurationText: adder?.duration - ? duration(adder.duration) - : i18n(LanguageKeys.Commands.Moderation.AutomaticParameterShowUnset) - }).join('\n') + ? t(LanguageKeys.Globals.DurationValue, { value: adder.duration }) + : t(LanguageKeys.Commands.Moderation.AutomaticParameterShowUnset), + joinArrays: '\n' + }) ) ); } @@ -231,44 +232,41 @@ export abstract class SelfModerationCommand extends Command { } } - private static displaySoftAction(language: Language, softAction: number) { + private static displaySoftAction(t: TFunction, softAction: number) { const actions: string[] = []; - if (SelfModerationCommand.has(softAction, ASKeys.Alert)) - actions.push(language.get(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionAlert)); - if (SelfModerationCommand.has(softAction, ASKeys.Log)) - actions.push(language.get(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionLog)); - if (SelfModerationCommand.has(softAction, ASKeys.Delete)) - actions.push(language.get(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionDelete)); + if (SelfModerationCommand.has(softAction, ASKeys.Alert)) actions.push(t(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionAlert)); + if (SelfModerationCommand.has(softAction, ASKeys.Log)) actions.push(t(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionLog)); + if (SelfModerationCommand.has(softAction, ASKeys.Delete)) actions.push(t(LanguageKeys.Commands.Moderation.AutomaticValueSoftActionDelete)); return actions; } - private static getLanguageKey(language: Language, action: AKeys, value: unknown) { + private static getLanguageKey(t: TFunction, action: AKeys, value: unknown) { switch (action) { case AKeys.Enable: - return language.get(LanguageKeys.Commands.Moderation.AutomaticParameterEnabled); + return t(LanguageKeys.Commands.Moderation.AutomaticParameterEnabled); case AKeys.Disable: - return language.get(LanguageKeys.Commands.Moderation.AutomaticParameterDisabled); + return t(LanguageKeys.Commands.Moderation.AutomaticParameterDisabled); case AKeys.SoftAction: { return value - ? language.get(LanguageKeys.Commands.Moderation.AutomaticParameterSoftActionWithValue, { value: value as string }) - : language.get(LanguageKeys.Commands.Moderation.AutomaticParameterSoftAction); + ? t(LanguageKeys.Commands.Moderation.AutomaticParameterSoftActionWithValue, { value: value as string }) + : t(LanguageKeys.Commands.Moderation.AutomaticParameterSoftAction); } case AKeys.HardAction: - return language.get(LanguageKeys.Commands.Moderation.AutomaticParameterHardAction, { value: value as string }); + return t(LanguageKeys.Commands.Moderation.AutomaticParameterHardAction, { value: value as string }); case AKeys.HardActionDuration: { return value - ? language.get(LanguageKeys.Commands.Moderation.AutomaticParameterHardActionDurationWithValue, { value: value as number }) - : language.get(LanguageKeys.Commands.Moderation.AutomaticParameterHardActionDuration); + ? t(LanguageKeys.Commands.Moderation.AutomaticParameterHardActionDurationWithValue, { value: value as number }) + : t(LanguageKeys.Commands.Moderation.AutomaticParameterHardActionDuration); } case AKeys.ThresholdMaximum: { return value - ? language.get(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdMaximumWithValue, { value: value as number }) - : language.get(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdMaximum); + ? t(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdMaximumWithValue, { value: value as number }) + : t(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdMaximum); } case AKeys.ThresholdDuration: { return value - ? language.get(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdDurationWithValue, { value: value as number }) - : language.get(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdDuration); + ? t(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdDurationWithValue, { value: value as number }) + : t(LanguageKeys.Commands.Moderation.AutomaticParameterThresholdDuration); } default: throw new Error('Unexpected.'); @@ -284,7 +282,7 @@ export abstract class SelfModerationCommand extends Command { case SelfModeratorHardActionFlags.Mute: return LanguageKeys.Commands.Moderation.AutomaticValueHardActionMute; case SelfModeratorHardActionFlags.SoftBan: - return LanguageKeys.Commands.Moderation.AutomaticValueHardActionSoftban; + return LanguageKeys.Commands.Moderation.AutomaticValueHardActionSoftBan; case SelfModeratorHardActionFlags.Warning: return LanguageKeys.Commands.Moderation.AutomaticValueHardActionWarning; default: @@ -303,15 +301,15 @@ export abstract class SelfModerationCommand extends Command { private static async parseMaximum(message: GuildMessage, key: SchemaKey, input: string, name: string) { const parsed = Number(input); if (parsed < 0) { - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidInt, { name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidInt, { name }); } if (key.minimum !== null && parsed < key.minimum) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticValueMaximumTooShort, { minimum: key.minimum, value: parsed }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticValueMaximumTooShort, { minimum: key.minimum, value: parsed }); } if (key.maximum !== null && parsed > key.maximum) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticValueMaximumTooLong, { maximum: key.maximum, value: parsed }); + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticValueMaximumTooLong, { maximum: key.maximum, value: parsed }); } return parsed; } @@ -319,18 +317,18 @@ export abstract class SelfModerationCommand extends Command { private static async parseDuration(message: GuildMessage, key: SchemaKey, input: string, name: string) { const parsed = new Duration(input); if (parsed.offset < 0) { - throw await message.fetchLocale(LanguageKeys.Resolvers.InvalidDuration, { name }); + throw await message.resolveKey(LanguageKeys.Resolvers.InvalidDuration, { name }); } if (key.minimum !== null && parsed.offset < key.minimum) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticValueDurationTooShort, { + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticValueDurationTooShort, { minimum: key.minimum, value: parsed.offset }); } if (key.maximum !== null && parsed.offset > key.maximum) { - throw await message.fetchLocale(LanguageKeys.Commands.Moderation.AutomaticValueDurationTooLong, { + throw await message.resolveKey(LanguageKeys.Commands.Moderation.AutomaticValueDurationTooLong, { maximum: key.maximum, value: parsed.offset }); diff --git a/src/lib/structures/SettingsMenu.ts b/src/lib/structures/SettingsMenu.ts index 528200ec9d7..36b3c420944 100644 --- a/src/lib/structures/SettingsMenu.ts +++ b/src/lib/structures/SettingsMenu.ts @@ -9,7 +9,7 @@ import { floatPromise, pickRandom } from '#utils/util'; import { deepClone } from '@sapphire/utilities'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { DiscordAPIError, MessageCollector, MessageEmbed } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { DbSet } from '../database/structures/DbSet'; const EMOJIS = { BACK: '◀', STOP: '⏹' }; @@ -24,7 +24,7 @@ const enum UpdateType { export class SettingsMenu { private readonly message: GuildMessage; - private language: Language; + private t: TFunction; private schema: SchemaKey | SchemaGroup; private messageCollector: MessageCollector | null = null; private errorMessage: string | null = null; @@ -33,9 +33,9 @@ export class SettingsMenu { private response: GuildMessage | null = null; private oldValue: unknown = undefined; - public constructor(message: GuildMessage, language: Language) { + public constructor(message: GuildMessage, language: TFunction) { this.message = message; - this.language = language; + this.t = language; this.schema = configurableGroups; this.embed = new MessageEmbed().setAuthor( this.message.author.username, @@ -49,7 +49,7 @@ export class SettingsMenu { public async init(): Promise { this.response = (await this.message.send( - new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(this.language.get(LanguageKeys.System.Loading))) + new MessageEmbed().setColor(BrandingColors.Secondary).setDescription(pickRandom(this.t(LanguageKeys.System.Loading))) )) as GuildMessage; await this.response.react(EMOJIS.STOP); this.llrc = new LongLivingReactionCollector(this.message.client).setListener(this.onReaction.bind(this)).setEndListener(this.stop.bind(this)); @@ -60,10 +60,10 @@ export class SettingsMenu { } private async render() { - const i18n = this.language; + const { t } = this; const description: string[] = []; if (isSchemaGroup(this.schema)) { - description.push(i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderAtFolder, { path: this.schema.name })); + description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderAtFolder, { path: this.schema.name })); if (this.errorMessage) description.push(this.errorMessage); const keys: string[] = []; const folders: string[] = []; @@ -73,16 +73,16 @@ export class SettingsMenu { else keys.push(key); } - if (!folders.length && !keys.length) description.push(i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderNokeys)); + if (!folders.length && !keys.length) description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderNokeys)); else description.push( - i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderSelect), + t(LanguageKeys.Commands.Admin.ConfMenuRenderSelect), '', ...folders.map((folder) => `📁 ${folder}`), ...keys.map((key) => `⚙️ ${key}`) ); } else { - description.push(i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderAtPiece, { path: this.schema.name })); + description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderAtPiece, { path: this.schema.name })); if (this.errorMessage) description.push('\n', this.errorMessage, '\n'); const [value, serialized, language] = await this.message.guild.readSettings((settings) => { @@ -90,17 +90,17 @@ export class SettingsMenu { const key = this.schema as SchemaKey; return [settings[key.property], key.display(settings, language), language]; }); - this.language = language; + this.t = language; description.push( - i18n.get(this.schema.description), + t(this.schema.description), '', - i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderTctitle), - i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderUpdate), - this.schema.array && (value as unknown[]).length ? i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderRemove) : '', - this.updatedValue ? i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderReset) : '', - this.updatedValue ? i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderUndo) : '', + t(LanguageKeys.Commands.Admin.ConfMenuRenderTctitle), + t(LanguageKeys.Commands.Admin.ConfMenuRenderUpdate), + this.schema.array && (value as unknown[]).length ? t(LanguageKeys.Commands.Admin.ConfMenuRenderRemove) : '', + this.updatedValue ? t(LanguageKeys.Commands.Admin.ConfMenuRenderReset) : '', + this.updatedValue ? t(LanguageKeys.Commands.Admin.ConfMenuRenderUndo) : '', '', - i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderCvalue, { + t(LanguageKeys.Commands.Admin.ConfMenuRenderCvalue, { value: serialized }) ); @@ -113,7 +113,7 @@ export class SettingsMenu { return this.embed .setColor(await DbSet.fetchColor(this.message)) .setDescription(`${description.filter((v) => v !== null).join('\n')}\n${ZeroWidthSpace}`) - .setFooter(parent ? i18n.get(LanguageKeys.Commands.Admin.ConfMenuRenderBack) : '') + .setFooter(parent ? t(LanguageKeys.Commands.Admin.ConfMenuRenderBack) : '') .setTimestamp(); } @@ -129,7 +129,7 @@ export class SettingsMenu { this.schema = schema as SchemaKey | SchemaGroup; this.oldValue = undefined; } else { - this.errorMessage = this.language.get(LanguageKeys.Commands.Admin.ConfMenuInvalidKey); + this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfMenuInvalidKey); } } else { const [command, ...params] = message.content.split(' '); @@ -138,7 +138,7 @@ export class SettingsMenu { else if (commandLowerCase === 'remove') await this.tryUpdate(params.join(' '), UpdateType.Remove); else if (commandLowerCase === 'reset') await this.tryUpdate(null, UpdateType.Reset); else if (commandLowerCase === 'undo') await this.tryUndo(); - else this.errorMessage = this.language.get(LanguageKeys.Commands.Admin.ConfMenuInvalidAction); + else this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfMenuInvalidAction); } if (!this.errorMessage) floatPromise(this.message, message.nuke()); @@ -222,21 +222,21 @@ export class SettingsMenu { switch (action) { case UpdateType.Set: { - this.language = await set(settings, key, value as string); + this.t = await set(settings, key, value as string); break; } case UpdateType.Remove: { - this.language = await remove(settings, key, value as string); + this.t = await remove(settings, key, value as string); break; } case UpdateType.Reset: { Reflect.set(settings, key.property, key.default); - this.language = settings.getLanguage(); + this.t = settings.getLanguage(); break; } case UpdateType.Replace: { Reflect.set(settings, key.property, value); - this.language = settings.getLanguage(); + this.t = settings.getLanguage(); break; } } @@ -245,7 +245,7 @@ export class SettingsMenu { }); if (skipped) { - this.errorMessage = this.language.get(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); + this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); } else { this.oldValue = oldValue; } @@ -259,7 +259,7 @@ export class SettingsMenu { await this.tryUpdate(this.oldValue, UpdateType.Replace); } else { const key = this.schema as SchemaKey; - this.errorMessage = this.language.get(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); + this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); } } @@ -269,7 +269,7 @@ export class SettingsMenu { this.response.reactions.removeAll().catch((error) => this.response!.client.emit(Events.ApiError, error)); } this.response - .edit(this.language.get(LanguageKeys.Commands.Admin.ConfMenuSaved), { embed: null }) + .edit(this.t(LanguageKeys.Commands.Admin.ConfMenuSaved), { embed: null }) .catch((error) => this.message.client.emit(Events.ApiError, error)); } diff --git a/src/lib/structures/SkyraCommand.ts b/src/lib/structures/SkyraCommand.ts index af09272691e..dcf149a6521 100644 --- a/src/lib/structures/SkyraCommand.ts +++ b/src/lib/structures/SkyraCommand.ts @@ -1,16 +1,25 @@ +import { CustomGet } from '#lib/types'; +import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; import { PermissionResolvable, Permissions } from 'discord.js'; import { Command, CommandOptions, CommandStore, KlasaMessage } from 'klasa'; export abstract class SkyraCommand extends Command { + public description: CustomGet; + public extendedHelp: CustomGet; + public spam: boolean; public requiredGuildPermissions: Permissions; - public constructor(store: CommandStore, file: string[], directory: string, options: SkyraCommandOptions = {}) { + public constructor(store: CommandStore, file: string[], directory: string, options: SkyraCommandOptions) { super(store, file, directory, { spam: false, requiredGuildPermissions: 0, ...options }); + + this.description = options.description; + this.extendedHelp = options.extendedHelp; + this.spam = options.spam!; this.requiredGuildPermissions = new Permissions(options.requiredGuildPermissions); } @@ -27,6 +36,8 @@ export abstract class SkyraCommand extends Command { } export interface SkyraCommandOptions extends CommandOptions { + description: CustomGet; + extendedHelp: CustomGet; spam?: boolean; requiredGuildPermissions?: PermissionResolvable; } diff --git a/src/lib/structures/WeebCommand.ts b/src/lib/structures/WeebCommand.ts index a935a2885f7..1dcf50b627c 100644 --- a/src/lib/structures/WeebCommand.ts +++ b/src/lib/structures/WeebCommand.ts @@ -5,9 +5,10 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { TOKENS, VERSION } from '#root/config'; import { fetch, FetchResultTypes } from '#utils/util'; import { MessageEmbed, User } from 'discord.js'; -import { CommandOptions, CommandStore, KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { CommandStore, KlasaMessage } from 'klasa'; import { DbSet } from '../database/structures/DbSet'; -import { SkyraCommand } from './SkyraCommand'; +import { SkyraCommand, SkyraCommandOptions } from './SkyraCommand'; export abstract class WeebCommand extends SkyraCommand { /** @@ -42,25 +43,25 @@ export abstract class WeebCommand extends SkyraCommand { query.searchParams.append('type', this.queryType); query.searchParams.append('nsfw', String(message.channel.nsfw)); - const language = await message.guild.fetchLanguage(); - const { url } = await this.fetch(language, query); + const t = await message.guild.fetchT(); + const { url } = await this.fetch(t, query); return message.send( Boolean(this.usage.parsedUsage.length) - ? language.get(this.responseName as ComplexKey, { user: params![0].username }) - : language.get(this.responseName as SimpleKey), + ? t(this.responseName as ComplexKey, { user: params![0].username }) + : t(this.responseName as SimpleKey), { embed: new MessageEmbed() .setTitle('→') .setURL(url) .setColor(await DbSet.fetchColor(message)) .setImage(url) - .setFooter(language.get(LanguageKeys.System.PoweredByWeebSh)) + .setFooter(t(LanguageKeys.System.PoweredByWeebSh)) } ) as Promise; } - private async fetch(language: Language, url: URL): Promise { + private async fetch(t: TFunction, url: URL): Promise { try { return await fetch(url, { headers: this.kHeaders }, FetchResultTypes.JSON); } catch (unknownError: unknown) { @@ -68,17 +69,17 @@ export abstract class WeebCommand extends SkyraCommand { // If we received a 5XX code error, warn the user about the service's unavailability. if (error.code >= 500) { - throw language.get(LanguageKeys.Commands.Weeb.UnavailableError); + throw t(LanguageKeys.Commands.Weeb.UnavailableError); } // If otherwise we got an 4XX error code, warn the user about unexpected error. this.client.emit(Events.Error, `Unexpected error in ${this.name}: [${error.code}] ${error.message}`); - throw language.get(LanguageKeys.Commands.Weeb.UnexpectedError); + throw t(LanguageKeys.Commands.Weeb.UnexpectedError); } } } -export interface WeebCommandOptions extends CommandOptions { +export interface WeebCommandOptions extends SkyraCommandOptions { queryType: string; responseName: SimpleKey | ComplexKey; } diff --git a/src/lib/structures/i18n/Augments.d.ts b/src/lib/structures/i18n/Augments.d.ts new file mode 100644 index 00000000000..bc4918d0eea --- /dev/null +++ b/src/lib/structures/i18n/Augments.d.ts @@ -0,0 +1,25 @@ +// TODO: Remove this when TS types Intl.ListFormat +declare namespace Intl { + interface DateTimeFormatOptions { + dateStyle?: 'full' | 'long' | 'medium' | 'short'; + timeStyle?: 'full' | 'long' | 'medium' | 'short'; + } + + class ListFormat { + public constructor(locales: string | string[], options?: ListFormatOptions); + public format(values: Iterable): string; + public formatToParts(values: readonly string[]): ListFormatPart[]; + public static supportedLocalesOf(locales: string | string[], options?: ListFormatOptions): string[]; + } + + interface ListFormatOptions { + localeMatcher?: 'lookup' | 'best fit'; + type?: 'conjunction' | 'disjunction' | 'unit'; + style?: 'long' | 'short' | 'narrow'; + } + + interface ListFormatPart { + type: 'element' | 'literal'; + value: string; + } +} diff --git a/src/lib/structures/i18n/Handler.ts b/src/lib/structures/i18n/Handler.ts new file mode 100644 index 00000000000..c9a66e12ac1 --- /dev/null +++ b/src/lib/structures/i18n/Handler.ts @@ -0,0 +1,33 @@ +import { DurationFormatAssetsTime, DurationFormatter } from '@sapphire/time-utilities'; + +export abstract class Handler { + public readonly name: string; + public readonly number: Intl.NumberFormat; + public readonly numberCompact: Intl.NumberFormat; + public readonly listAnd: Intl.ListFormat; + public readonly listOr: Intl.ListFormat; + public readonly timeDate: Intl.DateTimeFormat; + public readonly timeFull: Intl.DateTimeFormat; + public readonly duration: DurationFormatter; + + public constructor(options: Handler.Options) { + this.name = options.name; + this.number = new Intl.NumberFormat(this.name, { maximumFractionDigits: 2 }); + this.numberCompact = new Intl.NumberFormat(this.name, { notation: 'compact', compactDisplay: 'short', maximumFractionDigits: 2 }); + this.listAnd = new Intl.ListFormat(this.name, { type: 'conjunction' }); + this.listOr = new Intl.ListFormat(this.name, { type: 'disjunction' }); + this.timeDate = new Intl.DateTimeFormat(this.name, { timeZone: 'Etc/UTC', dateStyle: 'short' }); + this.timeFull = new Intl.DateTimeFormat(this.name, { timeZone: 'Etc/UTC', dateStyle: 'short', timeStyle: 'medium' }); + this.duration = new DurationFormatter(options.duration); + } + + public abstract ordinal(cardinal: number): string; +} + +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace Handler { + export interface Options { + name: string; + duration: DurationFormatAssetsTime; + } +} diff --git a/src/lib/types/Augments.d.ts b/src/lib/types/Augments.d.ts index b45849b74e8..8607c2dbad5 100644 --- a/src/lib/types/Augments.d.ts +++ b/src/lib/types/Augments.d.ts @@ -6,13 +6,15 @@ import type { InviteStore } from '#lib/structures/InviteStore'; import type { GiveawayManager } from '#lib/structures/managers/GiveawayManager'; import type { ScheduleManager } from '#lib/structures/managers/ScheduleManager'; import type { WebsocketHandler } from '#lib/websocket/WebsocketHandler'; +import type { O } from '#utils/constants'; import type { ConnectFourManager } from '#utils/Games/ConnectFourManager'; import type { Leaderboard } from '#utils/Leaderboard'; import type { LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; import type { Twitch } from '#utils/Notifications/Twitch'; import type { AnalyticsSchema } from '#utils/Tracking/Analytics/AnalyticsSchema'; import type { AnalyticsData } from '#utils/Tracking/Analytics/structures/AnalyticsData'; -import type { PermissionString } from 'discord.js'; +import type { I18nextHandler, I18nOptions } from '@sapphire/plugin-i18next'; +import 'i18next'; import type { PoolConfig } from 'pg'; import type { MessageAcknowledgeable } from './Discord'; import type { Events } from './Enums'; @@ -31,12 +33,15 @@ declare module 'discord.js' { readonly schedules: ScheduleManager; readonly settings: SettingsManager; readonly twitch: Twitch; + readonly i18n: I18nextHandler; readonly version: string; readonly webhookDatabase: Webhook | null; readonly webhookError: Webhook; readonly webhookFeedback: Webhook | null; readonly websocket: WebsocketHandler; + fetchLanguage(message: Message): Promise; + emit(event: Events.AnalyticsSync, guilds: number, users: number): boolean; emit(event: Events.CommandUsageAnalytics, command: string, category: string, subCategory: string): boolean; emit( @@ -93,18 +98,7 @@ declare module 'klasa' { schedule?: { interval: number; }; - } - - interface Language { - PERMISSIONS: Record; - HUMAN_LEVELS: Record<'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH', string>; - duration(time: number, precision?: number): string; - ordinal(cardinal: number): string; - list(values: readonly string[], conjunction: string): string; - groupDigits(number: number): string; - - get(value: CustomGet): TReturn; - get(value: CustomFunctionGet, args: TArgs): TReturn; + i18n?: I18nOptions; } interface PieceDefaults { @@ -128,3 +122,19 @@ declare module 'klasa-dashboard-hooks' { expires: number; } } + +declare module 'i18next' { + export interface TFunction { + lng: string; + ns?: string; + + (key: CustomGet, options?: TOptionsBase | string): TReturn; + (key: CustomGet, defaultValue: TReturn, options?: TOptionsBase | string): TReturn; + (key: CustomFunctionGet, options?: TOptions): TReturn; + ( + key: CustomFunctionGet, + defaultValue: TReturn, + options?: TOptions + ): TReturn; + } +} diff --git a/src/lib/types/Constants.d.ts b/src/lib/types/Constants.d.ts index 0f5282e2b6a..ba931adf7df 100644 --- a/src/lib/types/Constants.d.ts +++ b/src/lib/types/Constants.d.ts @@ -7,3 +7,21 @@ export const enum CdnUrls { TwitchLogo = 'https://cdn.skyra.pw/skyra-assets/twitch_logo.png', Pokedex = 'https://cdn.skyra.pw/skyra-assets/pokedex.png' } + +export const enum LanguageFormatters { + AndList = 'andList', + Duration = 'duration', + Number = 'number', + NumberCompact = 'numberCompact', + HumanLevels = 'humanLevels', + InlineCodeblock = 'inlineCodeBlock', + JsCodeBlock = 'jsCodeBlock', + Ordinal = 'ordinal', + OrList = 'orList', + Permissions = 'permissions', + Random = 'random', + TimeDate = 'timeDate', + TimeFull = 'timeFull', + Timestamp = 'timestamp', + ToTitleCase = 'toTitleCase' +} diff --git a/src/lib/types/Languages.d.ts b/src/lib/types/Languages.d.ts deleted file mode 100644 index f81d20fa05c..00000000000 --- a/src/lib/types/Languages.d.ts +++ /dev/null @@ -1,2304 +0,0 @@ -import type { ScheduleEntity } from '#lib/database'; -import type { EightBallLanguage } from '#root/commands/Fun/8ball'; -import type { HungerGamesGame } from '#root/commands/Games/hungergames'; -import type { StatsGeneral, StatsUptime, StatsUsage } from '#root/commands/System/stats'; -import type { Moderation } from '#utils/constants'; -import type { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -import type { Guild, GuildMember, Role, User } from 'discord.js'; -import type { LevelTitles, ProfileTitles } from './namespaces/languages/commands/Social'; - -export interface ModerationAction { - addRole: string; - mute: string; - ban: string; - kick: string; - softban: string; - vkick: string; - vmute: string; - restrictedReact: string; - restrictedEmbed: string; - restrictedAttachment: string; - restrictedVoice: string; - setNickname: string; - removeRole: string; -} - -declare module 'klasa' { - export interface LanguageKeys { - default: (params: { key: string }) => string; - defaultLanguage: string; - - globalYes: string; - globalNo: string; - globalNone: string; - globalIs: string; - globalAnd: string; - globalOr: string; - globalUnknown: string; - - settingGatewayKeyNoext: (params: { key: string }) => string; - settingGatewayChooseKey: (params: { keys: string }) => string; - settingGatewayUnconfigurableFolder: string; - settingGatewayUnconfigurableKey: (params: { key: string }) => string; - settingGatewayMissingValue: (params: { path: string; value: string }) => string; - settingGatewayDuplicateValue: (params: { path: string; value: string }) => string; - settingGatewayInvalidFilteredValue: (params: { path: string; value: unknown }) => string; - resolverBoolFalseOptions: readonly string[]; - resolverBoolTrueOptions: readonly string[]; - resolverBoolEnabled: string; - resolverBoolDisabled: string; - resolverMultiTooFew: (params: { name: string; min?: number; conjunctionWord: string }) => string; - resolverInvalidBool: (params: { name: string }) => string; - resolverInvalidChannel: (params: { name: string }) => string; - resolverInvalidCustom: (params: { name: string; type: string }) => string; - resolverInvalidDate: (params: { name: string }) => string; - resolverInvalidDuration: (params: { name: string }) => string; - resolverInvalidEmoji: (params: { name: string }) => string; - resolverInvalidFloat: (params: { name: string }) => string; - resolverInvalidGuild: (params: { name: string }) => string; - resolverInvalidInt: (params: { name: string }) => string; - resolverInvalidInvite: (params: { name: string }) => string; - resolverInvalidWager: (params: { bet: number; validAmounts: string }) => string; - resolverInvalidLiteral: (params: { name: string }) => string; - resolverInvalidMember: (params: { name: string }) => string; - resolverInvalidMessage: (params: { name: string }) => string; - resolverInvalidPiece: (params: { name: string; piece: string }) => string; - resolverInvalidRegexMatch: (params: { name: string; pattern: string }) => string; - resolverInvalidRole: (params: { name: string }) => string; - resolverInvalidString: (params: { name: string }) => string; - resolverInvalidTime: (params: { name: string }) => string; - resolverInvalidUrl: (params: { name: string }) => string; - resolverInvalidUser: (params: { name: string }) => string; - resolverInvalidSnowflake: (params: { name: string }) => string; - resolverInvalidStore: (params: { store: string }) => string; - resolverStringSuffix: string; - resolverMinmaxExactlyInclusive: (params: { name: string; min: number }) => string; - resolverMinmaxExactlyExclusive: (params: { name: string; min: number }) => string; - resolverMinmaxBothInclusive: (params: { name: string; min: number; max: number }) => string; - resolverMinmaxBothExclusive: (params: { name: string; min: number; max: number }) => string; - resolverMinmaxMinInclusive: (params: { name: string; min: number }) => string; - resolverMinmaxMinExclusive: (params: { name: string; min: number }) => string; - resolverMinmaxMaxInclusive: (params: { name: string; max: number }) => string; - resolverMinmaxMaxExclusive: (params: { name: string; max: number }) => string; - reactionhandlerPrompt: string; - commandmessageMissing: string; - commandmessageMissingRequired: (params: { name: string }) => string; - commandmessageMissingOptionals: (params: { possibles: string }) => string; - commandmessageNomatch: (params: { possibles: string }) => string; - monitorCommandHandlerReprompt: (params: { tag: string; name: string; time: string; cancelOptions: string }) => string; - monitorCommandHandlerRepeatingReprompt: (params: { tag: string; name: string; time: string; cancelOptions: string }) => string; - monitorCommandHandlerAborted: string; - inhibitorCooldown: (params: { remaining: string }) => string; - inhibitorMissingBotPerms: (params: { missing: string }) => string; - inhibitorNsfw: string; - inhibitorPermissions: string; - inhibitorRequiredSettings: (params: { settings: string; count: number }) => string; - inhibitorRequiredSettingsPlural: (params: { settings: string; count: number }) => string; - inhibitorRunin: (params: { type: string }) => string; - inhibitorRuninNone: (params: { name: string }) => string; - inhibitorDisabledGuild: string; - inhibitorDisabledGlobal: string; - /** used to build a LanguageBuilder for extendedHelp */ - systemHelpTitles: { - explainedUsage: string; - possibleFormats: string; - examples: string; - reminders: string; - }; - commandBlocklistDescription: string; - commandBlocklistSaveSuccess: string; - commandBlocklistResetSuccess: string; - commandUnload: (params: { type: string; name: string }) => string; - commandUnloadDescription: string; - commandTransferError: string; - commandTransferSuccess: (params: { type: string; name: string }) => string; - commandTransferFailed: (params: { type: string; name: string }) => string; - commandTransferDescription: string; - commandReload: (params: { type: string; name: string; time: string }) => string; - commandReloadAll: (params: { type: string; time: string }) => string; - commandReloadEverything: (params: { time: string }) => string; - commandReloadFailed: (params: { type: string; name: string }) => string; - commandReloadDescription: string; - commandReboot: string; - commandRebootDescription: string; - commandPing: string; - commandPingDescription: string; - commandPingPong: (params: { diff: number; ping: number }) => string; - commandInfoDescription: string; - commandHelpDescription: string; - commandHelpNoExtended: string; - commandHelpDm: string; - commandHelpNodm: string; - commandHelpAllFlag: (params: { prefix: string }) => string; - commandHelpCommandCount: (params: { count: number }) => string; - commandHelpCommandCountPlural: (params: { count: number }) => string; - commandEnable: (params: { type: string; name: string }) => string; - commandEnableDescription: string; - commandDisable: (params: { type: string; name: string }) => string; - commandDisableDescription: string; - commandDisableWarn: string; - commandConfNoKey: string; - commandConfNoValue: string; - commandConfGuarded: (params: { name: string }) => string; - commandConfUpdated: (params: { key: string; response: string }) => string; - commandConfKeyNotArray: string; - commandConfGetNoExt: (params: { key: string }) => string; - commandConfGet: (params: { key: string; value: string }) => string; - commandConfReset: (params: { key: string; value: string }) => string; - commandConfNochange: (params: { key: string }) => string; - commandConfServerDescription: string; - commandConfServer: (params: { key: string; list: string }) => string; - commandConfUserDescription: string; - commandConfDashboardOnlyKey: (params: { key: string }) => string; - commandConfUser: (params: { key: string; list: string }) => string; - commandConfSettingNotSet: string; - messagePromptTimeout: string; - textPromptAbortOptions: readonly string[]; - commandLoad: (params: { time: string; type: string; name: string }) => string; - commandLoadFail: string; - commandLoadError: (params: { type: string; name: string; error: string }) => string; - commandLoadDescription: string; - argumentRangeInvalid: (params: { name: string }) => string; - argumentRangeMax: (params: { name: string; maximum: number; count: number }) => string; - argumentRangeMaxPlural: (params: { name: string; maximum: number; count: number }) => string; - commandAddDescription: string; - commandAddExtended: LanguageHelpDisplayOptions; - commandAddPlaylist: (params: { songs: string }) => string; - commandAddPlaylistSongs: (params: { count: number }) => string; - commandAddPlaylistSongsPlural: (params: { count: number }) => string; - commandAddSong: (params: { title: string }) => string; - commandClearDescription: string; - commandClearDenied: string; - commandClearSuccess: (params: { count: number }) => string; - commandClearSuccessPlural: (params: { count: number }) => string; - commandExportQueueDescription: string; - commandExportQueueExtended: LanguageHelpDisplayOptions; - commandExportQueueSuccess: (params: { guildName: string }) => string; - commandImportQueueDescription: string; - commandImportQueueExtended: LanguageHelpDisplayOptions; - commandJoinDescription: string; - commandJoinNoMember: string; - commandJoinNoVoicechannel: string; - commandJoinSuccess: (params: { channel: string }) => string; - commandJoinVoiceDifferent: string; - commandJoinVoiceFull: string; - commandJoinVoiceNoConnect: string; - commandJoinVoiceNoSpeak: string; - commandJoinVoiceSame: string; - commandJoinFailed: string; - commandLeaveDescription: string; - commandLeaveExtended: LanguageHelpDisplayOptions; - commandLeaveSuccess: (params: { channel: string }) => string; - commandPauseDescription: string; - commandPauseSuccess: string; - commandPlayDescription: string; - commandPlayExtended: LanguageHelpDisplayOptions; - commandPlayEnd: string; - commandPlayNext: (params: { title: string; requester: string }) => string; - commandPlayQueuePaused: (params: { song: string }) => string; - commandPlayQueuePlaying: string; - commandPlayQueueEmpty: string; - commandPlayingDescription: string; - commandPlayingDuration: (params: { duration: string }) => string; - commandPlayingQueueEmpty: string; - commandPlayingQueueNotPlaying: string; - commandRepeatDescription: string; - commandRepeatSuccessEnabled: string; - commandRepeatSuccessDisabled: string; - commandQueueDescription: string; - commandQueueLast: string; - commandQueueTitle: (params: { guildname: string }) => string; - commandQueueLine: (params: { position: number; duration: string; title: string; url: string; requester: string }) => string; - commandQueueNowplaying: (context: { title: string; url: string; requester: string }) => string; - commandQueueNowplayingTimeRemaining: (params: { timeRemaining: string }) => string; - commandQueueNowplayingLiveStream: string; - commandQueueNowplayingTitle: string; - commandQueueTotalTitle: string; - commandQueueTotal: (params: { songs: string; remainingTime: string }) => string; - commandQueueEmpty: string; - commandQueueDashboardInfo: (params: { guild: Guild }) => string; - commandRemoveDescription: string; - commandRemoveIndexInvalid: string; - commandRemoveIndexOutOfBounds: (params: { songs: string }) => string; - commandRemoveDenied: string; - commandRemoveSuccess: (params: { title: string; requester: string }) => string; - commandSeekDescription: string; - commandSeekSuccess: (params: { time: number }) => string; - commandResumeDescription: string; - commandResumeSuccess: string; - commandRolesetDescription: string; - commandRolesetExtended: LanguageHelpDisplayOptions; - commandRolesetCreated: (params: { name: string; roles: string }) => string; - commandRolesetAdded: (params: { name: string; roles: string }) => string; - commandRolesetInvalidName: (params: { name: string }) => string; - commandRolesetRemoved: (params: { name: string; roles: string }) => string; - commandRolesetResetEmpty: string; - commandRolesetResetAll: string; - commandRolesetResetNotExists: (params: { name: string }) => string; - commandRolesetResetGroup: (params: { name: string }) => string; - commandRolesetUpdated: (params: { name: string }) => string; - commandRolesetNoRolesets: string; - commandShuffleDescription: string; - commandShuffleSuccess: (params: { amount: number }) => string; - commandSkipDescription: string; - commandSkipPermissions: string; - commandSkipVotesVoted: string; - commandSkipVotesTotal: (params: { amount: number; needed: number }) => string; - commandSkipSuccess: (params: { title: string }) => string; - commandSupportEmbedTitle: (params: { username: string }) => string; - commandSupportEmbedDescription: string; - commandPlayingTimeDescription: string; - commandPlayingTimeQueueEmpty: string; - commandPromoteDescription: string; - commandPromoteExtended: LanguageHelpDisplayOptions; - commandPromoteSuccess: (params: { title: string; url: string }) => string; - commandVolumeDescription: string; - commandVolumeSuccess: (params: { volume: number }) => string; - commandVolumeChanged: (params: { emoji: string; volume: number }) => string; - commandVolumeChangedExtreme: (params: { emoji: string; text: string; volume: number }) => string; - commandVolumeChangedTexts: readonly string[]; - commandAbilityDescription: string; - commandAbilityExtended: LanguageHelpDisplayOptions; - commandAbilityEmbedTitles: { - authorTitle: string; - fieldEffectTitle: string; - }; - commandAbilityQueryFail: (params: { ability: string }) => string; - commandFlavorsDescription: string; - commandFlavorsExtended: LanguageHelpDisplayOptions; - commandFlavorsQueryFail: (params: { pokemon: string }) => string; - commandItemDescription: string; - commandItemExtended: LanguageHelpDisplayOptions; - commandItemEmbedData: (params: { - availableInGen8: string; - }) => { - ITEM: string; - generationIntroduced: string; - availableInGeneration8Title: string; - availableInGeneration8Data: string; - }; - commandItemQueryFail: (params: { item: string }) => string; - commandLearnDescription: string; - commandLearnExtended: LanguageHelpDisplayOptions; - commandLearnMethodTypes: (params: { - level?: number | null; - }) => { - levelUpMoves: string; - eventMoves: string; - tutorMoves: string; - eggMoves: string; - virtualTransferMoves: string; - tmMoves: string; - dreamworldMoves: string; - }; - commandLearnInvalidGeneration: (params: { generation: string }) => string; - commandLearnMethod: (params: { generation: number; pokemon: string; move: string; method: string }) => string; - commandLearnQueryFailed: (params: { pokemon: string; moves: string }) => string; - commandLearnCannotLearn: (params: { pokemon: string; moves: string }) => string; - commandLearnTitle: (params: { pokemon: string; generation: number }) => string; - commandMoveDescription: string; - commandMoveExtended: LanguageHelpDisplayOptions; - commandMoveEmbedData: (params: { - availableInGen8: string; - }) => { - move: string; - types: string; - basePower: string; - pp: string; - category: string; - accuracy: string; - priority: string; - target: string; - contestCondition: string; - zCrystal: string; - gmaxPokemon: string; - availableInGeneration8Title: string; - availableInGeneration8Data: string; - none: string; - maxMovePower: string; - zMovePower: string; - fieldMoveEffectTitle: string; - }; - commandMoveQueryFail: (params: { move: string }) => string; - commandPokedexDescription: string; - commandPokedexExtended: LanguageHelpDisplayOptions; - commandPokedexEmbedData: (params: { - otherFormes: readonly string[]; - cosmeticFormes: readonly string[]; - }) => { - types: string; - abilities: string; - genderRatio: string; - smogonTier: string; - uknownSmogonTier: string; - height: string; - weight: string; - eggGroups: string; - evolutionaryLine: string; - baseStats: string; - baseStatsTotal: string; - flavourText: string; - otherFormesTitle: string; - cosmeticFormesTitle: string; - otherFormesList: string; - cosmeticFormesList: string; - }; - commandPokedexQueryFail: (params: { pokemon: string }) => string; - commandTypeDescription: string; - commandTypeExtended: LanguageHelpDisplayOptions; - commandTypeEmbedData: (params: { - types: string[]; - }) => { - offensive: string; - defensive: string; - superEffectiveAgainst: string; - dealsNormalDamageTo: string; - doesNotAffect: string; - notVeryEffectiveAgainst: string; - vulnerableTo: string; - takesNormalDamageFrom: string; - resists: string; - notAffectedBy: string; - typeEffectivenessFor: string; - }; - commandTypeTooManyTypes: string; - commandTypeNotAType: (params: { type: string }) => string; - commandTypeQueryFail: (params: { types: string }) => string; - inhibitorMusicQueueEmpty: string; - inhibitorMusicNotPlaying: string; - inhibitorMusicPaused: string; - inhibitorMusicDjMember: string; - inhibitorMusicUserVoiceChannel: string; - inhibitorMusicBotVoiceChannel: string; - inhibitorMusicBothVoiceChannel: string; - inhibitorMusicNothingPlaying: string; - musicManagerFetchNoArguments: string; - musicManagerFetchNoMatches: string; - musicManagerFetchLoadFailed: string; - musicManagerImportQueueNotFound: string; - musicManagerImportQueueError: string; - musicManagerTooManySongs: string; - musicManagerSetvolumeSilent: string; - musicManagerSetvolumeLoud: string; - musicManagerPlayNoSongs: string; - musicManagerPlayPlaying: string; - musicManagerStuck: (params: { milliseconds: number }) => string; - commandConfMenuNopermissions: string; - commandConfMenuRenderAtFolder: (params: { path: string }) => string; - commandConfMenuRenderAtPiece: (params: { path: string }) => string; - commandConfMenuRenderNokeys: string; - commandConfMenuRenderSelect: string; - commandConfMenuRenderTctitle: string; - commandConfMenuRenderUpdate: string; - commandConfMenuRenderRemove: string; - commandConfMenuRenderReset: string; - commandConfMenuRenderUndo: string; - commandConfMenuRenderCvalue: (params: { value: string }) => string; - commandConfMenuRenderBack: string; - commandConfMenuInvalidKey: string; - commandConfMenuInvalidAction: string; - commandConfMenuSaved: string; - settingsPrefix: string; - settingsLanguage: string; - settingsDisabledcommands: string; - settingsDisablenaturalprefix: string; - settingsChannelsAnnouncements: string; - settingsChannelsFarewell: string; - settingsChannelsGreeting: string; - settingsChannelsImageLogs: string; - settingsChannelsMemberLogs: string; - settingsChannelsMessageLogs: string; - settingsChannelsModerationLogs: string; - settingsChannelsNsfwMessageLogs: string; - settingsChannelsPruneLogs: string; - settingsChannelsReactionLogs: string; - settingsChannelsRoles: string; - settingsChannelsSpam: string; - settingsChannelsIgnoreMessageDelete: string; - settingsChannelsIgnoreMessageEdit: string; - settingsChannelsIgnoreReactionAdd: string; - settingsChannelsIgnoreAll: string; - settingsDisabledchannels: string; - settingsEventsBanadd: string; - settingsEventsBanremove: string; - settingsEventsMemberadd: string; - settingsEventsMemberNickNameUpdate: string; - settingsEventsMemberUserNameUpdate: string; - settingsEventsMemberroleupdate: string; - settingsEventsMemberremove: string; - settingsEventsMessagedelete: string; - settingsEventsMessageedit: string; - settingsEventsTwemojiReactions: string; - settingsMessagesFarewell: string; - settingsMessagesGreeting: string; - settingsMessagesIgnorechannels: string; - settingsMessagesJoinDm: string; - settingsMessagesModerationAutoDelete: string; - settingsMessagesModerationDm: string; - settingsMessagesModerationMessageDisplay: string; - settingsMessagesModerationReasonDisplay: string; - settingsMessagesModeratorNameDisplay: string; - settingsMessagesWarnings: string; - settingsMessagesAnnouncementEmbed: string; - settingsMusicAllowStreams: string; - settingsMusicDefaultVolume: string; - settingsMusicMaximumDuration: string; - settingsMusicMaximumEntriesPerUser: string; - settingsNoMentionSpamAlerts: string; - settingsNoMentionSpamEnabled: string; - settingsNoMentionSpamMentionsallowed: string; - settingsNoMentionSpamTimeperiod: string; - settingsRolesAdmin: string; - settingsRolesDj: string; - settingsRolesInitial: string; - settingsRolesModerator: string; - settingsRolesMuted: string; - settingsRolesPublic: string; - settingsRolesRemoveinitial: string; - settingsRolesRestrictedAttachment: string; - settingsRolesRestrictedEmbed: string; - settingsRolesRestrictedEmoji: string; - settingsRolesRestrictedReaction: string; - settingsRolesRestrictedVoice: string; - settingsRolesSubscriber: string; - settingsSelfmodAttachmentsEnabled: string; - settingsSelfmodAttachmentsIgnoredChannels: string; - settingsSelfmodAttachmentsIgnoredRoles: string; - settingsSelfmodCapitalsEnabled: string; - settingsSelfmodCapitalsIgnoredchannels: string; - settingsSelfmodCapitalsIgnoredroles: string; - settingsSelfmodCapitalsMaximum: string; - settingsSelfmodCapitalsMinimum: string; - settingsSelfmodFilterEnabled: string; - settingsSelfmodFilterIgnoredchannels: string; - settingsSelfmodFilterIgnoredroles: string; - settingsSelfmodIgnorechannels: string; - settingsSelfmodInvitesEnabled: string; - settingsSelfmodInvitesIgnoredchannels: string; - settingsSelfmodInvitesIgnoredroles: string; - settingsSelfmodInvitesIgnoredcodes: string; - settingsSelfmodInvitesIgnoredguilds: string; - settingsSelfmodLinksEnabled: string; - settingsSelfmodLinksIgnoredchannels: string; - settingsSelfmodLinksIgnoredroles: string; - settingsSelfmodLinksWhitelist: string; - settingsSelfmodMessagesEnabled: string; - settingsSelfmodMessagesIgnoredchannels: string; - settingsSelfmodMessagesIgnoredroles: string; - settingsSelfmodMessagesMaximum: string; - settingsSelfmodMessagesQueueSize: string; - settingsSelfmodNewlinesEnabled: string; - settingsSelfmodNewlinesIgnoredchannels: string; - settingsSelfmodNewlinesIgnoredroles: string; - settingsSelfmodNewlinesMaximum: string; - settingsSelfmodReactionsMaximum: string; - settingsSelfmodReactionsBlacklist: string; - settingsSelfmodReactionsEnabled: string; - settingsSelfmodReactionsIgnoredchannels: string; - settingsSelfmodReactionsIgnoredroles: string; - settingsSelfmodReactionsWhitelist: string; - settingsSocialEnabled: string; - settingsSocialMultiplier: string; - settingsSocialAchieve: string; - settingsSocialAchievemessage: string; - settingsSocialIgnorechannels: string; - settingsStarboardChannel: string; - settingsStarboardIgnorechannels: string; - settingsStarboardMinimum: string; - settingsStarboardSelfstar: string; - settingsSuggestionsChannel: string; - settingsSuggestionsEmojisUpvote: string; - settingsSuggestionsEmojisDownvote: string; - settingsSuggestionsOnActionDm: string; - settingsSuggestionsOnActionRepost: string; - settingsSuggestionsOnActionHideAuthor: string; - settingsDashboardOnlyKey: string; - commandCatfactDescription: string; - commandCatfactExtended: LanguageHelpDisplayOptions; - commandDogDescription: string; - commandDogExtended: LanguageHelpDisplayOptions; - commandFoxDescription: string; - commandFoxExtended: LanguageHelpDisplayOptions; - commandKittyDescription: string; - commandKittyExtended: LanguageHelpDisplayOptions; - commandShibeDescription: string; - commandShibeExtended: LanguageHelpDisplayOptions; - commandAnimeDescription: string; - commandAnimeExtended: LanguageHelpDisplayOptions; - commandMangaDescription: string; - commandMangaExtended: LanguageHelpDisplayOptions; - commandWaifuDescription: string; - commandWaifuExtended: LanguageHelpDisplayOptions; - commandAnnouncementDescription: string; - commandAnnouncementExtended: LanguageHelpDisplayOptions; - commandSubscribeDescription: string; - commandSubscribeExtended: LanguageHelpDisplayOptions; - commandUnsubscribeDescription: string; - commandUnsubscribeExtended: LanguageHelpDisplayOptions; - commandChoiceDescription: string; - commandChoiceExtended: LanguageHelpDisplayOptions; - commandChangemymindDescription: string; - commandChangemymindExtended: LanguageHelpDisplayOptions; - commandDiceDescription: string; - commandDiceExtended: LanguageHelpDisplayOptions; - commandEscaperopeDescription: string; - commandEscaperopeExtended: LanguageHelpDisplayOptions; - commandHowToFlirtDescription: string; - commandHowToFlirtExtended: LanguageHelpDisplayOptions; - commandLoveDescription: string; - commandLoveExtended: LanguageHelpDisplayOptions; - commandMarkovTimer: (params: { timer: string }) => string; - commandMarkovNoMessages: string; - commandMarkovDescription: string; - commandMarkovExtended: LanguageHelpDisplayOptions; - commandNorrisDescription: string; - commandNorrisExtended: LanguageHelpDisplayOptions; - commandRateDescription: string; - commandRateExtended: LanguageHelpDisplayOptions; - commandXkcdDescription: string; - commandXkcdExtended: LanguageHelpDisplayOptions; - commandPunDescription: string; - commandPunExtended: LanguageHelpDisplayOptions; - commandWakandaDescription: string; - commandWakandaExtended: LanguageHelpDisplayOptions; - // GI commands - commandBrawlstarsDescription: string; - commandBrawlstarsExtended: LanguageHelpDisplayOptions; - commandBrawlstarsPlayerEmbedTitles: { - trophies: string; - exp: string; - events: string; - gamesModes: string; - other: string; - }; - commandBrawlstarsPlayerEmbedFields: { - total: string; - personalBest: string; - experienceLevel: string; - events: string; - roboRumble: string; - qualifiedForChamps: string; - victories3v3: string; - victoriesDuo: string; - victoriesSolo: string; - club: string; - brawlersUnlocked: string; - }; - commandBrawlstarsClubEmbedTitles: { - totalTrophies: string; - averageTrophies: string; - requiredTrophies: string; - members: string; - type: string; - top5Members: string; - president: string; - }; - commandBrawlstarsClubEmbedFields: { - noPresident: string; - }; - commandClashofclansDescription: string; - commandClashofclansExtended: LanguageHelpDisplayOptions; - commandClashofclansPlayerEmbedTitles: { - xpLevel: string; - builderHallLevel: string; - townhallLevel: string; - townhallWeaponLevel: string; - trophies: string; - bestTrophies: string; - warStars: string; - attackWins: string; - defenseWins: string; - amountOfAchievements: string; - versusTrophies: string; - bestVersusTrophies: string; - versusBattleWins: string; - clanRole: string; - clanName: string; - leagueName: string; - noTownhallWeaponLevel: string; - noRole: string; - noClan: string; - noLeague: string; - }; - commandClashofclansClanEmbedTitles: { - clanLevel: string; - clanPoints: string; - clanVersusPoints: string; - amountOfMembers: string; - description: string; - locationName: string; - warFrequency: string; - warWinStreak: string; - warWins: string; - warTies: string; - warLosses: string; - warLogPublic: string; - unknown: string; - warFrequencyDescr: { - moreThanOncePerWeek: string; - unknown: string; - always: string; - oncePerWeek: string; - lessThanOncePerWeek: string; - }; - }; - commandBrawlStarsInvalidPlayerTag: (params: { playertag: string }) => string; - commandBrawlStarsClansQueryFail: (params: { clan: string }) => string; - commandBrawlStarsPlayersQueryFail: (params: { playertag: string }) => string; - commandClashofclansInvalidPlayerTag: (params: { playertag: string }) => string; - commandClashOfClansClansQueryFail: (params: { clan: string }) => string; - commandClashofclansPlayersQueryFail: (params: { playertag: string }) => string; - commandFFXIVDescription: string; - commandFFXIVExtended: LanguageHelpDisplayOptions; - commandFFXIVCharacterFields: { - serverAndDc: string; - tribe: string; - characterGender: string; - nameday: string; - guardian: string; - cityState: string; - grandCompany: string; - rank: string; - none: string; - male: string; - female: string; - dowDomClasses: string; - tank: string; - healer: string; - meleeDps: string; - physicalRangedDps: string; - magicalRangedDps: string; - dohClasses: string; - dolClasses: string; - }; - commandFFXIVItemFields: { - kind: string; - category: string; - levelEquip: string; - none: string; - }; - commandFFXIVNoCharacterFound: string; - commandFFXIVInvalidServer: string; - commandFFXIVNoItemFound: string; - commandFortniteDescription: string; - commandFortniteExtended: LanguageHelpDisplayOptions; - commandFortniteNoUser: string; - commandFortniteEmbedTitle: (params: { epicUserHandle: string }) => string; - commandFortniteEmbedSectionTitles: { - lifetimeStats: string; - solos: string; - duos: string; - squads: string; - }; - commandFortniteEmbedStats: (params: { - winCount: string; - killCount: string; - kdrCount: string; - matchesPlayedCount: string; - top1Count: string; - top3Count: string; - top5Count: string; - top6Count: string; - top10Count: string; - top12Count: string; - top25Count: string; - }) => { - wins: string; - kills: string; - kdr: string; - matchesPlayed: string; - top1s: string; - top3s: string; - top5s: string; - top6s: string; - top10s: string; - top12s: string; - top25s: string; - }; - commandOverwatchDescription: string; - commandOverwatchExtended: LanguageHelpDisplayOptions; - commandOverwatchInvalidPlayerName: (params: { playerTag: string }) => string; - commandOverwatchQueryFail: (params: { player: string; platform: string }) => string; - commandOverwatchNoStats: (params: { player: string }) => string; - commandOverwatchNoAverage: string; - commandOverwatchEmbedDataStats: (params: { - finalBlows: number; - deaths: number; - damageDone: number; - healing: number; - objectiveKills: number; - soloKills: number; - playTime: number; - gamesWon: number; - goldenMedals: number; - silverMedals: number; - bronzeMedals: number; - }) => { - finalBlows: string; - deaths: string; - damageDealt: string; - healing: string; - objectiveKills: string; - soloKills: string; - playTime: string; - gamesWon: string; - goldenMedals: string; - silverMedals: string; - bronzeMedals: string; - }; - commandOverwatchEmbedDataTopHero: (params: { name: string; playTime: string }) => string; - commandOverwatchEmbedData: (params: { - authorName: string; - playerLevel: number; - prestigeLevel: number; - totalGamesWon: number; - }) => { - title: string; - ratingsTitle: string; - author: string; - playerLevel: string; - prestigeLevel: string; - totalGamesWon: string; - noGamesWon: string; - headers: { - account: string; - quickplay: string; - competitive: string; - topHeroesQuickplay: string; - topHeroesCompetitive: string; - }; - }; - gamesNotEnoughMoney: (params: { money: number }) => string; - gamesCannotHaveNegativeMoney: string; - commandCreateMuteDescription: string; - commandCreateMuteExtended: LanguageHelpDisplayOptions; - commandGiveawayDescription: string; - commandGiveawayExtended: LanguageHelpDisplayOptions; - commandGiveawayRerollDescription: string; - commandGiveawayRerollExtended: LanguageHelpDisplayOptions; - commandGiveawayScheduleDescription: string; - commandGiveawayScheduleExtended: LanguageHelpDisplayOptions; - commandCurrentTimeDescription: string; - commandCurrentTimeExtended: LanguageHelpDisplayOptions; - commandCurrentTimeLocationNotFound: string; - commandCurrentTimeTitles: (params: { - dst: string; - }) => { - currentTime: string; - currentDate: string; - country: string; - gmsOffset: string; - dst: string; - }; - commandCurrentTimeDst: string; - commandCurrentTimeNoDst: string; - commandGsearchDescription: string; - commandGsearchExtended: LanguageHelpDisplayOptions; - commandGimageDescription: string; - commandGimageExtended: LanguageHelpDisplayOptions; - commandLmgtfyDescription: string; - commandLmgtfyExtended: LanguageHelpDisplayOptions; - commandLmgtfyClick: string; - commandWeatherDescription: string; - commandWeatherExtended: LanguageHelpDisplayOptions; - googleErrorZeroResults: string; - googleErrorRequestDenied: string; - googleErrorInvalidRequest: string; - googleErrorOverQueryLimit: string; - googleErrorUnknown: string; - commandNickDescription: string; - commandNickExtended: LanguageHelpDisplayOptions; - commandPermissionNodesDescription: string; - commandPermissionNodesExtended: LanguageHelpDisplayOptions; - commandTriggersDescription: string; - commandTriggersExtended: LanguageHelpDisplayOptions; - commandManagecommandautodeleteDescription: string; - commandManagecommandautodeleteExtended: LanguageHelpDisplayOptions; - commandManageCommandChannelDescription: string; - commandManageCommandChannelExtended: LanguageHelpDisplayOptions; - commandManageReactionRolesDescription: string; - commandManageReactionRolesExtended: LanguageHelpDisplayOptions; - commandSetIgnoreChannelsDescription: string; - commandSetIgnoreChannelsExtended: LanguageHelpDisplayOptions; - commandSetImageLogsDescription: string; - commandSetImageLogsExtended: LanguageHelpDisplayOptions; - commandSetMemberLogsDescription: string; - commandSetMemberLogsExtended: LanguageHelpDisplayOptions; - commandSetMessageLogsDescription: string; - commandSetMessageLogsExtended: LanguageHelpDisplayOptions; - commandSetmodlogsDescription: string; - commandSetmodlogsExtended: LanguageHelpDisplayOptions; - commandSetprefixDescription: string; - commandSetprefixExtended: LanguageHelpDisplayOptions; - commandSetrolechannelDescription: string; - commandSetrolechannelExtended: LanguageHelpDisplayOptions; - commandSetrolemessageDescription: string; - commandSetrolemessageExtended: LanguageHelpDisplayOptions; - commandSetStarboardEmojiDescription: string; - commandSetStarboardEmojiExtended: LanguageHelpDisplayOptions; - commandGiveawayRerollInvalid: string; - commandRoleInfoDescription: string; - commandRoleInfoExtended: LanguageHelpDisplayOptions; - commandGuildInfoDescription: string; - commandGuildInfoExtended: LanguageHelpDisplayOptions; - commandStickyRolesDescription: string; - commandStickyRolesExtended: LanguageHelpDisplayOptions; - commandAttachmentsModeDescription: string; - commandAttachmentsModeExtended: LanguageHelpDisplayOptions; - commandCapitalsModeDescription: string; - commandCapitalsModeExtended: LanguageHelpDisplayOptions; - commandFilterDescription: string; - commandFilterExtended: LanguageHelpDisplayOptions; - commandFilterModeDescription: string; - commandFilterModeExtended: LanguageHelpDisplayOptions; - commandInviteModeDescription: string; - commandInviteModeExtended: LanguageHelpDisplayOptions; - commandLinkModeDescription: string; - commandLinkModeExtended: LanguageHelpDisplayOptions; - commandMessageModeDescription: string; - commandMessageModeExtended: LanguageHelpDisplayOptions; - commandNewlineModeDescription: string; - commandNewlineModeExtended: LanguageHelpDisplayOptions; - commandReactionModeDescription: string; - commandReactionModeExtended: LanguageHelpDisplayOptions; - commandCuddleDescription: string; - commandCuddleExtended: LanguageHelpDisplayOptions; - commandDeletthisDescription: string; - commandDeletthisExtended: LanguageHelpDisplayOptions; - commandFDescription: string; - commandFExtended: LanguageHelpDisplayOptions; - commandGoodnightDescription: string; - commandGoodnightExtended: LanguageHelpDisplayOptions; - commandGoofytimeDescription: string; - commandGoofytimeExtended: LanguageHelpDisplayOptions; - commandHugDescription: string; - commandHugExtended: LanguageHelpDisplayOptions; - commandIneedhealingDescription: string; - commandIneedhealingExtended: LanguageHelpDisplayOptions; - commandRandRedditDescription: string; - commandRandRedditExtended: LanguageHelpDisplayOptions; - commandChaseDescription: string; - commandChaseExtended: LanguageHelpDisplayOptions; - commandShindeiruDescription: string; - commandShindeiruExtended: LanguageHelpDisplayOptions; - commandPeepoloveDescription: string; - commandPeepoloveExtended: LanguageHelpDisplayOptions; - commandSlapDescription: string; - commandSlapExtended: LanguageHelpDisplayOptions; - commandSnipeDescription: string; - commandSnipeExtended: LanguageHelpDisplayOptions; - commandThesearchDescription: string; - commandThesearchExtended: LanguageHelpDisplayOptions; - commandTriggeredDescription: string; - commandTriggeredExtended: LanguageHelpDisplayOptions; - commandUpvoteDescription: string; - commandUpvoteExtended: LanguageHelpDisplayOptions; - - commandSetNicknameDescription: string; - commandSetNicknameExtended: LanguageHelpDisplayOptions; - commandAddRoleDescription: string; - commandAddRoleExtended: LanguageHelpDisplayOptions; - commandRemoveroleDescription: string; - commandRemoveroleExtended: LanguageHelpDisplayOptions; - commandSlowmodeDescription: string; - commandSlowmodeExtended: LanguageHelpDisplayOptions; - commandBanDescription: string; - commandBanExtended: LanguageHelpDisplayOptions; - commandDehoistDescription: string; - commandDehoistExtended: LanguageHelpDisplayOptions; - commandKickDescription: string; - commandKickExtended: LanguageHelpDisplayOptions; - commandLockdownDescription: string; - commandLockdownExtended: LanguageHelpDisplayOptions; - commandMuteDescription: string; - commandMuteExtended: LanguageHelpDisplayOptions; - commandPruneDescription: string; - commandPruneExtended: LanguageHelpDisplayOptions; - commandCaseDescription: string; - commandCaseExtended: LanguageHelpDisplayOptions; - commandPermissionsDescription: string; - commandPermissionsExtended: LanguageHelpDisplayOptions; - commandFlowDescription: string; - commandFlowExtended: LanguageHelpDisplayOptions; - commandReasonDescription: string; - commandReasonExtended: LanguageHelpDisplayOptions; - commandRestrictAttachmentDescription: string; - commandRestrictAttachmentExtended: LanguageHelpDisplayOptions; - commandRestrictEmbedDescription: string; - commandRestrictEmbedExtended: LanguageHelpDisplayOptions; - commandRestrictEmojiDescription: string; - commandRestrictEmojiExtended: LanguageHelpDisplayOptions; - commandRestrictReactionDescription: string; - commandRestrictReactionExtended: LanguageHelpDisplayOptions; - commandRestrictVoiceDescription: string; - commandRestrictVoiceExtended: LanguageHelpDisplayOptions; - commandSoftBanDescription: string; - commandSoftBanExtended: LanguageHelpDisplayOptions; - commandToggleModerationDmDescription: string; - commandToggleModerationDmExtended: LanguageHelpDisplayOptions; - commandUnbanDescription: string; - commandUnbanExtended: LanguageHelpDisplayOptions; - commandUnmuteDescription: string; - commandUnmuteExtended: LanguageHelpDisplayOptions; - commandUnrestrictAttachmentDescription: string; - commandUnrestrictAttachmentExtended: LanguageHelpDisplayOptions; - commandUnrestrictEmbedDescription: string; - commandUnrestrictEmbedExtended: LanguageHelpDisplayOptions; - commandUnrestrictEmojiDescription: string; - commandUnrestrictEmojiExtended: LanguageHelpDisplayOptions; - commandUnrestrictReactionDescription: string; - commandUnrestrictReactionExtended: LanguageHelpDisplayOptions; - commandUnrestrictVoiceDescription: string; - commandUnrestrictVoiceExtended: LanguageHelpDisplayOptions; - commandUnwarnDescription: string; - commandUnwarnExtended: LanguageHelpDisplayOptions; - commandVmuteDescription: string; - commandVmuteExtended: LanguageHelpDisplayOptions; - commandVoiceKickDescription: string; - commandVoiceKickExtended: LanguageHelpDisplayOptions; - commandVunmuteDescription: string; - commandVunmuteExtended: LanguageHelpDisplayOptions; - commandWarnDescription: string; - commandWarnExtended: LanguageHelpDisplayOptions; - commandSocialDescription: string; - commandSocialExtended: LanguageHelpDisplayOptions; - commandBannerDescription: string; - commandBannerExtended: LanguageHelpDisplayOptions; - commandToggleDarkModeDescription: string; - commandToggleDarkModeExtended: LanguageHelpDisplayOptions; - commandAutoRoleDescription: string; - commandAutoRoleExtended: LanguageHelpDisplayOptions; - commandBalanceDescription: string; - commandBalanceExtended: LanguageHelpDisplayOptions; - commandDailyDescription: string; - commandDailyExtended: LanguageHelpDisplayOptions; - commandLeaderboardDescription: string; - commandLeaderboardExtended: LanguageHelpDisplayOptions; - commandLevelDescription: string; - commandLevelExtended: LanguageHelpDisplayOptions; - commandDivorceDescription: string; - commandDivorceExtended: LanguageHelpDisplayOptions; - commandMarryDescription: string; - commandMarryExtended: LanguageHelpDisplayOptions; - commandMarriedDescription: string; - commandMarriedExtended: LanguageHelpDisplayOptions; - commandMylevelDescription: string; - commandMylevelExtended: LanguageHelpDisplayOptions; - commandPayDescription: string; - commandPayExtended: LanguageHelpDisplayOptions; - commandProfileDescription: string; - commandProfileExtended: LanguageHelpDisplayOptions; - commandRemindmeDescription: string; - commandRemindmeExtended: LanguageHelpDisplayOptions; - commandReputationDescription: string; - commandReputationExtended: LanguageHelpDisplayOptions; - commandSetColorDescription: string; - commandSetColorExtended: LanguageHelpDisplayOptions; - commandStarDescription: string; - commandStarExtended: LanguageHelpDisplayOptions; - commandSuggestDescription: string; - commandSuggestExtended: LanguageHelpDisplayOptions; - commandResolveSuggestionDescription: string; - commandResolveSuggestionExtended: LanguageHelpDisplayOptions; - commandDmDescription: string; - commandDmExtended: LanguageHelpDisplayOptions; - commandEvalDescription: string; - commandEvalExtended: LanguageHelpDisplayOptions; - commandExecDescription: string; - commandExecExtended: LanguageHelpDisplayOptions; - commandSetAvatarDescription: string; - commandSetAvatarExtended: LanguageHelpDisplayOptions; - commandDonateDescription: string; - commandDonateExtended: LanguageHelpDisplayOptions; - commandEchoDescription: string; - commandEchoExtended: LanguageHelpDisplayOptions; - commandFeedbackDescription: string; - commandFeedbackExtended: LanguageHelpDisplayOptions; - commandStatsDescription: string; - commandStatsExtended: LanguageHelpDisplayOptions; - commandAvatarDescription: string; - commandAvatarExtended: LanguageHelpDisplayOptions; - commandColorDescription: string; - commandColorExtended: LanguageHelpDisplayOptions; - commandContentDescription: string; - commandContentExtended: LanguageHelpDisplayOptions; - commandEmojiDescription: string; - commandEmojiExtended: LanguageHelpDisplayOptions; - commandCountryDescription: string; - commandCountryExtended: LanguageHelpDisplayOptions; - commandCountryTitles: { - OVERVIEW: string; - LANGUAGES: string; - OTHER: string; - }; - commandCountryFields: { - overview: { - officialName: string; - capital: string; - population: string; - }; - other: { - demonym: string; - area: string; - currencies: string; - }; - }; - commandEshopDescription: string; - commandEshopExtended: LanguageHelpDisplayOptions; - commandEshopNotInDatabase: string; - commandEshopTitles: { - price: string; - availability: string; - releaseDate: string; - numberOfPlayers: string; - platform: string; - categories: string; - noCategories: string; - nsuid: 'NSUID'; - esrb: 'ESRB'; - }; - commandEshopPricePaid: (params: { price: number }) => string; - commandEshopPriceFree: string; - commandHoroscopeDescription: string; - commandHoroscopeExtended: LanguageHelpDisplayOptions; - commandHoroscopeInvalidSunsign: (params: { sign: string; maybe: string }) => string; - commandHoroscopeTitles: (params: { - sign: string; - intensity: string; - keywords: readonly string[]; - mood: string; - rating: string; - }) => { - dailyHoroscope: string; - metadataTitle: string; - metadata: readonly string[]; - }; - commandIgdbDescription: string; - commandIgdbExtended: LanguageHelpDisplayOptions; - commandIgdbTitles: { - userScore: string; - ageRating: string; - releaseDate: string; - genres: string; - developers: string; - platform: string; - }; - commandIgdbData: { - noDevelopers: string; - noPlatforms: string; - noReleaseDate: string; - noRating: string; - noSummary: string; - noAgeRatings: string; - noGenres: string; - }; - commandItunesDescription: string; - commandItunesExtended: LanguageHelpDisplayOptions; - commandItunesTitles: { - artist: string; - collection: string; - collectionPrice: string; - trackPrice: string; - trackReleaseDate: string; - numberOfTracksInCollection: string; - primaryGenre: string; - preview: string; - previewLabel: string; - }; - commandMoviesDescription: string; - commandMoviesExtended: LanguageHelpDisplayOptions; - commandMoviesTitles: { - runtime: string; - userScore: string; - status: string; - releaseDate: string; - imdbPage: string; - homePage: string; - collection: string; - genres: string; - }; - commandMoviesData: { - variableRuntime: string; - movieInProduction: string; - linkClickHere: string; - none: string; - notPartOfCollection: string; - noGenres: string; - }; - commandShowsDescription: string; - commandShowsExtended: LanguageHelpDisplayOptions; - commandShowsTitles: { - episodeRuntime: string; - userScore: string; - status: string; - firstAirDate: string; - genres: string; - }; - commandShowsData: { - variableRuntime: string; - unknownUserScore: string; - noGenres: string; - }; - commandPriceDescription: string; - commandPriceExtended: LanguageHelpDisplayOptions; - commandQuoteDescription: string; - commandQuoteExtended: LanguageHelpDisplayOptions; - commandRolesDescription: string; - commandRolesExtended: LanguageHelpDisplayOptions; - commandDuckDuckGoDescription: string; - commandDuckDuckGoExtended: LanguageHelpDisplayOptions; - commandPollDescription: string; - commandPollExtended: LanguageHelpDisplayOptions; - commandPollReactionLimit: string; - commandVoteDescription: string; - commandVoteExtended: LanguageHelpDisplayOptions; - commandTopInvitesDescription: string; - commandTopInvitesExtended: LanguageHelpDisplayOptions; - commandTopInvitesNoInvites: string; - commandTopInvitesTop10InvitesFor: (params: { guild: Guild }) => string; - commandTopInvitesEmbedData: { - channel: string; - link: string; - createdAt: string; - createdAtUnknown: string; - expiresIn: string; - neverExpress: string; - temporary: string; - uses: string; - }; - commandUrbanDescription: string; - commandUrbanExtended: LanguageHelpDisplayOptions; - commandWhoisDescription: string; - commandWhoisExtended: LanguageHelpDisplayOptions; - commandFollowageDescription: string; - commandFollowageExtended: LanguageHelpDisplayOptions; - commandTwitchDescription: string; - commandTwitchExtended: LanguageHelpDisplayOptions; - commandTwitchSubscriptionDescription: string; - commandTwitchSubscriptionExtended: LanguageHelpDisplayOptions; - commandWikipediaDescription: string; - commandWikipediaExtended: LanguageHelpDisplayOptions; - commandYoutubeDescription: string; - commandYoutubeExtended: LanguageHelpDisplayOptions; - commandWbangDescription: string; - commandWbangExtended: LanguageHelpDisplayOptions; - commandWbangheadDescription: string; - commandWbangheadExtended: LanguageHelpDisplayOptions; - commandWbiteDescription: string; - commandWbiteExtended: LanguageHelpDisplayOptions; - commandWblushDescription: string; - commandWblushExtended: LanguageHelpDisplayOptions; - commandWcryDescription: string; - commandWcryExtended: LanguageHelpDisplayOptions; - commandWcuddleDescription: string; - commandWcuddleExtended: LanguageHelpDisplayOptions; - commandWdanceDescription: string; - commandWdanceExtended: LanguageHelpDisplayOptions; - commandWgreetDescription: string; - commandWgreetExtended: LanguageHelpDisplayOptions; - commandWhugDescription: string; - commandWhugExtended: LanguageHelpDisplayOptions; - commandWkissDescription: string; - commandWkissExtended: LanguageHelpDisplayOptions; - commandWlewdDescription: string; - commandWlewdExtended: LanguageHelpDisplayOptions; - commandWlickDescription: string; - commandWlickExtended: LanguageHelpDisplayOptions; - commandWnomDescription: string; - commandWnomExtended: LanguageHelpDisplayOptions; - commandWnekoDescription: string; - commandWnekoExtended: LanguageHelpDisplayOptions; - commandWpatDescription: string; - commandWpatExtended: LanguageHelpDisplayOptions; - commandWpoutDescription: string; - commandWpoutExtended: LanguageHelpDisplayOptions; - commandWpunchDescription: string; - commandWpunchExtended: LanguageHelpDisplayOptions; - commandWslapDescription: string; - commandWslapExtended: LanguageHelpDisplayOptions; - commandWsleepyDescription: string; - commandWsleepyExtended: LanguageHelpDisplayOptions; - commandWsmileDescription: string; - commandWsmileExtended: LanguageHelpDisplayOptions; - commandWsmugDescription: string; - commandWsmugExtended: LanguageHelpDisplayOptions; - commandWstareDescription: string; - commandWstareExtended: LanguageHelpDisplayOptions; - commandWthumbsupDescription: string; - commandWthumbsupExtended: LanguageHelpDisplayOptions; - commandWtickleDescription: string; - commandWtickleExtended: LanguageHelpDisplayOptions; - commandWeebUnavailableError: string; - commandWeebUnexpectedError: string; - commandAnimeTypes: { - tv: string; - movie: string; - ova: string; - special: string; - [index: string]: string; - }; - commandAnimeInvalidChoice: string; - commandAnimeOutputDescription: (params: { englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }) => string; - commandAnimeNoSynopsis: string; - commandAnimeEmbedData: { - type: string; - score: string; - episodes: string; - episodeLength: string; - ageRating: string; - firstAirDate: string; - watchIt: string; - stillAiring: string; - }; - commandMangaOutputDescription: (params: { englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }) => string; - commandMangaEmbedData: { - type: string; - score: string; - ageRating: string; - firstPublishDate: string; - readIt: string; - none: string; - }; - commandMangaTypes: { - manga: string; - novel: string; - manhwa: string; - oneShot: string; - special: string; - [index: string]: string; - }; - commandWaifuFooter: string; - commandSubscribeNoRole: string; - commandSubscribeSuccess: (params: { role: string }) => string; - commandUnsubscribeSuccess: (params: { role: string }) => string; - commandSubscribeNoChannel: string; - commandAnnouncement: (params: { role: string }) => string; - commandAnnouncementSuccess: string; - commandAnnouncementCancelled: string; - commandAnnouncementPrompt: string; - commandAnnouncementEmbedMentions: (params: { header: string }) => string; - commandAnnouncementEmbedMentionsWithMentions: (params: { header: string; mentions: string }) => string; - commandInviteDescription: string; - commandInviteExtended: LanguageHelpDisplayOptions; - commandInvitePermissionInviteText: string; - commandInvitePermissionSupportServerText: string; - commandInvitePermissionsDescription: string; - commandInfoBody: string[]; - commandHelpData: (params: { - titleDescription: string; - usage: string; - extendedHelp: string; - footerName: string; - }) => { - title: string; - usage: string; - extended: string; - footer: string; - }; - commandSupportDescription: string; - commandSupportExtended: LanguageHelpDisplayOptions; - commandYarnDescription: string; - commandYarnExtended: LanguageHelpDisplayOptions; - commandYarnNoPackage: string; - commandYarnUnpublishedPackage: (params: { pkg: string }) => string; - commandYarnPackageNotFound: (params: { pkg: string }) => string; - commandYarnEmbedDescriptionAuthor: (params: { author: string }) => string; - commandYarnEmbedDescriptionMaintainers: string; - commandYarnEmbedDescriptionLatestVersion: (params: { latestVersionNumber: string }) => string; - commandYarnEmbedDescriptionLicense: (params: { license: string }) => string; - commandYarnEmbedDescriptionMainFile: (params: { mainFile: string }) => string; - commandYarnEmbedDescriptionDateCreated: (params: { dateCreated: string }) => string; - commandYarnEmbedDescriptionDateModified: (params: { dateModified: string }) => string; - commandYarnEmbedDescriptionDeprecated: (params: { deprecated: string }) => string; - commandYarnEmbedDescriptionDependenciesLabel: string; - commandYarnEmbedDescriptionDependenciesNoDeps: string; - commandYarnEmbedMoreText: string; - command8ballDescription: string; - command8ballExtended: LanguageHelpDisplayOptions; - command8ballOutput: (params: { author: string; question: string; response: string }) => string; - command8ballQuestions: EightBallLanguage; - command8ballWhen: readonly string[]; - command8ballWhat: readonly string[]; - command8ballHowMuch: readonly string[]; - command8ballHowMany: readonly string[]; - command8ballWhy: readonly string[]; - command8ballWho: readonly string[]; - command8ballElse: readonly string[]; - commandCatfactTitle: string; - commandChoiceOutput: (params: { user: string; word: string }) => string; - commandChoiceMissing: string; - commandChoiceDuplicates: (params: { words: string }) => string; - commandDiceOutput: (params: { result: number }) => string; - commandDiceRollsError: string; - commandDiceSidesError: string; - commandEscaperopeOutput: (params: { user: string }) => string; - commandLoveLess45: string; - commandLoveLess75: string; - commandLoveLess100: string; - commandLove100: string; - commandLoveItself: string; - commandLoveResult: string; - commandNorrisOutput: string; - commandPunError: string; - commandRateOutput: (params: { author: string; userToRate: string; rate: number; emoji: string }) => string; - commandRateMyself: [string, string]; - commandRateOwners: [string, string]; - commandXkcdComics: (params: { amount: number }) => string; - commandXkcdNotfound: string; - commandGamesSkyra: string; - commandGamesBot: string; - commandGamesSelf: string; - commandGamesProgress: string; - commandGamesNoPlayers: (params: { prefix: string }) => string; - commandGamesTooManyOrFew: (params: { min: number; max: number }) => string; - commandGamesRepeat: string; - commandGamesPromptTimeout: string; - commandGamesPromptDeny: string; - commandGamesTimeout: string; - commandC4Description: string; - commandC4Extended: LanguageHelpDisplayOptions; - commandC4Prompt: (params: { challenger: string; challengee: string }) => string; - commandC4Start: (params: { player: string }) => string; - commandC4GameColumnFull: string; - commandC4GameWin: (params: { user: string }) => string; - commandC4GameWinTurn0: (params: { user: string }) => string; - commandC4GameDraw: string; - commandC4GameNext: (params: { user: string }) => string; - commandC4GameNextTurn0: (params: { user: string }) => string; - commandCoinFlipDescription: string; - commandCoinFlipExtended: LanguageHelpDisplayOptions; - commandCoinFlipInvalidCoinname: (params: { arg: string }) => string; - commandCoinFlipCoinnames: string[]; - commandCoinFlipWinTitle: string; - commandCoinFlipLoseTitle: string; - commandCoinFlipNoguessTitle: string; - commandCoinFlipWinDescription: (params: { result: string }) => string; - commandCoinFlipWinDescriptionWithWager: (params: { result: string; wager: number }) => string; - commandCoinFlipLoseDescription: (params: { result: string }) => string; - commandCoinFlipLoseDescriptionWithWager: (params: { result: string; wager: number }) => string; - commandCoinFlipNoguessDescription: (params: { result: string }) => string; - commandHigherLowerDescription: string; - commandHigherLowerExtended: LanguageHelpDisplayOptions; - commandHigherLowerLoading: string; - commandHigherLowerNewround: string; - commandHigherLowerEmbed: (params: { - turn: number; - number: number; - }) => { - title: string; - description: string; - footer: string; - }; - commandHigherLowerLose: (params: { - number: number; - losses: number; - }) => { - title: string; - description: string; - footer: string; - }; - commandHigherLowerWin: (params: { - potentials: number; - number: number; - }) => { - title: string; - description: string; - footer: string; - }; - commandHigherLowerCancel: (params: { - username: string; - }) => { - title: string; - description: string; - }; - commandHigherLowerCashout: (params: { amount: number }) => string; - commandHungerGamesDescription: string; - commandHungerGamesExtended: LanguageHelpDisplayOptions; - commandHungerGamesResultHeaderBloodbath: (params: { game: HungerGamesGame }) => string; - commandHungerGamesResultHeaderSun: (params: { game: HungerGamesGame }) => string; - commandHungerGamesResultHeaderMoon: (params: { game: HungerGamesGame }) => string; - commandHungerGamesResultDeaths: (params: { deaths: number }) => string; - commandHungerGamesResultDeathsPlural: (params: { deaths: number }) => string; - commandHungerGamesResultProceed: string; - commandHungerGamesStop: string; - commandHungerGamesWinner: (params: { winner: string }) => string; - commandSlotmachineDescription: string; - commandSlotmachineExtended: LanguageHelpDisplayOptions; - commandSlotmachinesWin: (params: { roll: string; winnings: number }) => string; - commandSlotmachinesLoss: (params: { roll: string }) => string; - commandSlotmachineTitles: { - previous: string; - new: string; - }; - commandSlotmachineCanvasTextWon: string; - commandSlotmachineCanvasTextLost: string; - commandTicTacToeDescription: string; - commandTicTacToeExtended: LanguageHelpDisplayOptions; - commandWheelOfFortuneDescription: string; - commandWheelOfFortuneExtended: LanguageHelpDisplayOptions; - commandWheelOfFortuneCanvasTextWon: string; - commandWheelOfFortuneCanvasTextLost: string; - commandWheelOfFortuneTitles: { - previous: string; - new: string; - }; - commandTicTacToePrompt: (params: { challenger: string; challengee: string }) => string; - commandTicTacToeTurn: (params: { icon: string; player: string; board: string }) => string; - commandTicTacToeWinner: (params: { winner: string; board: string }) => string; - commandTicTacToeDraw: (params: { board: string }) => string; - commandTriviaDescription: string; - commandTriviaExtended: LanguageHelpDisplayOptions; - commandTriviaInvalidCategory: string; - commandTriviaActiveGame: string; - commandTriviaIncorrect: (params: { attempt: string }) => string; - commandTriviaNoAnswer: (params: { correctAnswer: string }) => string; - commandTriviaEmbedTitles: { - trivia: string; - difficulty: string; - }; - commandTriviaWinner: (params: { winner: string; correctAnswer: string }) => string; - commandVaultDescription: string; - commandVaultExtended: LanguageHelpDisplayOptions; - commandVaultEmbedData: (params: { - coins?: number; - }) => { - depositedDescription: string; - withdrewDescription: string; - showDescription: string; - accountMoney: string; - accountVault: string; - }; - commandVaultInvalidCoins: string; - commandVaultNotEnoughMoney: (params: { money: number }) => string; - commandVaultNotEnoughInVault: (params: { vault: number }) => string; - giveawayTime: string; - giveawayTimeTooLong: string; - giveawayEndsAt: string; - giveawayDuration: (params: { time: number }) => string; - giveawayTitle: string; - giveawayLastchance: (params: { time: number }) => string; - giveawayLastchanceTitle: string; - giveawayEnded: (params: { winners: string; count: number }) => string; - giveawayEndedPlural: (params: { winners: string; count: number }) => string; - giveawayEndedNoWinner: string; - giveawayEndedAt: string; - giveawayEndedTitle: string; - giveawayEndedMessage: (params: { winners: readonly string[]; title: string }) => string; - giveawayEndedMessageNoWinner: (params: { title: string }) => string; - giveawayScheduled: (params: { scheduledTime: number }) => string; - commandNickSet: (params: { nickname: string }) => string; - commandNickCleared: string; - commandPermissionNodesHigher: string; - commandPermissionNodesInvalidType: string; - commandPermissionNodesAdd: string; - commandPermissionNodesNodeNotExists: string; - commandPermissionNodesCommandNotExists: string; - commandPermissionNodesRemove: string; - commandPermissionNodesReset: string; - commandPermissionNodesShowName: (params: { name: string }) => string; - commandPermissionNodesShowAllow: (params: { allow: string }) => string; - commandPermissionNodesShowDeny: (params: { deny: string }) => string; - commandTriggersNotype: string; - commandTriggersNooutput: string; - commandTriggersInvalidreaction: string; - commandTriggersInvalidalias: string; - commandTriggersRemoveNottaken: string; - commandTriggersRemove: string; - commandTriggersAddTaken: string; - commandTriggersAdd: string; - commandTriggersListEmpty: string; - commandGuildInfoTitles: Record; - commandGuildInfoRoles: (params: { roles: string }) => string; - commandGuildInfoNoroles: string; - commandGuildInfoChannels: (params: { text: number; voice: number; categories: number; afkChannelText: string }) => string[]; - commandGuildInfoChannelsAfkChannelText: (params: { afkChannel: string; afkTime: number }) => string; - commandGuildInfoMembers: (params: { count: string; owner: User }) => string[]; - commandGuildInfoOther: (params: { - size: number; - region: string; - createdAt: number; - verificationLevel: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH'; - }) => string[]; - commandRoleInfoTitles: Record; - commandRoleInfoData: (params: { role: Role; hoisted: string; mentionable: string }) => string[]; - commandRoleInfoAll: string; - commandRoleInfoNoPermissions: string; - commandFilterUndefinedWord: string; - commandFilterAlreadyFiltered: string; - commandFilterNotFiltered: string; - commandFilterAdded: (params: { word: string }) => string; - commandFilterRemoved: (params: { word: string }) => string; - commandFilterReset: string; - commandFilterShowEmpty: string; - commandFilterShow: (params: { words: string }) => string; - commandManageCommandAutoDeleteTextChannel: string; - commandManageCommandAutoDeleteRequiredDuration: string; - commandManageCommandAutoDeleteShowEmpty: string; - commandManageCommandAutoDeleteShow: (params: { codeblock: string }) => string; - commandManageCommandAutoDeleteAdd: (params: { channel: string; time: number }) => string; - commandManageCommandAutoDeleteRemove: (params: { channel: string }) => string; - commandManageCommandAutoDeleteRemoveNotset: (params: { channel: string }) => string; - commandManageCommandAutoDeleteReset: string; - commandManageCommandChannelTextChannel: string; - commandManageCommandChannelRequiredCommand: string; - commandManageCommandChannelShow: (params: { channel: string; commands: string }) => string; - commandManageCommandChannelShowEmpty: string; - commandManageCommandChannelAddAlreadyset: string; - commandManageCommandChannelAdd: (params: { channel: string; command: string }) => string; - commandManageCommandChannelRemoveNotset: (params: { channel: string }) => string; - commandManageCommandChannelRemove: (params: { channel: string; command: string }) => string; - commandManageCommandChannelResetEmpty: string; - commandManageCommandChannelReset: (params: { channel: string }) => string; - commandManageReactionRolesShowEmpty: string; - commandManageReactionRolesAddPrompt: string; - commandManageReactionRolesAddChannel: (params: { emoji: string; channel: string }) => string; - commandManageReactionRolesAddMissing: string; - commandManageReactionRolesAdd: (params: { emoji: string; url: string }) => string; - commandManageReactionRolesRemoveNotExists: string; - commandManageReactionRolesRemove: (params: { emoji: string; url: string }) => string; - commandManageReactionRolesResetEmpty: string; - commandManageReactionRolesReset: string; - commandSetStarboardEmojiSet: (params: { emoji: string }) => string; - configurationTextChannelRequired: string; - configurationEquals: string; - commandSetIgnoreChannelsSet: (params: { channel: string }) => string; - commandSetIgnoreChannelsRemoved: (params: { channel: string }) => string; - commandSetImageLogsSet: (params: { channel: string }) => string; - commandSetMemberLogsSet: (params: { channel: string }) => string; - commandSetMessageLogsSet: (params: { channel: string }) => string; - commandSetModLogsSet: (params: { channel: string }) => string; - commandSetPrefixSet: (params: { prefix: string }) => string; - commandStickyRolesRequiredUser: string; - commandStickyRolesRequiredRole: string; - commandStickyRolesNotExists: (params: { user: string }) => string; - commandStickyRolesReset: (params: { user: string }) => string; - commandStickyRolesRemove: (params: { user: string }) => string; - commandStickyRolesAddExists: (params: { user: string }) => string; - commandStickyRolesAdd: (params: { user: string }) => string; - commandStickyRolesShowEmpty: string; - commandStickyRolesShowSingle: (params: { user: string; roles: string }) => string; - commandRandRedditRequiredReddit: string; - commandRandRedditInvalidArgument: string; - commandRandRedditBanned: string; - commandRandRedditFail: string; - commandRandRedditAllNsfw: string; - commandRandRedditAllNsfl: string; - commandRandRedditMessage: (params: { title: string; author: string; url: string }) => string; - commandRandRedditErrorPrivate: string; - commandRandRedditErrorQuarantined: string; - commandRandRedditErrorNotFound: string; - commandRandRedditErrorBanned: string; - commandRedditUserDescription: string; - commandRedditUserExtended: LanguageHelpDisplayOptions; - commandRedditUserComplexityLevels: string[]; - commandRedditUserInvalidUser: (params: { user: string }) => string; - commandRedditUserQueryFailed: string; - commandRedditUserTitles: { - linkKarma: string; - commentKarma: string; - totalComments: string; - totalSubmissions: string; - commentControversiality: string; - textComplexity: string; - top5Subreddits: string; - bySubmissions: string; - byComments: string; - bestComment: string; - worstComment: string; - }; - commandRedditUserData: (params: { - user: string; - timestamp: string; - }) => { - overviewFor: string; - permalink: string; - dataAvailableFor: string; - joinedReddit: string; - }; - commandShipDescription: string; - commandShipExtended: LanguageHelpDisplayOptions; - commandShipData: (params: { - romeoUsername: string; - julietUsername: string; - shipName: string; - }) => { - title: string; - description: string; - }; - commandSnipeEmpty: string; - commandSnipeTitle: string; - commandUpvoteMessage: string; - commandVaporwaveDescription: string; - commandVaporwaveExtended: LanguageHelpDisplayOptions; - commandVaporwaveOutput: (params: { str: string }) => string; - - commandHistoryDescription: string; - commandHistoryExtended: LanguageHelpDisplayOptions; - commandHistoryFooterNew: (params: { - warnings: number; - mutes: number; - kicks: number; - bans: number; - warningsText: string; - mutesText: string; - kicksText: string; - bansText: string; - }) => string; - commandHistoryFooterWarning: (params: { count: number }) => string; - commandHistoryFooterWarningPlural: (params: { count: number }) => string; - commandHistoryFooterMutes: (params: { count: number }) => string; - commandHistoryFooterMutesPlural: (params: { count: number }) => string; - commandHistoryFooterKicks: (params: { count: number }) => string; - commandHistoryFooterKicksPlural: (params: { count: number }) => string; - commandHistoryFooterBans: (params: { count: number }) => string; - commandHistoryFooterBansPlural: (params: { count: number }) => string; - commandModerationsDescription: string; - commandModerationsExtended: LanguageHelpDisplayOptions; - commandModerationsEmpty: string; - commandModerationsAmount: (params: { count: number }) => string; - commandModerationsAmountPlural: (params: { count: number }) => string; - commandMutesDescription: string; - commandMutesExtended: LanguageHelpDisplayOptions; - commandWarningsDescription: string; - commandWarningsExtended: LanguageHelpDisplayOptions; - - commandPermissions: (params: { username: string; id: string }) => string; - commandPermissionsAll: string; - commandFlow: (params: { amount: number }) => string; - commandTimeTimed: string; - commandTimeUndefinedTime: string; - commandTimeUnsupportedType: string; - commandTimeNotScheduled: string; - commandTimeAborted: (params: { title: string }) => string; - commandTimeScheduled: (params: { title: string; user: User; time: number }) => string; - commandTimeDescription: string; - commandTimeExtended: LanguageHelpDisplayOptions; - commandSlowmodeSet: (params: { cooldown: number }) => string; - commandSlowmodeReset: string; - commandSlowmodeTooLong: string; - commandBanNotBannable: string; - commandDehoistStarting: (params: { count: number }) => string; - commandDehoistProgress: (params: { count: number; percentage: number }) => string; - commandDehoistEmbed: (params: { - users: number; - dehoistedMemberCount: number; - dehoistedWithErrorsCount: number; - errored: number; - }) => { - title: string; - descriptionNoone: string; - descriptionWithError: string; - descriptionWithMultipleErrors: string; - description: string; - descriptionMultipleMembers: string; - fieldErrorTitle: string; - }; - commandKickNotKickable: string; - commandLockdownLock: (params: { channel: string }) => string; - commandLockdownLocking: (params: { channel: string }) => string; - commandLockdownLocked: (params: { channel: string }) => string; - commandLockdownUnlocked: (params: { channel: string }) => string; - commandLockdownOpen: (params: { channel: string }) => string; - commandMuteLowlevel: string; - commandMuteConfigureCancelled: string; - commandMuteConfigure: string; - commandMuteConfigureToomanyRoles: string; - commandMuteMuted: string; - commandMuteUserNotMuted: string; - commandMuteUnconfigured: string; - commandMutecreateMissingPermission: string; - commandRestrictLowlevel: string; - commandPruneInvalid: string; - commandPruneAlert: (params: { count: number; total: number }) => string; - commandPruneAlertPlural: (params: { count: number; total: number }) => string; - commandPruneInvalidPosition: string; - commandPruneInvalidFilter: string; - commandPruneNoDeletes: string; - commandPruneLogHeader: string; - commandPruneLogMessage: (params: { channel: string; author: string; count: number }) => string; - commandPruneLogMessagePlural: (params: { channel: string; author: string; count: number }) => string; - commandReasonMissingCase: string; - commandReasonNotExists: string; - commandReasonUpdated: (params: { entries: readonly number[]; newReason: string; count: number }) => string[]; - commandReasonUpdatedPlural: (params: { entries: readonly number[]; newReason: string; count: number }) => string[]; - commandToggleModerationDmToggledEnabled: string; - commandToggleModerationDmToggledDisabled: string; - commandUnbanMissingPermission: string; - commandUnmuteMissingPermission: string; - commandVmuteMissingPermission: string; - commandVmuteUserNotMuted: string; - commandWarnDm: (params: { moderator: string; guild: string; reason: string }) => string; - commandWarnMessage: (params: { user: User; log: number }) => string; - commandModerationOutput: (params: { count: number; range: string | number; users: string; reason: string | null }) => string; - commandModerationOutputPlural: (params: { count: number; range: string | number; users: string; reason: string | null }) => string; - commandModerationOutputWithReason: (params: { count: number; range: string | number; users: string; reason: string | null }) => string; - commandModerationOutputWithReasonPlural: (params: { count: number; range: string | number; users: string; reason: string | null }) => string; - commandModerationFailed: (params: { users: string; count: number }) => string; - commandModerationFailedPlural: (params: { users: string; count: number }) => string; - commandModerationDmFooter: string; - commandModerationDmDescription: (params: { guild: string; title: string; reason: string | null; duration: number | null }) => string[]; - commandModerationDmDescriptionWithReason: (params: { - guild: string; - title: string; - reason: string | null; - duration: number | null; - }) => string[]; - commandModerationDmDescriptionWithDuration: (params: { - guild: string; - title: string; - reason: string | null; - duration: number | null; - }) => string[]; - commandModerationDmDescriptionWithReasonWithDuration: (params: { - guild: string; - title: string; - reason: string | null; - duration: number | null; - }) => string[]; - commandModerationDays: string; - commandAutoRolePointsRequired: string; - commandAutoRoleUpdateConfigured: string; - commandAutoRoleUpdateUnconfigured: string; - commandAutoRoleUpdate: (params: { role: Role; points: number; before: number }) => string; - commandAutoRoleRemove: (params: { role: Role; before: number }) => string; - commandAutoRoleAdd: (params: { role: Role; points: number }) => string; - commandAutoRoleListEmpty: string; - commandAutoRoleUnknownRole: (params: { role: string }) => string; - commandBalance: (params: { user: string; amount: string }) => string; - commandBalanceSelf: (params: { amount: string }) => string; - commandBalanceBots: string; - commandSocialMemberNotexists: string; - commandSocialAdd: (params: { user: string; amount: number; count: number }) => string; - commandSocialAddPlural: (params: { user: string; amount: number; count: number }) => string; - commandSocialRemove: (params: { user: string; amount: number; count: number }) => string; - commandSocialRemovePlural: (params: { user: string; amount: number; count: number }) => string; - commandSocialUnchanged: (params: { user: string }) => string; - commandSocialReset: (params: { user: string }) => string; - commandBannerMissing: (params: { type: string }) => string; - commandBannerNotexists: (params: { prefix: string }) => string; - commandBannerUserlistEmpty: (params: { prefix: string }) => string; - commandBannerResetDefault: string; - commandBannerReset: string; - commandBannerSetNotBought: string; - commandBannerSet: (params: { banner: string }) => string; - commandBannerBought: (params: { prefix: string; banner: string }) => string; - commandBannerMoney: (params: { money: number; cost: number }) => string; - commandBannerPaymentCancelled: string; - commandBannerBuy: (params: { banner: string }) => string; - commandBannerPrompt: string; - commandToggleDarkModeEnabled: string; - commandToggleDarkModeDisabled: string; - commandDailyTime: (params: { time: number }) => string; - commandDailyTimeSuccess: (params: { amount: number }) => string; - commandDailyGrace: (params: { remaining: number }) => string[]; - commandDailyGraceAccepted: (params: { amount: number; remaining: number }) => string; - commandDailyGraceDenied: string; - commandDailyCollect: string; - commandLevel: LevelTitles; - commandDivorceSelf: string; - commandDivorceNotTaken: string; - commandDivorcePrompt: string; - commandDivorceCancel: string; - commandDivorceDm: (params: { user: string }) => string; - commandDivorceSuccess: (params: { user: string }) => string; - commandMarryWith: (params: { users: readonly string[] }) => string; - commandMarryNotTaken: string; - commandMarrySkyra: string; - commandMarryAelia: string; - commandMarryBots: string; - commandMarrySelf: string; - commandMarryAuthorTaken: (params: { author: User }) => string; - commandMarryAuthorMultipleCancel: (params: { user: string }) => string; - commandMarryTaken: (params: { count: number }) => string; - commandMarryTakenPlural: (params: { count: number }) => string; - commandMarryAlreadyMarried: (params: { user: User }) => string; - commandMarryAuthorTooMany: (params: { limit: number }) => string; - commandMarryTargetTooMany: (params: { limit: number }) => string; - commandMarryMultipleCancel: string; - commandMarryPetition: (params: { author: User; user: User }) => string; - commandMarryNoreply: string; - commandMarryDenied: string; - commandMarryAccepted: (params: { author: User; user: User }) => string; - commandMylevel: (params: { points: number; next: string; user: string }) => string; - commandMylevelSelf: (params: { points: number; next: string }) => string; - commandMylevelNext: (params: { remaining: number; next: number }) => string; - commandPayMissingMoney: (params: { needed: number; has: number }) => string; - commandPayPrompt: (params: { user: string; amount: number }) => string; - commandPayPromptAccept: (params: { user: string; amount: number }) => string; - commandPayPromptDeny: string; - commandPaySelf: string; - commandSocialPayBot: string; - commandProfile: ProfileTitles; - commandRemindmeCreate: (params: { id: string }) => string; - commandRemindmeCreateNoDuration: string; - commandRemindmeCreateNoDescription: string; - commandRemindmeDeleteNoId: string; - commandRemindmeDelete: (params: { task: ScheduleEntity; id: number }) => string; - commandRemindmeListEmpty: string; - commandRemindmeShowFooter: (params: { id: number }) => string; - commandRemindmeInvalidId: string; - commandRemindmeNotfound: string; - commandReputationTime: (params: { remaining: number }) => string; - commandReputationUsable: string; - commandReputationUserNotfound: string; - commandReputationSelf: string; - commandReputationBots: string; - commandReputationGive: (params: { user: string }) => string; - commandReputationsBots: string; - commandReputationsSelf: (params: { points: number }) => string; - commandReputation: (params: { count: number }) => string; - commandReputationPlural: (params: { count: number }) => string; - commandReputations: (params: { user: string; points: string }) => string; - commandRequireRole: string; - commandScoreboardPosition: (params: { position: number }) => string; - commandSetColor: (params: { color: string }) => string; - commandSuggestNoSetup: (params: { username: string }) => string; - commandSuggestNoSetupAsk: (params: { username: string }) => string; - commandSuggestNoSetupAbort: string; - commandSuggestNopermissions: (params: { username: string; channel: string }) => string; - commandSuggestChannelPrompt: string; - commandSuggestTitle: (params: { id: number }) => string; - commandSuggestSuccess: (params: { channel: string }) => string; - commandResolveSuggestionInvalidId: string; - commandResolveSuggestionMessageNotFound: string; - commandResolveSuggestionIdNotFound: string; - commandResolveSuggestionDefaultComment: string; - commandResolveSuggestionAuthorAdmin: string; - commandResolveSuggestionAuthorModerator: string; - commandResolveSuggestionActions: (params: { - author: string; - }) => { - accept: string; - consider: string; - deny: string; - }; - commandResolveSuggestionActionsDms: (params: { - author: string; - guild: string; - }) => { - accept: string; - consider: string; - deny: string; - }; - commandResolveSuggestionDmFail: string; - commandResolveSuggestionSuccess: (params: { id: number; actionText: string }) => string; - commandResolveSuggestionSuccessAcceptedText: string; - commandResolveSuggestionSuccessDeniedText: string; - commandResolveSuggestionSuccessConsideredText: string; - commandStarNostars: string; - commandStarNoChannel: string; - commandStarStats: string; - commandStarStatsDescription: (params: { messages: string; stars: string }) => string; - commandStarMessages: (params: { count: number }) => string; - commandStarMessagesPlural: (params: { count: number }) => string; - commandStars: (params: { count: number }) => string; - commandStarsPlural: (params: { count: number }) => string; - commandStarTopstarred: string; - commandStarTopstarredDescription: (params: { medal: string; id: string; count: number }) => string; - commandStarTopstarredDescriptionPlural: (params: { medal: string; id: string; count: number }) => string; - commandStarTopreceivers: string; - commandStarTopreceiversDescription: (params: { medal: string; id: string; count: number }) => string; - commandStarTopreceiversDescriptionPlural: (params: { medal: string; id: string; count: number }) => string; - commandEvalTimeout: (params: { seconds: number }) => string; - commandEvalError: (params: { time: string; output: string; type: string }) => string; - commandStatsTitles: { - stats: string; - uptime: string; - serverUsage: string; - }; - commandStatsFields: (params: { - stats: StatsGeneral; - uptime: StatsUptime; - usage: StatsUsage; - }) => { - stats: string[]; - uptime: string[]; - serverUsage: string[]; - }; - commandTagDescription: string; - commandTagExtended: LanguageHelpDisplayOptions; - commandTagPermissionlevel: string; - commandTagNameNotAllowed: string; - commandTagNameTooLong: string; - commandTagListEmpty: string; - commandTagContentRequired: string; - commandTagExists: (params: { tag: string }) => string; - commandTagAdded: (params: { name: string; content: string }) => string; - commandTagRemoved: (params: { name: string }) => string; - commandTagNotexists: (params: { tag: string }) => string; - commandTagEdited: (params: { name: string; content: string }) => string; - commandTagReset: string; - commandAvatarNone: string; - commandColor: (params: { hex: string; rgb: string; hsl: string }) => string[]; - commandEmojiCustom: (params: { emoji: string; id: string }) => string[]; - commandEmojiTwemoji: (params: { emoji: string; id: string }) => string[]; - commandEmojiInvalid: string; - commandEmojiTooLarge: (params: { emoji: string }) => string; - commandEmotesDescription: string; - commandEmotesExtended: LanguageHelpDisplayOptions; - commandEmotesTitle: string; - commandPriceCurrency: (params: { fromCurrency: string; fromAmount: number; worths: string[] }) => string; - commandPriceCurrencyNotFound: string; - commandQuoteMessage: string; - commandRolesListEmpty: string; - commandRolesAbort: (params: { prefix: string }) => string; - commandRolesListTitle: string; - commandRolesAdded: (params: { roles: string }) => string; - commandRolesRemoved: (params: { roles: string }) => string; - commandRolesNotPublic: (params: { roles: string }) => string; - commandRolesNotManageable: (params: { roles: string }) => string; - commandRolesAuditlog: string; - commandDuckDuckGoNotfound: string; - commandDuckDuckGoLookalso: string; - commandUrbanNotFound: string; - commandUrbanIndexNotfound: string; - systemTextTruncated: (params: { definition: string; url: string }) => string; - commandWhoisMemberTitles: { - joined: string; - createdAt: string; - }; - commandWhoisMemberFields: (params: { - member: GuildMember; - }) => { - joinedUnknown: string; - joinedWithTimestamp: string; - createdAt: string; - footer: string; - }; - commandWhoisMemberRoles: (params: { count: number }) => string; - commandWhoisMemberRolesPlural: (params: { count: number }) => string; - commandWhoisMemberPermissions: string; - commandWhoisMemberPermissionsAll: string; - commandWhoisUserTitles: { - createdAt: string; - }; - commandWhoisUserFields: (params: { - user: User; - }) => { - createdAt: string; - footer: string; - }; - commandFollowage: (params: { user: string; channel: string; time: number }) => string; - commandFollowageMissingEntries: string; - commandFollowageNotFollowing: string; - commandTwitchNoEntries: string; - commandTwitchTitles: { - followers: string; - views: string; - clickToVisit: string; - partner: string; - }; - commandTwitchPartnershipWithoutAffiliate: string; - commandTwitchAffiliateStatus: { - affiliated: string; - partnered: string; - }; - commandTwitchCreatedAt: string; - commandTwitchSubscriptionRequiredStreamer: string; - commandTwitchSubscriptionStreamerNotFound: string; - commandTwitchSubscriptionRequiredChannel: string; - commandTwitchSubscriptionRequiredStatus: string; - commandTwitchSubscriptionStatusValues: [string, string]; - commandTwitchSubscriptionInvalidStatus: string; - commandTwitchSubscriptionRequiredContent: string; - commandTwitchSubscriptionAddDuplicated: string; - commandTwitchSubscriptionAddSuccessOffline: (params: { name: string; channel: string }) => string; - commandTwitchSubscriptionAddSuccessLive: (params: { name: string; channel: string }) => string; - commandTwitchSubscriptionRemoveStreamerNotSubscribed: string; - commandTwitchSubscriptionRemoveEntryNotExists: string; - commandTwitchSubscriptionRemoveSuccessOffline: (params: { name: string; channel: string }) => string; - commandTwitchSubscriptionRemoveSuccessLive: (params: { name: string; channel: string }) => string; - commandTwitchSubscriptionResetEmpty: string; - commandTwitchSubscriptionResetSuccess: (params: { count: number }) => string; - commandTwitchSubscriptionResetSuccessPlural: (params: { count: number }) => string; - commandTwitchSubscriptionResetStreamerNotSubscribed: string; - commandTwitchSubscriptionResetChannelSuccess: (params: { name: string; count: number }) => string; - commandTwitchSubscriptionResetChannelSuccessPlural: (params: { name: string; count: number }) => string; - commandTwitchSubscriptionShowStreamerNotSubscribed: string; - commandTwitchSubscriptionShowStatus: [string, string]; - commandTwitchSubscriptionShowEmpty: string; - commandTwitchSubscriptionShowUnknownUser: string; - commandWikipediaNotfound: string; - commandYoutubeNotfound: string; - commandYoutubeIndexNotfound: string; - commandDefineDescription: string; - commandDefineExtended: LanguageHelpDisplayOptions; - commandDefineNotfound: string; - commandDefinePronounciation: string; - commandDefineUnknown: string; - commandWbang: (params: { user: string }) => string; - commandWbanghead: string; - commandWbite: (params: { user: string }) => string; - commandWblush: string; - commandWcry: (params: { user: string }) => string; - commandWcuddle: (params: { user: string }) => string; - commandWdance: string; - commandWgreet: (params: { user: string }) => string; - commandWhug: (params: { user: string }) => string; - commandWkiss: (params: { user: string }) => string; - commandWlewd: string; - commandWlick: (params: { user: string }) => string; - commandWnom: string; - commandWneko: string; - commandWpat: (params: { user: string }) => string; - commandWpout: string; - commandWpunch: (params: { user: string }) => string; - commandWslap: (params: { user: string }) => string; - commandWsleepy: string; - commandWsmile: string; - commandWsmug: string; - commandWstare: (params: { user: string }) => string; - commandWthumbsup: string; - commandWtickle: (params: { user: string }) => string; - constMonitorInvitelink: string; - constMonitorLink: string; - constMonitorNms: string; - constMonitorWordfilter: string; - constMonitorCapsfilter: string; - constMonitorAttachmentfilter: string; - monitorAttachmentFilter: (params: { user: string }) => string; - constMonitorReactionfilter: string; - moderationMonitorAttachments: string; - moderationMonitorAttachmentsWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorCapitals: string; - moderationMonitorCapitalsWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorInvites: string; - moderationMonitorInvitesWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorLinks: string; - moderationMonitorLinksWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorMessages: string; - moderationMonitorMessagesWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorNewlines: string; - moderationMonitorNewlinesWithMaximum: (params: { amount: number; maximum: number }) => string; - moderationMonitorWords: string; - moderationMonitorWordsWithMaximum: (params: { amount: number; maximum: number }) => string; - monitorInviteFilterAlert: (params: { user: string }) => string; - monitorInviteFilterLog: (params: { links: readonly string[]; count: number }) => string; - monitorInviteFilterLogPlural: (params: { links: readonly string[]; count: number }) => string; - monitorNolink: (params: { user: string }) => string; - monitorWordFilterDm: (params: { filtered: string }) => string; - monitorCapsFilterDm: (params: { message: string }) => string; - monitorWordFilter: (params: { user: string }) => string; - monitorCapsFilter: (params: { user: string }) => string; - monitorMessageFilter: (params: { user: string }) => string; - monitorNewlineFilter: (params: { user: string }) => string; - monitorReactionsFilter: (params: { user: string }) => string; - monitorNmsMessage: (params: { user: User }) => string[]; - monitorNmsModlog: (params: { threshold: number }) => string; - monitorNmsAlert: string; - monitorSocialAchievement: string; - inhibitorSpam: (params: { channel: string }) => string; - hgBloodbath: readonly string[]; - hgDay: readonly string[]; - hgNight: readonly string[]; - serializerAutoRoleInvalid: string; - serializerCommandAutoDeleteInvalid: string; - serializerPermissionNodeDuplicatedCommand: (params: { command: string }) => string; - serializerPermissionNodeInvalidCommand: (params: { command: string }) => string; - serializerPermissionNodeInvalidTarget: string; - serializerPermissionNodeInvalid: string; - serializerPermissionNodeSecurityEveryoneAllows: string; - serializerPermissionNodeSecurityGuarded: (params: { command: string }) => string; - serializerPermissionNodeSecurityOwner: string; - serializerReactionRoleInvalid: string; - serializerStickyRoleInvalid: string; - serializerTriggerAliasInvalid: string; - serializerTriggerIncludeInvalid: string; - serializerTriggerIncludeInvalidAction: string; - serializerTwitchSubscriptionInvalidStreamer: string; - serializerTwitchSubscriptionInvalid: string; - serializerUniqueRoleSetInvalid: string; - serializerUnsupported: string; - serializerCustomCommandInvalidId: string; - serializerCustomCommandInvalidEmbed: string; - serializerCustomCommandInvalidColor: string; - serializerCustomCommandInvalidContent: string; - serializerCustomCommandInvalidArgs: string; - serializerDisabledCommandChannelsChannelsDoesNotExist: string; - serializerDisabledCommandChannelsChannelsCommandDoesNotExist: (params: { name: string }) => string; - selfModerationCommandInvalidMissingAction: (params: { name: string }) => string; - selfModerationCommandInvalidMissingArguments: (params: { name: string }) => string; - selfModerationCommandInvalidSoftaction: (params: { name: string }) => string; - selfModerationCommandInvalidHardaction: (params: { name: string }) => string; - selfModerationCommandEnabled: string; - selfModerationCommandDisabled: string; - selfModerationCommandSoftAction: string; - selfModerationCommandSoftActionWithValue: (params: { value: string }) => string; - selfModerationCommandHardAction: (params: { value: string }) => string; - selfModerationCommandHardActionDuration: string; - selfModerationCommandHardActionDurationWithValue: (params: { value: number }) => string; - selfModerationCommandThresholdMaximum: string; - selfModerationCommandThresholdMaximumWithValue: (params: { value: number }) => string; - selfModerationCommandThresholdDuration: string; - selfModerationCommandThresholdDurationWithValue: (params: { value: number }) => string; - selfModerationCommandShow: (params: { - kEnabled: string; - kAlert: string; - kLog: string; - kDelete: string; - kHardAction: string; - hardActionDurationText: string; - thresholdMaximumText: string | number; - thresholdDurationText: string; - }) => readonly string[]; - selfModerationCommandShowDurationPermanent: string; - selfModerationCommandShowUnset: string; - selfModerationSoftActionAlert: string; - selfModerationSoftActionLog: string; - selfModerationSoftActionDelete: string; - selfModerationHardActionBan: string; - selfModerationHardActionKick: string; - selfModerationHardActionMute: string; - selfModerationHardActionSoftban: string; - selfModerationHardActionWarning: string; - selfModerationHardActionNone: string; - selfModerationEnabled: string; - selfModerationDisabled: string; - selfModerationMaximumTooShort: (params: { minimum: number; value: number }) => string; - selfModerationMaximumTooLong: (params: { maximum: number; value: number }) => string; - selfModerationDurationTooShort: (params: { minimum: number; value: number }) => string; - selfModerationDurationTooLong: (params: { maximum: number; value: number }) => string; - moderationActions: ModerationAction; - actionApplyReason: (params: { action: string; reason: string }) => string; - actionApplyNoReason: (params: { action: string }) => string; - actionRevokeReason: (params: { action: string; reason: string }) => string; - actionRevokeNoReason: (params: { action: string }) => string; - actionSoftbanReason: (params: { reason: string }) => string; - actionUnSoftbanReason: (params: { reason: string }) => string; - actionSoftbanNoReason: string; - actionUnSoftbanNoReason: string; - actionSetNicknameSet: (params: { reason: string }) => string; - actionSetNicknameRemoved: (params: { reason: string }) => string; - actionSetNicknameNoReasonSet: string; - actionSetNicknameNoReasonRemoved: string; - actionSetupMuteExists: string; - actionSetupRestrictionExists: string; - actionSetupTooManyRoles: string; - actionSharedRoleSetupExisting: string; - actionSharedRoleSetupExistingName: string; - actionSharedRoleSetupNew: string; - actionSharedRoleSetupAsk: (params: { role: string; channels: number; permissions: string }) => string; - actionSharedRoleSetupAskMultipleChannels: (params: { role: string; channels: number; permissions: string }) => string; - actionSharedRoleSetupAskMultiplePermissions: (params: { role: string; channels: number; permissions: string }) => string; - actionSharedRoleSetupAskMultipleChannelsMultiplePermissions: (params: { role: string; channels: number; permissions: string }) => string; - actionRequiredMember: string; - muteNotConfigured: string; - restrictionNotConfigured: string; - muteNotInMember: string; - muteLowHierarchy: string; - muteCannotManageRoles: string; - muteNotExists: string; - resolverDateSuffix: string; - resolverPositiveAmount: string; - systemPoweredByWeebsh: string; - prefixReminder: (params: { prefix: string }) => string; - unexpectedIssue: string; - commandDmNotSent: string; - commandDmSent: string; - commandRoleHigherSkyra: string; - commandRoleHigher: string; - commandSuccess: string; - commandToskyra: string; - commandUserself: string; - systemParseError: string; - systemHighestRole: string; - systemChannelNotPostable: string; - systemFetchbansFail: string; - systemLoading: readonly string[]; - systemError: string; - systemDatabaseError: string; - systemDiscordAborterror: string; - systemQueryFail: string; - systemNoResults: string; - systemMessageNotFound: string; - systemNotenoughParameters: string; - systemCannotAccessChannel: string; - systemExceededLengthOutput: (params: { output: string; time?: string; type?: string }) => string; - systemExceededLengthOutputWithTypeAndTime: (params: { output: string; time?: string; type?: string }) => string; - systemExceededLengthOutputConsole: (params: { time?: string; type?: string }) => string; - systemExceededLengthOutputConsoleWithTypeAndTime: (params: { time?: string; type?: string }) => string; - systemExceededLengthOutputFile: (params: { time?: string; type?: string }) => string; - systemExceededLengthOutputFileWithTypeAndTime: (params: { time?: string; type?: string }) => string; - systemExceededLengthOutputHastebin: (params: { url: string; time?: string; type?: string }) => string; - systemExceededLengthOutputHastebinWithTypeAndTime: (params: { url: string; time?: string; type?: string }) => string; - systemExceededLengthChooseOutput: (params: { output: string[] }) => string; - systemExternalServerError: string; - systemPokedexExternalResource: string; - jumpTo: string; - resolverInvalidChannelName: (params: { name: string }) => string; - resolverChannelNotInGuild: string; - resolverChannelNotInGuildSubcommand: (params: { command: string; subcommand: string }) => string; - resolverInvalidRoleName: (params: { name: string }) => string; - resolverInvalidUsername: (params: { name: string }) => string; - resolverMembernameUserLeftDuringPrompt: string; - listifyPage: (params: { page: number; pageCount: number; results: string }) => string; - moderationLogAppealed: string; - moderationLogExpiresIn: (params: { duration: number }) => string; - moderationLogDescription: (params: { data: Moderation.ModerationManagerDescriptionData }) => string; - moderationLogFooter: (params: { caseID: number }) => string; - moderationCaseNotExists: (params: { count: number }) => string; - ModerationCaseNotExistsPlural: (params: { count: number }) => string; - guildSettingsChannelsMod: string; - guildSettingsRolesRestricted: (params: { prefix: string; path: string }) => string; - guildMuteNotFound: string; - guildBansEmpty: string; - guildBansNotFound: string; - channelNotReadable: string; - userNotInGuild: string; - userNotExistent: string; - eventsGuildMemberAdd: string; - eventsGuildMemberAddMute: string; - eventsGuildMemberAddDescription: (params: { mention: string; time: number }) => string; - eventsGuildMemberRemove: string; - eventsGuildMemberKicked: string; - eventsGuildMemberBanned: string; - eventsGuildMemberSoftBanned: string; - eventsGuildMemberRemoveDescription: (params: { mention: string; time: number }) => string; - eventsGuildMemberRemoveDescriptionWithJoinedAt: (params: { mention: string; time: number }) => string; - eventsGuildMemberUpdateNickname: (params: { previous: string; current: string }) => string; - eventsGuildMemberAddedNickname: (params: { previous: string; current: string }) => string; - eventsGuildMemberRemovedNickname: (params: { previous: string }) => string; - eventsNicknameUpdate: string; - eventsUsernameUpdate: string; - eventsNameUpdatePreviousWasSet: (params: { previousName: string | null }) => string; - eventsNameUpdatePreviousWasNotSet: (params: { previousName: string | null }) => string; - eventsNameUpdateNextWasSet: (params: { nextName: string | null }) => string; - eventsNameUpdateNextWasNotSet: (params: { nextName: string | null }) => string; - eventsGuildMemberNoUpdate: string; - eventsGuildMemberAddedRoles: (params: { addedRoles: string }) => string; - eventsGuildMemberAddedRolesPlural: (params: { addedRoles: string }) => string; - eventsGuildMemberRemovedRoles: (params: { removedRoles: string }) => string; - eventsGuildMemberRemovedRolesPlural: (params: { removedRoles: string }) => string; - eventsRoleUpdate: string; - eventsMessageUpdate: string; - eventsMessageDelete: string; - eventsReaction: string; - eventsCommand: (params: { command: string }) => string; - settingsDeleteChannelsDefault: string; - settingsDeleteRolesInitial: string; - settingsDeleteRolesMute: string; - modlogTimed: (params: { remaining: number }) => string; - guildWarnNotFound: string; - guildMemberNotVoicechannel: string; - promptlistMultipleChoice: (params: { list: string; count: number }) => string; - promptlistMultipleChoicePlural: (params: { list: string; count: number }) => string; - promptlistAttemptFailed: (params: { list: string; attempt: number; maxAttempts: number }) => string; - promptlistAborted: string; - fuzzySearchMatches: (params: { matches: number; codeblock: string }) => string; - fuzzySearchAborted: string; - fuzzySearchInvalidNumber: string; - fuzzySearchInvalidIndex: string; - eventsErrorWtf: string; - eventsErrorString: (params: { mention: string; message: string }) => string; - constUsers: string; - constMonitorMessagefilter: string; - constMonitorNewlinefilter: string; - unknownChannel: string; - unknownRole: string; - unknownUser: string; - notificationsTwitchNoGameName: string; - notificationsTwitchEmbedDescription: (params: { userName: string }) => string; - notificationsTwitchEmbedDescriptionWithGame: (params: { userName: string; gameName: string }) => string; - notificationTwitchEmbedFooter: string; - } -} diff --git a/src/lib/types/definitions/Yarnpkg.d.ts b/src/lib/types/definitions/Yarnpkg.d.ts index 6d341506e19..558de6bb7cf 100644 --- a/src/lib/types/definitions/Yarnpkg.d.ts +++ b/src/lib/types/definitions/Yarnpkg.d.ts @@ -14,7 +14,7 @@ export namespace YarnPkg { readme: string; readmeFilename: string; repository: Repository; - time?: Record; + time?: Record; versions: Record; } diff --git a/src/lib/types/namespaces/languages/Arguments.ts b/src/lib/types/namespaces/languages/Arguments.ts index 415db2a44f7..de92a45b031 100644 --- a/src/lib/types/namespaces/languages/Arguments.ts +++ b/src/lib/types/namespaces/languages/Arguments.ts @@ -1,5 +1,4 @@ import { FT } from '#lib/types'; -export const RangeInvalid = FT<{ name: string }, string>('argumentRangeInvalid'); -export const RangeMax = FT<{ name: string; maximum: number; count: number }, string>('argumentRangeMax'); -export const RangeMaxPlural = FT<{ name: string; maximum: number; count: number }, string>('argumentRangeMaxPlural'); +export const RangeInvalid = FT<{ name: string }, string>('arguments/range:invalid'); +export const RangeMax = FT<{ name: string; maximum: number; count: number }, string>('arguments/range:max'); diff --git a/src/lib/types/namespaces/languages/CustomCommandSerializer/All.ts b/src/lib/types/namespaces/languages/CustomCommandSerializer/All.ts index 659d781dca4..077fdd62412 100644 --- a/src/lib/types/namespaces/languages/CustomCommandSerializer/All.ts +++ b/src/lib/types/namespaces/languages/CustomCommandSerializer/All.ts @@ -1,7 +1,7 @@ import { T } from '#lib/types'; -export const InvalidId = T('serializerCustomCommandInvalidId'); -export const InvalidEmbed = T('serializerCustomCommandInvalidEmbed'); -export const InvalidColor = T('serializerCustomCommandInvalidColor'); -export const InvalidContent = T('serializerCustomCommandInvalidContent'); -export const InvalidArgs = T('serializerCustomCommandInvalidArgs'); +export const InvalidId = T('serializers:customCommandInvalidId'); +export const InvalidEmbed = T('serializers:customCommandInvalidEmbed'); +export const InvalidColor = T('serializers:customCommandInvalidColor'); +export const InvalidContent = T('serializers:customCommandInvalidContent'); +export const InvalidArgs = T('serializers:customCommandInvalidArgs'); diff --git a/src/lib/types/namespaces/languages/DisabledCommandChannels/All.ts b/src/lib/types/namespaces/languages/DisabledCommandChannels/All.ts index cbda415a89b..36a300186a6 100644 --- a/src/lib/types/namespaces/languages/DisabledCommandChannels/All.ts +++ b/src/lib/types/namespaces/languages/DisabledCommandChannels/All.ts @@ -1,4 +1,4 @@ import { FT, T } from '#lib/types'; -export const ChannelDoesNotExist = T('serializerDisabledCommandChannelsChannelsDoesNotExist'); -export const CommandDoesNotExist = FT<{ name: string }, string>('serializerDisabledCommandChannelsChannelsCommandDoesNotExist'); +export const ChannelDoesNotExist = T('serializers:disabledCommandChannelsChannelsDoesNotExist'); +export const CommandDoesNotExist = FT<{ name: string }, string>('serializers:disabledCommandChannelsChannelsCommandDoesNotExist'); diff --git a/src/lib/types/namespaces/languages/Events.ts b/src/lib/types/namespaces/languages/Events.ts index d0a0848c3d2..6c79eccf09c 100644 --- a/src/lib/types/namespaces/languages/Events.ts +++ b/src/lib/types/namespaces/languages/Events.ts @@ -1,34 +1,33 @@ import { FT, T } from '#lib/types'; +import type { Message, TextChannel } from 'discord.js'; -export const GuildMemberAdd = T('eventsGuildMemberAdd'); -export const GuildMemberAddMute = T('eventsGuildMemberAddMute'); -export const GuildMemberAddDescription = FT<{ mention: string; time: number }, string>('eventsGuildMemberAddDescription'); -export const GuildMemberRemove = T('eventsGuildMemberRemove'); -export const GuildMemberKicked = T('eventsGuildMemberKicked'); -export const GuildMemberBanned = T('eventsGuildMemberBanned'); -export const GuildMemberSoftBanned = T('eventsGuildMemberSoftBanned'); -export const GuildMemberRemoveDescription = FT<{ mention: string; time: number }, string>('eventsGuildMemberRemoveDescription'); +export const GuildMemberAdd = T('events:guildMemberAdd'); +export const GuildMemberAddMute = T('events:guildMemberAddMute'); +export const GuildMemberAddDescription = FT<{ mention: string; time: number }, string>('events:guildMemberAddDescription'); +export const GuildMemberRemove = T('events:guildMemberRemove'); +export const GuildMemberKicked = T('events:guildMemberKicked'); +export const GuildMemberBanned = T('events:guildMemberBanned'); +export const GuildMemberSoftBanned = T('events:guildMemberSoftBanned'); +export const GuildMemberRemoveDescription = FT<{ mention: string; time: number }, string>('events:guildMemberRemoveDescription'); export const GuildMemberRemoveDescriptionWithJoinedAt = FT<{ mention: string; time: number }, string>( - 'eventsGuildMemberRemoveDescriptionWithJoinedAt' + 'events:guildMemberRemoveDescriptionWithJoinedAt' ); -export const GuildMemberUpdateNickname = FT<{ previous: string; current: string }, string>('eventsGuildMemberUpdateNickname'); -export const GuildMemberAddedNickname = FT<{ previous: string; current: string }, string>('eventsGuildMemberAddedNickname'); -export const GuildMemberRemovedNickname = FT<{ previous: string }, string>('eventsGuildMemberRemovedNickname'); -export const NicknameUpdate = T('eventsNicknameUpdate'); -export const UsernameUpdate = T('eventsUsernameUpdate'); -export const NameUpdatePreviousWasSet = FT<{ previousName: string | null }, string>('eventsNameUpdatePreviousWasSet'); -export const NameUpdatePreviousWasNotSet = FT<{ previousName: string | null }, string>('eventsNameUpdatePreviousWasNotSet'); -export const NameUpdateNextWasSet = FT<{ nextName: string | null }, string>('eventsNameUpdateNextWasSet'); -export const NameUpdateNextWasNotSet = FT<{ nextName: string | null }, string>('eventsNameUpdateNextWasNotSet'); -export const GuildMemberNoUpdate = T('eventsGuildMemberNoUpdate'); -export const GuildMemberAddedRoles = FT<{ addedRoles: string }, string>('eventsGuildMemberAddedRoles'); -export const GuildMemberAddedRolesPlural = FT<{ addedRoles: string }, string>('eventsGuildMemberAddedRolesPlural'); -export const GuildMemberRemovedRoles = FT<{ removedRoles: string }, string>('eventsGuildMemberRemovedRoles'); -export const GuildMemberRemovedRolesPlural = FT<{ removedRoles: string }, string>('eventsGuildMemberRemovedRolesPlural'); -export const RoleUpdate = T('eventsRoleUpdate'); -export const MessageUpdate = T('eventsMessageUpdate'); -export const MessageDelete = T('eventsMessageDelete'); -export const Reaction = T('eventsReaction'); -export const Command = FT<{ command: string }, string>('eventsCommand'); -export const ErrorWtf = T('eventsErrorWtf'); -export const ErrorString = FT<{ mention: string; message: string }, string>('eventsErrorString'); +export const GuildMemberUpdateNickname = FT<{ previous: string; current: string }, string>('events:guildMemberUpdateNickname'); +export const GuildMemberAddedNickname = FT<{ previous: string; current: string }, string>('events:guildMemberAddedNickname'); +export const GuildMemberRemovedNickname = FT<{ previous: string }, string>('events:guildMemberRemovedNickname'); +export const NicknameUpdate = T('events:nicknameUpdate'); +export const UsernameUpdate = T('events:usernameUpdate'); +export const NameUpdatePreviousWasSet = FT<{ previousName: string | null }, string>('events:nameUpdatePreviousWasSet'); +export const NameUpdatePreviousWasNotSet = FT<{ previousName: string | null }, string>('events:nameUpdatePreviousWasNotSet'); +export const NameUpdateNextWasSet = FT<{ nextName: string | null }, string>('events:nameUpdateNextWasSet'); +export const NameUpdateNextWasNotSet = FT<{ nextName: string | null }, string>('events:nameUpdateNextWasNotSet'); +export const GuildMemberNoUpdate = T('events:guildMemberNoUpdate'); +export const GuildMemberAddedRoles = FT<{ addedRoles: string; count: number }, string>('events:guildMemberAddedRoles'); +export const GuildMemberRemovedRoles = FT<{ removedRoles: string; count: number }, string>('events:guildMemberRemovedRoles'); +export const RoleUpdate = T('events:roleUpdate'); +export const MessageUpdate = FT<{ message: Message }, string>('events:messageUpdate'); +export const MessageDelete = FT<{ channel: TextChannel }, string>('events:messageDelete'); +export const Reaction = T('events:reaction'); +export const Command = FT<{ command: string }, string>('events:command'); +export const ErrorWtf = T('events:errorWtf'); +export const ErrorString = FT<{ mention: string; message: string }, string>('events:errorString'); diff --git a/src/lib/types/namespaces/languages/FuzzySearch.ts b/src/lib/types/namespaces/languages/FuzzySearch.ts index 900b64351bf..86edf7fa44c 100644 --- a/src/lib/types/namespaces/languages/FuzzySearch.ts +++ b/src/lib/types/namespaces/languages/FuzzySearch.ts @@ -1,7 +1,6 @@ import { FT, T } from '#lib/types'; -export const Matches = FT<{ matches: number; codeblock: string }, string>('fuzzySearchMatches'); -export const Aborted = T('fuzzySearchAborted'); -export const InvalidNumber = T('fuzzySearchInvalidNumber'); -export const InvalidIndex = T('fuzzySearchInvalidIndex'); -export const Page = FT<{ page: number; pageCount: number; results: string }, string>('listifyPage'); +export const Matches = FT<{ matches: number; codeblock: string }, string>('fuzzySearch:matches'); +export const Aborted = T('fuzzySearch:aborted'); +export const InvalidNumber = T('fuzzySearch:invalidNumber'); +export const InvalidIndex = T('fuzzySearch:invalidIndex'); diff --git a/src/lib/types/namespaces/languages/Giveaway.ts b/src/lib/types/namespaces/languages/Giveaway.ts index a571618a931..40ab4970685 100644 --- a/src/lib/types/namespaces/languages/Giveaway.ts +++ b/src/lib/types/namespaces/languages/Giveaway.ts @@ -1,17 +1,16 @@ import { FT, T } from '#lib/types'; -export const Time = T('giveawayTime'); -export const TimeTooLong = T('giveawayTimeTooLong'); -export const EndsAt = T('giveawayEndsAt'); -export const Duration = FT<{ time: number }, string>('giveawayDuration'); -export const Title = T('giveawayTitle'); -export const Lastchance = FT<{ time: number }, string>('giveawayLastchance'); -export const LastchanceTitle = T('giveawayLastchanceTitle'); -export const Ended = FT<{ winners: string; count: number }, string>('giveawayEnded'); -export const EndedPlural = FT<{ winners: string; count: number }, string>('giveawayEndedPlural'); -export const EndedNoWinner = T('giveawayEndedNoWinner'); -export const EndedAt = T('giveawayEndedAt'); -export const EndedTitle = T('giveawayEndedTitle'); -export const EndedMessage = FT<{ winners: readonly string[]; title: string }, string>('giveawayEndedMessage'); -export const EndedMessageNoWinner = FT<{ title: string }, string>('giveawayEndedMessageNoWinner'); -export const Scheduled = FT<{ scheduledTime: number }, string>('giveawayScheduled'); +export const Time = T('giveaway:time'); +export const TimeTooLong = T('giveaway:timeTooLong'); +export const EndsAt = T('giveaway:endsAt'); +export const Duration = FT<{ time: number }, string>('giveaway:duration'); +export const Title = T('giveaway:title'); +export const LastChance = FT<{ time: number }, string>('giveaway:lastchance'); +export const LastChanceTitle = T('giveaway:lastchanceTitle'); +export const Ended = FT<{ winners: string; count: number }, string>('giveaway:ended'); +export const EndedNoWinner = T('giveaway:endedNoWinner'); +export const EndedAt = T('giveaway:endedAt'); +export const EndedTitle = T('giveaway:endedTitle'); +export const EndedMessage = FT<{ winners: readonly string[]; title: string }, string>('giveaway:endedMessage'); +export const EndedMessageNoWinner = FT<{ title: string }, string>('giveaway:endedMessageNoWinner'); +export const Scheduled = FT<{ scheduledTime: number }, string>('giveaway:scheduled'); diff --git a/src/lib/types/namespaces/languages/Globals.ts b/src/lib/types/namespaces/languages/Globals.ts index 594acada861..6c02f4c6fd2 100644 --- a/src/lib/types/namespaces/languages/Globals.ts +++ b/src/lib/types/namespaces/languages/Globals.ts @@ -1,9 +1,17 @@ -import { T } from '#lib/types'; +import { FT, T } from '#lib/types'; -export const Yes = T('globalYes'); -export const No = T('globalNo'); -export const None = T('globalNone'); -export const Is = T('globalIs'); -export const And = T('globalAnd'); -export const Or = T('globalOr'); -export const Unknown = T('globalUnknown'); +export const Yes = T('globals:yes'); +export const No = T('globals:no'); +export const None = T('globals:none'); +export const Is = T('globals:is'); +export const And = T('globals:and'); +export const Or = T('globals:or'); +export const Unknown = T('globals:unknown'); +export const OrdinalValue = FT<{ value: string }, string>('globals:ordinalValue'); +export const DurationValue = FT<{ value: number }, string>('globals:durationValue'); +export const NumberValue = FT<{ value: number }, string>('globals:numberValue'); +export const NumberCompactValue = FT<{ value: number }, string>('globals:numberCompactValue'); +export const TimeDateValue = FT<{ value: number }, string>('globals:timeDateValue'); +export const TimeFullValue = FT<{ value: number }, string>('globals:timeFullValue'); +export const AndListValue = FT<{ value: string[] }, string>('globals:andListValue'); +export const OrListValue = FT<{ value: string[] }, string>('globals:orListValue'); diff --git a/src/lib/types/namespaces/languages/Inhibitors.ts b/src/lib/types/namespaces/languages/Inhibitors.ts index 62789837103..6fcc9a5949d 100644 --- a/src/lib/types/namespaces/languages/Inhibitors.ts +++ b/src/lib/types/namespaces/languages/Inhibitors.ts @@ -1,21 +1,20 @@ import { FT, T } from '#lib/types'; -export const Cooldown = FT<{ remaining: string }, string>('inhibitorCooldown'); -export const MissingBotPerms = FT<{ missing: string }, string>('inhibitorMissingBotPerms'); -export const Nsfw = T('inhibitorNsfw'); -export const Permissions = T('inhibitorPermissions'); -export const RequiredSettings = FT<{ settings: string; count: number }, string>('inhibitorRequiredSettings'); -export const RequiredSettingsPlural = FT<{ settings: string; count: number }, string>('inhibitorRequiredSettingsPlural'); -export const Runin = FT<{ type: string }, string>('inhibitorRunin'); -export const RuninNone = FT<{ name: string }, string>('inhibitorRuninNone'); -export const DisabledGuild = T('inhibitorDisabledGuild'); -export const DisabledGlobal = T('inhibitorDisabledGlobal'); -export const MusicQueueEmpty = T('inhibitorMusicQueueEmpty'); -export const MusicNotPlaying = T('inhibitorMusicNotPlaying'); -export const MusicPaused = T('inhibitorMusicPaused'); -export const MusicDjMember = T('inhibitorMusicDjMember'); -export const MusicUserVoiceChannel = T('inhibitorMusicUserVoiceChannel'); -export const MusicBotVoiceChannel = T('inhibitorMusicBotVoiceChannel'); -export const MusicBothVoiceChannel = T('inhibitorMusicBothVoiceChannel'); -export const MusicNothingPlaying = T('inhibitorMusicNothingPlaying'); -export const Spam = FT<{ channel: string }, string>('inhibitorSpam'); +export const Cooldown = FT<{ remaining: number }, string>('inhibitors:cooldown'); +export const MissingBotPerms = FT<{ missing: string[] }, string>('inhibitors:missingBotPerms'); +export const Nsfw = T('inhibitors:nsfw'); +export const Permissions = T('inhibitors:permissions'); +export const RequiredSettings = FT<{ settings: string; count: number }, string>('inhibitors:requiredSettings'); +export const Runin = FT<{ type: string }, string>('inhibitors:runin'); +export const RuninNone = FT<{ name: string }, string>('inhibitors:runinNone'); +export const DisabledGuild = T('inhibitors:disabledGuild'); +export const DisabledGlobal = T('inhibitors:disabledGlobal'); +export const MusicQueueEmpty = T('inhibitors:musicQueueEmpty'); +export const MusicNotPlaying = T('inhibitors:musicNotPlaying'); +export const MusicPaused = T('inhibitors:musicPaused'); +export const MusicDjMember = T('inhibitors:musicDjMember'); +export const MusicUserVoiceChannel = T('inhibitors:musicUserVoiceChannel'); +export const MusicBotVoiceChannel = T('inhibitors:musicBotVoiceChannel'); +export const MusicBothVoiceChannel = T('inhibitors:musicBothVoiceChannel'); +export const MusicNothingPlaying = T('inhibitors:musicNothingPlaying'); +export const Spam = FT<{ channel: string }, string>('inhibitors:spam'); diff --git a/src/lib/types/namespaces/languages/Misc.ts b/src/lib/types/namespaces/languages/Misc.ts index 9686c24cc0a..dfa9b696fdd 100644 --- a/src/lib/types/namespaces/languages/Misc.ts +++ b/src/lib/types/namespaces/languages/Misc.ts @@ -1,34 +1,23 @@ import { FT, T } from '#lib/types'; -export const ChannelNotReadable = T('channelNotReadable'); -export const CommandmessageMissing = T('commandmessageMissing'); -export const CommandmessageMissingOptionals = FT<{ possibles: string }, string>('commandmessageMissingOptionals'); -export const CommandmessageMissingRequired = FT<{ name: string }, string>('commandmessageMissingRequired'); -export const CommandmessageNomatch = FT<{ possibles: string }, string>('commandmessageNomatch'); -export const CommandRequireRole = T('commandRequireRole'); -export const CommandRoleHigher = T('commandRoleHigher'); -export const CommandRoleHigherSkyra = T('commandRoleHigherSkyra'); -export const CommandScoreboardPosition = FT<{ position: number }, string>('commandScoreboardPosition'); -export const CommandSuccess = T('commandSuccess'); -export const CommandToskyra = T('commandToskyra'); -export const CommandUserself = T('commandUserself'); -export const ConfigurationEquals = T('configurationEquals'); -export const ConfigurationTextChannelRequired = T('configurationTextChannelRequired'); -export const ConstUsers = T('constUsers'); -export const DefaultLanguage = T('defaultLanguage'); -export const JumpTo = T('jumpTo'); -export const MessagePromptTimeout = T('messagePromptTimeout'); -export const PrefixReminder = FT<{ prefix: string }, string>('prefixReminder'); -export const ReactionhandlerPrompt = T('reactionhandlerPrompt'); -export const RestrictionNotConfigured = T('restrictionNotConfigured'); -export const SettingsDeleteChannelsDefault = T('settingsDeleteChannelsDefault'); -export const SettingsDeleteRolesInitial = T('settingsDeleteRolesInitial'); -export const SettingsDeleteRolesMute = T('settingsDeleteRolesMute'); -export const SystemTextTruncated = FT<{ definition: string; url: string }, string>('systemTextTruncated'); -export const TextPromptAbortOptions = T('textPromptAbortOptions'); -export const UnexpectedIssue = T('unexpectedIssue'); -export const UnknownChannel = T('unknownChannel'); -export const UnknownRole = T('unknownRole'); -export const UnknownUser = T('unknownUser'); -export const UserNotExistent = T('userNotExistent'); -export const UserNotInGuild = T('userNotInGuild'); +export const ChannelNotReadable = T('errors:channelNotReadable'); +export const CommandmessageMissing = T('klasa:commandMessageMissing'); +export const CommandmessageMissingOptionals = FT<{ possibles: string }, string>('klasa:commandMessageMissingOptionals'); +export const CommandmessageMissingRequired = FT<{ name: string }, string>('klasa:commandMessageMissingRequired'); +export const CommandmessageNomatch = FT<{ possibles: string }, string>('klasa:commandMessageNoMatch'); +export const ConfigurationEquals = T('commands/management:configurationEquals'); +export const ConfigurationTextChannelRequired = T('commands/management:configurationTextChannelRequired'); +export const DefaultLanguage = T('globals:defaultLanguage'); +export const JumpTo = T('system:jumpTo'); +export const MessagePromptTimeout = T('klasa:messagePromptTimeout'); +export const PrefixReminder = FT<{ prefix: string }, string>('system:prefixReminder'); +export const ReactionhandlerPrompt = T('klasa:reactionhandlerPrompt'); +export const RestrictionNotConfigured = T('moderation:restrictionNotConfigured'); +export const SystemTextTruncated = FT<{ definition: string; url: string }, string>('commands/tools:systemTextTruncated'); +export const TextPromptAbortOptions = T('klasa:textPromptAbortOptions'); +export const UnexpectedIssue = T('errors:unexpectedIssue'); +export const UnknownChannel = T('resolvers:unknownChannel'); +export const UnknownRole = T('resolvers:unknownRole'); +export const UnknownUser = T('resolvers:unknownUser'); +export const UserNotExistent = T('errors:userNotExistent'); +export const UserNotInGuild = T('errors:userNotInGuild'); diff --git a/src/lib/types/namespaces/languages/Monitors.ts b/src/lib/types/namespaces/languages/Monitors.ts index 92347cea1c0..92e73246b40 100644 --- a/src/lib/types/namespaces/languages/Monitors.ts +++ b/src/lib/types/namespaces/languages/Monitors.ts @@ -1,47 +1,48 @@ import { FT, T } from '#lib/types'; -import { User } from 'discord.js'; +import type { User } from 'discord.js'; -export const CommandHandlerReprompt = FT<{ tag: string; name: string; time: string; cancelOptions: string }, string>('monitorCommandHandlerReprompt'); +export const AttachmentFilter = FT<{ user: string }, string>('monitors:attachmentFilter'); +export const AttachmentFilterFooter = T('monitors:attachmentFilter'); +export const CapsFilter = FT<{ user: string }, string>('monitors:capsFilter'); +export const CapsFilterDm = FT<{ message: string }, string>('monitors:capsFilterDm'); +export const CapsFilterFooter = T('monitors:capsFilterFooter'); +export const CommandHandlerAborted = T('monitors:commandHandlerAborted'); export const CommandHandlerRepeatingReprompt = FT<{ tag: string; name: string; time: string; cancelOptions: string }, string>( - 'monitorCommandHandlerRepeatingReprompt' + 'monitors:commandHandlerRepeatingReprompt' ); -export const AttachmentFilterFooter = T('constMonitorAttachmentfilter'); -export const AttachmentFilter = FT<{ user: string }, string>('monitorAttachmentFilter'); -export const CapsFilter = FT<{ user: string }, string>('monitorCapsFilter'); -export const CapsFilterDm = FT<{ message: string }, string>('monitorCapsFilterDm'); -export const CapsfilterFooter = T('constMonitorCapsfilter'); -export const CommandHandlerAborted = T('monitorCommandHandlerAborted'); -export const InviteFilterAlert = FT<{ user: string }, string>('monitorInviteFilterAlert'); -export const InviteFilterLog = FT<{ links: readonly string[]; count: number }, string>('monitorInviteFilterLog'); -export const InviteFilterLogPlural = FT<{ links: readonly string[]; count: number }, string>('monitorInviteFilterLogPlural'); -export const InviteFooter = T('constMonitorInvitelink'); -export const LinkFooter = T('constMonitorLink'); -export const MessageFilter = FT<{ user: string }, string>('monitorMessageFilter'); -export const ModerationAttachments = T('moderationMonitorAttachments'); -export const ModerationAttachmentsWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorAttachmentsWithMaximum'); -export const ModerationCapitals = T('moderationMonitorCapitals'); -export const ModerationCapitalsWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorCapitalsWithMaximum'); -export const ModerationInvites = T('moderationMonitorInvites'); -export const ModerationInvitesWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorInvitesWithMaximum'); -export const ModerationLinks = T('moderationMonitorLinks'); -export const ModerationLinksWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorLinksWithMaximum'); -export const ModerationMessages = T('moderationMonitorMessages'); -export const ModerationMessagesWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorMessagesWithMaximum'); -export const ModerationNewLine = T('moderationMonitorNewlines'); -export const ModerationNewLineWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorNewlinesWithMaximum'); -export const ModerationWords = T('moderationMonitorWords'); -export const ModerationWordsWithMaximum = FT<{ amount: number; maximum: number }, string>('moderationMonitorWordsWithMaximum'); -export const NewLineFilter = FT<{ user: string }, string>('monitorNewlineFilter'); -export const NmsAlert = T('monitorNmsAlert'); -export const NmsFooter = T('constMonitorNms'); -export const NmsMessage = FT<{ user: User }, string[]>('monitorNmsMessage'); -export const NmsModlog = FT<{ threshold: number }, string>('monitorNmsModlog'); -export const LinkMissing = FT<{ user: string }, string>('monitorNolink'); -export const ReactionsFilter = FT<{ user: string }, string>('monitorReactionsFilter'); -export const ReactionsFilterFooter = T('constMonitorReactionfilter'); -export const SocialAchievement = T('monitorSocialAchievement'); -export const WordFilter = FT<{ user: string }, string>('monitorWordFilter'); -export const WordFilterDm = FT<{ filtered: string }, string>('monitorWordFilterDm'); -export const WordFooter = T('constMonitorWordfilter'); -export const MessageFooter = T('constMonitorMessagefilter'); -export const NewLineFooter = T('constMonitorNewlinefilter'); +export const CommandHandlerReprompt = FT<{ tag: string; name: string; time: string; cancelOptions: string }, string>( + 'monitors:commandHandlerReprompt' +); +export const InviteFilterAlert = FT<{ user: string }, string>('monitors:inviteFilterAlert'); +export const InviteFilterLog = FT<{ links: readonly string[]; count: number }, string>('monitors:inviteFilterLog'); +export const InviteFooter = T('monitors:inviteLink'); +export const LinkFooter = T('monitors:link'); +export const LinkMissing = FT<{ user: string }, string>('monitors:nolink'); +export const MessageFilter = FT<{ user: string }, string>('monitors:messageFilter'); +export const MessageFooter = T('monitors:messageFilterFooter'); +export const ModerationAttachments = T('monitors:attachments'); +export const ModerationAttachmentsWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:attachmentsWithMaximum'); +export const ModerationCapitals = T('monitors:capitals'); +export const ModerationCapitalsWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:capitalsWithMaximum'); +export const ModerationInvites = T('monitors:invites'); +export const ModerationInvitesWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:invitesWithMaximum'); +export const ModerationLinks = T('monitors:links'); +export const ModerationLinksWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:linksWithMaximum'); +export const ModerationMessages = T('monitors:messages'); +export const ModerationMessagesWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:messagesWithMaximum'); +export const ModerationNewLine = T('monitors:newlines'); +export const ModerationNewLineWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:newlinesWithMaximum'); +export const ModerationWords = T('monitors:words'); +export const ModerationWordsWithMaximum = FT<{ amount: number; maximum: number }, string>('monitors:wordsWithMaximum'); +export const NewLineFilter = FT<{ user: string }, string>('monitors:newlineFilter'); +export const NewLineFooter = T('monitors:newlineFilterFooter'); +export const NoMentionSpamAlert = T('monitors:nmsAlert'); +export const NoMentionSpamFooter = T('monitors:nms'); +export const NoMentionSpamMessage = FT<{ user: User }, string>('monitors:nmsMessage'); +export const NoMentionSpamModerationLog = FT<{ threshold: number }, string>('monitors:nmsModlog'); +export const ReactionsFilter = FT<{ user: string }, string>('monitors:reactionsFilter'); +export const ReactionsFilterFooter = T('monitors:reactionFilterFooter'); +export const SocialAchievement = T('monitors:socialAchievement'); +export const WordFilter = FT<{ user: string }, string>('monitors:wordFilter'); +export const WordFilterDm = FT<{ filtered: string }, string>('monitors:wordFilterDm'); +export const WordFooter = T('monitors:wordFilterFooter'); diff --git a/src/lib/types/namespaces/languages/MusicManager.ts b/src/lib/types/namespaces/languages/MusicManager.ts index eb1b8c36c7a..7cd7e172f4b 100644 --- a/src/lib/types/namespaces/languages/MusicManager.ts +++ b/src/lib/types/namespaces/languages/MusicManager.ts @@ -1,13 +1,13 @@ import { FT, T } from '#lib/types'; -export const FetchNoArguments = T('musicManagerFetchNoArguments'); -export const FetchNoMatches = T('musicManagerFetchNoMatches'); -export const FetchLoadFailed = T('musicManagerFetchLoadFailed'); -export const ImportQueueNotFound = T('musicManagerImportQueueNotFound'); -export const ImportQueueError = T('musicManagerImportQueueError'); -export const TooManySongs = T('musicManagerTooManySongs'); -export const SetvolumeSilent = T('musicManagerSetvolumeSilent'); -export const SetvolumeLoud = T('musicManagerSetvolumeLoud'); -export const PlayNoSongs = T('musicManagerPlayNoSongs'); -export const PlayPlaying = T('musicManagerPlayPlaying'); -export const Stuck = FT<{ milliseconds: number }, string>('musicManagerStuck'); +export const FetchNoArguments = T('musicManager:fetchNoArguments'); +export const FetchNoMatches = T('musicManager:fetchNoMatches'); +export const FetchLoadFailed = T('musicManager:fetchLoadFailed'); +export const ImportQueueNotFound = T('musicManager:importQueueNotFound'); +export const ImportQueueError = T('musicManager:importQueueError'); +export const TooManySongs = T('musicManager:tooManySongs'); +export const SetvolumeSilent = T('musicManager:setvolumeSilent'); +export const SetvolumeLoud = T('musicManager:setvolumeLoud'); +export const PlayNoSongs = T('musicManager:playNoSongs'); +export const PlayPlaying = T('musicManager:playPlaying'); +export const Stuck = FT<{ milliseconds: number }, string>('musicManager:stuck'); diff --git a/src/lib/types/namespaces/languages/Notifications.ts b/src/lib/types/namespaces/languages/Notifications.ts index 0b7d1835519..d5559a17070 100644 --- a/src/lib/types/namespaces/languages/Notifications.ts +++ b/src/lib/types/namespaces/languages/Notifications.ts @@ -1,6 +1,6 @@ import { FT, T } from '#lib/types'; -export const TwitchNoGameName = T('notificationsTwitchNoGameName'); -export const TwitchEmbedDescription = FT<{ userName: string }, string>('notificationsTwitchEmbedDescription'); -export const TwitchEmbedDescriptionWithGame = FT<{ userName: string; gameName: string }, string>('notificationsTwitchEmbedDescriptionWithGame'); -export const TwitchEmbedFooter = T('notificationTwitchEmbedFooter'); +export const TwitchNoGameName = T('notifications:twitchNoGameName'); +export const TwitchEmbedDescription = FT<{ userName: string }, string>('notifications:twitchEmbedDescription'); +export const TwitchEmbedDescriptionWithGame = FT<{ userName: string; gameName: string }, string>('notifications:twitchEmbedDescriptionWithGame'); +export const TwitchEmbedFooter = T('notifications:twitchEmbedFooter'); diff --git a/src/lib/types/namespaces/languages/PromptList.ts b/src/lib/types/namespaces/languages/PromptList.ts index a9d5ccb9e17..4de1d39fc74 100644 --- a/src/lib/types/namespaces/languages/PromptList.ts +++ b/src/lib/types/namespaces/languages/PromptList.ts @@ -1,6 +1,5 @@ import { FT, T } from '#lib/types'; -export const MultipleChoice = FT<{ list: string; count: number }, string>('promptlistMultipleChoice'); -export const MultipleChoicePlural = FT<{ list: string; count: number }, string>('promptlistMultipleChoicePlural'); -export const AttemptFailed = FT<{ list: string; attempt: number; maxAttempts: number }, string>('promptlistAttemptFailed'); -export const Aborted = T('promptlistAborted'); +export const MultipleChoice = FT<{ list: string; count: number }, string>('promptlist:multipleChoice'); +export const AttemptFailed = FT<{ list: string; attempt: number; maxAttempts: number }, string>('promptlist:attemptFailed'); +export const Aborted = T('promptlist:aborted'); diff --git a/src/lib/types/namespaces/languages/Resolvers.ts b/src/lib/types/namespaces/languages/Resolvers.ts index 40d2deb94c7..65f529f125f 100644 --- a/src/lib/types/namespaces/languages/Resolvers.ts +++ b/src/lib/types/namespaces/languages/Resolvers.ts @@ -1,47 +1,48 @@ import { FT, T } from '#lib/types'; -export const BoolFalseOptions = T('resolverBoolFalseOptions'); -export const BoolTrueOptions = T('resolverBoolTrueOptions'); -export const BoolEnabled = T('resolverBoolEnabled'); -export const BoolDisabled = T('resolverBoolDisabled'); -export const MultiTooFew = FT<{ name: string; min?: number; conjunctionWord: string }, string>('resolverMultiTooFew'); -export const InvalidBool = FT<{ name: string }, string>('resolverInvalidBool'); -export const InvalidChannel = FT<{ name: string }, string>('resolverInvalidChannel'); -export const InvalidCustom = FT<{ name: string; type: string }, string>('resolverInvalidCustom'); -export const InvalidDate = FT<{ name: string }, string>('resolverInvalidDate'); -export const InvalidDuration = FT<{ name: string }, string>('resolverInvalidDuration'); -export const InvalidEmoji = FT<{ name: string }, string>('resolverInvalidEmoji'); -export const InvalidFloat = FT<{ name: string }, string>('resolverInvalidFloat'); -export const InvalidGuild = FT<{ name: string }, string>('resolverInvalidGuild'); -export const InvalidInt = FT<{ name: string }, string>('resolverInvalidInt'); -export const InvalidInvite = FT<{ name: string }, string>('resolverInvalidInvite'); -export const InvalidWager = FT<{ bet: number; validAmounts: string }, string>('resolverInvalidWager'); -export const InvalidLiteral = FT<{ name: string }, string>('resolverInvalidLiteral'); -export const InvalidMember = FT<{ name: string }, string>('resolverInvalidMember'); -export const InvalidMessage = FT<{ name: string }, string>('resolverInvalidMessage'); -export const InvalidPiece = FT<{ name: string; piece: string }, string>('resolverInvalidPiece'); -export const InvalidRegexMatch = FT<{ name: string; pattern: string }, string>('resolverInvalidRegexMatch'); -export const InvalidRole = FT<{ name: string }, string>('resolverInvalidRole'); -export const InvalidString = FT<{ name: string }, string>('resolverInvalidString'); -export const InvalidTime = FT<{ name: string }, string>('resolverInvalidTime'); -export const InvalidUrl = FT<{ name: string }, string>('resolverInvalidUrl'); -export const InvalidUser = FT<{ name: string }, string>('resolverInvalidUser'); -export const InvalidSnowflake = FT<{ name: string }, string>('resolverInvalidSnowflake'); -export const InvalidStore = FT<{ store: string }, string>('resolverInvalidStore'); -export const StringSuffix = T('resolverStringSuffix'); -export const MinmaxExactlyInclusive = FT<{ name: string; min: number }, string>('resolverMinmaxExactlyInclusive'); -export const MinmaxExactlyExclusive = FT<{ name: string; min: number }, string>('resolverMinmaxExactlyExclusive'); -export const MinmaxBothInclusive = FT<{ name: string; min: number; max: number }, string>('resolverMinmaxBothInclusive'); -export const MinmaxBothExclusive = FT<{ name: string; min: number; max: number }, string>('resolverMinmaxBothExclusive'); -export const MinmaxMinInclusive = FT<{ name: string; min: number }, string>('resolverMinmaxMinInclusive'); -export const MinmaxMinExclusive = FT<{ name: string; min: number }, string>('resolverMinmaxMinExclusive'); -export const MinmaxMaxInclusive = FT<{ name: string; max: number }, string>('resolverMinmaxMaxInclusive'); -export const MinmaxMaxExclusive = FT<{ name: string; max: number }, string>('resolverMinmaxMaxExclusive'); -export const DateSuffix = T('resolverDateSuffix'); -export const PositiveAmount = T('resolverPositiveAmount'); -export const InvalidChannelName = FT<{ name: string }, string>('resolverInvalidChannelName'); -export const ChannelNotInGuild = T('resolverChannelNotInGuild'); -export const ChannelNotInGuildSubcommand = FT<{ command: string; subcommand: string }, string>('resolverChannelNotInGuildSubcommand'); -export const InvalidRoleName = FT<{ name: string }, string>('resolverInvalidRoleName'); -export const InvalidUsername = FT<{ name: string }, string>('resolverInvalidUsername'); -export const MembernameUserLeftDuringPrompt = T('resolverMembernameUserLeftDuringPrompt'); +export const BoolFalseOptions = T('resolvers:boolFalseOptions'); +export const BoolTrueOptions = T('resolvers:boolTrueOptions'); +export const BoolEnabled = T('resolvers:boolEnabled'); +export const BoolDisabled = T('resolvers:boolDisabled'); +export const MultiTooFew = FT<{ name: string; min?: number; conjunctionWord: string }, string>('resolvers:multiTooFew'); +export const InvalidBool = FT<{ name: string }, string>('resolvers:invalidBool'); +export const InvalidChannel = FT<{ name: string }, string>('resolvers:invalidChannel'); +export const InvalidCustom = FT<{ name: string; type: string }, string>('resolvers:invalidCustom'); +export const InvalidDate = FT<{ name: string }, string>('resolvers:invalidDate'); +export const InvalidDuration = FT<{ name: string }, string>('resolvers:invalidDuration'); +export const InvalidEmoji = FT<{ name: string }, string>('resolvers:invalidEmoji'); +export const InvalidFloat = FT<{ name: string }, string>('resolvers:invalidFloat'); +export const InvalidGuild = FT<{ name: string }, string>('resolvers:invalidGuild'); +export const InvalidInt = FT<{ name: string }, string>('resolvers:invalidInt'); +export const InvalidInvite = FT<{ name: string }, string>('resolvers:invalidInvite'); +export const InvalidWager = FT<{ bet: number; validAmounts: readonly string[] }, string>('resolvers:invalidWager'); +export const InvalidLanguage = FT<{ name: string; possibles: readonly string[] }, string>('resolvers:invalidLanguage'); +export const InvalidLiteral = FT<{ name: string }, string>('resolvers:invalidLiteral'); +export const InvalidMember = FT<{ name: string }, string>('resolvers:invalidMember'); +export const InvalidMessage = FT<{ name: string }, string>('resolvers:invalidMessage'); +export const InvalidPiece = FT<{ name: string; piece: string }, string>('resolvers:invalidPiece'); +export const InvalidRegexMatch = FT<{ name: string; pattern: string }, string>('resolvers:invalidRegexMatch'); +export const InvalidRole = FT<{ name: string }, string>('resolvers:invalidRole'); +export const InvalidString = FT<{ name: string }, string>('resolvers:invalidString'); +export const InvalidTime = FT<{ name: string }, string>('resolvers:invalidTime'); +export const InvalidUrl = FT<{ name: string }, string>('resolvers:invalidUrl'); +export const InvalidUser = FT<{ name: string }, string>('resolvers:invalidUser'); +export const InvalidSnowflake = FT<{ name: string }, string>('resolvers:invalidSnowflake'); +export const InvalidStore = FT<{ store: string }, string>('resolvers:invalidStore'); +export const StringSuffix = T('resolvers:stringSuffix'); +export const MinmaxExactlyInclusive = FT<{ name: string; min: number }, string>('resolvers:minmaxExactlyInclusive'); +export const MinmaxExactlyExclusive = FT<{ name: string; min: number }, string>('resolvers:minmaxExactlyExclusive'); +export const MinmaxBothInclusive = FT<{ name: string; min: number; max: number }, string>('resolvers:minmaxBothInclusive'); +export const MinmaxBothExclusive = FT<{ name: string; min: number; max: number }, string>('resolvers:minmaxBothExclusive'); +export const MinmaxMinInclusive = FT<{ name: string; min: number }, string>('resolvers:minmaxMinInclusive'); +export const MinmaxMinExclusive = FT<{ name: string; min: number }, string>('resolvers:minmaxMinExclusive'); +export const MinmaxMaxInclusive = FT<{ name: string; max: number }, string>('resolvers:minmaxMaxInclusive'); +export const MinmaxMaxExclusive = FT<{ name: string; max: number }, string>('resolvers:minmaxMaxExclusive'); +export const DateSuffix = T('resolvers:dateSuffix'); +export const PositiveAmount = T('resolvers:positiveAmount'); +export const InvalidChannelName = FT<{ name: string }, string>('resolvers:invalidChannelName'); +export const ChannelNotInGuild = T('resolvers:channelNotInGuild'); +export const ChannelNotInGuildSubCommand = FT<{ command: string; subcommand: string }, string>('resolvers:channelNotInGuildSubCommand'); +export const InvalidRoleName = FT<{ name: string }, string>('resolvers:invalidRoleName'); +export const InvalidUsername = FT<{ name: string }, string>('resolvers:invalidUsername'); +export const MemberNameUserLeftDuringPrompt = T('resolvers:memberNameUserLeftDuringPrompt'); diff --git a/src/lib/types/namespaces/languages/Serializers.ts b/src/lib/types/namespaces/languages/Serializers.ts index ad3213563fc..83ea8138292 100644 --- a/src/lib/types/namespaces/languages/Serializers.ts +++ b/src/lib/types/namespaces/languages/Serializers.ts @@ -1,23 +1,23 @@ import { FT, T } from '#lib/types'; -export const AutoRoleInvalid = T('serializerAutoRoleInvalid'); -export const CommandAutoDeleteInvalid = T('serializerCommandAutoDeleteInvalid'); -export const PermissionNodeDuplicatedCommand = FT<{ command: string }, string>('serializerPermissionNodeDuplicatedCommand'); -export const PermissionNodeInvalidCommand = FT<{ command: string }, string>('serializerPermissionNodeInvalidCommand'); -export const PermissionNodeInvalidTarget = T('serializerPermissionNodeInvalidTarget'); -export const PermissionNodeInvalid = T('serializerPermissionNodeInvalid'); -export const PermissionNodeSecurityEveryoneAllows = T('serializerPermissionNodeSecurityEveryoneAllows'); -export const PermissionNodeSecurityGuarded = FT<{ command: string }, string>('serializerPermissionNodeSecurityGuarded'); -export const PermissionNodeSecurityOwner = T('serializerPermissionNodeSecurityOwner'); -export const ReactionRoleInvalid = T('serializerReactionRoleInvalid'); -export const StickyRoleInvalid = T('serializerStickyRoleInvalid'); -export const TriggerAliasInvalid = T('serializerTriggerAliasInvalid'); -export const TriggerIncludeInvalid = T('serializerTriggerIncludeInvalid'); -export const TriggerIncludeInvalidAction = T('serializerTriggerIncludeInvalidAction'); -export const TwitchSubscriptionInvalidStreamer = T('serializerTwitchSubscriptionInvalidStreamer'); -export const TwitchSubscriptionInvalid = T('serializerTwitchSubscriptionInvalid'); -export const UniqueRoleSetInvalid = T('serializerUniqueRoleSetInvalid'); -export const Unsupported = T('serializerUnsupported'); +export const AutoRoleInvalid = T('serializers:autoRoleInvalid'); +export const CommandAutoDeleteInvalid = T('serializers:commandAutoDeleteInvalid'); +export const PermissionNodeDuplicatedCommand = FT<{ command: string }, string>('serializers:permissionNodeDuplicatedCommand'); +export const PermissionNodeInvalidCommand = FT<{ command: string }, string>('serializers:permissionNodeInvalidCommand'); +export const PermissionNodeInvalidTarget = T('serializers:permissionNodeInvalidTarget'); +export const PermissionNodeInvalid = T('serializers:permissionNodeInvalid'); +export const PermissionNodeSecurityEveryoneAllows = T('serializers:permissionNodeSecurityEveryoneAllows'); +export const PermissionNodeSecurityGuarded = FT<{ command: string }, string>('serializers:permissionNodeSecurityGuarded'); +export const PermissionNodeSecurityOwner = T('serializers:permissionNodeSecurityOwner'); +export const ReactionRoleInvalid = T('serializers:reactionRoleInvalid'); +export const StickyRoleInvalid = T('serializers:stickyRoleInvalid'); +export const TriggerAliasInvalid = T('serializers:triggerAliasInvalid'); +export const TriggerIncludeInvalid = T('serializers:triggerIncludeInvalid'); +export const TriggerIncludeInvalidAction = T('serializers:triggerIncludeInvalidAction'); +export const TwitchSubscriptionInvalidStreamer = T('serializers:twitchSubscriptionInvalidStreamer'); +export const TwitchSubscriptionInvalid = T('serializers:twitchSubscriptionInvalid'); +export const UniqueRoleSetInvalid = T('serializers:uniqueRoleSetInvalid'); +export const Unsupported = T('serializers:unsupported'); export * as CustomCommands from './CustomCommandSerializer/All'; export * as DisabledCommandChannels from './DisabledCommandChannels/All'; diff --git a/src/lib/types/namespaces/languages/Settings.ts b/src/lib/types/namespaces/languages/Settings.ts index e13296e5495..9ad0d436407 100644 --- a/src/lib/types/namespaces/languages/Settings.ts +++ b/src/lib/types/namespaces/languages/Settings.ts @@ -1,121 +1,121 @@ import { T } from '#lib/types'; -export const Prefix = T('settingsPrefix'); -export const Language = T('settingsLanguage'); -export const DisabledCommands = T('settingsDisabledcommands'); -export const DisableNaturalPrefix = T('settingsDisablenaturalprefix'); -export const ChannelsAnnouncements = T('settingsChannelsAnnouncements'); -export const ChannelsFarewell = T('settingsChannelsFarewell'); -export const ChannelsGreeting = T('settingsChannelsGreeting'); -export const ChannelsImageLogs = T('settingsChannelsImageLogs'); -export const ChannelsMemberLogs = T('settingsChannelsMemberLogs'); -export const ChannelsMessageLogs = T('settingsChannelsMessageLogs'); -export const ChannelsModerationLogs = T('settingsChannelsModerationLogs'); -export const ChannelsNsfwMessageLogs = T('settingsChannelsNsfwMessageLogs'); -export const ChannelsPruneLogs = T('settingsChannelsPruneLogs'); -export const ChannelsReactionLogs = T('settingsChannelsReactionLogs'); -export const ChannelsRoles = T('settingsChannelsRoles'); -export const ChannelsSpam = T('settingsChannelsSpam'); -export const ChannelsIgnoreMessageDelete = T('settingsChannelsIgnoreMessageDelete'); -export const ChannelsIgnoreMessageEdit = T('settingsChannelsIgnoreMessageEdit'); -export const ChannelsIgnoreReactionAdd = T('settingsChannelsIgnoreReactionAdd'); -export const ChannelsIgnoreAll = T('settingsChannelsIgnoreAll'); -export const DisabledChannels = T('settingsDisabledchannels'); -export const EventsBanAdd = T('settingsEventsBanadd'); -export const EventsBanRemove = T('settingsEventsBanremove'); -export const EventsMemberAdd = T('settingsEventsMemberadd'); -export const EventsMemberNickNameUpdate = T('settingsEventsMemberNickNameUpdate'); -export const EventsMemberUserNameUpdate = T('settingsEventsMemberUserNameUpdate'); -export const EventsMemberRoleUpdate = T('settingsEventsMemberroleupdate'); -export const EventsMemberRemove = T('settingsEventsMemberremove'); -export const EventsMessageDelete = T('settingsEventsMessagedelete'); -export const EventsMessageEdit = T('settingsEventsMessageedit'); -export const EventsTwemojiReactions = T('settingsEventsTwemojiReactions'); -export const MessagesFarewell = T('settingsMessagesFarewell'); -export const MessagesGreeting = T('settingsMessagesGreeting'); -export const MessagesIgnoreChannels = T('settingsMessagesIgnorechannels'); -export const MessagesJoinDM = T('settingsMessagesJoinDm'); -export const MessagesModerationAutoDelete = T('settingsMessagesModerationAutoDelete'); -export const MessagesModerationDM = T('settingsMessagesModerationDm'); -export const MessagesModerationMessageDisplay = T('settingsMessagesModerationMessageDisplay'); -export const MessagesModerationReasonDisplay = T('settingsMessagesModerationReasonDisplay'); -export const MessagesModeratorNameDisplay = T('settingsMessagesModeratorNameDisplay'); -export const MessagesWarnings = T('settingsMessagesWarnings'); -export const MessagesAnnouncementEmbed = T('settingsMessagesAnnouncementEmbed'); -export const MusicAllowStreams = T('settingsMusicAllowStreams'); -export const MusicDefaultVolume = T('settingsMusicDefaultVolume'); -export const MusicMaximumDuration = T('settingsMusicMaximumDuration'); -export const MusicMaximumEntriesPerUser = T('settingsMusicMaximumEntriesPerUser'); -export const NoMentionSpamAlerts = T('settingsNoMentionSpamAlerts'); -export const NoMentionSpamEnabled = T('settingsNoMentionSpamEnabled'); -export const NoMentionSpamMentionsAllowed = T('settingsNoMentionSpamMentionsallowed'); -export const NoMentionSpamTimePeriod = T('settingsNoMentionSpamTimeperiod'); -export const RolesAdmin = T('settingsRolesAdmin'); -export const RolesDj = T('settingsRolesDj'); -export const RolesInitial = T('settingsRolesInitial'); -export const RolesModerator = T('settingsRolesModerator'); -export const RolesMuted = T('settingsRolesMuted'); -export const RolesPublic = T('settingsRolesPublic'); -export const RolesRemoveInitial = T('settingsRolesRemoveinitial'); -export const RolesRestrictedAttachment = T('settingsRolesRestrictedAttachment'); -export const RolesRestrictedEmbed = T('settingsRolesRestrictedEmbed'); -export const RolesRestrictedEmoji = T('settingsRolesRestrictedEmoji'); -export const RolesRestrictedReaction = T('settingsRolesRestrictedReaction'); -export const RolesRestrictedVoice = T('settingsRolesRestrictedVoice'); -export const RolesSubscriber = T('settingsRolesSubscriber'); -export const SelfmodAttachmentsEnabled = T('settingsSelfmodAttachmentsEnabled'); -export const SelfmodAttachmentsIgnoredChannels = T('settingsSelfmodAttachmentsIgnoredChannels'); -export const SelfmodAttachmentsIgnoredRoles = T('settingsSelfmodAttachmentsIgnoredRoles'); -export const SelfmodCapitalsEnabled = T('settingsSelfmodCapitalsEnabled'); -export const SelfmodCapitalsIgnoredChannels = T('settingsSelfmodCapitalsIgnoredchannels'); -export const SelfmodCapitalsIgnoredRoles = T('settingsSelfmodCapitalsIgnoredroles'); -export const SelfmodCapitalsMaximum = T('settingsSelfmodCapitalsMaximum'); -export const SelfmodCapitalsMinimum = T('settingsSelfmodCapitalsMinimum'); -export const SelfmodFilterEnabled = T('settingsSelfmodFilterEnabled'); -export const SelfmodFilterIgnoredChannels = T('settingsSelfmodFilterIgnoredchannels'); -export const SelfmodFilterIgnoredRoles = T('settingsSelfmodFilterIgnoredroles'); -export const SelfmodIgnoreChannels = T('settingsSelfmodIgnorechannels'); -export const SelfmodInvitesEnabled = T('settingsSelfmodInvitesEnabled'); -export const SelfmodInvitesIgnoredChannels = T('settingsSelfmodInvitesIgnoredchannels'); -export const SelfmodInvitesIgnoredRoles = T('settingsSelfmodInvitesIgnoredroles'); -export const SelfmodInvitesIgnoredCodes = T('settingsSelfmodInvitesIgnoredcodes'); -export const SelfmodInvitesIgnoredGuilds = T('settingsSelfmodInvitesIgnoredguilds'); -export const SelfmodLinksEnabled = T('settingsSelfmodLinksEnabled'); -export const SelfmodLinksIgnoredChannels = T('settingsSelfmodLinksIgnoredchannels'); -export const SelfmodLinksIgnoredRoles = T('settingsSelfmodLinksIgnoredroles'); -export const SelfmodLinksWhiteList = T('settingsSelfmodLinksWhitelist'); -export const SelfmodMessagesEnabled = T('settingsSelfmodMessagesEnabled'); -export const SelfmodMessagesIgnoredChannels = T('settingsSelfmodMessagesIgnoredchannels'); -export const SelfmodMessagesIgnoredRoles = T('settingsSelfmodMessagesIgnoredroles'); -export const SelfmodMessagesMaximum = T('settingsSelfmodMessagesMaximum'); -export const SelfmodMessagesQueueSize = T('settingsSelfmodMessagesQueueSize'); -export const SelfmodNewlinesEnabled = T('settingsSelfmodNewlinesEnabled'); -export const SelfmodNewlinesIgnoredChannels = T('settingsSelfmodNewlinesIgnoredchannels'); -export const SelfmodNewlinesIgnoredRoles = T('settingsSelfmodNewlinesIgnoredroles'); -export const SelfmodNewlinesMaximum = T('settingsSelfmodNewlinesMaximum'); -export const SelfmodRaid = T('settingsSelfmodRaid'); -export const SelfmodRaidthreshold = T('settingsSelfmodRaidthreshold'); -export const SelfmodReactionsMaximum = T('settingsSelfmodReactionsMaximum'); -export const SelfmodReactionsBlackList = T('settingsSelfmodReactionsBlacklist'); -export const SelfmodReactionsEnabled = T('settingsSelfmodReactionsEnabled'); -export const SelfmodReactionsIgnoredChannels = T('settingsSelfmodReactionsIgnoredchannels'); -export const SelfmodReactionsIgnoredRoles = T('settingsSelfmodReactionsIgnoredroles'); -export const SelfmodReactionsWhiteList = T('settingsSelfmodReactionsWhitelist'); -export const SocialEnabled = T('settingsSocialEnabled'); -export const SocialMultiplier = T('settingsSocialMultiplier'); -export const SocialAchieve = T('settingsSocialAchieve'); -export const SocialAchieveMessage = T('settingsSocialAchievemessage'); -export const SocialIgnoreChannels = T('settingsSocialIgnorechannels'); -export const StarboardChannel = T('settingsStarboardChannel'); -export const StarboardIgnoreChannels = T('settingsStarboardIgnorechannels'); -export const StarboardMinimum = T('settingsStarboardMinimum'); -export const StarboardSelfStar = T('settingsStarboardSelfstar'); -export const SuggestionsChannel = T('settingsSuggestionsChannel'); -export const SuggestionsEmojisUpvote = T('settingsSuggestionsEmojisUpvote'); -export const SuggestionsEmojisDownvote = T('settingsSuggestionsEmojisDownvote'); -export const SuggestionsOnActionDM = T('settingsSuggestionsOnActionDm'); -export const SuggestionsOnActionRepost = T('settingsSuggestionsOnActionRepost'); -export const SuggestionsOnActionHideAuthor = T('settingsSuggestionsOnActionHideAuthor'); -export const DashboardOnlyKey = T('settingsDashboardOnlyKey'); +export const Prefix = T('settings:prefix'); +export const Language = T('settings:language'); +export const DisabledCommands = T('settings:disabledCommands'); +export const DisableNaturalPrefix = T('settings:disableNaturalPrefix'); +export const ChannelsAnnouncements = T('settings:channelsAnnouncements'); +export const ChannelsFarewell = T('settings:channelsFarewell'); +export const ChannelsGreeting = T('settings:channelsGreeting'); +export const ChannelsImageLogs = T('settings:channelsImageLogs'); +export const ChannelsMemberLogs = T('settings:channelsMemberLogs'); +export const ChannelsMessageLogs = T('settings:channelsMessageLogs'); +export const ChannelsModerationLogs = T('settings:channelsModerationLogs'); +export const ChannelsNsfwMessageLogs = T('settings:channelsNsfwMessageLogs'); +export const ChannelsPruneLogs = T('settings:channelsPruneLogs'); +export const ChannelsReactionLogs = T('settings:channelsReactionLogs'); +export const ChannelsRoles = T('settings:channelsRoles'); +export const ChannelsSpam = T('settings:channelsSpam'); +export const ChannelsIgnoreMessageDelete = T('settings:channelsIgnoreMessageDelete'); +export const ChannelsIgnoreMessageEdit = T('settings:channelsIgnoreMessageEdit'); +export const ChannelsIgnoreReactionAdd = T('settings:channelsIgnoreReactionAdd'); +export const ChannelsIgnoreAll = T('settings:channelsIgnoreAll'); +export const DisabledChannels = T('settings:disabledChannels'); +export const EventsBanAdd = T('settings:eventsBanAdd'); +export const EventsBanRemove = T('settings:eventsBanRemove'); +export const EventsMemberAdd = T('settings:eventsMemberAdd'); +export const EventsMemberNickNameUpdate = T('settings:eventsMemberNickNameUpdate'); +export const EventsMemberUserNameUpdate = T('settings:eventsMemberUserNameUpdate'); +export const EventsMemberRoleUpdate = T('settings:eventsMemberRoleUpdate'); +export const EventsMemberRemove = T('settings:eventsMemberRemove'); +export const EventsMessageDelete = T('settings:eventsMessageDelete'); +export const EventsMessageEdit = T('settings:eventsMessageEdit'); +export const EventsTwemojiReactions = T('settings:eventsTwemojiReactions'); +export const MessagesFarewell = T('settings:messagesFarewell'); +export const MessagesGreeting = T('settings:messagesGreeting'); +export const MessagesIgnoreChannels = T('settings:messagesIgnoreChannels'); +export const MessagesJoinDM = T('settings:messagesJoinDm'); +export const MessagesModerationAutoDelete = T('settings:messagesModerationAutoDelete'); +export const MessagesModerationDM = T('settings:messagesModerationDm'); +export const MessagesModerationMessageDisplay = T('settings:messagesModerationMessageDisplay'); +export const MessagesModerationReasonDisplay = T('settings:messagesModerationReasonDisplay'); +export const MessagesModeratorNameDisplay = T('settings:messagesModeratorNameDisplay'); +export const MessagesWarnings = T('settings:messagesWarnings'); +export const MessagesAnnouncementEmbed = T('settings:messagesAnnouncementEmbed'); +export const MusicAllowStreams = T('settings:musicAllowStreams'); +export const MusicDefaultVolume = T('settings:musicDefaultVolume'); +export const MusicMaximumDuration = T('settings:musicMaximumDuration'); +export const MusicMaximumEntriesPerUser = T('settings:musicMaximumEntriesPerUser'); +export const NoMentionSpamAlerts = T('settings:noMentionSpamAlerts'); +export const NoMentionSpamEnabled = T('settings:noMentionSpamEnabled'); +export const NoMentionSpamMentionsAllowed = T('settings:noMentionSpamMentionsAllowed'); +export const NoMentionSpamTimePeriod = T('settings:noMentionSpamTimePeriod'); +export const RolesAdmin = T('settings:rolesAdmin'); +export const RolesDj = T('settings:rolesDj'); +export const RolesInitial = T('settings:rolesInitial'); +export const RolesModerator = T('settings:rolesModerator'); +export const RolesMuted = T('settings:rolesMuted'); +export const RolesPublic = T('settings:rolesPublic'); +export const RolesRemoveInitial = T('settings:rolesRemoveInitial'); +export const RolesRestrictedAttachment = T('settings:rolesRestrictedAttachment'); +export const RolesRestrictedEmbed = T('settings:rolesRestrictedEmbed'); +export const RolesRestrictedEmoji = T('settings:rolesRestrictedEmoji'); +export const RolesRestrictedReaction = T('settings:rolesRestrictedReaction'); +export const RolesRestrictedVoice = T('settings:rolesRestrictedVoice'); +export const RolesSubscriber = T('settings:rolesSubscriber'); +export const SelfmodAttachmentsEnabled = T('settings:selfmodAttachmentsEnabled'); +export const SelfmodAttachmentsIgnoredChannels = T('settings:selfmodAttachmentsIgnoredChannels'); +export const SelfmodAttachmentsIgnoredRoles = T('settings:selfmodAttachmentsIgnoredRoles'); +export const SelfmodCapitalsEnabled = T('settings:selfmodCapitalsEnabled'); +export const SelfmodCapitalsIgnoredChannels = T('settings:selfmodCapitalsIgnoredChannels'); +export const SelfmodCapitalsIgnoredRoles = T('settings:selfmodCapitalsIgnoredRoles'); +export const SelfmodCapitalsMaximum = T('settings:selfmodCapitalsMaximum'); +export const SelfmodCapitalsMinimum = T('settings:selfmodCapitalsMinimum'); +export const SelfmodFilterEnabled = T('settings:selfmodFilterEnabled'); +export const SelfmodFilterIgnoredChannels = T('settings:selfmodFilterIgnoredChannels'); +export const SelfmodFilterIgnoredRoles = T('settings:selfmodFilterIgnoredRoles'); +export const SelfmodIgnoreChannels = T('settings:selfmodIgnoreChannels'); +export const SelfmodInvitesEnabled = T('settings:selfmodInvitesEnabled'); +export const SelfmodInvitesIgnoredChannels = T('settings:selfmodInvitesIgnoredChannels'); +export const SelfmodInvitesIgnoredRoles = T('settings:selfmodInvitesIgnoredRoles'); +export const SelfmodInvitesIgnoredCodes = T('settings:selfmodInvitesIgnoredCodes'); +export const SelfmodInvitesIgnoredGuilds = T('settings:selfmodInvitesIgnoredGuilds'); +export const SelfmodLinksEnabled = T('settings:selfmodLinksEnabled'); +export const SelfmodLinksIgnoredChannels = T('settings:selfmodLinksIgnoredChannels'); +export const SelfmodLinksIgnoredRoles = T('settings:selfmodLinksIgnoredRoles'); +export const SelfmodLinksWhiteList = T('settings:selfmodLinksWhitelist'); +export const SelfmodMessagesEnabled = T('settings:selfmodMessagesEnabled'); +export const SelfmodMessagesIgnoredChannels = T('settings:selfmodMessagesIgnoredChannels'); +export const SelfmodMessagesIgnoredRoles = T('settings:selfmodMessagesIgnoredRoles'); +export const SelfmodMessagesMaximum = T('settings:selfmodMessagesMaximum'); +export const SelfmodMessagesQueueSize = T('settings:selfmodMessagesQueueSize'); +export const SelfmodNewlinesEnabled = T('settings:selfmodNewlinesEnabled'); +export const SelfmodNewlinesIgnoredChannels = T('settings:selfmodNewlinesIgnoredChannels'); +export const SelfmodNewlinesIgnoredRoles = T('settings:selfmodNewlinesIgnoredRoles'); +export const SelfmodNewlinesMaximum = T('settings:selfmodNewlinesMaximum'); +export const SelfmodRaid = T('settings:selfmodRaid'); +export const SelfmodRaidThreshold = T('settings:selfmodRaidThreshold'); +export const SelfmodReactionsMaximum = T('settings:selfmodReactionsMaximum'); +export const SelfmodReactionsBlackList = T('settings:selfmodReactionsBlacklist'); +export const SelfmodReactionsEnabled = T('settings:selfmodReactionsEnabled'); +export const SelfmodReactionsIgnoredChannels = T('settings:selfmodReactionsIgnoredChannels'); +export const SelfmodReactionsIgnoredRoles = T('settings:selfmodReactionsIgnoredRoles'); +export const SelfmodReactionsWhiteList = T('settings:selfmodReactionsWhitelist'); +export const SocialEnabled = T('settings:socialEnabled'); +export const SocialMultiplier = T('settings:socialMultiplier'); +export const SocialAchieve = T('settings:socialAchieve'); +export const SocialAchieveMessage = T('settings:socialAchieveMessage'); +export const SocialIgnoreChannels = T('settings:socialIgnoreChannels'); +export const StarboardChannel = T('settings:starboardChannel'); +export const StarboardIgnoreChannels = T('settings:starboardIgnoreChannels'); +export const StarboardMinimum = T('settings:starboardMinimum'); +export const StarboardSelfStar = T('settings:starboardSelfStar'); +export const SuggestionsChannel = T('settings:suggestionsChannel'); +export const SuggestionsEmojisUpvote = T('settings:suggestionsEmojisUpvote'); +export const SuggestionsEmojisDownvote = T('settings:suggestionsEmojisDownvote'); +export const SuggestionsOnActionDM = T('settings:suggestionsOnActionDm'); +export const SuggestionsOnActionRepost = T('settings:suggestionsOnActionRepost'); +export const SuggestionsOnActionHideAuthor = T('settings:suggestionsOnActionHideAuthor'); +export const DashboardOnlyKey = T('settings:dashboardOnlyKey'); export * as Gateway from './settings/Gateway'; diff --git a/src/lib/types/namespaces/languages/System.ts b/src/lib/types/namespaces/languages/System.ts index f6174a7be23..ef7e1e94422 100644 --- a/src/lib/types/namespaces/languages/System.ts +++ b/src/lib/types/namespaces/languages/System.ts @@ -1,39 +1,39 @@ import { FT, T } from '#lib/types'; -export const PoweredByWeebSh = T('systemPoweredByWeebsh'); -export const ParseError = T('systemParseError'); -export const HighestRole = T('systemHighestRole'); -export const ChannelNotPostable = T('systemChannelNotPostable'); -export const FetchBansFail = T('systemFetchbansFail'); -export const Loading = T('systemLoading'); -export const Error = T('systemError'); -export const DatabaseError = T('systemDatabaseError'); -export const DiscordAbortError = T('systemDiscordAborterror'); -export const QueryFail = T('systemQueryFail'); -export const NoResults = T('systemNoResults'); -export const MessageNotFound = T('systemMessageNotFound'); -export const NotEnoughParameters = T('systemNotenoughParameters'); -export const CannotAccessChannel = T('systemCannotAccessChannel'); -export const ExceededLengthOutput = FT<{ output: string; time?: string; type?: string }, string>('systemExceededLengthOutput'); +export const PoweredByWeebSh = T('system:poweredByWeebSh'); +export const ParseError = T('system:parseError'); +export const HighestRole = T('system:highestRole'); +export const ChannelNotPostable = T('system:channelNotPostable'); +export const FetchBansFail = T('system:fetchBansFail'); +export const Loading = T('system:loading'); +export const Error = T('system:error'); +export const DatabaseError = T('system:databaseError'); +export const DiscordAbortError = T('system:discordAbortError'); +export const QueryFail = T('system:queryFail'); +export const NoResults = T('system:noResults'); +export const MessageNotFound = T('system:messageNotFound'); +export const NotEnoughParameters = T('system:notEnoughParameters'); +export const CannotAccessChannel = T('system:cannotAccessChannel'); +export const ExceededLengthOutput = FT<{ output: string; time?: string; type?: string }, string>('system:exceededLengthOutput'); export const ExceededLengthOutputWithTypeAndTime = FT<{ output: string; time?: string; type?: string }, string>( - 'systemExceededLengthOutputWithTypeAndTime' + 'system:exceededLengthOutputWithTypeAndTime' ); -export const ExceededLengthOutputConsole = FT<{ time?: string; type?: string }, string>('systemExceededLengthOutputConsole'); +export const ExceededLengthOutputConsole = FT<{ time?: string; type?: string }, string>('system:exceededLengthOutputConsole'); export const ExceededLengthOutputConsoleWithTypeAndTime = FT<{ time?: string; type?: string }, string>( - 'systemExceededLengthOutputConsoleWithTypeAndTime' + 'system:exceededLengthOutputConsoleWithTypeAndTime' ); -export const ExceededLengthOutputFile = FT<{ time?: string; type?: string }, string>('systemExceededLengthOutputFile'); -export const ExceededLengthOutputFileWithTypeAndTime = FT<{ time?: string; type?: string }, string>('systemExceededLengthOutputFileWithTypeAndTime'); -export const ExceededLengthOutputHastebin = FT<{ url: string; time?: string; type?: string }, string>('systemExceededLengthOutputHastebin'); +export const ExceededLengthOutputFile = FT<{ time?: string; type?: string }, string>('system:exceededLengthOutputFile'); +export const ExceededLengthOutputFileWithTypeAndTime = FT<{ time?: string; type?: string }, string>('system:exceededLengthOutputFileWithTypeAndTime'); +export const ExceededLengthOutputHastebin = FT<{ url: string; time?: string; type?: string }, string>('system:exceededLengthOutputHastebin'); export const ExceededLengthOutputHastebinWithTypeAndTime = FT<{ url: string; time?: string; type?: string }, string>( - 'systemExceededLengthOutputHastebinWithTypeAndTime' + 'system:exceededLengthOutputHastebinWithTypeAndTime' ); -export const ExceededLengthChooseOutput = FT<{ output: string[] }, string>('systemExceededLengthChooseOutput'); -export const ExternalServerError = T('systemExternalServerError'); -export const PokedexExternalResource = T('systemPokedexExternalResource'); +export const ExceededLengthChooseOutput = FT<{ output: string[] }, string>('system:exceededLengthChooseOutput'); +export const ExternalServerError = T('system:externalServerError'); +export const PokedexExternalResource = T('system:pokedexExternalResource'); export const HelpTitles = T<{ explainedUsage: string; possibleFormats: string; examples: string; reminders: string; -}>('systemHelpTitles'); +}>('system:helpTitles'); diff --git a/src/lib/types/namespaces/languages/commands/Admin.ts b/src/lib/types/namespaces/languages/commands/Admin.ts index 2f8d4a70a1e..ea1532c1d5e 100644 --- a/src/lib/types/namespaces/languages/commands/Admin.ts +++ b/src/lib/types/namespaces/languages/commands/Admin.ts @@ -1,48 +1,54 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const BlocklistDescription = T('commandBlocklistDescription'); -export const BlocklistResetSuccess = T('commandBlocklistResetSuccess'); -export const BlocklistSaveSuccess = T('commandBlocklistSaveSuccess'); -export const ConfGet = FT<{ key: string; value: string }, string>('commandConfGet'); -export const ConfGetNoExt = FT<{ key: string }, string>('commandConfGetNoExt'); -export const ConfGuarded = FT<{ name: string }, string>('commandConfGuarded'); -export const ConfKeyNotArray = T('commandConfKeyNotArray'); -export const ConfMenuInvalidAction = T('commandConfMenuInvalidAction'); -export const ConfMenuInvalidKey = T('commandConfMenuInvalidKey'); -export const ConfMenuNopermissions = T('commandConfMenuNopermissions'); -export const ConfMenuRenderAtFolder = FT<{ path: string }, string>('commandConfMenuRenderAtFolder'); -export const ConfMenuRenderAtPiece = FT<{ path: string }, string>('commandConfMenuRenderAtPiece'); -export const ConfMenuRenderBack = T('commandConfMenuRenderBack'); -export const ConfMenuRenderCvalue = FT<{ value: string }, string>('commandConfMenuRenderCvalue'); -export const ConfMenuRenderNokeys = T('commandConfMenuRenderNokeys'); -export const ConfMenuRenderRemove = T('commandConfMenuRenderRemove'); -export const ConfMenuRenderReset = T('commandConfMenuRenderReset'); -export const ConfMenuRenderSelect = T('commandConfMenuRenderSelect'); -export const ConfMenuRenderTctitle = T('commandConfMenuRenderTctitle'); -export const ConfMenuRenderUndo = T('commandConfMenuRenderUndo'); -export const ConfMenuRenderUpdate = T('commandConfMenuRenderUpdate'); -export const ConfMenuSaved = T('commandConfMenuSaved'); -export const ConfNochange = FT<{ key: string }, string>('commandConfNochange'); -export const ConfNoKey = T('commandConfNoKey'); -export const ConfNoValue = T('commandConfNoValue'); -export const ConfReset = FT<{ key: string; value: string }, string>('commandConfReset'); -export const Conf = FT<{ key: string; list: string }, string>('commandConfServer'); -export const ConfDescription = T('commandConfServerDescription'); -export const ConfSettingNotSet = T('commandConfSettingNotSet'); -export const ConfUpdated = FT<{ key: string; response: string }, string>('commandConfUpdated'); -export const ConfUser = FT<{ key: string; list: string }, string>('commandConfUser'); -export const ConfUserDescription = T('commandConfUserDescription'); -export const ConfDashboardOnlyKey = FT<{ key: string }, string>('commandConfDashboardOnlyKey'); -export const RoleSetAdded = FT<{ name: string; roles: string }, string>('commandRolesetAdded'); -export const RoleSetCreated = FT<{ name: string; roles: string }, string>('commandRolesetCreated'); -export const RoleSetDescription = T('commandRolesetDescription'); -export const RoleSetExtended = T('commandRolesetExtended'); -export const RoleSetInvalidName = FT<{ name: string }, string>('commandRolesetInvalidName'); -export const RoleSetNoRolesets = T('commandRolesetNoRolesets'); -export const RoleSetRemoved = FT<{ name: string; roles: string }, string>('commandRolesetRemoved'); -export const RoleSetResetAll = T('commandRolesetResetAll'); -export const RoleSetResetEmpty = T('commandRolesetResetEmpty'); -export const RoleSetResetGroup = FT<{ name: string }, string>('commandRolesetResetGroup'); -export const RoleSetResetNotExists = FT<{ name: string }, string>('commandRolesetResetNotExists'); -export const RoleSetUpdated = FT<{ name: string }, string>('commandRolesetUpdated'); +export const BlocklistDescription = T('commands/admin:blocklistDescription'); +export const BlocklistExtended = T('commands/admin:blocklistExtended'); +export const BlocklistResetSuccess = T('commands/admin:blocklistResetSuccess'); +export const BlocklistSaveSuccess = T('commands/admin:blocklistSaveSuccess'); +export const ConfGet = FT<{ key: string; value: string }, string>('commands/admin:confGet'); +export const ConfGetNoExt = FT<{ key: string }, string>('commands/admin:confGetNoExt'); +export const ConfGuarded = FT<{ name: string }, string>('commands/admin:confGuarded'); +export const ConfKeyNotArray = T('commands/admin:confKeyNotArray'); +export const ConfMenuInvalidAction = T('commands/admin:confMenuInvalidAction'); +export const ConfMenuInvalidKey = T('commands/admin:confMenuInvalidKey'); +export const ConfMenuNopermissions = T('commands/admin:confMenuNopermissions'); +export const ConfMenuRenderAtFolder = FT<{ path: string }, string>('commands/admin:confMenuRenderAtFolder'); +export const ConfMenuRenderAtPiece = FT<{ path: string }, string>('commands/admin:confMenuRenderAtPiece'); +export const ConfMenuRenderBack = T('commands/admin:confMenuRenderBack'); +export const ConfMenuRenderCvalue = FT<{ value: string }, string>('commands/admin:confMenuRenderCvalue'); +export const ConfMenuRenderNokeys = T('commands/admin:confMenuRenderNokeys'); +export const ConfMenuRenderRemove = T('commands/admin:confMenuRenderRemove'); +export const ConfMenuRenderReset = T('commands/admin:confMenuRenderReset'); +export const ConfMenuRenderSelect = T('commands/admin:confMenuRenderSelect'); +export const ConfMenuRenderTctitle = T('commands/admin:confMenuRenderTctitle'); +export const ConfMenuRenderUndo = T('commands/admin:confMenuRenderUndo'); +export const ConfMenuRenderUpdate = T('commands/admin:confMenuRenderUpdate'); +export const ConfMenuSaved = T('commands/admin:confMenuSaved'); +export const ConfNochange = FT<{ key: string }, string>('commands/admin:confNochange'); +export const ConfNoKey = T('commands/admin:confNoKey'); +export const ConfNoValue = T('commands/admin:confNoValue'); +export const ConfReset = FT<{ key: string; value: string }, string>('commands/admin:confReset'); +export const Conf = FT<{ key: string; list: string }, string>('commands/admin:confServer'); +export const ConfDescription = T('commands/admin:confServerDescription'); +export const ConfExtended = T('commands/admin:confServerExtendedHelp'); +export const ConfSettingNotSet = T('commands/admin:confSettingNotSet'); +export const ConfUpdated = FT<{ key: string; response: string }, string>('commands/admin:confUpdated'); +export const ConfUser = FT<{ key: string; list: string }, string>('commands/admin:confUser'); +export const ConfUserDescription = T('commands/admin:confUserDescription'); +export const ConfDashboardOnlyKey = FT<{ key: string }, string>('commands/admin:confDashboardOnlyKey'); +export const HeapSnapshotDescription = T('commands/system:heapSnapshotDescription'); +export const HeapSnapshotExtended = T('commands/system:heapSnapshotExtended'); +export const RoleSetAdded = FT<{ name: string; roles: string }, string>('commands/admin:rolesetAdded'); +export const RoleSetCreated = FT<{ name: string; roles: string }, string>('commands/admin:rolesetCreated'); +export const RoleSetDescription = T('commands/admin:rolesetDescription'); +export const RoleSetExtended = T('commands/admin:rolesetExtended'); +export const RoleSetInvalidName = FT<{ name: string }, string>('commands/admin:rolesetInvalidName'); +export const RoleSetNoRoleSets = T('commands/admin:rolesetNoRolesets'); +export const RoleSetRemoved = FT<{ name: string; roles: string }, string>('commands/admin:rolesetRemoved'); +export const RoleSetResetAll = T('commands/admin:rolesetResetAll'); +export const RoleSetResetEmpty = T('commands/admin:rolesetResetEmpty'); +export const RoleSetResetGroup = FT<{ name: string }, string>('commands/admin:rolesetResetGroup'); +export const RoleSetResetNotExists = FT<{ name: string }, string>('commands/admin:rolesetResetNotExists'); +export const RoleSetUpdated = FT<{ name: string }, string>('commands/admin:rolesetUpdated'); +export const UpdateDescription = T('commands/admin:updateDescription'); +export const UpdateExtended = T('commands/admin:updateExtended'); diff --git a/src/lib/types/namespaces/languages/commands/Animal.ts b/src/lib/types/namespaces/languages/commands/Animal.ts index 1232af52c49..278b2ce6910 100644 --- a/src/lib/types/namespaces/languages/commands/Animal.ts +++ b/src/lib/types/namespaces/languages/commands/Animal.ts @@ -1,14 +1,14 @@ import { T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const CatfactDescription = T('commandCatfactDescription'); -export const CatfactExtended = T('commandCatfactExtended'); -export const CatfactTitle = T('commandCatfactTitle'); -export const DogDescription = T('commandDogDescription'); -export const DogExtended = T('commandDogExtended'); -export const FoxDescription = T('commandFoxDescription'); -export const FoxExtended = T('commandFoxExtended'); -export const KittyDescription = T('commandKittyDescription'); -export const KittyExtended = T('commandKittyExtended'); -export const ShibeDescription = T('commandShibeDescription'); -export const ShibeExtended = T('commandShibeExtended'); +export const CatfactDescription = T('commands/animal:catfactDescription'); +export const CatfactExtended = T('commands/animal:catfactExtended'); +export const CatfactTitle = T('commands/animal:catfactTitle'); +export const DogDescription = T('commands/animal:dogDescription'); +export const DogExtended = T('commands/animal:dogExtended'); +export const FoxDescription = T('commands/animal:foxDescription'); +export const FoxExtended = T('commands/animal:foxExtended'); +export const KittyDescription = T('commands/animal:kittyDescription'); +export const KittyExtended = T('commands/animal:kittyExtended'); +export const ShibeDescription = T('commands/animal:shibeDescription'); +export const ShibeExtended = T('commands/animal:shibeExtended'); diff --git a/src/lib/types/namespaces/languages/commands/Anime.ts b/src/lib/types/namespaces/languages/commands/Anime.ts index 26053353b53..b6b70bc5684 100644 --- a/src/lib/types/namespaces/languages/commands/Anime.ts +++ b/src/lib/types/namespaces/languages/commands/Anime.ts @@ -1,24 +1,24 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const AnimeDescription = T('commandAnimeDescription'); -export const AnimeExtended = T('commandAnimeExtended'); -export const MangaDescription = T('commandMangaDescription'); -export const MangaExtended = T('commandMangaExtended'); -export const WaifuDescription = T('commandWaifuDescription'); -export const WaifuExtended = T('commandWaifuExtended'); +export const AnimeDescription = T('commands/anime:animeDescription'); +export const AnimeExtended = T('commands/anime:animeExtended'); +export const MangaDescription = T('commands/anime:mangaDescription'); +export const MangaExtended = T('commands/anime:mangaExtended'); +export const WaifuDescription = T('commands/anime:waifuDescription'); +export const WaifuExtended = T('commands/anime:waifuExtended'); export const AnimeTypes = T<{ tv: string; movie: string; ova: string; special: string; [index: string]: string; -}>('commandAnimeTypes'); -export const AnimeInvalidChoice = T('commandAnimeInvalidChoice'); +}>('commands/anime:animeTypes'); +export const AnimeInvalidChoice = T('commands/anime:animeInvalidChoice'); export const AnimeOutputDescription = FT<{ englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }, string>( - 'commandAnimeOutputDescription' + 'commands/anime:animeOutputDescription' ); -export const AnimeNoSynopsis = T('commandAnimeNoSynopsis'); +export const AnimeNoSynopsis = T('commands/anime:animeNoSynopsis'); export const AnimeEmbedData = T<{ type: string; score: string; @@ -28,9 +28,9 @@ export const AnimeEmbedData = T<{ firstAirDate: string; watchIt: string; stillAiring: string; -}>('commandAnimeEmbedData'); +}>('commands/anime:animeEmbedData'); export const MangaOutputDescription = FT<{ englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }, string>( - 'commandMangaOutputDescription' + 'commands/anime:mangaOutputDescription' ); export const MangaEmbedData = T<{ type: string; @@ -39,7 +39,7 @@ export const MangaEmbedData = T<{ firstPublishDate: string; readIt: string; none: string; -}>('commandMangaEmbedData'); +}>('commands/anime:mangaEmbedData'); export const MangaTypes = T<{ manga: string; novel: string; @@ -47,5 +47,5 @@ export const MangaTypes = T<{ oneShot: string; special: string; [index: string]: string; -}>('commandMangaTypes'); -export const WaifuFooter = T('commandWaifuFooter'); +}>('commands/anime:mangaTypes'); +export const WaifuFooter = T('commands/anime:waifuFooter'); diff --git a/src/lib/types/namespaces/languages/commands/Announcement.ts b/src/lib/types/namespaces/languages/commands/Announcement.ts index 9715aa3a362..eb8787dd5af 100644 --- a/src/lib/types/namespaces/languages/commands/Announcement.ts +++ b/src/lib/types/namespaces/languages/commands/Announcement.ts @@ -1,19 +1,21 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const Announcement = FT<{ role: string }, string>('commandAnnouncement'); -export const AnnouncementCancelled = T('commandAnnouncementCancelled'); -export const AnnouncementDescription = T('commandAnnouncementDescription'); -export const AnnouncementEmbedMentions = FT<{ header: string }, string>('commandAnnouncementEmbedMentions'); -export const AnnouncementEmbedMentionsWithMentions = FT<{ header: string; mentions: string }, string>('commandAnnouncementEmbedMentionsWithMentions'); -export const AnnouncementExtended = T('commandAnnouncementExtended'); -export const AnnouncementPrompt = T('commandAnnouncementPrompt'); -export const AnnouncementSuccess = T('commandAnnouncementSuccess'); -export const SubscribeDescription = T('commandSubscribeDescription'); -export const SubscribeExtended = T('commandSubscribeExtended'); -export const SubscribeNoChannel = T('commandSubscribeNoChannel'); -export const SubscribeNoRole = T('commandSubscribeNoRole'); -export const SubscribeSuccess = FT<{ role: string }, string>('commandSubscribeSuccess'); -export const UnsubscribeDescription = T('commandUnsubscribeDescription'); -export const UnsubscribeExtended = T('commandUnsubscribeExtended'); -export const UnsubscribeSuccess = FT<{ role: string }, string>('commandUnsubscribeSuccess'); +export const AnnouncementHeader = FT<{ role: string }, string>('commands/announcement:announcementHeader'); +export const AnnouncementCancelled = T('commands/announcement:announcementCancelled'); +export const AnnouncementDescription = T('commands/announcement:announcementDescription'); +export const AnnouncementEmbedMentions = FT<{ header: string }, string>('commands/announcement:announcementEmbedMentions'); +export const AnnouncementEmbedMentionsWithMentions = FT<{ header: string; mentions: string[] }, string>( + 'commands/announcement:announcementEmbedMentionsWithMentions' +); +export const AnnouncementExtended = T('commands/announcement:announcementExtended'); +export const AnnouncementPrompt = T('commands/announcement:announcementPrompt'); +export const AnnouncementSuccess = T('commands/announcement:announcementSuccess'); +export const SubscribeDescription = T('commands/announcement:subscribeDescription'); +export const SubscribeExtended = T('commands/announcement:subscribeExtended'); +export const SubscribeNoChannel = T('commands/announcement:subscribeNoChannel'); +export const SubscribeNoRole = T('commands/announcement:subscribeNoRole'); +export const SubscribeSuccess = FT<{ role: string }, string>('commands/announcement:subscribeSuccess'); +export const UnsubscribeDescription = T('commands/announcement:unsubscribeDescription'); +export const UnsubscribeExtended = T('commands/announcement:unsubscribeExtended'); +export const UnsubscribeSuccess = FT<{ role: string }, string>('commands/announcement:unsubscribeSuccess'); diff --git a/src/lib/types/namespaces/languages/commands/Developers.ts b/src/lib/types/namespaces/languages/commands/Developers.ts index 72da2003576..92fb8eaa3ef 100644 --- a/src/lib/types/namespaces/languages/commands/Developers.ts +++ b/src/lib/types/namespaces/languages/commands/Developers.ts @@ -1,19 +1,19 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const YarnDescription = T('commandYarnDescription'); -export const YarnEmbedDescriptionAuthor = FT<{ author: string }, string>('commandYarnEmbedDescriptionAuthor'); -export const YarnEmbedDescriptionDateCreated = FT<{ dateCreated: string }, string>('commandYarnEmbedDescriptionDateCreated'); -export const YarnEmbedDescriptionDateModified = FT<{ dateModified: string }, string>('commandYarnEmbedDescriptionDateModified'); -export const YarnEmbedDescriptionDependenciesLabel = T('commandYarnEmbedDescriptionDependenciesLabel'); -export const YarnEmbedDescriptionDependenciesNoDeps = T('commandYarnEmbedDescriptionDependenciesNoDeps'); -export const YarnEmbedDescriptionDeprecated = FT<{ deprecated: string }, string>('commandYarnEmbedDescriptionDeprecated'); -export const YarnEmbedDescriptionLatestVersion = FT<{ latestVersionNumber: string }, string>('commandYarnEmbedDescriptionLatestVersion'); -export const YarnEmbedDescriptionLicense = FT<{ license: string }, string>('commandYarnEmbedDescriptionLicense'); -export const YarnEmbedDescriptionMainFile = FT<{ mainFile: string }, string>('commandYarnEmbedDescriptionMainFile'); -export const YarnEmbedDescriptionMaintainers = T('commandYarnEmbedDescriptionMaintainers'); -export const YarnEmbedMoreText = T('commandYarnEmbedMoreText'); -export const YarnExtended = T('commandYarnExtended'); -export const YarnNoPackage = T('commandYarnNoPackage'); -export const YarnPackageNotFound = FT<{ pkg: string }, string>('commandYarnPackageNotFound'); -export const YarnUnpublishedPackage = FT<{ pkg: string }, string>('commandYarnUnpublishedPackage'); +export const YarnDescription = T('commands/developer:yarnDescription'); +export const YarnEmbedDescriptionAuthor = FT<{ author: string }, string>('commands/developer:yarnEmbedDescriptionAuthor'); +export const YarnEmbedDescriptionDateCreated = FT<{ dateCreated: string }, string>('commands/developer:yarnEmbedDescriptionDateCreated'); +export const YarnEmbedDescriptionDateModified = FT<{ dateModified: string }, string>('commands/developer:yarnEmbedDescriptionDateModified'); +export const YarnEmbedDescriptionDependenciesLabel = T('commands/developer:yarnEmbedDescriptionDependenciesLabel'); +export const YarnEmbedDescriptionDependenciesNoDeps = T('commands/developer:yarnEmbedDescriptionDependenciesNoDeps'); +export const YarnEmbedDescriptionDeprecated = FT<{ deprecated: string }, string>('commands/developer:yarnEmbedDescriptionDeprecated'); +export const YarnEmbedDescriptionLatestVersion = FT<{ latestVersionNumber: string }, string>('commands/developer:yarnEmbedDescriptionLatestVersion'); +export const YarnEmbedDescriptionLicense = FT<{ license: string }, string>('commands/developer:yarnEmbedDescriptionLicense'); +export const YarnEmbedDescriptionMainFile = FT<{ mainFile: string }, string>('commands/developer:yarnEmbedDescriptionMainFile'); +export const YarnEmbedDescriptionMaintainers = FT<{ maintainers: string[] }, string>('commands/developer:yarnEmbedDescriptionMaintainers'); +export const YarnEmbedMoreText = T('commands/developer:yarnEmbedMoreText'); +export const YarnExtended = T('commands/developer:yarnExtended'); +export const YarnNoPackage = T('commands/developer:yarnNoPackage'); +export const YarnPackageNotFound = FT<{ pkg: string }, string>('commands/developer:yarnPackageNotFound'); +export const YarnUnpublishedPackage = FT<{ pkg: string }, string>('commands/developer:yarnUnpublishedPackage'); diff --git a/src/lib/types/namespaces/languages/commands/Fun.ts b/src/lib/types/namespaces/languages/commands/Fun.ts index 0096669b719..21c3e739fd9 100644 --- a/src/lib/types/namespaces/languages/commands/Fun.ts +++ b/src/lib/types/namespaces/languages/commands/Fun.ts @@ -2,67 +2,67 @@ import { CustomGet, FT, T } from '#lib/types'; import { EightBallLanguage } from '#root/commands/Fun/8ball'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const ChangemymindDescription = T('commandChangemymindDescription'); -export const ChangemymindExtended = T('commandChangemymindExtended'); -export const ChoiceDescription = T('commandChoiceDescription'); -export const ChoiceDuplicates = FT<{ words: string }, string>('commandChoiceDuplicates'); -export const ChoiceExtended = T('commandChoiceExtended'); -export const ChoiceMissing = T('commandChoiceMissing'); -export const ChoiceOutput = FT<{ user: string; word: string }, string>('commandChoiceOutput'); -export const DiceDescription = T('commandDiceDescription'); -export const DiceExtended = T('commandDiceExtended'); -export const DiceOutput = FT<{ result: number }, string>('commandDiceOutput'); -export const DiceRollsError = T('commandDiceRollsError'); -export const DiceSidesError = T('commandDiceSidesError'); -export const EightballDescription = T('command8ballDescription'); -export const EightballElse = T('command8ballElse'); -export const EightballExtended = T('command8ballExtended'); -export const EightballHowMany = T('command8ballHowMany'); -export const EightballHowMuch = T('command8ballHowMuch'); -export const EightballOutput = FT<{ author: string; question: string; response: string }, string>('command8ballOutput'); -export const EightballQuestions = T('command8ballQuestions'); -export const EightballWhat = T('command8ballWhat'); -export const EightballWhen = T('command8ballWhen'); -export const EightballWho = T('command8ballWho'); -export const EightballWhy = T('command8ballWhy'); -export const EscaperopeDescription = T('commandEscaperopeDescription'); -export const EscaperopeExtended = T('commandEscaperopeExtended'); -export const EscaperopeOutput = FT<{ user: string }, string>('commandEscaperopeOutput'); -export const HowToFlirtDescription = T('commandHowToFlirtDescription'); -export const HowToFlirtExtended = T('commandHowToFlirtExtended'); -export const Love100 = T('commandLove100'); -export const LoveDescription = T('commandLoveDescription'); -export const LoveExtended = T('commandLoveExtended'); -export const LoveItself = T('commandLoveItself'); -export const LoveLess100 = T('commandLoveLess100'); -export const LoveLess45 = T('commandLoveLess45'); -export const LoveLess75 = T('commandLoveLess75'); -export const LoveResult = T('commandLoveResult'); -export const MarkovDescription = T('commandMarkovDescription'); -export const MarkovExtended = T('commandMarkovExtended'); -export const MarkovNoMessages = T('commandMarkovNoMessages'); -export const MarkovTimer = FT<{ timer: string }, string>('commandMarkovTimer'); -export const NorrisDescription = T('commandNorrisDescription'); -export const NorrisExtended = T('commandNorrisExtended'); -export const NorrisOutput = T('commandNorrisOutput'); -export const PeepoloveDescription = T('commandPeepoloveDescription'); -export const PeepoloveExtended = T('commandPeepoloveExtended'); -export const PunDescription = T('commandPunDescription'); -export const PunError = T('commandPunError'); -export const PunExtended = T('commandPunExtended'); -export const RateDescription = T('commandRateDescription'); -export const RateExtended = T('commandRateExtended'); -export const RateMyself = T<[string, string]>('commandRateMyself'); -export const RateMyOwners = T<[string, string]>('commandRateOwners'); -export const RateOutput = FT<{ author: string; userToRate: string; rate: number; emoji: string }, string>('commandRateOutput'); -export const ShindeiruDescription = T('commandShindeiruDescription'); -export const ShindeiruExtended = T('commandShindeiruExtended'); -export const WakandaDescription = T('commandWakandaDescription'); -export const WakandaExtended = T('commandWakandaExtended'); -export const XkcdComics = FT<{ amount: number }, string>('commandXkcdComics'); -export const XkcdDescription = T('commandXkcdDescription'); -export const XkcdExtended = T('commandXkcdExtended'); -export const XkcdNotfound = T('commandXkcdNotfound'); +export const ChangeMyMindDescription = T('commands/fun:changemymindDescription'); +export const ChangeMyMindExtended = T('commands/fun:changemymindExtended'); +export const ChoiceDescription = T('commands/fun:choiceDescription'); +export const ChoiceDuplicates = FT<{ words: string }, string>('commands/fun:choiceDuplicates'); +export const ChoiceExtended = T('commands/fun:choiceExtended'); +export const ChoiceMissing = T('commands/fun:choiceMissing'); +export const ChoiceOutput = FT<{ user: string; word: string }, string>('commands/fun:choiceOutput'); +export const DiceDescription = T('commands/fun:diceDescription'); +export const DiceExtended = T('commands/fun:diceExtended'); +export const DiceOutput = FT<{ result: number }, string>('commands/fun:diceOutput'); +export const DiceRollsError = T('commands/fun:diceRollsError'); +export const DiceSidesError = T('commands/fun:diceSidesError'); +export const EightballDescription = T('commands/fun:8ballDescription'); +export const EightballElse = T('commands/fun:8ballElse'); +export const EightballExtended = T('commands/fun:8ballExtended'); +export const EightballHowMany = T('commands/fun:8ballHowMany'); +export const EightballHowMuch = T('commands/fun:8ballHowMuch'); +export const EightballOutput = FT<{ author: string; question: string; response: string }, string>('commands/fun:8ballOutput'); +export const EightballQuestions = T('commands/fun:8ballQuestions'); +export const EightballWhat = T('commands/fun:8ballWhat'); +export const EightballWhen = T('commands/fun:8ballWhen'); +export const EightballWho = T('commands/fun:8ballWho'); +export const EightballWhy = T('commands/fun:8ballWhy'); +export const EscapeRopeDescription = T('commands/fun:escaperopeDescription'); +export const EscapeRopeExtended = T('commands/fun:escaperopeExtended'); +export const EscapeRopeOutput = FT<{ user: string }, string>('commands/fun:escaperopeOutput'); +export const HowToFlirtDescription = T('commands/fun:howToFlirtDescription'); +export const HowToFlirtExtended = T('commands/fun:howToFlirtExtended'); +export const Love100 = T('commands/fun:love100'); +export const LoveDescription = T('commands/fun:loveDescription'); +export const LoveExtended = T('commands/fun:loveExtended'); +export const LoveItself = T('commands/fun:loveItself'); +export const LoveLess100 = T('commands/fun:loveLess100'); +export const LoveLess45 = T('commands/fun:loveLess45'); +export const LoveLess75 = T('commands/fun:loveLess75'); +export const LoveResult = T('commands/fun:loveResult'); +export const MarkovDescription = T('commands/fun:markovDescription'); +export const MarkovExtended = T('commands/fun:markovExtended'); +export const MarkovNoMessages = T('commands/fun:markovNoMessages'); +export const MarkovTimer = FT<{ timer: string }, string>('commands/fun:markovTimer'); +export const NorrisDescription = T('commands/fun:norrisDescription'); +export const NorrisExtended = T('commands/fun:norrisExtended'); +export const NorrisOutput = T('commands/fun:norrisOutput'); +export const PeepoLoveDescription = T('commands/fun:peepoloveDescription'); +export const PeepoLoveExtended = T('commands/fun:peepoloveExtended'); +export const PunDescription = T('commands/fun:punDescription'); +export const PunError = T('commands/fun:punError'); +export const PunExtended = T('commands/fun:punExtended'); +export const RateDescription = T('commands/fun:rateDescription'); +export const RateExtended = T('commands/fun:rateExtended'); +export const RateMyOwners = T<[string, string]>('commands/fun:rateOwners'); +export const RateMyself = T<[string, string]>('commands/fun:rateMyself'); +export const RateOutput = FT<{ author: string; userToRate: string; rate: number; emoji: string }, string>('commands/fun:rateOutput'); +export const ShindeiruDescription = T('commands/fun:shindeiruDescription'); +export const ShindeiruExtended = T('commands/fun:shindeiruExtended'); +export const WakandaDescription = T('commands/fun:wakandaDescription'); +export const WakandaExtended = T('commands/fun:wakandaExtended'); +export const XkcdComics = FT<{ amount: number }, string>('commands/fun:xkcdComics'); +export const XkcdDescription = T('commands/fun:xkcdDescription'); +export const XkcdExtended = T('commands/fun:xkcdExtended'); +export const XkcdNotFound = T('commands/fun:xkcdNotfound'); export const Resolve8BallQuestionKey = (key: keyof EightBallLanguage): CustomGet => { switch (key) { diff --git a/src/lib/types/namespaces/languages/commands/GameIntegration.ts b/src/lib/types/namespaces/languages/commands/GameIntegration.ts index aaca88d9d96..c215117107e 100644 --- a/src/lib/types/namespaces/languages/commands/GameIntegration.ts +++ b/src/lib/types/namespaces/languages/commands/GameIntegration.ts @@ -1,16 +1,16 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const BrawlstarsDescription = T('commandBrawlstarsDescription'); -export const BrawlstarsExtended = T('commandBrawlstarsExtended'); -export const BrawlstarsPlayerEmbedTitles = T<{ +export const BrawlStarsDescription = T('commands/gameIntegration:brawlstarsDescription'); +export const BrawlStarsExtended = T('commands/gameIntegration:brawlstarsExtended'); +export const BrawlStarsPlayerEmbedTitles = T<{ trophies: string; exp: string; events: string; gamesModes: string; other: string; -}>('commandBrawlstarsPlayerEmbedTitles'); -export const BrawlstarsPlayerEmbedFields = T<{ +}>('commands/gameIntegration:brawlstarsPlayerEmbedTitles'); +export const BrawlStarsPlayerEmbedFields = T<{ total: string; personalBest: string; experienceLevel: string; @@ -22,8 +22,8 @@ export const BrawlstarsPlayerEmbedFields = T<{ victoriesSolo: string; club: string; brawlersUnlocked: string; -}>('commandBrawlstarsPlayerEmbedFields'); -export const BrawlstarsClubEmbedTitles = T<{ +}>('commands/gameIntegration:brawlstarsPlayerEmbedFields'); +export const BrawlStarsClubEmbedTitles = T<{ totalTrophies: string; averageTrophies: string; requiredTrophies: string; @@ -31,13 +31,13 @@ export const BrawlstarsClubEmbedTitles = T<{ type: string; top5Members: string; president: string; -}>('commandBrawlstarsClubEmbedTitles'); -export const BrawlstarsClubEmbedFields = T<{ +}>('commands/gameIntegration:brawlstarsClubEmbedTitles'); +export const BrawlStarsClubEmbedFields = T<{ noPresident: string; -}>('commandBrawlstarsClubEmbedFields'); -export const ClashofclansDescription = T('commandClashofclansDescription'); -export const ClashofclansExtended = T('commandClashofclansExtended'); -export const ClashofclansPlayerEmbedTitles = T<{ +}>('commands/gameIntegration:brawlstarsClubEmbedFields'); +export const ClashOfClansDescription = T('commands/gameIntegration:clashofclansDescription'); +export const ClashOfClansExtended = T('commands/gameIntegration:clashofclansExtended'); +export const ClashOfClansPlayerEmbedTitles = T<{ xpLevel: string; builderHallLevel: string; townhallLevel: string; @@ -58,8 +58,8 @@ export const ClashofclansPlayerEmbedTitles = T<{ noRole: string; noClan: string; noLeague: string; -}>('commandClashofclansPlayerEmbedTitles'); -export const ClashofclansClanEmbedTitles = T<{ +}>('commands/gameIntegration:clashofclansPlayerEmbedTitles'); +export const ClashOfClansClanEmbedTitles = T<{ clanLevel: string; clanPoints: string; clanVersusPoints: string; @@ -80,15 +80,15 @@ export const ClashofclansClanEmbedTitles = T<{ oncePerWeek: string; lessThanOncePerWeek: string; }; -}>('commandClashofclansClanEmbedTitles'); -export const BrawlStarsInvalidPlayerTag = FT<{ playertag: string }, string>('commandBrawlStarsInvalidPlayerTag'); -export const BrawlStarsClansQueryFail = FT<{ clan: string }, string>('commandBrawlStarsClansQueryFail'); -export const BrawlStarsPlayersQueryFail = FT<{ playertag: string }, string>('commandBrawlStarsPlayersQueryFail'); -export const ClashOfClansInvalidPlayerTag = FT<{ playertag: string }, string>('commandClashofclansInvalidPlayerTag'); -export const ClashOfClansClansQueryFail = FT<{ clan: string }, string>('commandClashOfClansClansQueryFail'); -export const ClashOfClansPlayersQueryFail = FT<{ playertag: string }, string>('commandClashofclansPlayersQueryFail'); -export const FFXIVDescription = T('commandFFXIVDescription'); -export const FFXIVExtended = T('commandFFXIVExtended'); +}>('commands/gameIntegration:clashofclansClanEmbedTitles'); +export const BrawlStarsInvalidPlayerTag = FT<{ playertag: string }, string>('commands/gameIntegration:brawlStarsInvalidPlayerTag'); +export const BrawlStarsClansQueryFail = FT<{ clan: string }, string>('commands/gameIntegration:brawlStarsClansQueryFail'); +export const BrawlStarsPlayersQueryFail = FT<{ playertag: string }, string>('commands/gameIntegration:brawlStarsPlayersQueryFail'); +export const ClashOfClansInvalidPlayerTag = FT<{ playertag: string }, string>('commands/gameIntegration:clashofclansInvalidPlayerTag'); +export const ClashOfClansClansQueryFail = FT<{ clan: string }, string>('commands/gameIntegration:clashOfClansClansQueryFail'); +export const ClashOfClansPlayersQueryFail = FT<{ playertag: string }, string>('commands/gameIntegration:clashofclansPlayersQueryFail'); +export const FFXIVDescription = T('commands/gameIntegration:FFXIVDescription'); +export const FFXIVExtended = T('commands/gameIntegration:FFXIVExtended'); export const FFXIVCharacterFields = T<{ serverAndDc: string; tribe: string; @@ -109,26 +109,26 @@ export const FFXIVCharacterFields = T<{ magicalRangedDps: string; dohClasses: string; dolClasses: string; -}>('commandFFXIVCharacterFields'); +}>('commands/gameIntegration:FFXIVCharacterFields'); export const FFXIVItemFields = T<{ kind: string; category: string; levelEquip: string; none: string; -}>('commandFFXIVItemFields'); -export const FFXIVNoCharacterFound = T('commandFFXIVNoCharacterFound'); -export const FFXIVInvalidServer = T('commandFFXIVInvalidServer'); -export const FFXIVNoItemFound = T('commandFFXIVNoItemFound'); -export const FortniteDescription = T('commandFortniteDescription'); -export const FortniteExtended = T('commandFortniteExtended'); -export const FortniteNoUser = T('commandFortniteNoUser'); -export const FortniteEmbedTitle = FT<{ epicUserHandle: string }, string>('commandFortniteEmbedTitle'); +}>('commands/gameIntegration:FFXIVItemFields'); +export const FFXIVNoCharacterFound = T('commands/gameIntegration:FFXIVNoCharacterFound'); +export const FFXIVInvalidServer = T('commands/gameIntegration:FFXIVInvalidServer'); +export const FFXIVNoItemFound = T('commands/gameIntegration:FFXIVNoItemFound'); +export const FortniteDescription = T('commands/gameIntegration:fortniteDescription'); +export const FortniteExtended = T('commands/gameIntegration:fortniteExtended'); +export const FortniteNoUser = T('commands/gameIntegration:fortniteNoUser'); +export const FortniteEmbedTitle = FT<{ epicUserHandle: string }, string>('commands/gameIntegration:fortniteEmbedTitle'); export const FortniteEmbedSectionTitles = T<{ lifetimeStats: string; solos: string; duos: string; squads: string; -}>('commandFortniteEmbedSectionTitles'); +}>('commands/gameIntegration:fortniteEmbedSectionTitles'); export const FortniteEmbedStats = FT< { winCount: string; @@ -156,13 +156,13 @@ export const FortniteEmbedStats = FT< top12s: string; top25s: string; } ->('commandFortniteEmbedStats'); -export const OverwatchDescription = T('commandOverwatchDescription'); -export const OverwatchExtended = T('commandOverwatchExtended'); -export const OverwatchInvalidPlayerName = FT<{ playerTag: string }, string>('commandOverwatchInvalidPlayerName'); -export const OverwatchQueryFail = FT<{ player: string; platform: string }, string>('commandOverwatchQueryFail'); -export const OverwatchNoStats = FT<{ player: string }, string>('commandOverwatchNoStats'); -export const OverwatchNoAverage = T('commandOverwatchNoAverage'); +>('commands/gameIntegration:fortniteEmbedStats'); +export const OverwatchDescription = T('commands/gameIntegration:overwatchDescription'); +export const OverwatchExtended = T('commands/gameIntegration:overwatchExtended'); +export const OverwatchInvalidPlayerName = FT<{ playerTag: string }, string>('commands/gameIntegration:overwatchInvalidPlayerName'); +export const OverwatchQueryFail = FT<{ player: string; platform: string }, string>('commands/gameIntegration:overwatchQueryFail'); +export const OverwatchNoStats = FT<{ player: string }, string>('commands/gameIntegration:overwatchNoStats'); +export const OverwatchNoAverage = T('commands/gameIntegration:overwatchNoAverage'); export const OverwatchEmbedDataStats = FT< { finalBlows: number; @@ -190,8 +190,8 @@ export const OverwatchEmbedDataStats = FT< silverMedals: string; bronzeMedals: string; } ->('commandOverwatchEmbedDataStats'); -export const OverwatchEmbedDataTopHero = FT<{ name: string; playTime: string }, string>('commandOverwatchEmbedDataTopHero'); +>('commands/gameIntegration:overwatchEmbedDataStats'); +export const OverwatchEmbedDataTopHero = FT<{ name: string; playTime: number }, string>('commands/gameIntegration:overwatchEmbedDataTopHero'); export const OverwatchEmbedData = FT< { authorName: string; @@ -200,7 +200,7 @@ export const OverwatchEmbedData = FT< totalGamesWon: number; }, OverwatchEmbedDataReturn ->('commandOverwatchEmbedData'); +>('commands/gameIntegration:overwatchEmbedData'); export interface OverwatchEmbedDataReturn { title: string; diff --git a/src/lib/types/namespaces/languages/commands/Games.ts b/src/lib/types/namespaces/languages/commands/Games.ts index ae165fa01e1..1ac86a2dfaf 100644 --- a/src/lib/types/namespaces/languages/commands/Games.ts +++ b/src/lib/types/namespaces/languages/commands/Games.ts @@ -2,44 +2,45 @@ import { FT, T } from '#lib/types'; import { HungerGamesGame } from '#root/commands/Games/hungergames'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const GamesSkyra = T('commandGamesSkyra'); -export const GamesBot = T('commandGamesBot'); -export const GamesSelf = T('commandGamesSelf'); -export const GamesProgress = T('commandGamesProgress'); -export const GamesNoPlayers = FT<{ prefix: string }, string>('commandGamesNoPlayers'); -export const GamesTooManyOrFew = FT<{ min: number; max: number }, string>('commandGamesTooManyOrFew'); -export const GamesRepeat = T('commandGamesRepeat'); -export const GamesPromptTimeout = T('commandGamesPromptTimeout'); -export const GamesPromptDeny = T('commandGamesPromptDeny'); -export const GamesTimeout = T('commandGamesTimeout'); -export const GamesCannotHaveNegativeMoney = T('gamesCannotHaveNegativeMoney'); -export const GamesNotEnoughMoney = FT<{ money: number }, string>('gamesNotEnoughMoney'); -export const C4Description = T('commandC4Description'); -export const C4Extended = T('commandC4Extended'); -export const C4Prompt = FT<{ challenger: string; challengee: string }, string>('commandC4Prompt'); -export const C4Start = FT<{ player: string }, string>('commandC4Start'); -export const C4GameColumnFull = T('commandC4GameColumnFull'); -export const C4GameWin = FT<{ user: string }, string>('commandC4GameWin'); -export const C4GameWinTurn0 = FT<{ user: string }, string>('commandC4GameWinTurn0'); -export const C4GameDraw = T('commandC4GameDraw'); -export const C4GameNext = FT<{ user: string }, string>('commandC4GameNext'); -export const C4GameNextTurn0 = FT<{ user: string }, string>('commandC4GameNextTurn0'); -export const CoinFlipDescription = T('commandCoinFlipDescription'); -export const CoinFlipExtended = T('commandCoinFlipExtended'); -export const CoinFlipInvalidCoinname = FT<{ arg: string }, string>('commandCoinFlipInvalidCoinname'); -export const CoinFlipCoinNames = T('commandCoinFlipCoinnames'); -export const CoinFlipWinTitle = T('commandCoinFlipWinTitle'); -export const CoinFlipLoseTitle = T('commandCoinFlipLoseTitle'); -export const CoinFlipNoGuessTitle = T('commandCoinFlipNoguessTitle'); -export const CoinFlipWinDescription = FT<{ result: string }, string>('commandCoinFlipWinDescription'); -export const CoinFlipWinDescriptionWithWager = FT<{ result: string; wager: number }, string>('commandCoinFlipWinDescriptionWithWager'); -export const CoinFlipLoseDescription = FT<{ result: string }, string>('commandCoinFlipLoseDescription'); -export const CoinFlipLoseDescriptionWithWager = FT<{ result: string; wager: number }, string>('commandCoinFlipLoseDescriptionWithWager'); -export const CoinFlipNoGuessDescription = FT<{ result: string }, string>('commandCoinFlipNoguessDescription'); -export const HigherLowerDescription = T('commandHigherLowerDescription'); -export const HigherLowerExtended = T('commandHigherLowerExtended'); -export const HigherLowerLoading = T('commandHigherLowerLoading'); -export const HigherLowerNewround = T('commandHigherLowerNewround'); +export const BalanceDifference = FT<{ previous: string; next: string }, string>('commands/game:balanceDifference'); +export const GamesSkyra = T('commands/game:gamesSkyra'); +export const GamesBot = T('commands/game:gamesBot'); +export const GamesSelf = T('commands/game:gamesSelf'); +export const GamesProgress = T('commands/game:gamesProgress'); +export const GamesNoPlayers = FT<{ prefix: string }, string>('commands/game:gamesNoPlayers'); +export const GamesTooManyOrFew = FT<{ min: number; max: number }, string>('commands/game:gamesTooManyOrFew'); +export const GamesRepeat = T('commands/game:gamesRepeat'); +export const GamesPromptTimeout = T('commands/game:gamesPromptTimeout'); +export const GamesPromptDeny = T('commands/game:gamesPromptDeny'); +export const GamesTimeout = T('commands/game:gamesTimeout'); +export const GamesCannotHaveNegativeMoney = T('commands/game:cannotHaveNegativeMoney'); +export const GamesNotEnoughMoney = FT<{ money: number }, string>('commands/game:notEnoughMoney'); +export const C4Description = T('commands/game:c4Description'); +export const C4Extended = T('commands/game:c4Extended'); +export const C4Prompt = FT<{ challenger: string; challengee: string }, string>('commands/game:c4Prompt'); +export const C4Start = FT<{ player: string }, string>('commands/game:c4Start'); +export const C4GameColumnFull = T('commands/game:c4GameColumnFull'); +export const C4GameWin = FT<{ user: string }, string>('commands/game:c4GameWin'); +export const C4GameWinTurn0 = FT<{ user: string }, string>('commands/game:c4GameWinTurn0'); +export const C4GameDraw = T('commands/game:c4GameDraw'); +export const C4GameNext = FT<{ user: string }, string>('commands/game:c4GameNext'); +export const C4GameNextTurn0 = FT<{ user: string }, string>('commands/game:c4GameNextTurn0'); +export const CoinFlipDescription = T('commands/game:coinFlipDescription'); +export const CoinFlipExtended = T('commands/game:coinFlipExtended'); +export const CoinFlipInvalidCoinName = FT<{ arg: string }, string>('commands/game:coinFlipInvalidCoinname'); +export const CoinFlipCoinNames = T('commands/game:coinFlipCoinnames'); +export const CoinFlipWinTitle = T('commands/game:coinFlipWinTitle'); +export const CoinFlipLoseTitle = T('commands/game:coinFlipLoseTitle'); +export const CoinFlipNoGuessTitle = T('commands/game:coinFlipNoguessTitle'); +export const CoinFlipWinDescription = FT<{ result: string }, string>('commands/game:coinFlipWinDescription'); +export const CoinFlipWinDescriptionWithWager = FT<{ result: string; wager: number }, string>('commands/game:coinFlipWinDescriptionWithWager'); +export const CoinFlipLoseDescription = FT<{ result: string }, string>('commands/game:coinFlipLoseDescription'); +export const CoinFlipLoseDescriptionWithWager = FT<{ result: string; wager: number }, string>('commands/game:coinFlipLoseDescriptionWithWager'); +export const CoinFlipNoGuessDescription = FT<{ result: string }, string>('commands/game:coinFlipNoguessDescription'); +export const HigherLowerDescription = T('commands/game:higherLowerDescription'); +export const HigherLowerExtended = T('commands/game:higherLowerExtended'); +export const HigherLowerLoading = T('commands/game:higherLowerLoading'); +export const HigherLowerNewRound = T('commands/game:higherLowerNewround'); export const HigherLowerEmbed = FT< { turn: number; @@ -50,7 +51,7 @@ export const HigherLowerEmbed = FT< description: string; footer: string; } ->('commandHigherLowerEmbed'); +>('commands/game:higherLowerEmbed'); export const HigherLowerLose = FT< { number: number; @@ -61,7 +62,7 @@ export const HigherLowerLose = FT< description: string; footer: string; } ->('commandHigherLowerLose'); +>('commands/game:higherLowerLose'); export const HigherLowerWin = FT< { potentials: number; @@ -72,7 +73,7 @@ export const HigherLowerWin = FT< description: string; footer: string; } ->('commandHigherLowerWin'); +>('commands/game:higherLowerWin'); export const HigherLowerCancel = FT< { username: string; @@ -81,53 +82,44 @@ export const HigherLowerCancel = FT< title: string; description: string; } ->('commandHigherLowerCancel'); -export const HigherLowerCashout = FT<{ amount: number }, string>('commandHigherLowerCashout'); -export const HungerGamesDescription = T('commandHungerGamesDescription'); -export const HungerGamesExtended = T('commandHungerGamesExtended'); -export const HungerGamesResultHeaderBloodbath = FT<{ game: HungerGamesGame }, string>('commandHungerGamesResultHeaderBloodbath'); -export const HungerGamesResultHeaderSun = FT<{ game: HungerGamesGame }, string>('commandHungerGamesResultHeaderSun'); -export const HungerGamesResultHeaderMoon = FT<{ game: HungerGamesGame }, string>('commandHungerGamesResultHeaderMoon'); -export const HungerGamesResultDeaths = FT<{ deaths: number }, string>('commandHungerGamesResultDeaths'); -export const HungerGamesResultDeathsPlural = FT<{ deaths: number }, string>('commandHungerGamesResultDeathsPlural'); -export const HungerGamesResultProceed = T('commandHungerGamesResultProceed'); -export const HungerGamesStop = T('commandHungerGamesStop'); -export const HungerGamesWinner = FT<{ winner: string }, string>('commandHungerGamesWinner'); -export const HungerGamesBloodbath = T('hgBloodbath'); -export const HungerGamesDay = T('hgDay'); -export const HungerGamesNight = T('hgNight'); -export const SlotmachineDescription = T('commandSlotmachineDescription'); -export const SlotmachineExtended = T('commandSlotmachineExtended'); -export const SlotmachinesWin = FT<{ roll: string; winnings: number }, string>('commandSlotmachinesWin'); -export const SlotmachinesLoss = FT<{ roll: string }, string>('commandSlotmachinesLoss'); -export const SlotmachineTitles = T<{ - previous: string; - new: string; -}>('commandSlotmachineTitles'); -export const SlotmachineCanvasTextWon = T('commandSlotmachineCanvasTextWon'); -export const SlotmachineCanvasTextLost = T('commandSlotmachineCanvasTextLost'); -export const TicTacToeDescription = T('commandTicTacToeDescription'); -export const TicTacToeExtended = T('commandTicTacToeExtended'); -export const WheelOfFortuneDescription = T('commandWheelOfFortuneDescription'); -export const WheelOfFortuneExtended = T('commandWheelOfFortuneExtended'); -export const WheelOfFortuneCanvasTextWon = T('commandWheelOfFortuneCanvasTextWon'); -export const WheelOfFortuneCanvasTextLost = T('commandWheelOfFortuneCanvasTextLost'); -export const WheelOfFortuneTitles = T<{ - previous: string; - new: string; -}>('commandWheelOfFortuneTitles'); -export const TicTacToePrompt = FT<{ challenger: string; challengee: string }, string>('commandTicTacToePrompt'); -export const TicTacToeTurn = FT<{ icon: string; player: string; board: string }, string>('commandTicTacToeTurn'); -export const TicTacToeWinner = FT<{ winner: string; board: string }, string>('commandTicTacToeWinner'); -export const TicTacToeDraw = FT<{ board: string }, string>('commandTicTacToeDraw'); -export const TriviaDescription = T('commandTriviaDescription'); -export const TriviaExtended = T('commandTriviaExtended'); -export const TriviaInvalidCategory = T('commandTriviaInvalidCategory'); -export const TriviaActiveGame = T('commandTriviaActiveGame'); -export const TriviaIncorrect = FT<{ attempt: string }, string>('commandTriviaIncorrect'); -export const TriviaNoAnswer = FT<{ correctAnswer: string }, string>('commandTriviaNoAnswer'); +>('commands/game:higherLowerCancel'); +export const HigherLowerCashout = FT<{ amount: number }, string>('commands/game:higherLowerCashout'); +export const HungerGamesDescription = T('commands/game:hungerGamesDescription'); +export const HungerGamesExtended = T('commands/game:hungerGamesExtended'); +export const HungerGamesResultHeaderBloodbath = FT<{ game: HungerGamesGame }, string>('commands/game:hungerGamesResultHeaderBloodbath'); +export const HungerGamesResultHeaderSun = FT<{ game: HungerGamesGame }, string>('commands/game:hungerGamesResultHeaderSun'); +export const HungerGamesResultHeaderMoon = FT<{ game: HungerGamesGame }, string>('commands/game:hungerGamesResultHeaderMoon'); +export const HungerGamesResultDeaths = FT<{ deaths: number }, string>('commands/game:hungerGamesResultDeaths'); +export const HungerGamesResultProceed = T('commands/game:hungerGamesResultProceed'); +export const HungerGamesStop = T('commands/game:hungerGamesStop'); +export const HungerGamesWinner = FT<{ winner: string }, string>('commands/game:hungerGamesWinner'); +export const HungerGamesBloodbath = T('commands/game:hgBloodbath'); +export const HungerGamesDay = T('commands/game:hgDay'); +export const HungerGamesNight = T('commands/game:hgNight'); +export const SlotMachineDescription = T('commands/game:slotmachineDescription'); +export const SlotMachineExtended = T('commands/game:slotmachineExtended'); +export const SlotMachineWin = FT<{ roll: string; winnings: number }, string>('commands/game:slotmachinesWin'); +export const SlotMachineLoss = FT<{ roll: string }, string>('commands/game:slotmachinesLoss'); +export const SlotMachineCanvasTextWon = T('commands/game:slotmachineCanvasTextWon'); +export const SlotMachineCanvasTextLost = T('commands/game:slotmachineCanvasTextLost'); +export const TicTacToeDescription = T('commands/game:ticTacToeDescription'); +export const TicTacToeExtended = T('commands/game:ticTacToeExtended'); +export const WheelOfFortuneDescription = T('commands/game:wheelOfFortuneDescription'); +export const WheelOfFortuneExtended = T('commands/game:wheelOfFortuneExtended'); +export const WheelOfFortuneCanvasTextWon = T('commands/game:wheelOfFortuneCanvasTextWon'); +export const WheelOfFortuneCanvasTextLost = T('commands/game:wheelOfFortuneCanvasTextLost'); +export const TicTacToePrompt = FT<{ challenger: string; challengee: string }, string>('commands/game:ticTacToePrompt'); +export const TicTacToeTurn = FT<{ icon: string; player: string; board: string }, string>('commands/game:ticTacToeTurn'); +export const TicTacToeWinner = FT<{ winner: string; board: string }, string>('commands/game:ticTacToeWinner'); +export const TicTacToeDraw = FT<{ board: string }, string>('commands/game:ticTacToeDraw'); +export const TriviaDescription = T('commands/game:triviaDescription'); +export const TriviaExtended = T('commands/game:triviaExtended'); +export const TriviaInvalidCategory = T('commands/game:triviaInvalidCategory'); +export const TriviaActiveGame = T('commands/game:triviaActiveGame'); +export const TriviaIncorrect = FT<{ attempt: string }, string>('commands/game:triviaIncorrect'); +export const TriviaNoAnswer = FT<{ correctAnswer: string }, string>('commands/game:triviaNoAnswer'); export const TriviaEmbedTitles = T<{ trivia: string; difficulty: string; -}>('commandTriviaEmbedTitles'); -export const TriviaWinner = FT<{ winner: string; correctAnswer: string }, string>('commandTriviaWinner'); +}>('commands/game:triviaEmbedTitles'); +export const TriviaWinner = FT<{ winner: string; correctAnswer: string }, string>('commands/game:triviaWinner'); diff --git a/src/lib/types/namespaces/languages/commands/General.ts b/src/lib/types/namespaces/languages/commands/General.ts index 8fedb9ee9f9..37fe6c4a5fa 100644 --- a/src/lib/types/namespaces/languages/commands/General.ts +++ b/src/lib/types/namespaces/languages/commands/General.ts @@ -1,23 +1,10 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const Ping = T('commandPing'); -export const PingDescription = T('commandPingDescription'); -export const PingPong = FT<{ diff: number; ping: number }, string>('commandPingPong'); -export const InfoDescription = T('commandInfoDescription'); -export const HelpDescription = T('commandHelpDescription'); -export const HelpNoExtended = T('commandHelpNoExtended'); -export const HelpDm = T('commandHelpDm'); -export const HelpNodm = T('commandHelpNodm'); -export const HelpAllFlag = FT<{ prefix: string }, string>('commandHelpAllFlag'); -export const HelpCommandCount = FT<{ count: number }, string>('commandHelpCommandCount'); -export const HelpCommandCountPlural = FT<{ count: number }, string>('commandHelpCommandCountPlural'); -export const InviteDescription = T('commandInviteDescription'); -export const InviteExtended = T('commandInviteExtended'); -export const InvitePermissionInviteText = T('commandInvitePermissionInviteText'); -export const InvitePermissionSupportServerText = T('commandInvitePermissionSupportServerText'); -export const InvitePermissionsDescription = T('commandInvitePermissionsDescription'); -export const InfoBody = T('commandInfoBody'); +export const HelpAllFlag = FT<{ prefix: string }, string>('commands/general:helpAllFlag'); +export const HelpCommandCount = FT<{ count: number }, string>('commands/general:helpCommandCount'); +export const HelpDescription = T('commands/general:helpDescription'); +export const HelpExtended = T('commands/general:helpExtended'); export const HelpData = FT< { titleDescription: string; @@ -31,4 +18,19 @@ export const HelpData = FT< extended: string; footer: string; } ->('commandHelpData'); +>('commands/general:helpData'); +export const HelpDm = T('commands/general:helpDm'); +export const HelpNoDm = T('commands/general:helpNodm'); +export const HelpNoExtended = T('commands/general:helpNoExtended'); +export const InfoBody = T('commands/general:infoBody'); +export const InfoDescription = T('commands/general:infoDescription'); +export const InfoExtended = T('commands/general:infoExtended'); +export const InviteDescription = T('commands/general:inviteDescription'); +export const InviteExtended = T('commands/general:inviteExtended'); +export const InvitePermissionInviteText = T('commands/general:invitePermissionInviteText'); +export const InvitePermissionsDescription = T('commands/general:invitePermissionsDescription'); +export const InvitePermissionSupportServerText = T('commands/general:invitePermissionSupportServerText'); +export const Ping = T('commands/general:ping'); +export const PingDescription = T('commands/general:pingDescription'); +export const PingExtended = T('commands/general:pingExtended'); +export const PingPong = FT<{ diff: number; ping: number }, string>('commands/general:pingPong'); diff --git a/src/lib/types/namespaces/languages/commands/Giveaway.ts b/src/lib/types/namespaces/languages/commands/Giveaway.ts index 36888c2a232..3856d769837 100644 --- a/src/lib/types/namespaces/languages/commands/Giveaway.ts +++ b/src/lib/types/namespaces/languages/commands/Giveaway.ts @@ -1,10 +1,10 @@ import { T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const GiveawayDescription = T('commandGiveawayDescription'); -export const GiveawayExtended = T('commandGiveawayExtended'); -export const GiveawayRerollDescription = T('commandGiveawayRerollDescription'); -export const GiveawayRerollExtended = T('commandGiveawayRerollExtended'); -export const GiveawayScheduleDescription = T('commandGiveawayScheduleDescription'); -export const GiveawayScheduleExtended = T('commandGiveawayScheduleExtended'); -export const GiveawayRerollInvalid = T('commandGiveawayRerollInvalid'); +export const GiveawayDescription = T('commands/giveaway:giveawayDescription'); +export const GiveawayExtended = T('commands/giveaway:giveawayExtended'); +export const GiveawayRerollDescription = T('commands/giveaway:giveawayRerollDescription'); +export const GiveawayRerollExtended = T('commands/giveaway:giveawayRerollExtended'); +export const GiveawayScheduleDescription = T('commands/giveaway:giveawayScheduleDescription'); +export const GiveawayScheduleExtended = T('commands/giveaway:giveawayScheduleExtended'); +export const GiveawayRerollInvalid = T('commands/giveaway:giveawayRerollInvalid'); diff --git a/src/lib/types/namespaces/languages/commands/Google.ts b/src/lib/types/namespaces/languages/commands/Google.ts index 2fa2c75c940..ee67378f769 100644 --- a/src/lib/types/namespaces/languages/commands/Google.ts +++ b/src/lib/types/namespaces/languages/commands/Google.ts @@ -1,9 +1,11 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const CurrentTimeDescription = T('commandCurrentTimeDescription'); -export const CurrentTimeExtended = T('commandCurrentTimeExtended'); -export const CurrentTimeLocationNotFound = T('commandCurrentTimeLocationNotFound'); +export const CurrentTimeDescription = T('commands/google:currentTimeDescription'); +export const CurrentTimeDst = T('commands/google:currentTimeDst'); +export const CurrentTimeExtended = T('commands/google:currentTimeExtended'); +export const CurrentTimeLocationNotFound = T('commands/google:currentTimeLocationNotFound'); +export const CurrentTimeNoDst = T('commands/google:currentTimeNoDst'); export const CurrentTimeTitles = FT< { dst: string }, { @@ -13,20 +15,19 @@ export const CurrentTimeTitles = FT< gmsOffset: string; dst: string; } ->('commandCurrentTimeTitles'); -export const CurrentTimeDst = T('commandCurrentTimeDst'); -export const CurrentTimeNoDst = T('commandCurrentTimeNoDst'); -export const GsearchDescription = T('commandGsearchDescription'); -export const GsearchExtended = T('commandGsearchExtended'); -export const GimageDescription = T('commandGimageDescription'); -export const GimageExtended = T('commandGimageExtended'); -export const LmgtfyDescription = T('commandLmgtfyDescription'); -export const LmgtfyExtended = T('commandLmgtfyExtended'); -export const LmgtfyClick = T('commandLmgtfyClick'); -export const WeatherDescription = T('commandWeatherDescription'); -export const WeatherExtended = T('commandWeatherExtended'); -export const MessagesErrorZeroResults = T('googleErrorZeroResults'); -export const MessagesErrorRequestDenied = T('googleErrorRequestDenied'); -export const MessagesErrorInvalidRequest = T('googleErrorInvalidRequest'); -export const MessagesErrorOverQueryLimit = T('googleErrorOverQueryLimit'); -export const MessagesErrorUnknown = T('googleErrorUnknown'); +>('commands/google:currentTimeTitles'); +export const GimageDescription = T('commands/google:gimageDescription'); +export const GimageExtended = T('commands/google:gimageExtended'); +export const GsearchDescription = T('commands/google:gsearchDescription'); +export const GsearchExtended = T('commands/google:gsearchExtended'); +export const LmgtfyClick = T('commands/google:lmgtfyClick'); +export const LmgtfyDescription = T('commands/google:lmgtfyDescription'); +export const LmgtfyExtended = T('commands/google:lmgtfyExtended'); +export const MessagesErrorInvalidRequest = T('commands/google:errorInvalidRequest'); +export const MessagesErrorOverQueryLimit = T('commands/google:errorOverQueryLimit'); +export const MessagesErrorPermissionDenied = T('commands/google:errorPermissionDenied'); +export const MessagesErrorRequestDenied = T('commands/google:errorRequestDenied'); +export const MessagesErrorUnknown = T('commands/google:errorUnknown'); +export const MessagesErrorZeroResults = T('commands/google:errorZeroResults'); +export const WeatherDescription = T('commands/google:weatherDescription'); +export const WeatherExtended = T('commands/google:weatherExtended'); diff --git a/src/lib/types/namespaces/languages/commands/Management.ts b/src/lib/types/namespaces/languages/commands/Management.ts index 5c2941c6bc5..7165d212df9 100644 --- a/src/lib/types/namespaces/languages/commands/Management.ts +++ b/src/lib/types/namespaces/languages/commands/Management.ts @@ -2,158 +2,160 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; import { Role, User } from 'discord.js'; -export const AttachmentsModeDescription = T('commandAttachmentsModeDescription'); -export const AttachmentsModeExtended = T('commandAttachmentsModeExtended'); -export const ManageCommandAutoDeleteTextChannel = T('commandManageCommandAutoDeleteTextChannel'); -export const ManageCommandAutoDeleteRequiredDuration = T('commandManageCommandAutoDeleteRequiredDuration'); -export const ManageCommandAutoDeleteShowEmpty = T('commandManageCommandAutoDeleteShowEmpty'); -export const ManageCommandAutoDeleteShow = FT<{ codeblock: string }, string>('commandManageCommandAutoDeleteShow'); -export const ManageCommandAutoDeleteAdd = FT<{ channel: string; time: number }, string>('commandManageCommandAutoDeleteAdd'); -export const ManageCommandAutoDeleteRemove = FT<{ channel: string }, string>('commandManageCommandAutoDeleteRemove'); -export const ManageCommandAutoDeleteRemoveNotSet = FT<{ channel: string }, string>('commandManageCommandAutoDeleteRemoveNotset'); -export const ManageCommandAutoDeleteReset = T('commandManageCommandAutoDeleteReset'); -export const ManageCommandChannelTextChannel = T('commandManageCommandChannelTextChannel'); -export const ManageCommandChannelRequiredCommand = T('commandManageCommandChannelRequiredCommand'); -export const ManageCommandChannelShow = FT<{ channel: string; commands: string }, string>('commandManageCommandChannelShow'); -export const ManageCommandChannelShowEmpty = T('commandManageCommandChannelShowEmpty'); -export const ManageCommandChannelAddAlreadySet = T('commandManageCommandChannelAddAlreadyset'); -export const ManageCommandChannelAdd = FT<{ channel: string; command: string }, string>('commandManageCommandChannelAdd'); -export const ManageCommandChannelRemoveNotSet = FT<{ channel: string }, string>('commandManageCommandChannelRemoveNotset'); -export const ManageCommandChannelRemove = FT<{ channel: string; command: string }, string>('commandManageCommandChannelRemove'); -export const ManageCommandChannelResetEmpty = T('commandManageCommandChannelResetEmpty'); -export const ManageCommandChannelReset = FT<{ channel: string }, string>('commandManageCommandChannelReset'); -export const ManageReactionRolesShowEmpty = T('commandManageReactionRolesShowEmpty'); -export const ManageReactionRolesAddPrompt = T('commandManageReactionRolesAddPrompt'); -export const ManageReactionRolesAddChannel = FT<{ emoji: string; channel: string }, string>('commandManageReactionRolesAddChannel'); -export const ManageReactionRolesAddMissing = T('commandManageReactionRolesAddMissing'); -export const ManageReactionRolesAdd = FT<{ emoji: string; url: string }, string>('commandManageReactionRolesAdd'); -export const ManageReactionRolesRemoveNotExists = T('commandManageReactionRolesRemoveNotExists'); -export const ManageReactionRolesRemove = FT<{ emoji: string; url: string }, string>('commandManageReactionRolesRemove'); -export const ManageReactionRolesResetEmpty = T('commandManageReactionRolesResetEmpty'); -export const ManageReactionRolesReset = T('commandManageReactionRolesReset'); -export const SetStarboardEmojiSet = FT<{ emoji: string }, string>('commandSetStarboardEmojiSet'); -export const ManageCommandChannelDescription = T('commandManageCommandChannelDescription'); -export const ManageCommandChannelExtended = T('commandManageCommandChannelExtended'); -export const ManageReactionRolesDescription = T('commandManageReactionRolesDescription'); -export const ManageReactionRolesExtended = T('commandManageReactionRolesExtended'); -export const SetIgnoreChannelsDescription = T('commandSetIgnoreChannelsDescription'); -export const SetIgnoreChannelsExtended = T('commandSetIgnoreChannelsExtended'); -export const SetImageLogsDescription = T('commandSetImageLogsDescription'); -export const SetImageLogsExtended = T('commandSetImageLogsExtended'); -export const SetMemberLogsDescription = T('commandSetMemberLogsDescription'); -export const SetMemberLogsExtended = T('commandSetMemberLogsExtended'); -export const SetMessageLogsDescription = T('commandSetMessageLogsDescription'); -export const SetMessageLogsExtended = T('commandSetMessageLogsExtended'); -export const SetModerationLogsDescription = T('commandSetmodlogsDescription'); -export const SetModerationLogsExtended = T('commandSetmodlogsExtended'); -export const SetprefixDescription = T('commandSetprefixDescription'); -export const SetprefixExtended = T('commandSetprefixExtended'); -export const SetIgnoreChannelsSet = FT<{ channel: string }, string>('commandSetIgnoreChannelsSet'); -export const SetIgnoreChannelsRemoved = FT<{ channel: string }, string>('commandSetIgnoreChannelsRemoved'); -export const SetImageLogsSet = FT<{ channel: string }, string>('commandSetImageLogsSet'); -export const SetMemberLogsSet = FT<{ channel: string }, string>('commandSetMemberLogsSet'); -export const SetMessageLogsSet = FT<{ channel: string }, string>('commandSetMessageLogsSet'); -export const SetModLogsSet = FT<{ channel: string }, string>('commandSetModLogsSet'); -export const SetPrefixSet = FT<{ prefix: string }, string>('commandSetPrefixSet'); -export const SetStarboardEmojiDescription = T('commandSetStarboardEmojiDescription'); -export const SetStarboardEmojiExtended = T('commandSetStarboardEmojiExtended'); -export const CreateMuteDescription = T('commandCreateMuteDescription'); -export const CreateMuteExtended = T('commandCreateMuteExtended'); -export const NickDescription = T('commandNickDescription'); -export const NickExtended = T('commandNickExtended'); -export const PermissionNodesDescription = T('commandPermissionNodesDescription'); -export const PermissionNodesExtended = T('commandPermissionNodesExtended'); -export const TriggersDescription = T('commandTriggersDescription'); -export const TriggersExtended = T('commandTriggersExtended'); -export const ManageCommandAutoDeleteDescription = T('commandManagecommandautodeleteDescription'); -export const ManageCommandAutoDeleteExtended = T('commandManagecommandautodeleteExtended'); -export const SetRoleChannelDescription = T('commandSetrolechannelDescription'); -export const SetRoleChannelExtended = T('commandSetrolechannelExtended'); -export const SetRoleMessageDescription = T('commandSetrolemessageDescription'); -export const SetRoleMessageExtended = T('commandSetrolemessageExtended'); -export const RoleInfoDescription = T('commandRoleInfoDescription'); -export const RoleInfoExtended = T('commandRoleInfoExtended'); -export const GuildInfoDescription = T('commandGuildInfoDescription'); -export const GuildInfoExtended = T('commandGuildInfoExtended'); -export const StickyRolesDescription = T('commandStickyRolesDescription'); -export const StickyRolesExtended = T('commandStickyRolesExtended'); -export const CapitalsModeDescription = T('commandCapitalsModeDescription'); -export const CapitalsModeExtended = T('commandCapitalsModeExtended'); -export const FilterDescription = T('commandFilterDescription'); -export const FilterExtended = T('commandFilterExtended'); -export const FilterModeDescription = T('commandFilterModeDescription'); -export const FilterModeExtended = T('commandFilterModeExtended'); -export const InviteModeDescription = T('commandInviteModeDescription'); -export const InviteModeExtended = T('commandInviteModeExtended'); -export const LinkModeDescription = T('commandLinkModeDescription'); -export const LinkModeExtended = T('commandLinkModeExtended'); -export const MessageModeDescription = T('commandMessageModeDescription'); -export const MessageModeExtended = T('commandMessageModeExtended'); -export const NewlineModeDescription = T('commandNewlineModeDescription'); -export const NewlineModeExtended = T('commandNewlineModeExtended'); -export const ReactionModeDescription = T('commandReactionModeDescription'); -export const ReactionModeExtended = T('commandReactionModeExtended'); -export const GuildInfoTitles = T>('commandGuildInfoTitles'); -export const GuildInfoRoles = FT<{ roles: string }, string>('commandGuildInfoRoles'); -export const GuildInfoNoroles = T('commandGuildInfoNoroles'); -export const GuildInfoChannels = FT<{ text: number; voice: number; categories: number; afkChannelText: string }, string[]>( - 'commandGuildInfoChannels' +export const AttachmentsModeDescription = T('commands/management:attachmentsModeDescription'); +export const AttachmentsModeExtended = T('commands/management:attachmentsModeExtended'); +export const CapitalsModeDescription = T('commands/management:capitalsModeDescription'); +export const CapitalsModeExtended = T('commands/management:capitalsModeExtended'); +export const CreateMuteDescription = T('commands/management:createMuteDescription'); +export const CreateMuteExtended = T('commands/management:createMuteExtended'); +export const FilterAdded = FT<{ word: string }, string>('commands/management:filterAdded'); +export const FilterAlreadyFiltered = T('commands/management:filterAlreadyFiltered'); +export const FilterDescription = T('commands/management:filterDescription'); +export const FilterExtended = T('commands/management:filterExtended'); +export const FilterModeDescription = T('commands/management:filterModeDescription'); +export const FilterModeExtended = T('commands/management:filterModeExtended'); +export const FilterNotFiltered = T('commands/management:filterNotFiltered'); +export const FilterRemoved = FT<{ word: string }, string>('commands/management:filterRemoved'); +export const FilterReset = T('commands/management:filterReset'); +export const FilterShow = FT<{ words: string }, string>('commands/management:filterShow'); +export const FilterShowEmpty = T('commands/management:filterShowEmpty'); +export const FilterUndefinedWord = T('commands/management:filterUndefinedWord'); +export const GuildInfoChannels = FT<{ text: number; voice: number; categories: number; afkChannelText: string }, string>( + 'commands/management:guildInfoChannels' ); -export const GuildInfoChannelsAfkChannelText = FT<{ afkChannel: string; afkTime: number }, string>('commandGuildInfoChannelsAfkChannelText'); -export const GuildInfoMembers = FT<{ count: string; owner: User }, string[]>('commandGuildInfoMembers'); +export const GuildInfoChannelsAfkChannelText = FT<{ afkChannel: string; afkTime: number }, string>( + 'commands/management:guildInfoChannelsAfkChannelText' +); +export const GuildInfoDescription = T('commands/management:guildInfoDescription'); +export const GuildInfoExtended = T('commands/management:guildInfoExtended'); +export const GuildInfoMembers = FT<{ memberCount: number; owner: User }, string>('commands/management:guildInfoMembers'); +export const GuildInfoNoroles = T('commands/management:guildInfoNoroles'); export const GuildInfoOther = FT< { size: number; region: string; createdAt: number; verificationLevel: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH' }, - string[] ->('commandGuildInfoOther'); -export const RoleInfoTitles = T>('commandRoleInfoTitles'); -export const RoleInfoData = FT<{ role: Role; hoisted: string; mentionable: string }, string[]>('commandRoleInfoData'); -export const RoleInfoAll = T('commandRoleInfoAll'); -export const RoleInfoNoPermissions = T('commandRoleInfoNoPermissions'); -export const FilterUndefinedWord = T('commandFilterUndefinedWord'); -export const FilterAlreadyFiltered = T('commandFilterAlreadyFiltered'); -export const FilterNotFiltered = T('commandFilterNotFiltered'); -export const FilterAdded = FT<{ word: string }, string>('commandFilterAdded'); -export const FilterRemoved = FT<{ word: string }, string>('commandFilterRemoved'); -export const FilterReset = T('commandFilterReset'); -export const FilterShowEmpty = T('commandFilterShowEmpty'); -export const FilterShow = FT<{ words: string }, string>('commandFilterShow'); -export const StickyRolesRequiredUser = T('commandStickyRolesRequiredUser'); -export const StickyRolesRequiredRole = T('commandStickyRolesRequiredRole'); -export const StickyRolesNotExists = FT<{ user: string }, string>('commandStickyRolesNotExists'); -export const StickyRolesReset = FT<{ user: string }, string>('commandStickyRolesReset'); -export const StickyRolesRemove = FT<{ user: string }, string>('commandStickyRolesRemove'); -export const StickyRolesAddExists = FT<{ user: string }, string>('commandStickyRolesAddExists'); -export const StickyRolesAdd = FT<{ user: string }, string>('commandStickyRolesAdd'); -export const StickyRolesShowEmpty = T('commandStickyRolesShowEmpty'); -export const StickyRolesShowSingle = FT<{ user: string; roles: string }, string>('commandStickyRolesShowSingle'); -export const NickSet = FT<{ nickname: string }, string>('commandNickSet'); -export const NickCleared = T('commandNickCleared'); -export const PermissionNodesHigher = T('commandPermissionNodesHigher'); -export const PermissionNodesInvalidType = T('commandPermissionNodesInvalidType'); -export const PermissionNodesAdd = T('commandPermissionNodesAdd'); -export const PermissionNodesNodeNotExists = T('commandPermissionNodesNodeNotExists'); -export const PermissionNodesCommandNotExists = T('commandPermissionNodesCommandNotExists'); -export const PermissionNodesRemove = T('commandPermissionNodesRemove'); -export const PermissionNodesReset = T('commandPermissionNodesReset'); -export const PermissionNodesShowName = FT<{ name: string }, string>('commandPermissionNodesShowName'); -export const PermissionNodesShowAllow = FT<{ allow: string }, string>('commandPermissionNodesShowAllow'); -export const PermissionNodesShowDeny = FT<{ deny: string }, string>('commandPermissionNodesShowDeny'); -export const RolesDescription = T('commandRolesDescription'); -export const RolesExtended = T('commandRolesExtended'); -export const RolesListEmpty = T('commandRolesListEmpty'); -export const RolesAbort = FT<{ prefix: string }, string>('commandRolesAbort'); -export const RolesListTitle = T('commandRolesListTitle'); -export const RolesAdded = FT<{ roles: string }, string>('commandRolesAdded'); -export const RolesRemoved = FT<{ roles: string }, string>('commandRolesRemoved'); -export const RolesNotPublic = FT<{ roles: string }, string>('commandRolesNotPublic'); -export const RolesNotManageable = FT<{ roles: string }, string>('commandRolesNotManageable'); -export const RolesAuditLog = T('commandRolesAuditlog'); -export const TriggersNoType = T('commandTriggersNotype'); -export const TriggersNoOutput = T('commandTriggersNooutput'); -export const TriggersInvalidReaction = T('commandTriggersInvalidreaction'); -export const TriggersInvalidAlias = T('commandTriggersInvalidalias'); -export const TriggersRemoveNotTaken = T('commandTriggersRemoveNottaken'); -export const TriggersRemove = T('commandTriggersRemove'); -export const TriggersAddTaken = T('commandTriggersAddTaken'); -export const TriggersAdd = T('commandTriggersAdd'); -export const TriggersListEmpty = T('commandTriggersListEmpty'); + string +>('commands/management:guildInfoOther'); +export const GuildInfoRoles = FT<{ roles: string }, string>('commands/management:guildInfoRoles'); +export const GuildInfoTitles = T>('commands/management:guildInfoTitles'); +export const InviteModeDescription = T('commands/management:inviteModeDescription'); +export const InviteModeExtended = T('commands/management:inviteModeExtended'); +export const LinkModeDescription = T('commands/management:linkModeDescription'); +export const LinkModeExtended = T('commands/management:linkModeExtended'); +export const ManageCommandAutoDeleteAdd = FT<{ channel: string; time: number }, string>('commands/management:manageCommandAutoDeleteAdd'); +export const ManageCommandAutoDeleteDescription = T('commands/management:managecommandautodeleteDescription'); +export const ManageCommandAutoDeleteExtended = T('commands/management:managecommandautodeleteExtended'); +export const ManageCommandAutoDeleteRemove = FT<{ channel: string }, string>('commands/management:manageCommandAutoDeleteRemove'); +export const ManageCommandAutoDeleteRemoveNotSet = FT<{ channel: string }, string>('commands/management:manageCommandAutoDeleteRemoveNotset'); +export const ManageCommandAutoDeleteRequiredDuration = T('commands/management:manageCommandAutoDeleteRequiredDuration'); +export const ManageCommandAutoDeleteReset = T('commands/management:manageCommandAutoDeleteReset'); +export const ManageCommandAutoDeleteShow = FT<{ codeblock: string }, string>('commands/management:manageCommandAutoDeleteShow'); +export const ManageCommandAutoDeleteShowEmpty = T('commands/management:manageCommandAutoDeleteShowEmpty'); +export const ManageCommandAutoDeleteTextChannel = T('commands/management:manageCommandAutoDeleteTextChannel'); +export const ManageCommandChannelAdd = FT<{ channel: string; command: string }, string>('commands/management:manageCommandChannelAdd'); +export const ManageCommandChannelAddAlreadySet = T('commands/management:manageCommandChannelAddAlreadyset'); +export const ManageCommandChannelDescription = T('commands/management:manageCommandChannelDescription'); +export const ManageCommandChannelExtended = T('commands/management:manageCommandChannelExtended'); +export const ManageCommandChannelRemove = FT<{ channel: string; command: string }, string>('commands/management:manageCommandChannelRemove'); +export const ManageCommandChannelRemoveNotSet = FT<{ channel: string }, string>('commands/management:manageCommandChannelRemoveNotset'); +export const ManageCommandChannelRequiredCommand = T('commands/management:manageCommandChannelRequiredCommand'); +export const ManageCommandChannelReset = FT<{ channel: string }, string>('commands/management:manageCommandChannelReset'); +export const ManageCommandChannelResetEmpty = T('commands/management:manageCommandChannelResetEmpty'); +export const ManageCommandChannelShow = FT<{ channel: string; commands: string }, string>('commands/management:manageCommandChannelShow'); +export const ManageCommandChannelShowEmpty = T('commands/management:manageCommandChannelShowEmpty'); +export const ManageCommandChannelTextChannel = T('commands/management:manageCommandChannelTextChannel'); +export const ManageReactionRolesAdd = FT<{ emoji: string; url: string }, string>('commands/management:manageReactionRolesAdd'); +export const ManageReactionRolesAddChannel = FT<{ emoji: string; channel: string }, string>('commands/management:manageReactionRolesAddChannel'); +export const ManageReactionRolesAddMissing = T('commands/management:manageReactionRolesAddMissing'); +export const ManageReactionRolesAddPrompt = T('commands/management:manageReactionRolesAddPrompt'); +export const ManageReactionRolesDescription = T('commands/management:manageReactionRolesDescription'); +export const ManageReactionRolesExtended = T('commands/management:manageReactionRolesExtended'); +export const ManageReactionRolesRemove = FT<{ emoji: string; url: string }, string>('commands/management:manageReactionRolesRemove'); +export const ManageReactionRolesRemoveNotExists = T('commands/management:manageReactionRolesRemoveNotExists'); +export const ManageReactionRolesReset = T('commands/management:manageReactionRolesReset'); +export const ManageReactionRolesResetEmpty = T('commands/management:manageReactionRolesResetEmpty'); +export const ManageReactionRolesShowEmpty = T('commands/management:manageReactionRolesShowEmpty'); +export const MessageModeDescription = T('commands/management:messageModeDescription'); +export const MessageModeExtended = T('commands/management:messageModeExtended'); +export const NewlineModeDescription = T('commands/management:newlineModeDescription'); +export const NewlineModeExtended = T('commands/management:newlineModeExtended'); +export const NickCleared = T('commands/management:nickCleared'); +export const NickDescription = T('commands/management:nickDescription'); +export const NickExtended = T('commands/management:nickExtended'); +export const NickSet = FT<{ nickname: string }, string>('commands/management:nickSet'); +export const PermissionNodesAdd = T('commands/management:permissionNodesAdd'); +export const PermissionNodesCommandNotExists = T('commands/management:permissionNodesCommandNotExists'); +export const PermissionNodesDescription = T('commands/management:permissionNodesDescription'); +export const PermissionNodesExtended = T('commands/management:permissionNodesExtended'); +export const PermissionNodesHigher = T('commands/management:permissionNodesHigher'); +export const PermissionNodesInvalidType = T('commands/management:permissionNodesInvalidType'); +export const PermissionNodesNodeNotExists = T('commands/management:permissionNodesNodeNotExists'); +export const PermissionNodesRemove = T('commands/management:permissionNodesRemove'); +export const PermissionNodesReset = T('commands/management:permissionNodesReset'); +export const PermissionNodesShowAllow = FT<{ allow: string }, string>('commands/management:permissionNodesShowAllow'); +export const PermissionNodesShowDeny = FT<{ deny: string[] }, string>('commands/management:permissionNodesShowDeny'); +export const PermissionNodesShowName = FT<{ name: string }, string>('commands/management:permissionNodesShowName'); +export const ReactionModeDescription = T('commands/management:reactionModeDescription'); +export const ReactionModeExtended = T('commands/management:reactionModeExtended'); +export const RoleInfoAll = T('commands/management:roleInfoAll'); +export const RoleInfoData = FT<{ role: Role; hoisted: string; mentionable: string }, string>('commands/management:roleInfoData'); +export const RoleInfoDescription = T('commands/management:roleInfoDescription'); +export const RoleInfoExtended = T('commands/management:roleInfoExtended'); +export const RoleInfoNoPermissions = T('commands/management:roleInfoNoPermissions'); +export const RoleInfoTitles = T>('commands/management:roleInfoTitles'); +export const RolesAbort = FT<{ prefix: string }, string>('commands/management:rolesAbort'); +export const RolesAdded = FT<{ roles: string }, string>('commands/management:rolesAdded'); +export const RolesAuditLog = T('commands/management:rolesAuditlog'); +export const RolesDescription = T('commands/management:rolesDescription'); +export const RolesExtended = T('commands/management:rolesExtended'); +export const RolesListEmpty = T('commands/management:rolesListEmpty'); +export const RolesListTitle = T('commands/management:rolesListTitle'); +export const RolesNotManageable = FT<{ roles: string }, string>('commands/management:rolesNotManageable'); +export const RolesNotPublic = FT<{ roles: string }, string>('commands/management:rolesNotPublic'); +export const RolesRemoved = FT<{ roles: string }, string>('commands/management:rolesRemoved'); +export const SetIgnoreChannelsDescription = T('commands/management:setIgnoreChannelsDescription'); +export const SetIgnoreChannelsExtended = T('commands/management:setIgnoreChannelsExtended'); +export const SetIgnoreChannelsRemoved = FT<{ channel: string }, string>('commands/management:setIgnoreChannelsRemoved'); +export const SetIgnoreChannelsSet = FT<{ channel: string }, string>('commands/management:setIgnoreChannelsSet'); +export const SetImageLogsDescription = T('commands/management:setImageLogsDescription'); +export const SetImageLogsExtended = T('commands/management:setImageLogsExtended'); +export const SetImageLogsSet = FT<{ channel: string }, string>('commands/management:setImageLogsSet'); +export const SetMemberLogsDescription = T('commands/management:setMemberLogsDescription'); +export const SetMemberLogsExtended = T('commands/management:setMemberLogsExtended'); +export const SetMemberLogsSet = FT<{ channel: string }, string>('commands/management:setMemberLogsSet'); +export const SetMessageLogsDescription = T('commands/management:setMessageLogsDescription'); +export const SetMessageLogsExtended = T('commands/management:setMessageLogsExtended'); +export const SetMessageLogsSet = FT<{ channel: string }, string>('commands/management:setMessageLogsSet'); +export const SetModerationLogsDescription = T('commands/management:setmodlogsDescription'); +export const SetModerationLogsExtended = T('commands/management:setmodlogsExtended'); +export const SetModerationLogsSet = FT<{ channel: string }, string>('commands/management:setModLogsSet'); +export const SetPrefixDescription = T('commands/management:setprefixDescription'); +export const SetPrefixExtended = T('commands/management:setprefixExtended'); +export const SetPrefixSet = FT<{ prefix: string }, string>('commands/management:setPrefixSet'); +export const SetRoleChannelDescription = T('commands/management:setrolechannelDescription'); +export const SetRoleChannelExtended = T('commands/management:setrolechannelExtended'); +export const SetRoleMessageDescription = T('commands/management:setrolemessageDescription'); +export const SetRoleMessageExtended = T('commands/management:setrolemessageExtended'); +export const SetStarboardEmojiDescription = T('commands/management:setStarboardEmojiDescription'); +export const SetStarboardEmojiExtended = T('commands/management:setStarboardEmojiExtended'); +export const SetStarboardEmojiSet = FT<{ emoji: string }, string>('commands/management:setStarboardEmojiSet'); +export const StickyRolesAdd = FT<{ user: string }, string>('commands/management:stickyRolesAdd'); +export const StickyRolesAddExists = FT<{ user: string }, string>('commands/management:stickyRolesAddExists'); +export const StickyRolesDescription = T('commands/management:stickyRolesDescription'); +export const StickyRolesExtended = T('commands/management:stickyRolesExtended'); +export const StickyRolesNotExists = FT<{ user: string }, string>('commands/management:stickyRolesNotExists'); +export const StickyRolesRemove = FT<{ user: string }, string>('commands/management:stickyRolesRemove'); +export const StickyRolesRequiredRole = T('commands/management:stickyRolesRequiredRole'); +export const StickyRolesRequiredUser = T('commands/management:stickyRolesRequiredUser'); +export const StickyRolesReset = FT<{ user: string }, string>('commands/management:stickyRolesReset'); +export const StickyRolesShowEmpty = T('commands/management:stickyRolesShowEmpty'); +export const StickyRolesShowSingle = FT<{ user: string; roles: string }, string>('commands/management:stickyRolesShowSingle'); +export const TriggersAdd = T('commands/management:triggersAdd'); +export const TriggersAddTaken = T('commands/management:triggersAddTaken'); +export const TriggersDescription = T('commands/management:triggersDescription'); +export const TriggersExtended = T('commands/management:triggersExtended'); +export const TriggersInvalidAlias = T('commands/management:triggersInvalidalias'); +export const TriggersInvalidReaction = T('commands/management:triggersInvalidreaction'); +export const TriggersListEmpty = T('commands/management:triggersListEmpty'); +export const TriggersNoOutput = T('commands/management:triggersNooutput'); +export const TriggersNoType = T('commands/management:triggersNotype'); +export const TriggersRemove = T('commands/management:triggersRemove'); +export const TriggersRemoveNotTaken = T('commands/management:triggersRemoveNottaken'); diff --git a/src/lib/types/namespaces/languages/commands/Misc.ts b/src/lib/types/namespaces/languages/commands/Misc.ts index 836e31c3932..33dfb3eab50 100644 --- a/src/lib/types/namespaces/languages/commands/Misc.ts +++ b/src/lib/types/namespaces/languages/commands/Misc.ts @@ -1,50 +1,44 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const ChaseDescription = T('commandChaseDescription'); -export const ChaseExtended = T('commandChaseExtended'); -export const CuddleDescription = T('commandCuddleDescription'); -export const CuddleExtended = T('commandCuddleExtended'); -export const DeletthisDescription = T('commandDeletthisDescription'); -export const DeletthisExtended = T('commandDeletthisExtended'); -export const FDescription = T('commandFDescription'); -export const FExtended = T('commandFExtended'); -export const GoodnightDescription = T('commandGoodnightDescription'); -export const GoodnightExtended = T('commandGoodnightExtended'); -export const GoofytimeDescription = T('commandGoofytimeDescription'); -export const GoofytimeExtended = T('commandGoofytimeExtended'); -export const HugDescription = T('commandHugDescription'); -export const HugExtended = T('commandHugExtended'); -export const IneedhealingDescription = T('commandIneedhealingDescription'); -export const IneedhealingExtended = T('commandIneedhealingExtended'); -export const RandRedditDescription = T('commandRandRedditDescription'); -export const RandRedditExtended = T('commandRandRedditExtended'); -export const SlapDescription = T('commandSlapDescription'); -export const SlapExtended = T('commandSlapExtended'); -export const SnipeDescription = T('commandSnipeDescription'); -export const SnipeExtended = T('commandSnipeExtended'); -export const ThesearchDescription = T('commandThesearchDescription'); -export const ThesearchExtended = T('commandThesearchExtended'); -export const TriggeredDescription = T('commandTriggeredDescription'); -export const TriggeredExtended = T('commandTriggeredExtended'); -export const UpvoteDescription = T('commandUpvoteDescription'); -export const UpvoteExtended = T('commandUpvoteExtended'); -export const RandRedditRequiredReddit = T('commandRandRedditRequiredReddit'); -export const RandRedditInvalidArgument = T('commandRandRedditInvalidArgument'); -export const RandRedditBanned = T('commandRandRedditBanned'); -export const RandRedditFail = T('commandRandRedditFail'); -export const RandRedditAllNsfw = T('commandRandRedditAllNsfw'); -export const RandRedditAllNsfl = T('commandRandRedditAllNsfl'); -export const RandRedditMessage = FT<{ title: string; author: string; url: string }, string>('commandRandRedditMessage'); -export const RandRedditErrorPrivate = T('commandRandRedditErrorPrivate'); -export const RandRedditErrorQuarantined = T('commandRandRedditErrorQuarantined'); -export const RandRedditErrorNotFound = T('commandRandRedditErrorNotFound'); -export const RandRedditErrorBanned = T('commandRandRedditErrorBanned'); -export const RedditUserDescription = T('commandRedditUserDescription'); -export const RedditUserExtended = T('commandRedditUserExtended'); -export const RedditUserComplexityLevels = T('commandRedditUserComplexityLevels'); -export const RedditUserInvalidUser = FT<{ user: string }, string>('commandRedditUserInvalidUser'); -export const RedditUserQueryFailed = T('commandRedditUserQueryFailed'); +export const ChaseDescription = T('commands/misc:chaseDescription'); +export const ChaseExtended = T('commands/misc:chaseExtended'); +export const CuddleDescription = T('commands/misc:cuddleDescription'); +export const CuddleExtended = T('commands/misc:cuddleExtended'); +export const DeletThisDescription = T('commands/misc:deletthisDescription'); +export const DeletThisExtended = T('commands/misc:deletthisExtended'); +export const FDescription = T('commands/misc:fDescription'); +export const FExtended = T('commands/misc:fExtended'); +export const GoodNightDescription = T('commands/misc:goodnightDescription'); +export const GoodNightExtended = T('commands/misc:goodnightExtended'); +export const GoofyTimeDescription = T('commands/misc:goofytimeDescription'); +export const GoofyTimeExtended = T('commands/misc:goofytimeExtended'); +export const HugDescription = T('commands/misc:hugDescription'); +export const HugExtended = T('commands/misc:hugExtended'); +export const INeedHealingDescription = T('commands/misc:ineedhealingDescription'); +export const INeedHealingExtended = T('commands/misc:ineedhealingExtended'); +export const RandRedditAllNsfl = T('commands/misc:randRedditAllNsfl'); +export const RandRedditAllNsfw = T('commands/misc:randRedditAllNsfw'); +export const RandRedditBanned = T('commands/misc:randRedditBanned'); +export const RandRedditDescription = T('commands/misc:randRedditDescription'); +export const RandRedditErrorBanned = T('commands/misc:randRedditErrorBanned'); +export const RandRedditErrorNotFound = T('commands/misc:randRedditErrorNotFound'); +export const RandRedditErrorPrivate = T('commands/misc:randRedditErrorPrivate'); +export const RandRedditErrorQuarantined = T('commands/misc:randRedditErrorQuarantined'); +export const RandRedditExtended = T('commands/misc:randRedditExtended'); +export const RandRedditFail = T('commands/misc:randRedditFail'); +export const RandRedditInvalidArgument = T('commands/misc:randRedditInvalidArgument'); +export const RandRedditMessage = FT<{ title: string; author: string; url: string }, string>('commands/misc:randRedditMessage'); +export const RandRedditRequiredReddit = T('commands/misc:randRedditRequiredReddit'); +export const RedditUserComplexityLevels = T('commands/misc:redditUserComplexityLevels'); +export const RedditUserData = FT< + { user: string; timestamp: number }, + { overviewFor: string; permalink: string; dataAvailableFor: string; joinedReddit: string } +>('commands/misc:redditUserData'); +export const RedditUserDescription = T('commands/misc:redditUserDescription'); +export const RedditUserExtended = T('commands/misc:redditUserExtended'); +export const RedditUserInvalidUser = FT<{ user: string }, string>('commands/misc:redditUserInvalidUser'); +export const RedditUserQueryFailed = T('commands/misc:redditUserQueryFailed'); export const RedditUserTitles = T<{ linkKarma: string; commentKarma: string; @@ -57,35 +51,25 @@ export const RedditUserTitles = T<{ byComments: string; bestComment: string; worstComment: string; -}>('commandRedditUserTitles'); -export const RedditUserData = FT< - { - user: string; - timestamp: string; - }, - { - overviewFor: string; - permalink: string; - dataAvailableFor: string; - joinedReddit: string; - } ->('commandRedditUserData'); -export const ShipDescription = T('commandShipDescription'); -export const ShipExtended = T('commandShipExtended'); -export const ShipData = FT< - { - romeoUsername: string; - julietUsername: string; - shipName: string; - }, - { - title: string; - description: string; - } ->('commandShipData'); -export const SnipeEmpty = T('commandSnipeEmpty'); -export const SnipeTitle = T('commandSnipeTitle'); -export const UpvoteMessage = T('commandUpvoteMessage'); -export const VaporwaveDescription = T('commandVaporwaveDescription'); -export const VaporwaveExtended = T('commandVaporwaveExtended'); -export const VaporwaveOutput = FT<{ str: string }, string>('commandVaporwaveOutput'); +}>('commands/misc:redditUserTitles'); +export const ShipData = FT<{ romeoUsername: string; julietUsername: string; shipName: string }, { title: string; description: string }>( + 'commands/misc:shipData' +); +export const ShipDescription = T('commands/misc:shipDescription'); +export const ShipExtended = T('commands/misc:shipExtended'); +export const SlapDescription = T('commands/misc:slapDescription'); +export const SlapExtended = T('commands/misc:slapExtended'); +export const SnipeDescription = T('commands/misc:snipeDescription'); +export const SnipeEmpty = T('commands/misc:snipeEmpty'); +export const SnipeExtended = T('commands/misc:snipeExtended'); +export const SnipeTitle = T('commands/misc:snipeTitle'); +export const TheSearchDescription = T('commands/misc:thesearchDescription'); +export const TheSearchExtended = T('commands/misc:thesearchExtended'); +export const TriggeredDescription = T('commands/misc:triggeredDescription'); +export const TriggeredExtended = T('commands/misc:triggeredExtended'); +export const UpvoteDescription = T('commands/misc:upvoteDescription'); +export const UpvoteExtended = T('commands/misc:upvoteExtended'); +export const UpvoteMessage = T('commands/misc:upvoteMessage'); +export const VaporwaveDescription = T('commands/misc:vaporwaveDescription'); +export const VaporwaveExtended = T('commands/misc:vaporwaveExtended'); +export const VaporwaveOutput = FT<{ str: string }, string>('commands/misc:vaporwaveOutput'); diff --git a/src/lib/types/namespaces/languages/commands/Moderation.ts b/src/lib/types/namespaces/languages/commands/Moderation.ts index f30ac857b38..2731e9216c6 100644 --- a/src/lib/types/namespaces/languages/commands/Moderation.ts +++ b/src/lib/types/namespaces/languages/commands/Moderation.ts @@ -19,8 +19,8 @@ export interface ModerationAction { removeRole: string; } -export const HistoryDescription = T('commandHistoryDescription'); -export const HistoryExtended = T('commandHistoryExtended'); +export const HistoryDescription = T('commands/moderation:historyDescription'); +export const HistoryExtended = T('commands/moderation:historyExtended'); export const HistoryFooterNew = FT< { warnings: number; @@ -33,89 +33,84 @@ export const HistoryFooterNew = FT< bansText: string; }, string ->('commandHistoryFooterNew'); -export const HistoryFooterWarning = FT<{ count: number }, string>('commandHistoryFooterWarning'); -export const HistoryFooterWarningPlural = FT<{ count: number }, string>('commandHistoryFooterWarningPlural'); -export const HistoryFooterMutes = FT<{ count: number }, string>('commandHistoryFooterMutes'); -export const HistoryFooterMutesPlural = FT<{ count: number }, string>('commandHistoryFooterMutesPlural'); -export const HistoryFooterKicks = FT<{ count: number }, string>('commandHistoryFooterKicks'); -export const HistoryFooterKicksPlural = FT<{ count: number }, string>('commandHistoryFooterKicksPlural'); -export const HistoryFooterBans = FT<{ count: number }, string>('commandHistoryFooterBans'); -export const HistoryFooterBansPlural = FT<{ count: number }, string>('commandHistoryFooterBansPlural'); -export const ModerationsDescription = T('commandModerationsDescription'); -export const ModerationsExtended = T('commandModerationsExtended'); -export const ModerationsEmpty = T('commandModerationsEmpty'); -export const ModerationsAmount = FT<{ count: number }, string>('commandModerationsAmount'); -export const ModerationsAmountPlural = FT<{ count: number }, string>('commandModerationsAmountPlural'); -export const MutesDescription = T('commandMutesDescription'); -export const MutesExtended = T('commandMutesExtended'); -export const WarningsDescription = T('commandWarningsDescription'); -export const WarningsExtended = T('commandWarningsExtended'); -export const MuteDescription = T('commandMuteDescription'); -export const MuteExtended = T('commandMuteExtended'); -export const PruneDescription = T('commandPruneDescription'); -export const PruneExtended = T('commandPruneExtended'); -export const CaseDescription = T('commandCaseDescription'); -export const CaseExtended = T('commandCaseExtended'); -export const PermissionsDescription = T('commandPermissionsDescription'); -export const PermissionsExtended = T('commandPermissionsExtended'); -export const FlowDescription = T('commandFlowDescription'); -export const FlowExtended = T('commandFlowExtended'); -export const ReasonDescription = T('commandReasonDescription'); -export const ReasonExtended = T('commandReasonExtended'); -export const RestrictAttachmentDescription = T('commandRestrictAttachmentDescription'); -export const RestrictAttachmentExtended = T('commandRestrictAttachmentExtended'); -export const RestrictEmbedDescription = T('commandRestrictEmbedDescription'); -export const RestrictEmbedExtended = T('commandRestrictEmbedExtended'); -export const RestrictEmojiDescription = T('commandRestrictEmojiDescription'); -export const RestrictEmojiExtended = T('commandRestrictEmojiExtended'); -export const RestrictReactionDescription = T('commandRestrictReactionDescription'); -export const RestrictReactionExtended = T('commandRestrictReactionExtended'); -export const RestrictVoiceDescription = T('commandRestrictVoiceDescription'); -export const RestrictVoiceExtended = T('commandRestrictVoiceExtended'); -export const SoftBanDescription = T('commandSoftBanDescription'); -export const SoftBanExtended = T('commandSoftBanExtended'); -export const ToggleModerationDmDescription = T('commandToggleModerationDmDescription'); -export const ToggleModerationDmExtended = T('commandToggleModerationDmExtended'); -export const UnbanDescription = T('commandUnbanDescription'); -export const UnbanExtended = T('commandUnbanExtended'); -export const UnmuteDescription = T('commandUnmuteDescription'); -export const UnmuteExtended = T('commandUnmuteExtended'); -export const UnrestrictAttachmentDescription = T('commandUnrestrictAttachmentDescription'); -export const UnrestrictAttachmentExtended = T('commandUnrestrictAttachmentExtended'); -export const UnrestrictEmbedDescription = T('commandUnrestrictEmbedDescription'); -export const UnrestrictEmbedExtended = T('commandUnrestrictEmbedExtended'); -export const UnrestrictEmojiDescription = T('commandUnrestrictEmojiDescription'); -export const UnrestrictEmojiExtended = T('commandUnrestrictEmojiExtended'); -export const UnrestrictReactionDescription = T('commandUnrestrictReactionDescription'); -export const UnrestrictReactionExtended = T('commandUnrestrictReactionExtended'); -export const UnrestrictVoiceDescription = T('commandUnrestrictVoiceDescription'); -export const UnrestrictVoiceExtended = T('commandUnrestrictVoiceExtended'); -export const UnwarnDescription = T('commandUnwarnDescription'); -export const UnwarnExtended = T('commandUnwarnExtended'); -export const VmuteDescription = T('commandVmuteDescription'); -export const VmuteExtended = T('commandVmuteExtended'); -export const VoiceKickDescription = T('commandVoiceKickDescription'); -export const VoiceKickExtended = T('commandVoiceKickExtended'); -export const VunmuteDescription = T('commandVunmuteDescription'); -export const VunmuteExtended = T('commandVunmuteExtended'); -export const WarnDescription = T('commandWarnDescription'); -export const WarnExtended = T('commandWarnExtended'); -export const Flow = FT<{ amount: number }, string>('commandFlow'); -export const TimeTimed = T('commandTimeTimed'); -export const TimeUndefinedTime = T('commandTimeUndefinedTime'); -export const TimeUnsupportedType = T('commandTimeUnsupportedType'); -export const TimeNotScheduled = T('commandTimeNotScheduled'); -export const TimeAborted = FT<{ title: string }, string>('commandTimeAborted'); -export const TimeScheduled = FT<{ title: string; user: User; time: number }, string>('commandTimeScheduled'); -export const SlowmodeSet = FT<{ cooldown: number }, string>('commandSlowmodeSet'); -export const SlowmodeReset = T('commandSlowmodeReset'); -export const SlowmodeTooLong = T('commandSlowmodeTooLong'); -export const TimeDescription = T('commandTimeDescription'); -export const TimeExtended = T('commandTimeExtended'); -export const BanNotBannable = T('commandBanNotBannable'); -export const DehoistStarting = FT<{ count: number }, string>('commandDehoistStarting'); -export const DehoistProgress = FT<{ count: number; percentage: number }, string>('commandDehoistProgress'); +>('commands/moderation:historyFooterNew'); +export const HistoryFooterWarning = FT<{ count: number }, string>('commands/moderation:historyFooterWarning'); +export const HistoryFooterMutes = FT<{ count: number }, string>('commands/moderation:historyFooterMutes'); +export const HistoryFooterKicks = FT<{ count: number }, string>('commands/moderation:historyFooterKicks'); +export const HistoryFooterBans = FT<{ count: number }, string>('commands/moderation:historyFooterBans'); +export const ModerationsDescription = T('commands/moderation:moderationsDescription'); +export const ModerationsExtended = T('commands/moderation:moderationsExtended'); +export const ModerationsEmpty = T('commands/moderation:moderationsEmpty'); +export const ModerationsAmount = FT<{ count: number }, string>('commands/moderation:moderationsAmount'); +export const MutesDescription = T('commands/moderation:mutesDescription'); +export const MutesExtended = T('commands/moderation:mutesExtended'); +export const WarningsDescription = T('commands/moderation:warningsDescription'); +export const WarningsExtended = T('commands/moderation:warningsExtended'); +export const MuteDescription = T('commands/moderation:muteDescription'); +export const MuteExtended = T('commands/moderation:muteExtended'); +export const PruneDescription = T('commands/moderation:pruneDescription'); +export const PruneExtended = T('commands/moderation:pruneExtended'); +export const CaseDescription = T('commands/moderation:caseDescription'); +export const CaseExtended = T('commands/moderation:caseExtended'); +export const PermissionsDescription = T('commands/moderation:permissionsDescription'); +export const PermissionsExtended = T('commands/moderation:permissionsExtended'); +export const FlowDescription = T('commands/moderation:flowDescription'); +export const FlowExtended = T('commands/moderation:flowExtended'); +export const ReasonDescription = T('commands/moderation:reasonDescription'); +export const ReasonExtended = T('commands/moderation:reasonExtended'); +export const RestrictAttachmentDescription = T('commands/moderation:restrictAttachmentDescription'); +export const RestrictAttachmentExtended = T('commands/moderation:restrictAttachmentExtended'); +export const RestrictEmbedDescription = T('commands/moderation:restrictEmbedDescription'); +export const RestrictEmbedExtended = T('commands/moderation:restrictEmbedExtended'); +export const RestrictEmojiDescription = T('commands/moderation:restrictEmojiDescription'); +export const RestrictEmojiExtended = T('commands/moderation:restrictEmojiExtended'); +export const RestrictReactionDescription = T('commands/moderation:restrictReactionDescription'); +export const RestrictReactionExtended = T('commands/moderation:restrictReactionExtended'); +export const RestrictVoiceDescription = T('commands/moderation:restrictVoiceDescription'); +export const RestrictVoiceExtended = T('commands/moderation:restrictVoiceExtended'); +export const SoftBanDescription = T('commands/moderation:softBanDescription'); +export const SoftBanExtended = T('commands/moderation:softBanExtended'); +export const ToggleModerationDmDescription = T('commands/moderation:toggleModerationDmDescription'); +export const ToggleModerationDmExtended = T('commands/moderation:toggleModerationDmExtended'); +export const UnbanDescription = T('commands/moderation:unbanDescription'); +export const UnbanExtended = T('commands/moderation:unbanExtended'); +export const UnmuteDescription = T('commands/moderation:unmuteDescription'); +export const UnmuteExtended = T('commands/moderation:unmuteExtended'); +export const UnrestrictAttachmentDescription = T('commands/moderation:unrestrictAttachmentDescription'); +export const UnrestrictAttachmentExtended = T('commands/moderation:unrestrictAttachmentExtended'); +export const UnrestrictEmbedDescription = T('commands/moderation:unrestrictEmbedDescription'); +export const UnrestrictEmbedExtended = T('commands/moderation:unrestrictEmbedExtended'); +export const UnrestrictEmojiDescription = T('commands/moderation:unrestrictEmojiDescription'); +export const UnrestrictEmojiExtended = T('commands/moderation:unrestrictEmojiExtended'); +export const UnrestrictReactionDescription = T('commands/moderation:unrestrictReactionDescription'); +export const UnrestrictReactionExtended = T('commands/moderation:unrestrictReactionExtended'); +export const UnrestrictVoiceDescription = T('commands/moderation:unrestrictVoiceDescription'); +export const UnrestrictVoiceExtended = T('commands/moderation:unrestrictVoiceExtended'); +export const UnwarnDescription = T('commands/moderation:unwarnDescription'); +export const UnwarnExtended = T('commands/moderation:unwarnExtended'); +export const VmuteDescription = T('commands/moderation:vmuteDescription'); +export const VmuteExtended = T('commands/moderation:vmuteExtended'); +export const VoiceKickDescription = T('commands/moderation:voiceKickDescription'); +export const VoiceKickExtended = T('commands/moderation:voiceKickExtended'); +export const VunmuteDescription = T('commands/moderation:vunmuteDescription'); +export const VunmuteExtended = T('commands/moderation:vunmuteExtended'); +export const WarnDescription = T('commands/moderation:warnDescription'); +export const WarnExtended = T('commands/moderation:warnExtended'); +export const Flow = FT<{ amount: number }, string>('commands/moderation:flow'); +export const TimeTimed = T('commands/moderation:timeTimed'); +export const TimeUndefinedTime = T('commands/moderation:timeUndefinedTime'); +export const TimeUnsupportedType = T('commands/moderation:timeUnsupportedType'); +export const TimeNotScheduled = T('commands/moderation:timeNotScheduled'); +export const TimeAborted = FT<{ title: string }, string>('commands/moderation:timeAborted'); +export const TimeScheduled = FT<{ title: string; user: User; time: number }, string>('commands/moderation:timeScheduled'); +export const SlowmodeSet = FT<{ cooldown: number }, string>('commands/moderation:slowmodeSet'); +export const SlowmodeReset = T('commands/moderation:slowmodeReset'); +export const SlowmodeTooLong = T('commands/moderation:slowmodeTooLong'); +export const TimeDescription = T('commands/moderation:timeDescription'); +export const TimeExtended = T('commands/moderation:timeExtended'); +export const BanNotBannable = T('commands/moderation:banNotBannable'); +export const DehoistStarting = FT<{ count: number }, string>('commands/moderation:dehoistStarting'); +export const DehoistProgress = FT<{ count: number; percentage: number }, string>('commands/moderation:dehoistProgress'); export const DehoistEmbed = FT< { users: number; @@ -132,124 +127,120 @@ export const DehoistEmbed = FT< descriptionMultipleMembers: string; fieldErrorTitle: string; } ->('commandDehoistEmbed'); -export const KickNotKickable = T('commandKickNotKickable'); -export const LockdownLock = FT<{ channel: string }, string>('commandLockdownLock'); -export const LockdownLocking = FT<{ channel: string }, string>('commandLockdownLocking'); -export const LockdownLocked = FT<{ channel: string }, string>('commandLockdownLocked'); -export const LockdownUnlocked = FT<{ channel: string }, string>('commandLockdownUnlocked'); -export const LockdownOpen = FT<{ channel: string }, string>('commandLockdownOpen'); -export const MuteLowlevel = T('commandMuteLowlevel'); -export const MuteConfigureCancelled = T('commandMuteConfigureCancelled'); -export const MuteConfigure = T('commandMuteConfigure'); -export const MuteConfigureToomanyRoles = T('commandMuteConfigureToomanyRoles'); -export const MuteMuted = T('commandMuteMuted'); -export const MuteUserNotMuted = T('commandMuteUserNotMuted'); -export const MuteUnconfigured = T('commandMuteUnconfigured'); -export const MutecreateMissingPermission = T('commandMutecreateMissingPermission'); -export const RestrictLowlevel = T('commandRestrictLowlevel'); -export const PruneInvalid = T('commandPruneInvalid'); -export const PruneAlert = FT<{ count: number; total: number }, string>('commandPruneAlert'); -export const PruneAlertPlural = FT<{ count: number; total: number }, string>('commandPruneAlertPlural'); -export const PruneInvalidPosition = T('commandPruneInvalidPosition'); -export const PruneInvalidFilter = T('commandPruneInvalidFilter'); -export const PruneNoDeletes = T('commandPruneNoDeletes'); -export const PruneLogHeader = T('commandPruneLogHeader'); -export const PruneLogMessage = FT<{ channel: string; author: string; count: number }, string>('commandPruneLogMessage'); -export const PruneLogMessagePlural = FT<{ channel: string; author: string; count: number }, string>('commandPruneLogMessagePlural'); -export const ReasonMissingCase = T('commandReasonMissingCase'); -export const ReasonNotExists = T('commandReasonNotExists'); -export const ReasonUpdated = FT<{ entries: readonly number[]; newReason: string; count: number }, string[]>('commandReasonUpdated'); -export const ReasonUpdatedPlural = FT<{ entries: readonly number[]; newReason: string; count: number }, string[]>('commandReasonUpdatedPlural'); -export const ToggleModerationDmToggledEnabled = T('commandToggleModerationDmToggledEnabled'); -export const ToggleModerationDmToggledDisabled = T('commandToggleModerationDmToggledDisabled'); -export const UnbanMissingPermission = T('commandUnbanMissingPermission'); -export const UnmuteMissingPermission = T('commandUnmuteMissingPermission'); -export const VmuteMissingPermission = T('commandVmuteMissingPermission'); -export const VmuteUserNotMuted = T('commandVmuteUserNotMuted'); -export const WarnDm = FT<{ moderator: string; guild: string; reason: string }, string>('commandWarnDm'); -export const WarnMessage = FT<{ user: User; log: number }, string>('commandWarnMessage'); +>('commands/moderation:dehoistEmbed'); +export const KickNotKickable = T('commands/moderation:kickNotKickable'); +export const LockdownLock = FT<{ channel: string }, string>('commands/moderation:lockdownLock'); +export const LockdownLocking = FT<{ channel: string }, string>('commands/moderation:lockdownLocking'); +export const LockdownLocked = FT<{ channel: string }, string>('commands/moderation:lockdownLocked'); +export const LockdownUnlocked = FT<{ channel: string }, string>('commands/moderation:lockdownUnlocked'); +export const LockdownOpen = FT<{ channel: string }, string>('commands/moderation:lockdownOpen'); +export const MuteLowlevel = T('commands/moderation:muteLowlevel'); +export const MuteConfigureCancelled = T('commands/moderation:muteConfigureCancelled'); +export const MuteConfigure = T('commands/moderation:muteConfigure'); +export const MuteConfigureToomanyRoles = T('commands/moderation:muteConfigureToomanyRoles'); +export const MuteMuted = T('commands/moderation:muteMuted'); +export const MuteUserNotMuted = T('commands/moderation:muteUserNotMuted'); +export const MuteUnconfigured = T('commands/moderation:muteUnconfigured'); +export const MutecreateMissingPermission = T('commands/moderation:mutecreateMissingPermission'); +export const RestrictLowlevel = T('commands/moderation:restrictLowlevel'); +export const PruneInvalid = T('commands/moderation:pruneInvalid'); +export const PruneAlert = FT<{ count: number; total: number }, string>('commands/moderation:pruneAlert'); +export const PruneInvalidPosition = T('commands/moderation:pruneInvalidPosition'); +export const PruneInvalidFilter = T('commands/moderation:pruneInvalidFilter'); +export const PruneNoDeletes = T('commands/moderation:pruneNoDeletes'); +export const PruneLogHeader = T('commands/moderation:pruneLogHeader'); +export const PruneLogMessage = FT<{ channel: string; author: string; count: number }, string>('commands/moderation:pruneLogMessage'); +export const ReasonMissingCase = T('commands/moderation:reasonMissingCase'); +export const ReasonNotExists = T('commands/moderation:reasonNotExists'); +export const ReasonUpdated = FT<{ entries: readonly number[]; newReason: string; count: number }, string[]>('commands/moderation:reasonUpdated'); +export const ToggleModerationDmToggledEnabled = T('commands/moderation:toggleModerationDmToggledEnabled'); +export const ToggleModerationDmToggledDisabled = T('commands/moderation:toggleModerationDmToggledDisabled'); +export const UnbanMissingPermission = T('commands/moderation:unbanMissingPermission'); +export const UnmuteMissingPermission = T('commands/moderation:unmuteMissingPermission'); +export const VmuteMissingPermission = T('commands/moderation:vmuteMissingPermission'); +export const VmuteUserNotMuted = T('commands/moderation:vmuteUserNotMuted'); +export const WarnDm = FT<{ moderator: string; guild: string; reason: string }, string>('commands/moderation:warnDm'); +export const WarnMessage = FT<{ user: User; log: number }, string>('commands/moderation:warnMessage'); export const ModerationOutput = FT<{ count: number; range: string | number; users: string; reason: string | null }, string>( - 'commandModerationOutput' -); -export const ModerationOutputPlural = FT<{ count: number; range: string | number; users: string; reason: string | null }, string>( - 'commandModerationOutputPlural' + 'commands/moderation:moderationOutput' ); export const ModerationOutputWithReason = FT<{ count: number; range: string | number; users: string; reason: string | null }, string>( - 'commandModerationOutputWithReason' + 'commands/moderation:moderationOutputWithReason' +); +export const ModerationCaseNotExists = FT<{ count: number }, string>('moderation:caseNotExists'); +export const ModerationLogAppealed = T('moderation:logAppealed'); +export const ModerationLogDescriptionTypeAndUser = FT<{ data: Moderation.ModerationManagerDescriptionData }, string>( + 'moderation:logDescriptionTypeAndUser' +); +export const ModerationLogDescriptionWithReason = FT<{ data: Moderation.ModerationManagerDescriptionData }, string>( + 'moderation:logDescriptionWithReason' ); -export const ModerationCaseNotExists = FT<{ count: number }, string>('moderationCaseNotExists'); -export const ModerationCaseNotExistsPlural = FT<{ count: number }, string>('ModerationCaseNotExistsPlural'); -export const ModerationLogAppealed = T('moderationLogAppealed'); -export const ModerationLogDescription = FT<{ data: Moderation.ModerationManagerDescriptionData }, string>('moderationLogDescription'); -export const GuildBansEmpty = T('guildBansEmpty'); -export const GuildBansNotFound = T('guildBansNotFound'); -export const GuildMemberNotVoicechannel = T('guildMemberNotVoicechannel'); -export const GuildMuteNotFound = T('guildMuteNotFound'); -export const GuildSettingsChannelsMod = T('guildSettingsChannelsMod'); -export const GuildSettingsRolesRestricted = FT<{ prefix: string; path: string }, string>('guildSettingsRolesRestricted'); -export const GuildWarnNotFound = T('guildWarnNotFound'); -export const ModerationLogExpiresIn = FT<{ duration: number }, string>('moderationLogExpiresIn'); -export const ModerationLogFooter = FT<{ caseID: number }, string>('moderationLogFooter'); -export const ModerationTimed = FT<{ remaining: number }, string>('modlogTimed'); -export const ModerationOutputWithReasonPlural = FT<{ count: number; range: string | number; users: string; reason: string | null }, string>( - 'commandModerationOutputWithReasonPlural' +export const ModerationLogDescriptionWithoutReason = FT<{ data: Moderation.ModerationManagerDescriptionData }, string>( + 'moderation:logDescriptionWithoutReason' ); -export const ModerationFailed = FT<{ users: string; count: number }, string>('commandModerationFailed'); -export const ModerationFailedPlural = FT<{ users: string; count: number }, string>('commandModerationFailedPlural'); -export const ModerationDmFooter = T('commandModerationDmFooter'); -export const ModerationDmDescription = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string[]>( - 'commandModerationDmDescription' +export const GuildBansEmpty = T('errors:guildBansEmpty'); +export const GuildBansNotFound = T('errors:guildBansNotFound'); +export const GuildMemberNotVoicechannel = T('errors:guildMemberNotVoicechannel'); +export const GuildSettingsChannelsMod = T('settings:guildChannelsMod'); +export const GuildSettingsRolesRestricted = FT<{ prefix: string; path: string }, string>('settings:guildRolesRestricted'); +export const GuildWarnNotFound = T('errors:guildWarnNotFound'); +export const ModerationLogExpiresIn = FT<{ duration: number }, string>('moderation:logExpiresIn'); +export const ModerationLogFooter = FT<{ caseID: number }, string>('moderation:logFooter'); +export const ModerationTimed = FT<{ remaining: number }, string>('errors:modlogTimed'); +export const ModerationFailed = FT<{ users: string; count: number }, string>('commands/moderation:moderationFailed'); +export const ModerationDmFooter = T('commands/moderation:moderationDmFooter'); +export const ModerationDmDescription = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string>( + 'commands/moderation:moderationDmDescription' ); -export const ModerationDmDescriptionWithReason = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string[]>( - 'commandModerationDmDescriptionWithReason' +export const ModerationDmDescriptionWithReason = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string>( + 'commands/moderation:moderationDmDescriptionWithReason' ); -export const ModerationDmDescriptionWithDuration = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string[]>( - 'commandModerationDmDescriptionWithDuration' +export const ModerationDmDescriptionWithDuration = FT<{ guild: string; title: string; reason: string | null; duration: number | null }, string>( + 'commands/moderation:moderationDmDescriptionWithDuration' ); export const ModerationDmDescriptionWithReasonWithDuration = FT< { guild: string; title: string; reason: string | null; duration: number | null }, - string[] ->('commandModerationDmDescriptionWithReasonWithDuration'); -export const ModerationDays = T('commandModerationDays'); -export const Permissions = FT<{ username: string; id: string }, string>('commandPermissions'); -export const PermissionsAll = T('commandPermissionsAll'); -export const SlowmodeDescription = T('commandSlowmodeDescription'); -export const SlowmodeExtended = T('commandSlowmodeExtended'); -export const SetNicknameDescription = T('commandSetNicknameDescription'); -export const SetNicknameExtended = T('commandSetNicknameExtended'); -export const AddRoleDescription = T('commandAddRoleDescription'); -export const AddRoleExtended = T('commandAddRoleExtended'); -export const RemoveroleDescription = T('commandRemoveroleDescription'); -export const RemoveroleExtended = T('commandRemoveroleExtended'); -export const BanDescription = T('commandBanDescription'); -export const BanExtended = T('commandBanExtended'); -export const DehoistDescription = T('commandDehoistDescription'); -export const DehoistExtended = T('commandDehoistExtended'); -export const KickDescription = T('commandKickDescription'); -export const KickExtended = T('commandKickExtended'); -export const LockdownDescription = T('commandLockdownDescription'); -export const LockdownExtended = T('commandLockdownExtended'); -export const MuteCannotManageRoles = T('muteCannotManageRoles'); -export const MuteLowHierarchy = T('muteLowHierarchy'); -export const MuteNotConfigured = T('muteNotConfigured'); -export const MuteNotExists = T('muteNotExists'); -export const MuteNotInMember = T('muteNotInMember'); -export const AutomaticParameterInvalidMissingAction = FT<{ name: string }, string>('selfModerationCommandInvalidMissingAction'); -export const AutomaticParameterInvalidMissingArguments = FT<{ name: string }, string>('selfModerationCommandInvalidMissingArguments'); -export const AutomaticParameterInvalidSoftaction = FT<{ name: string }, string>('selfModerationCommandInvalidSoftaction'); -export const AutomaticParameterInvalidHardaction = FT<{ name: string }, string>('selfModerationCommandInvalidHardaction'); -export const AutomaticParameterEnabled = T('selfModerationCommandEnabled'); -export const AutomaticParameterDisabled = T('selfModerationCommandDisabled'); -export const AutomaticParameterSoftAction = T('selfModerationCommandSoftAction'); -export const AutomaticParameterSoftActionWithValue = FT<{ value: string }, string>('selfModerationCommandSoftActionWithValue'); -export const AutomaticParameterHardAction = FT<{ value: string }, string>('selfModerationCommandHardAction'); -export const AutomaticParameterHardActionDuration = T('selfModerationCommandHardActionDuration'); -export const AutomaticParameterHardActionDurationWithValue = FT<{ value: number }, string>('selfModerationCommandHardActionDurationWithValue'); -export const AutomaticParameterThresholdMaximum = T('selfModerationCommandThresholdMaximum'); -export const AutomaticParameterThresholdMaximumWithValue = FT<{ value: number }, string>('selfModerationCommandThresholdMaximumWithValue'); -export const AutomaticParameterThresholdDuration = T('selfModerationCommandThresholdDuration'); -export const AutomaticParameterThresholdDurationWithValue = FT<{ value: number }, string>('selfModerationCommandThresholdDurationWithValue'); + string +>('commands/moderation:moderationDmDescriptionWithReasonWithDuration'); +export const ModerationDays = T('commands/moderation:moderationDays'); +export const Permissions = FT<{ username: string; id: string }, string>('commands/moderation:permissions'); +export const PermissionsAll = T('commands/moderation:permissionsAll'); +export const SlowmodeDescription = T('commands/moderation:slowmodeDescription'); +export const SlowmodeExtended = T('commands/moderation:slowmodeExtended'); +export const SetNicknameDescription = T('commands/moderation:setNicknameDescription'); +export const SetNicknameExtended = T('commands/moderation:setNicknameExtended'); +export const AddRoleDescription = T('commands/moderation:addRoleDescription'); +export const AddRoleExtended = T('commands/moderation:addRoleExtended'); +export const RemoveRoleDescription = T('commands/moderation:removeroleDescription'); +export const RemoveRoleExtended = T('commands/moderation:removeroleExtended'); +export const BanDescription = T('commands/moderation:banDescription'); +export const BanExtended = T('commands/moderation:banExtended'); +export const DehoistDescription = T('commands/moderation:dehoistDescription'); +export const DehoistExtended = T('commands/moderation:dehoistExtended'); +export const KickDescription = T('commands/moderation:kickDescription'); +export const KickExtended = T('commands/moderation:kickExtended'); +export const LockdownDescription = T('commands/moderation:lockdownDescription'); +export const LockdownExtended = T('commands/moderation:lockdownExtended'); +export const MuteCannotManageRoles = T('moderation:muteCannotManageRoles'); +export const MuteLowHierarchy = T('moderation:muteLowHierarchy'); +export const MuteNotConfigured = T('moderation:muteNotConfigured'); +export const MuteNotExists = T('moderation:muteNotExists'); +export const MuteNotInMember = T('moderation:muteNotInMember'); +export const AutomaticParameterInvalidMissingAction = FT<{ name: string }, string>('selfModeration:commandInvalidMissingAction'); +export const AutomaticParameterInvalidMissingArguments = FT<{ name: string }, string>('selfModeration:commandInvalidMissingArguments'); +export const AutomaticParameterInvalidSoftAction = FT<{ name: string }, string>('selfModeration:commandInvalidSoftaction'); +export const AutomaticParameterInvalidHardAction = FT<{ name: string }, string>('selfModeration:commandInvalidHardaction'); +export const AutomaticParameterEnabled = T('selfModeration:commandEnabled'); +export const AutomaticParameterDisabled = T('selfModeration:commandDisabled'); +export const AutomaticParameterSoftAction = T('selfModeration:commandSoftAction'); +export const AutomaticParameterSoftActionWithValue = FT<{ value: string }, string>('selfModeration:commandSoftActionWithValue'); +export const AutomaticParameterHardAction = FT<{ value: string }, string>('selfModeration:commandHardAction'); +export const AutomaticParameterHardActionDuration = T('selfModeration:commandHardActionDuration'); +export const AutomaticParameterHardActionDurationWithValue = FT<{ value: number }, string>('selfModeration:commandHardActionDurationWithValue'); +export const AutomaticParameterThresholdMaximum = T('selfModeration:commandThresholdMaximum'); +export const AutomaticParameterThresholdMaximumWithValue = FT<{ value: number }, string>('selfModeration:commandThresholdMaximumWithValue'); +export const AutomaticParameterThresholdDuration = T('selfModeration:commandThresholdDuration'); +export const AutomaticParameterThresholdDurationWithValue = FT<{ value: number }, string>('selfModeration:commandThresholdDurationWithValue'); export const AutomaticParameterShow = FT< { kEnabled: string; @@ -261,52 +252,57 @@ export const AutomaticParameterShow = FT< thresholdMaximumText: string | number; thresholdDurationText: string; }, - readonly string[] ->('selfModerationCommandShow'); -export const AutomaticParameterShowDurationPermanent = T('selfModerationCommandShowDurationPermanent'); -export const AutomaticParameterShowUnset = T('selfModerationCommandShowUnset'); -export const AutomaticValueSoftActionAlert = T('selfModerationSoftActionAlert'); -export const AutomaticValueSoftActionLog = T('selfModerationSoftActionLog'); -export const AutomaticValueSoftActionDelete = T('selfModerationSoftActionDelete'); -export const AutomaticValueHardActionBan = T('selfModerationHardActionBan'); -export const AutomaticValueHardActionKick = T('selfModerationHardActionKick'); -export const AutomaticValueHardActionMute = T('selfModerationHardActionMute'); -export const AutomaticValueHardActionSoftban = T('selfModerationHardActionSoftban'); -export const AutomaticValueHardActionWarning = T('selfModerationHardActionWarning'); -export const AutomaticValueHardActionNone = T('selfModerationHardActionNone'); -export const AutomaticValueEnabled = T('selfModerationEnabled'); -export const AutomaticValueDisabled = T('selfModerationDisabled'); -export const AutomaticValueMaximumTooShort = FT<{ minimum: number; value: number }, string>('selfModerationMaximumTooShort'); -export const AutomaticValueMaximumTooLong = FT<{ maximum: number; value: number }, string>('selfModerationMaximumTooLong'); -export const AutomaticValueDurationTooShort = FT<{ minimum: number; value: number }, string>('selfModerationDurationTooShort'); -export const AutomaticValueDurationTooLong = FT<{ maximum: number; value: number }, string>('selfModerationDurationTooLong'); -export const moderationActions = T('moderationActions'); -export const ActionApplyReason = FT<{ action: string; reason: string }, string>('actionApplyReason'); -export const ActionApplyNoReason = FT<{ action: string }, string>('actionApplyNoReason'); -export const ActionRevokeReason = FT<{ action: string; reason: string }, string>('actionRevokeReason'); -export const ActionRevokeNoReason = FT<{ action: string }, string>('actionRevokeNoReason'); -export const ActionSoftbanReason = FT<{ reason: string }, string>('actionSoftbanReason'); -export const ActionUnSoftbanReason = FT<{ reason: string }, string>('actionUnSoftbanReason'); -export const ActionSoftbanNoReason = T('actionSoftbanNoReason'); -export const ActionUnSoftbanNoReason = T('actionUnSoftbanNoReason'); -export const ActionSetNicknameSet = FT<{ reason: string }, string>('actionSetNicknameSet'); -export const ActionSetNicknameRemoved = FT<{ reason: string }, string>('actionSetNicknameRemoved'); -export const ActionSetNicknameNoReasonSet = T('actionSetNicknameNoReasonSet'); -export const ActionSetNicknameNoReasonRemoved = T('actionSetNicknameNoReasonRemoved'); -export const ActionSetupMuteExists = T('actionSetupMuteExists'); -export const ActionSetupRestrictionExists = T('actionSetupRestrictionExists'); -export const ActionSetupTooManyRoles = T('actionSetupTooManyRoles'); -export const ActionSharedRoleSetupExisting = T('actionSharedRoleSetupExisting'); -export const ActionSharedRoleSetupExistingName = T('actionSharedRoleSetupExistingName'); -export const ActionSharedRoleSetupNew = T('actionSharedRoleSetupNew'); -export const ActionSharedRoleSetupAsk = FT<{ role: string; channels: number; permissions: string }, string>('actionSharedRoleSetupAsk'); + string +>('selfModeration:commandShow'); +export const AutomaticParameterShowDurationPermanent = T('selfModeration:commandShowDurationPermanent'); +export const AutomaticParameterShowUnset = T('selfModeration:commandShowUnset'); +export const AutomaticValueSoftActionAlert = T('selfModeration:softActionAlert'); +export const AutomaticValueSoftActionLog = T('selfModeration:softActionLog'); +export const AutomaticValueSoftActionDelete = T('selfModeration:softActionDelete'); +export const AutomaticValueHardActionBan = T('selfModeration:hardActionBan'); +export const AutomaticValueHardActionKick = T('selfModeration:hardActionKick'); +export const AutomaticValueHardActionMute = T('selfModeration:hardActionMute'); +export const AutomaticValueHardActionSoftBan = T('selfModeration:hardActionSoftban'); +export const AutomaticValueHardActionWarning = T('selfModeration:hardActionWarning'); +export const AutomaticValueHardActionNone = T('selfModeration:hardActionNone'); +export const AutomaticValueEnabled = T('selfModeration:enabled'); +export const AutomaticValueDisabled = T('selfModeration:disabled'); +export const AutomaticValueMaximumTooShort = FT<{ minimum: number; value: number }, string>('selfModeration:maximumTooShort'); +export const AutomaticValueMaximumTooLong = FT<{ maximum: number; value: number }, string>('selfModeration:maximumTooLong'); +export const AutomaticValueDurationTooShort = FT<{ minimum: number; value: number }, string>('selfModeration:durationTooShort'); +export const AutomaticValueDurationTooLong = FT<{ maximum: number; value: number }, string>('selfModeration:durationTooLong'); +export const Actions = T('moderationActions:actions'); +export const ActionApplyReason = FT<{ action: string; reason: string }, string>('moderationActions:applyReason'); +export const ActionApplyNoReason = FT<{ action: string }, string>('moderationActions:applyNoReason'); +export const ActionRevokeReason = FT<{ action: string; reason: string }, string>('moderationActions:revokeReason'); +export const ActionRevokeNoReason = FT<{ action: string }, string>('moderationActions:revokeNoReason'); +export const ActionSoftBanReason = FT<{ reason: string }, string>('moderationActions:softbanReason'); +export const ActionUnSoftBanReason = FT<{ reason: string }, string>('moderationActions:unSoftbanReason'); +export const ActionSoftBanNoReason = T('moderationActions:softbanNoReason'); +export const ActionUnSoftBanNoReason = T('moderationActions:unSoftbanNoReason'); +export const ActionSetNicknameSet = FT<{ reason: string }, string>('moderationActions:setNicknameSet'); +export const ActionSetNicknameRemoved = FT<{ reason: string }, string>('moderationActions:setNicknameRemoved'); +export const ActionSetNicknameNoReasonSet = T('moderationActions:setNicknameNoReasonSet'); +export const ActionSetNicknameNoReasonRemoved = T('moderationActions:setNicknameNoReasonRemoved'); +export const ActionSetupMuteExists = T('moderationActions:setupMuteExists'); +export const ActionSetupRestrictionExists = T('moderationActions:setupRestrictionExists'); +export const ActionSetupTooManyRoles = T('moderationActions:setupTooManyRoles'); +export const ActionSharedRoleSetupExisting = T('moderationActions:sharedRoleSetupExisting'); +export const ActionSharedRoleSetupExistingName = T('moderationActions:sharedRoleSetupExistingName'); +export const ActionSharedRoleSetupNew = T('moderationActions:sharedRoleSetupNew'); +export const ActionSharedRoleSetupAsk = FT<{ role: string; channels: number; permissions: string }, string>('moderationActions:sharedRoleSetupAsk'); export const ActionSharedRoleSetupAskMultipleChannels = FT<{ role: string; channels: number; permissions: string }, string>( - 'actionSharedRoleSetupAskMultipleChannels' + 'moderationActions:sharedRoleSetupAskMultipleChannels' ); export const ActionSharedRoleSetupAskMultiplePermissions = FT<{ role: string; channels: number; permissions: string }, string>( - 'actionSharedRoleSetupAskMultiplePermissions' + 'moderationActions:sharedRoleSetupAskMultiplePermissions' ); export const ActionSharedRoleSetupAskMultipleChannelsMultiplePermissions = FT<{ role: string; channels: number; permissions: string }, string>( - 'actionSharedRoleSetupAskMultipleChannelsMultiplePermissions' + 'moderationActions:sharedRoleSetupAskMultipleChannelsMultiplePermissions' ); -export const ActionRequiredMember = T('actionRequiredMember'); +export const ActionRequiredMember = T('moderationActions:requiredMember'); +export const RoleHigher = T('moderation:roleHigher'); +export const RoleHigherSkyra = T('moderation:roleHigherSkyra'); +export const Success = T('moderation:success'); +export const ToSkyra = T('moderation:toSkyra'); +export const UserSelf = T('moderation:userSelf'); diff --git a/src/lib/types/namespaces/languages/commands/Music.ts b/src/lib/types/namespaces/languages/commands/Music.ts index e6afc26648f..c5a7851c612 100644 --- a/src/lib/types/namespaces/languages/commands/Music.ts +++ b/src/lib/types/namespaces/languages/commands/Music.ts @@ -2,85 +2,97 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; import { Guild } from 'discord.js'; -export const AddDescription = T('commandAddDescription'); -export const AddExtended = T('commandAddExtended'); -export const AddPlaylist = FT<{ songs: string }, string>('commandAddPlaylist'); -export const AddPlaylistSongs = FT<{ count: number }, string>('commandAddPlaylistSongs'); -export const AddPlaylistSongsPlural = FT<{ count: number }, string>('commandAddPlaylistSongsPlural'); -export const AddSong = FT<{ title: string }, string>('commandAddSong'); -export const ClearDescription = T('commandClearDescription'); -export const ClearDenied = T('commandClearDenied'); -export const ClearSuccess = FT<{ count: number }, string>('commandClearSuccess'); -export const ClearSuccessPlural = FT<{ count: number }, string>('commandClearSuccessPlural'); -export const ExportQueueDescription = T('commandExportQueueDescription'); -export const ExportQueueExtended = T('commandExportQueueExtended'); -export const ExportQueueSuccess = FT<{ guildName: string }, string>('commandExportQueueSuccess'); -export const ImportQueueDescription = T('commandImportQueueDescription'); -export const ImportQueueExtended = T('commandImportQueueExtended'); -export const JoinDescription = T('commandJoinDescription'); -export const JoinNoMember = T('commandJoinNoMember'); -export const JoinNoVoicechannel = T('commandJoinNoVoicechannel'); -export const JoinSuccess = FT<{ channel: string }, string>('commandJoinSuccess'); -export const JoinVoiceDifferent = T('commandJoinVoiceDifferent'); -export const JoinVoiceFull = T('commandJoinVoiceFull'); -export const JoinVoiceNoConnect = T('commandJoinVoiceNoConnect'); -export const JoinVoiceNoSpeak = T('commandJoinVoiceNoSpeak'); -export const JoinVoiceSame = T('commandJoinVoiceSame'); -export const JoinFailed = T('commandJoinFailed'); -export const LeaveDescription = T('commandLeaveDescription'); -export const LeaveExtended = T('commandLeaveExtended'); -export const LeaveSuccess = FT<{ channel: string }, string>('commandLeaveSuccess'); -export const PauseDescription = T('commandPauseDescription'); -export const PauseSuccess = T('commandPauseSuccess'); -export const PlayDescription = T('commandPlayDescription'); -export const PlayExtended = T('commandPlayExtended'); -export const PlayEnd = T('commandPlayEnd'); -export const PlayNext = FT<{ title: string; requester: string }, string>('commandPlayNext'); -export const PlayQueuePaused = FT<{ song: string }, string>('commandPlayQueuePaused'); -export const PlayQueuePlaying = T('commandPlayQueuePlaying'); -export const PlayQueueEmpty = T('commandPlayQueueEmpty'); -export const PlayingDescription = T('commandPlayingDescription'); -export const PlayingDuration = FT<{ duration: string }, string>('commandPlayingDuration'); -export const PlayingQueueEmpty = T('commandPlayingQueueEmpty'); -export const PlayingQueueNotPlaying = T('commandPlayingQueueNotPlaying'); -export const RepeatDescription = T('commandRepeatDescription'); -export const RepeatSuccessEnabled = T('commandRepeatSuccessEnabled'); -export const RepeatSuccessDisabled = T('commandRepeatSuccessDisabled'); -export const QueueDescription = T('commandQueueDescription'); -export const QueueLast = T('commandQueueLast'); -export const QueueTitle = FT<{ guildname: string }, string>('commandQueueTitle'); -export const QueueLine = FT<{ position: number; duration: string; title: string; url: string; requester: string }, string>('commandQueueLine'); -export const QueueNowPlaying = FT<{ title: string; url: string; requester: string }, string>('commandQueueNowplaying'); -export const QueueNowPlayingTimeRemaining = FT<{ timeRemaining: string }, string>('commandQueueNowplayingTimeRemaining'); -export const QueueNowPlayingLiveStream = T('commandQueueNowplayingLiveStream'); -export const QueueNowPlayingTitle = T('commandQueueNowplayingTitle'); -export const QueueTotalTitle = T('commandQueueTotalTitle'); -export const QueueTotal = FT<{ songs: string; remainingTime: string }, string>('commandQueueTotal'); -export const QueueEmpty = T('commandQueueEmpty'); -export const QueueDashboardInfo = FT<{ guild: Guild }, string>('commandQueueDashboardInfo'); -export const RemoveDescription = T('commandRemoveDescription'); -export const RemoveIndexInvalid = T('commandRemoveIndexInvalid'); -export const RemoveIndexOutOfBounds = FT<{ songs: string }, string>('commandRemoveIndexOutOfBounds'); -export const RemoveDenied = T('commandRemoveDenied'); -export const RemoveSuccess = FT<{ title: string; requester: string }, string>('commandRemoveSuccess'); -export const SeekDescription = T('commandSeekDescription'); -export const SeekSuccess = FT<{ time: number }, string>('commandSeekSuccess'); -export const ResumeDescription = T('commandResumeDescription'); -export const ResumeSuccess = T('commandResumeSuccess'); -export const ShuffleDescription = T('commandShuffleDescription'); -export const ShuffleSuccess = FT<{ amount: number }, string>('commandShuffleSuccess'); -export const SkipDescription = T('commandSkipDescription'); -export const SkipPermissions = T('commandSkipPermissions'); -export const SkipVotesVoted = T('commandSkipVotesVoted'); -export const SkipVotesTotal = FT<{ amount: number; needed: number }, string>('commandSkipVotesTotal'); -export const SkipSuccess = FT<{ title: string }, string>('commandSkipSuccess'); -export const PlayingTimeDescription = T('commandPlayingTimeDescription'); -export const PlayingTimeQueueEmpty = T('commandPlayingTimeQueueEmpty'); -export const PromoteDescription = T('commandPromoteDescription'); -export const PromoteExtended = T('commandPromoteExtended'); -export const PromoteSuccess = FT<{ title: string; url: string }, string>('commandPromoteSuccess'); -export const VolumeDescription = T('commandVolumeDescription'); -export const VolumeSuccess = FT<{ volume: number }, string>('commandVolumeSuccess'); -export const VolumeChanged = FT<{ emoji: string; volume: number }, string>('commandVolumeChanged'); -export const VolumeChangedExtreme = FT<{ emoji: string; text: string; volume: number }, string>('commandVolumeChangedExtreme'); -export const VolumeChangedTexts = T('commandVolumeChangedTexts'); +export const AddDescription = T('commands/music:addDescription'); +export const AddExtended = T('commands/music:addExtended'); +export const AddPlaylist = FT<{ songs: string }, string>('commands/music:addPlaylist'); +export const AddPlaylistSongs = FT<{ count: number }, string>('commands/music:addPlaylistSongs'); +export const AddSong = FT<{ title: string }, string>('commands/music:addSong'); +export const ClearDescription = T('commands/music:clearDescription'); +export const ClearExtended = T('commands/music:clearExtended'); +export const ClearDenied = T('commands/music:clearDenied'); +export const ClearSuccess = FT<{ count: number }, string>('commands/music:clearSuccess'); +export const ExportQueueDescription = T('commands/music:exportQueueDescription'); +export const ExportQueueExtended = T('commands/music:exportQueueExtended'); +export const ExportQueueSuccess = FT<{ guildName: string }, string>('commands/music:exportQueueSuccess'); +export const ImportQueueDescription = T('commands/music:importQueueDescription'); +export const ImportQueueExtended = T('commands/music:importQueueExtended'); +export const JoinDescription = T('commands/music:joinDescription'); +export const JoinExtended = T('commands/music:joinExtended'); +export const JoinNoMember = T('commands/music:joinNoMember'); +export const JoinNoVoiceChannel = T('commands/music:joinNoVoicechannel'); +export const JoinSuccess = FT<{ channel: string }, string>('commands/music:joinSuccess'); +export const JoinVoiceDifferent = T('commands/music:joinVoiceDifferent'); +export const JoinVoiceFull = T('commands/music:joinVoiceFull'); +export const JoinVoiceNoConnect = T('commands/music:joinVoiceNoConnect'); +export const JoinVoiceNoSpeak = T('commands/music:joinVoiceNoSpeak'); +export const JoinVoiceSame = T('commands/music:joinVoiceSame'); +export const JoinFailed = T('commands/music:joinFailed'); +export const LeaveDescription = T('commands/music:leaveDescription'); +export const LeaveExtended = T('commands/music:leaveExtended'); +export const LeaveSuccess = FT<{ channel: string }, string>('commands/music:leaveSuccess'); +export const PauseDescription = T('commands/music:pauseDescription'); +export const PauseExtended = T('commands/music:pauseExtended'); +export const PauseSuccess = T('commands/music:pauseSuccess'); +export const PlayDescription = T('commands/music:playDescription'); +export const PlayExtended = T('commands/music:playExtended'); +export const PlayEnd = T('commands/music:playEnd'); +export const PlayNext = FT<{ title: string; requester: string }, string>('commands/music:playNext'); +export const PlayQueuePaused = FT<{ song: string }, string>('commands/music:playQueuePaused'); +export const PlayQueuePlaying = T('commands/music:playQueuePlaying'); +export const PlayQueueEmpty = T('commands/music:playQueueEmpty'); +export const PlayingDescription = T('commands/music:playingDescription'); +export const PlayingExtended = T('commands/music:playingExtended'); +export const PlayingDuration = FT<{ duration: string }, string>('commands/music:playingDuration'); +export const PlayingQueueEmpty = T('commands/music:playingQueueEmpty'); +export const PlayingQueueNotPlaying = T('commands/music:playingQueueNotPlaying'); +export const RepeatDescription = T('commands/music:repeatDescription'); +export const RepeatExtended = T('commands/music:repeatExtended'); +export const RepeatSuccessEnabled = T('commands/music:repeatSuccessEnabled'); +export const RepeatSuccessDisabled = T('commands/music:repeatSuccessDisabled'); +export const QueueDescription = T('commands/music:queueDescription'); +export const QueueExtended = T('commands/music:queueExtended'); +export const QueueLast = T('commands/music:queueLast'); +export const QueueTitle = FT<{ guildname: string }, string>('commands/music:queueTitle'); +export const QueueLine = FT<{ position: number; duration: string; title: string; url: string; requester: string }, string>( + 'commands/music:queueLine' +); +export const QueueNowPlaying = FT<{ title: string; url: string; requester: string }, string>('commands/music:queueNowplaying'); +export const QueueNowPlayingTimeRemaining = FT<{ timeRemaining: string }, string>('commands/music:queueNowplayingTimeRemaining'); +export const QueueNowPlayingLiveStream = T('commands/music:queueNowplayingLiveStream'); +export const QueueNowPlayingTitle = T('commands/music:queueNowplayingTitle'); +export const QueueTotalTitle = T('commands/music:queueTotalTitle'); +export const QueueTotal = FT<{ songs: string; remainingTime: string }, string>('commands/music:queueTotal'); +export const QueueEmpty = T('commands/music:queueEmpty'); +export const QueueDashboardInfo = FT<{ guild: Guild }, string>('commands/music:queueDashboardInfo'); +export const RemoveDescription = T('commands/music:removeDescription'); +export const RemoveExtended = T('commands/music:removeExtended'); +export const RemoveIndexInvalid = T('commands/music:removeIndexInvalid'); +export const RemoveIndexOutOfBounds = FT<{ songs: string }, string>('commands/music:removeIndexOutOfBounds'); +export const RemoveDenied = T('commands/music:removeDenied'); +export const RemoveSuccess = FT<{ title: string; requester: string }, string>('commands/music:removeSuccess'); +export const SeekDescription = T('commands/music:seekDescription'); +export const SeekExtended = T('commands/music:seekExtended'); +export const SeekSuccess = FT<{ time: number }, string>('commands/music:seekSuccess'); +export const ResumeDescription = T('commands/music:resumeDescription'); +export const ResumeExtended = T('commands/music:resumeExtended'); +export const ResumeSuccess = T('commands/music:resumeSuccess'); +export const ShuffleDescription = T('commands/music:shuffleDescription'); +export const ShuffleExtended = T('commands/music:shuffleExtended'); +export const ShuffleSuccess = FT<{ amount: number }, string>('commands/music:shuffleSuccess'); +export const SkipDescription = T('commands/music:skipDescription'); +export const SkipExtended = T('commands/music:skipExtended'); +export const SkipPermissions = T('commands/music:skipPermissions'); +export const SkipVotesVoted = T('commands/music:skipVotesVoted'); +export const SkipVotesTotal = FT<{ amount: number; needed: number }, string>('commands/music:skipVotesTotal'); +export const SkipSuccess = FT<{ title: string }, string>('commands/music:skipSuccess'); +export const PlayingTimeDescription = T('commands/music:playingTimeDescription'); +export const PlayingTimeQueueEmpty = T('commands/music:playingTimeQueueEmpty'); +export const PromoteDescription = T('commands/music:promoteDescription'); +export const PromoteExtended = T('commands/music:promoteExtended'); +export const PromoteSuccess = FT<{ title: string; url: string }, string>('commands/music:promoteSuccess'); +export const VolumeDescription = T('commands/music:volumeDescription'); +export const VolumeExtended = T('commands/music:volumeExtended'); +export const VolumeSuccess = FT<{ volume: number }, string>('commands/music:volumeSuccess'); +export const VolumeChanged = FT<{ emoji: string; volume: number }, string>('commands/music:volumeChanged'); +export const VolumeChangedExtreme = FT<{ emoji: string; text: string; volume: number }, string>('commands/music:volumeChangedExtreme'); +export const VolumeChangedTexts = T('commands/music:volumeChangedTexts'); diff --git a/src/lib/types/namespaces/languages/commands/Pokemon.ts b/src/lib/types/namespaces/languages/commands/Pokemon.ts index 65eb1de1632..7e264774211 100644 --- a/src/lib/types/namespaces/languages/commands/Pokemon.ts +++ b/src/lib/types/namespaces/languages/commands/Pokemon.ts @@ -1,15 +1,15 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const AbilityDescription = T('commandAbilityDescription'); -export const AbilityExtended = T('commandAbilityExtended'); -export const AbilityEmbedTitles = T<{ authorTitle: string; fieldEffectTitle: string }>('commandAbilityEmbedTitles'); -export const AbilityQueryFail = FT<{ ability: string }, string>('commandAbilityQueryFail'); -export const FlavorsDescription = T('commandFlavorsDescription'); -export const FlavorsExtended = T('commandFlavorsExtended'); -export const FlavorsQueryFail = FT<{ pokemon: string }, string>('commandFlavorsQueryFail'); -export const ItemDescription = T('commandItemDescription'); -export const ItemExtended = T('commandItemExtended'); +export const AbilityDescription = T('commands/pokemon:abilityDescription'); +export const AbilityExtended = T('commands/pokemon:abilityExtended'); +export const AbilityEmbedTitles = T<{ authorTitle: string; fieldEffectTitle: string }>('commands/pokemon:abilityEmbedTitles'); +export const AbilityQueryFail = FT<{ ability: string }, string>('commands/pokemon:abilityQueryFail'); +export const FlavorsDescription = T('commands/pokemon:flavorsDescription'); +export const FlavorsExtended = T('commands/pokemon:flavorsExtended'); +export const FlavorsQueryFail = FT<{ pokemon: string }, string>('commands/pokemon:flavorsQueryFail'); +export const ItemDescription = T('commands/pokemon:itemDescription'); +export const ItemExtended = T('commands/pokemon:itemExtended'); export const ItemEmbedData = FT< { availableInGen8: string; @@ -20,18 +20,18 @@ export const ItemEmbedData = FT< availableInGeneration8Title: string; availableInGeneration8Data: string; } ->('commandItemEmbedData'); -export const ItemQueryFail = FT<{ item: string }, string>('commandItemQueryFail'); -export const LearnDescription = T('commandLearnDescription'); -export const LearnExtended = T('commandLearnExtended'); -export const LearnMethodTypes = FT<{ level?: number | null }, LearnMethodTypesReturn>('commandLearnMethodTypes'); -export const LearnInvalidGeneration = FT<{ generation: string }, string>('commandLearnInvalidGeneration'); -export const LearnMethod = FT<{ generation: number; pokemon: string; move: string; method: string }, string>('commandLearnMethod'); -export const LearnQueryFailed = FT<{ pokemon: string; moves: string }, string>('commandLearnQueryFailed'); -export const LearnCannotLearn = FT<{ pokemon: string; moves: string }, string>('commandLearnCannotLearn'); -export const LearnTitle = FT<{ pokemon: string; generation: number }, string>('commandLearnTitle'); -export const MoveDescription = T('commandMoveDescription'); -export const MoveExtended = T('commandMoveExtended'); +>('commands/pokemon:itemEmbedData'); +export const ItemQueryFail = FT<{ item: string }, string>('commands/pokemon:itemQueryFail'); +export const LearnDescription = T('commands/pokemon:learnDescription'); +export const LearnExtended = T('commands/pokemon:learnExtended'); +export const LearnMethodTypes = FT<{ level?: number | null }, LearnMethodTypesReturn>('commands/pokemon:learnMethodTypes'); +export const LearnInvalidGeneration = FT<{ generation: string }, string>('commands/pokemon:learnInvalidGeneration'); +export const LearnMethod = FT<{ generation: number; pokemon: string; move: string; method: string }, string>('commands/pokemon:learnMethod'); +export const LearnQueryFailed = FT<{ pokemon: string; moves: string[] }, string>('commands/pokemon:learnQueryFailed'); +export const LearnCannotLearn = FT<{ pokemon: string; moves: string[] }, string>('commands/pokemon:learnCannotLearn'); +export const LearnTitle = FT<{ pokemon: string; generation: number }, string>('commands/pokemon:learnTitle'); +export const MoveDescription = T('commands/pokemon:moveDescription'); +export const MoveExtended = T('commands/pokemon:moveExtended'); export const MoveEmbedData = FT< { availableInGen8: string; @@ -55,16 +55,16 @@ export const MoveEmbedData = FT< zMovePower: string; fieldMoveEffectTitle: string; } ->('commandMoveEmbedData'); -export const MoveQueryFail = FT<{ move: string }, string>('commandMoveQueryFail'); -export const PokedexDescription = T('commandPokedexDescription'); -export const PokedexExtended = T('commandPokedexExtended'); +>('commands/pokemon:moveEmbedData'); +export const MoveQueryFail = FT<{ move: string }, string>('commands/pokemon:moveQueryFail'); +export const PokedexDescription = T('commands/pokemon:pokedexDescription'); +export const PokedexExtended = T('commands/pokemon:pokedexExtended'); export const PokedexEmbedData = FT<{ otherFormes: readonly string[]; cosmeticFormes: readonly string[] }, PokedexEmbedDataReturn>( - 'commandPokedexEmbedData' + 'commands/pokemon:pokedexEmbedData' ); -export const PokedexQueryFail = FT<{ pokemon: string }, string>('commandPokedexQueryFail'); -export const TypeDescription = T('commandTypeDescription'); -export const TypeExtended = T('commandTypeExtended'); +export const PokedexQueryFail = FT<{ pokemon: string }, string>('commands/pokemon:pokedexQueryFail'); +export const TypeDescription = T('commands/pokemon:typeDescription'); +export const TypeExtended = T('commands/pokemon:typeExtended'); export const TypeEmbedData = FT< { types: string[]; @@ -82,10 +82,10 @@ export const TypeEmbedData = FT< notAffectedBy: string; typeEffectivenessFor: string; } ->('commandTypeEmbedData'); -export const TypeTooManyTypes = T('commandTypeTooManyTypes'); -export const TypeNotAType = FT<{ type: string }, string>('commandTypeNotAType'); -export const TypeQueryFail = FT<{ types: string }, string>('commandTypeQueryFail'); +>('commands/pokemon:typeEmbedData'); +export const TypeTooManyTypes = T('commands/pokemon:typeTooManyTypes'); +export const TypeNotAType = FT<{ type: string }, string>('commands/pokemon:typeNotAType'); +export const TypeQueryFail = FT<{ types: string[] }, string>('commands/pokemon:typeQueryFail'); export interface PokedexEmbedDataReturn { types: string; diff --git a/src/lib/types/namespaces/languages/commands/Social.ts b/src/lib/types/namespaces/languages/commands/Social.ts index e030a6e00b7..2ebfec0962b 100644 --- a/src/lib/types/namespaces/languages/commands/Social.ts +++ b/src/lib/types/namespaces/languages/commands/Social.ts @@ -17,135 +17,135 @@ export interface ProfileTitles { level: string; } -export const AutoRoleAdd = FT<{ role: Role; points: number }, string>('commandAutoRoleAdd'); -export const AutoRoleDescription = T('commandAutoRoleDescription'); -export const AutoRoleExtended = T('commandAutoRoleExtended'); -export const AutoRoleListEmpty = T('commandAutoRoleListEmpty'); -export const AutoRolePointsRequired = T('commandAutoRolePointsRequired'); -export const AutoRoleRemove = FT<{ role: Role; before: number }, string>('commandAutoRoleRemove'); -export const AutoRoleUnknownRole = FT<{ role: string }, string>('commandAutoRoleUnknownRole'); -export const AutoRoleUpdate = FT<{ role: Role; points: number; before: number }, string>('commandAutoRoleUpdate'); -export const AutoRoleUpdateConfigured = T('commandAutoRoleUpdateConfigured'); -export const AutoRoleUpdateUnconfigured = T('commandAutoRoleUpdateUnconfigured'); -export const Balance = FT<{ user: string; amount: string }, string>('commandBalance'); -export const BalanceBots = T('commandBalanceBots'); -export const BalanceDescription = T('commandBalanceDescription'); -export const BalanceExtended = T('commandBalanceExtended'); -export const BalanceSelf = FT<{ amount: string }, string>('commandBalanceSelf'); -export const BannerBought = FT<{ prefix: string; banner: string }, string>('commandBannerBought'); -export const BannerBuy = FT<{ banner: string }, string>('commandBannerBuy'); -export const BannerDescription = T('commandBannerDescription'); -export const BannerExtended = T('commandBannerExtended'); -export const BannerMissing = FT<{ type: string }, string>('commandBannerMissing'); -export const BannerMoney = FT<{ money: number; cost: number }, string>('commandBannerMoney'); -export const BannerNotexists = FT<{ prefix: string }, string>('commandBannerNotexists'); -export const BannerPaymentCancelled = T('commandBannerPaymentCancelled'); -export const BannerPrompt = T('commandBannerPrompt'); -export const BannerReset = T('commandBannerReset'); -export const BannerResetDefault = T('commandBannerResetDefault'); -export const BannerSet = FT<{ banner: string }, string>('commandBannerSet'); -export const BannerSetNotBought = T('commandBannerSetNotBought'); -export const BannerUserListEmpty = FT<{ prefix: string }, string>('commandBannerUserlistEmpty'); -export const DailyCollect = T('commandDailyCollect'); -export const DailyDescription = T('commandDailyDescription'); -export const DailyExtended = T('commandDailyExtended'); -export const DailyGrace = FT<{ remaining: number }, string[]>('commandDailyGrace'); -export const DailyGraceAccepted = FT<{ amount: number; remaining: number }, string>('commandDailyGraceAccepted'); -export const DailyGraceDenied = T('commandDailyGraceDenied'); -export const DailyTime = FT<{ time: number }, string>('commandDailyTime'); -export const DailyTimeSuccess = FT<{ amount: number }, string>('commandDailyTimeSuccess'); -export const DivorceCancel = T('commandDivorceCancel'); -export const DivorceDescription = T('commandDivorceDescription'); -export const DivorceDm = FT<{ user: string }, string>('commandDivorceDm'); -export const DivorceExtended = T('commandDivorceExtended'); -export const DivorceSelf = T('commandDivorceSelf'); -export const DivorceNotTaken = T('commandDivorceNotTaken'); -export const DivorcePrompt = T('commandDivorcePrompt'); -export const DivorceSuccess = FT<{ user: string }, string>('commandDivorceSuccess'); -export const LeaderboardDescription = T('commandLeaderboardDescription'); -export const LeaderboardExtended = T('commandLeaderboardExtended'); -export const Level = T('commandLevel'); -export const LevelDescription = T('commandLevelDescription'); -export const LevelExtended = T('commandLevelExtended'); -export const MarryAccepted = FT<{ author: User; user: User }, string>('commandMarryAccepted'); -export const MarryAlreadyMarried = FT<{ user: User }, string>('commandMarryAlreadyMarried'); -export const MarryAuthorMultipleCancel = FT<{ user: string }, string>('commandMarryAuthorMultipleCancel'); -export const MarryAuthorTaken = FT<{ author: User }, string>('commandMarryAuthorTaken'); -export const MarryAuthorTooMany = FT<{ limit: number }, string>('commandMarryAuthorTooMany'); -export const MarryBots = T('commandMarryBots'); -export const MarryDenied = T('commandMarryDenied'); -export const MarryDescription = T('commandMarryDescription'); -export const MarryExtended = T('commandMarryExtended'); -export const MarryMultipleCancel = T('commandMarryMultipleCancel'); -export const MarryNoreply = T('commandMarryNoreply'); -export const MarryNotTaken = T('commandMarryNotTaken'); -export const MarryPetition = FT<{ author: User; user: User }, string>('commandMarryPetition'); -export const MarrySelf = T('commandMarrySelf'); -export const MarrySkyra = T('commandMarrySkyra'); -export const MarryAelia = T('commandMarryAelia'); -export const MarryTaken = FT<{ count: number }, string>('commandMarryTaken'); -export const MarryTakenPlural = FT<{ count: number }, string>('commandMarryTakenPlural'); -export const MarryTargetTooMany = FT<{ limit: number }, string>('commandMarryTargetTooMany'); -export const MarryWith = FT<{ users: readonly string[] }, string>('commandMarryWith'); -export const MarriedDescription = T('commandMarriedDescription'); -export const MarriedExtended = T('commandMarriedExtended'); -export const Mylevel = FT<{ points: number; next: string; user: string }, string>('commandMylevel'); -export const MylevelDescription = T('commandMylevelDescription'); -export const MylevelExtended = T('commandMylevelExtended'); -export const MylevelNext = FT<{ remaining: number; next: number }, string>('commandMylevelNext'); -export const MylevelSelf = FT<{ points: number; next: string }, string>('commandMylevelSelf'); -export const PayDescription = T('commandPayDescription'); -export const PayExtended = T('commandPayExtended'); -export const PayMissingMoney = FT<{ needed: number; has: number }, string>('commandPayMissingMoney'); -export const PayPrompt = FT<{ user: string; amount: number }, string>('commandPayPrompt'); -export const PayPromptAccept = FT<{ user: string; amount: number }, string>('commandPayPromptAccept'); -export const PayPromptDeny = T('commandPayPromptDeny'); -export const PaySelf = T('commandPaySelf'); -export const Profile = T('commandProfile'); -export const ProfileDescription = T('commandProfileDescription'); -export const ProfileExtended = T('commandProfileExtended'); -export const RemindmeCreate = FT<{ id: string }, string>('commandRemindmeCreate'); -export const RemindmeCreateNoDescription = T('commandRemindmeCreateNoDescription'); -export const RemindmeCreateNoDuration = T('commandRemindmeCreateNoDuration'); -export const RemindmeDelete = FT<{ task: ScheduleEntity; id: number }, string>('commandRemindmeDelete'); -export const RemindmeDeleteNoId = T('commandRemindmeDeleteNoId'); -export const RemindmeDescription = T('commandRemindmeDescription'); -export const RemindmeExtended = T('commandRemindmeExtended'); -export const RemindmeInvalidId = T('commandRemindmeInvalidId'); -export const RemindmeListEmpty = T('commandRemindmeListEmpty'); -export const RemindmeNotfound = T('commandRemindmeNotfound'); -export const RemindmeShowFooter = FT<{ id: number }, string>('commandRemindmeShowFooter'); -export const Reputation = FT<{ count: number }, string>('commandReputation'); -export const ReputationBots = T('commandReputationBots'); -export const ReputationDescription = T('commandReputationDescription'); -export const ReputationExtended = T('commandReputationExtended'); -export const ReputationGive = FT<{ user: string }, string>('commandReputationGive'); -export const ReputationPlural = FT<{ count: number }, string>('commandReputationPlural'); -export const Reputations = FT<{ user: string; points: string }, string>('commandReputations'); -export const ReputationsBots = T('commandReputationsBots'); -export const ReputationSelf = T('commandReputationSelf'); -export const ReputationsSelf = FT<{ points: number }, string>('commandReputationsSelf'); -export const ReputationTime = FT<{ remaining: number }, string>('commandReputationTime'); -export const ReputationUsable = T('commandReputationUsable'); -export const ReputationUserNotfound = T('commandReputationUserNotfound'); -export const SetColor = FT<{ color: string }, string>('commandSetColor'); -export const SetColorDescription = T('commandSetColorDescription'); -export const SetColorExtended = T('commandSetColorExtended'); -export const SocialAdd = FT<{ user: string; amount: number; count: number }, string>('commandSocialAdd'); -export const SocialAddPlural = FT<{ user: string; amount: number; count: number }, string>('commandSocialAddPlural'); -export const SocialDescription = T('commandSocialDescription'); -export const SocialExtended = T('commandSocialExtended'); -export const SocialMemberNotexists = T('commandSocialMemberNotexists'); -export const SocialPayBot = T('commandSocialPayBot'); -export const SocialRemove = FT<{ user: string; amount: number; count: number }, string>('commandSocialRemove'); -export const SocialRemovePlural = FT<{ user: string; amount: number; count: number }, string>('commandSocialRemovePlural'); -export const SocialReset = FT<{ user: string }, string>('commandSocialReset'); -export const SocialUnchanged = FT<{ user: string }, string>('commandSocialUnchanged'); -export const ToggleDarkModeDescription = T('commandToggleDarkModeDescription'); -export const ToggleDarkModeDisabled = T('commandToggleDarkModeDisabled'); -export const ToggleDarkModeEnabled = T('commandToggleDarkModeEnabled'); -export const ToggleDarkModeExtended = T('commandToggleDarkModeExtended'); -export const VaultDescription = T('commandVaultDescription'); +export const AutoRoleAdd = FT<{ role: Role; points: number }, string>('commands/social:autoRoleAdd'); +export const AutoRoleDescription = T('commands/social:autoRoleDescription'); +export const AutoRoleExtended = T('commands/social:autoRoleExtended'); +export const AutoRoleListEmpty = T('commands/social:autoRoleListEmpty'); +export const AutoRolePointsRequired = T('commands/social:autoRolePointsRequired'); +export const AutoRoleRemove = FT<{ role: Role; before: number }, string>('commands/social:autoRoleRemove'); +export const AutoRoleRequireRole = T('commands/social:autoRoleRequireRole'); +export const AutoRoleUnknownRole = FT<{ role: string }, string>('commands/social:autoRoleUnknownRole'); +export const AutoRoleUpdate = FT<{ role: Role; points: number; before: number }, string>('commands/social:autoRoleUpdate'); +export const AutoRoleUpdateConfigured = T('commands/social:autoRoleUpdateConfigured'); +export const AutoRoleUpdateUnconfigured = T('commands/social:autoRoleUpdateUnconfigured'); +export const Balance = FT<{ user: string; amount: string }, string>('commands/social:balance'); +export const BalanceBots = T('commands/social:balanceBots'); +export const BalanceDescription = T('commands/social:balanceDescription'); +export const BalanceExtended = T('commands/social:balanceExtended'); +export const BalanceSelf = FT<{ amount: string }, string>('commands/social:balanceSelf'); +export const BannerBought = FT<{ prefix: string; banner: string }, string>('commands/social:bannerBought'); +export const BannerBuy = FT<{ banner: string }, string>('commands/social:bannerBuy'); +export const BannerDescription = T('commands/social:bannerDescription'); +export const BannerExtended = T('commands/social:bannerExtended'); +export const BannerMissing = FT<{ type: string }, string>('commands/social:bannerMissing'); +export const BannerMoney = FT<{ money: number; cost: number }, string>('commands/social:bannerMoney'); +export const BannerNotExists = FT<{ prefix: string }, string>('commands/social:bannerNotexists'); +export const BannerPaymentCancelled = T('commands/social:bannerPaymentCancelled'); +export const BannerPrompt = T('commands/social:bannerPrompt'); +export const BannerReset = T('commands/social:bannerReset'); +export const BannerResetDefault = T('commands/social:bannerResetDefault'); +export const BannerSet = FT<{ banner: string }, string>('commands/social:bannerSet'); +export const BannerSetNotBought = T('commands/social:bannerSetNotBought'); +export const BannerUserListEmpty = FT<{ prefix: string }, string>('commands/social:bannerUserlistEmpty'); +export const DailyCollect = T('commands/social:dailyCollect'); +export const DailyDescription = T('commands/social:dailyDescription'); +export const DailyExtended = T('commands/social:dailyExtended'); +export const DailyGrace = FT<{ remaining: number }, string>('commands/social:dailyGrace'); +export const DailyGraceAccepted = FT<{ amount: number; remaining: number }, string>('commands/social:dailyGraceAccepted'); +export const DailyGraceDenied = T('commands/social:dailyGraceDenied'); +export const DailyTime = FT<{ time: number }, string>('commands/social:dailyTime'); +export const DailyTimeSuccess = FT<{ amount: number }, string>('commands/social:dailyTimeSuccess'); +export const DivorceCancel = T('commands/social:divorceCancel'); +export const DivorceDescription = T('commands/social:divorceDescription'); +export const DivorceDm = FT<{ user: string }, string>('commands/social:divorceDm'); +export const DivorceExtended = T('commands/social:divorceExtended'); +export const DivorceSelf = T('commands/social:divorceSelf'); +export const DivorceNotTaken = T('commands/social:divorceNotTaken'); +export const DivorcePrompt = T('commands/social:divorcePrompt'); +export const DivorceSuccess = FT<{ user: string }, string>('commands/social:divorceSuccess'); +export const LeaderboardDescription = T('commands/social:leaderboardDescription'); +export const LeaderboardExtended = T('commands/social:leaderboardExtended'); +export const LeaderboardListifyPage = FT<{ page: number; pageCount: number; results: number }, string>('commands/social:leaderboardListifyPage'); +export const Level = T('commands/social:level'); +export const LevelDescription = T('commands/social:levelDescription'); +export const LevelExtended = T('commands/social:levelExtended'); +export const MarryAccepted = FT<{ author: string; user: string }, string>('commands/social:marryAccepted'); +export const MarryAlreadyMarried = FT<{ user: User }, string>('commands/social:marryAlreadyMarried'); +export const MarryAuthorMultipleCancel = FT<{ user: string }, string>('commands/social:marryAuthorMultipleCancel'); +export const MarryAuthorTaken = FT<{ author: User }, string>('commands/social:marryAuthorTaken'); +export const MarryAuthorTooMany = FT<{ limit: number }, string>('commands/social:marryAuthorTooMany'); +export const MarryBots = T('commands/social:marryBots'); +export const MarryDenied = T('commands/social:marryDenied'); +export const MarryDescription = T('commands/social:marryDescription'); +export const MarryExtended = T('commands/social:marryExtended'); +export const MarryMultipleCancel = T('commands/social:marryMultipleCancel'); +export const MarryNoReply = T('commands/social:marryNoreply'); +export const MarryNotTaken = T('commands/social:marryNotTaken'); +export const MarryPetition = FT<{ author: User; user: User }, string>('commands/social:marryPetition'); +export const MarrySelf = T('commands/social:marrySelf'); +export const MarrySkyra = T('commands/social:marrySkyra'); +export const MarryAelia = T('commands/social:marryAelia'); +export const MarryTaken = FT<{ count: number }, string>('commands/social:marryTaken'); +export const MarryTargetTooMany = FT<{ limit: number }, string>('commands/social:marryTargetTooMany'); +export const MarryWith = FT<{ users: readonly string[] }, string>('commands/social:marryWith'); +export const MarriedDescription = T('commands/social:marriedDescription'); +export const MarriedExtended = T('commands/social:marriedExtended'); +export const MyLevel = FT<{ points: number; next: string; user: string }, string>('commands/social:mylevel'); +export const MyLevelDescription = T('commands/social:mylevelDescription'); +export const MyLevelExtended = T('commands/social:mylevelExtended'); +export const MyLevelNext = FT<{ remaining: number; next: number }, string>('commands/social:mylevelNext'); +export const MyLevelSelf = FT<{ points: number; next: string }, string>('commands/social:mylevelSelf'); +export const PayDescription = T('commands/social:payDescription'); +export const PayExtended = T('commands/social:payExtended'); +export const PayMissingMoney = FT<{ needed: number; has: number }, string>('commands/social:payMissingMoney'); +export const PayPrompt = FT<{ user: string; amount: number }, string>('commands/social:payPrompt'); +export const PayPromptAccept = FT<{ user: string; amount: number }, string>('commands/social:payPromptAccept'); +export const PayPromptDeny = T('commands/social:payPromptDeny'); +export const PaySelf = T('commands/social:paySelf'); +export const Profile = T('commands/social:profile'); +export const ProfileMoney = FT<{ money: number; vault: number }, string>('commands/social:profileMoney'); +export const ProfileDescription = T('commands/social:profileDescription'); +export const ProfileExtended = T('commands/social:profileExtended'); +export const RemindMeCreate = FT<{ id: string }, string>('commands/social:remindmeCreate'); +export const RemindMeCreateNoDescription = T('commands/social:remindmeCreateNoDescription'); +export const RemindMeCreateNoDuration = T('commands/social:remindmeCreateNoDuration'); +export const RemindMeDelete = FT<{ task: ScheduleEntity; id: number }, string>('commands/social:remindmeDelete'); +export const RemindMeDeleteNoID = T('commands/social:remindmeDeleteNoId'); +export const RemindMeDescription = T('commands/social:remindmeDescription'); +export const RemindMeExtended = T('commands/social:remindmeExtended'); +export const RemindMeInvalidId = T('commands/social:remindmeInvalidId'); +export const RemindMeListEmpty = T('commands/social:remindmeListEmpty'); +export const RemindMeNotFound = T('commands/social:remindmeNotfound'); +export const RemindMeShowFooter = FT<{ id: number }, string>('commands/social:remindmeShowFooter'); +export const Reputation = FT<{ count: number }, string>('commands/social:reputation'); +export const ReputationBots = T('commands/social:reputationBots'); +export const ReputationDescription = T('commands/social:reputationDescription'); +export const ReputationExtended = T('commands/social:reputationExtended'); +export const ReputationGive = FT<{ user: string }, string>('commands/social:reputationGive'); +export const Reputations = FT<{ user: string; points: string }, string>('commands/social:reputations'); +export const ReputationsBots = T('commands/social:reputationsBots'); +export const ReputationSelf = T('commands/social:reputationSelf'); +export const ReputationsSelf = FT<{ points: number }, string>('commands/social:reputationsSelf'); +export const ReputationTime = FT<{ remaining: number }, string>('commands/social:reputationTime'); +export const ReputationUsable = T('commands/social:reputationUsable'); +export const ReputationUserNotFound = T('commands/social:reputationUserNotfound'); +export const SetColor = FT<{ color: string }, string>('commands/social:setColor'); +export const SetColorDescription = T('commands/social:setColorDescription'); +export const SetColorExtended = T('commands/social:setColorExtended'); +export const ScoreboardPosition = FT<{ position: number }, string>('commands/social:scoreboardPosition'); +export const SocialAdd = FT<{ user: string; amount: number; count: number }, string>('commands/social:socialAdd'); +export const SocialDescription = T('commands/social:socialDescription'); +export const SocialExtended = T('commands/social:socialExtended'); +export const SocialMemberNotExists = T('commands/social:socialMemberNotexists'); +export const SocialPayBot = T('commands/social:socialPayBot'); +export const SocialRemove = FT<{ user: string; amount: number; count: number }, string>('commands/social:socialRemove'); +export const SocialReset = FT<{ user: string }, string>('commands/social:socialReset'); +export const SocialUnchanged = FT<{ user: string }, string>('commands/social:socialUnchanged'); +export const ToggleDarkModeDescription = T('commands/social:toggleDarkModeDescription'); +export const ToggleDarkModeDisabled = T('commands/social:toggleDarkModeDisabled'); +export const ToggleDarkModeEnabled = T('commands/social:toggleDarkModeEnabled'); +export const ToggleDarkModeExtended = T('commands/social:toggleDarkModeExtended'); +export const VaultDescription = T('commands/social:vaultDescription'); export const VaultEmbedData = FT< { coins?: number; @@ -157,8 +157,8 @@ export const VaultEmbedData = FT< accountMoney: string; accountVault: string; } ->('commandVaultEmbedData'); -export const VaultExtended = T('commandVaultExtended'); -export const VaultInvalidCoins = T('commandVaultInvalidCoins'); -export const VaultNotEnoughInVault = FT<{ vault: number }, string>('commandVaultNotEnoughInVault'); -export const VaultNotEnoughMoney = FT<{ money: number }, string>('commandVaultNotEnoughMoney'); +>('commands/social:vaultEmbedData'); +export const VaultExtended = T('commands/social:vaultExtended'); +export const VaultInvalidCoins = T('commands/social:vaultInvalidCoins'); +export const VaultNotEnoughInVault = FT<{ vault: number }, string>('commands/social:vaultNotEnoughInVault'); +export const VaultNotEnoughMoney = FT<{ money: number }, string>('commands/social:vaultNotEnoughMoney'); diff --git a/src/lib/types/namespaces/languages/commands/Starboard.ts b/src/lib/types/namespaces/languages/commands/Starboard.ts index a8accfc2d82..f1772c9093d 100644 --- a/src/lib/types/namespaces/languages/commands/Starboard.ts +++ b/src/lib/types/namespaces/languages/commands/Starboard.ts @@ -1,19 +1,15 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const StarDescription = T('commandStarDescription'); -export const StarExtended = T('commandStarExtended'); -export const StarNoStars = T('commandStarNostars'); -export const StarNoChannel = T('commandStarNoChannel'); -export const StarStats = T('commandStarStats'); -export const StarStatsDescription = FT<{ messages: string; stars: string }, string>('commandStarStatsDescription'); -export const StarMessages = FT<{ count: number }, string>('commandStarMessages'); -export const StarMessagesPlural = FT<{ count: number }, string>('commandStarMessagesPlural'); -export const Stars = FT<{ count: number }, string>('commandStars'); -export const StarsPlural = FT<{ count: number }, string>('commandStarsPlural'); -export const StarTopstarred = T('commandStarTopstarred'); -export const StarTopstarredDescription = FT<{ medal: string; id: string; count: number }, string>('commandStarTopstarredDescription'); -export const StarTopstarredDescriptionPlural = FT<{ medal: string; id: string; count: number }, string>('commandStarTopstarredDescriptionPlural'); -export const StarTopreceivers = T('commandStarTopreceivers'); -export const StarTopreceiversDescription = FT<{ medal: string; id: string; count: number }, string>('commandStarTopreceiversDescription'); -export const StarTopreceiversDescriptionPlural = FT<{ medal: string; id: string; count: number }, string>('commandStarTopreceiversDescriptionPlural'); +export const StarDescription = T('commands/starboard:starDescription'); +export const StarExtended = T('commands/starboard:starExtended'); +export const StarMessages = FT<{ count: number }, string>('commands/starboard:starMessages'); +export const StarNoChannel = T('commands/starboard:starNoChannel'); +export const StarNoStars = T('commands/starboard:starNostars'); +export const Stars = FT<{ count: number }, string>('commands/starboard:stars'); +export const StarStats = T('commands/starboard:starStats'); +export const StarStatsDescription = FT<{ messages: string; stars: string }, string>('commands/starboard:starStatsDescription'); +export const StarTopReceivers = T('commands/starboard:starTopreceivers'); +export const StarTopReceiversDescription = FT<{ medal: string; id: string; count: number }, string>('commands/starboard:starTopreceiversDescription'); +export const StarTopStarred = T('commands/starboard:starTopstarred'); +export const StarTopStarredDescription = FT<{ medal: string; id: string; count: number }, string>('commands/starboard:starTopstarredDescription'); diff --git a/src/lib/types/namespaces/languages/commands/Suggestions.ts b/src/lib/types/namespaces/languages/commands/Suggestions.ts index 9d71e54ef4c..1c0a51600c7 100644 --- a/src/lib/types/namespaces/languages/commands/Suggestions.ts +++ b/src/lib/types/namespaces/languages/commands/Suggestions.ts @@ -1,23 +1,6 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const SuggestDescription = T('commandSuggestDescription'); -export const SuggestExtended = T('commandSuggestExtended'); -export const ResolveSuggestionDescription = T('commandResolveSuggestionDescription'); -export const ResolveSuggestionExtended = T('commandResolveSuggestionExtended'); -export const SuggestNoSetup = FT<{ username: string }, string>('commandSuggestNoSetup'); -export const SuggestNoSetupAsk = FT<{ username: string }, string>('commandSuggestNoSetupAsk'); -export const SuggestNoSetupAbort = T('commandSuggestNoSetupAbort'); -export const SuggestNopermissions = FT<{ username: string; channel: string }, string>('commandSuggestNopermissions'); -export const SuggestChannelPrompt = T('commandSuggestChannelPrompt'); -export const SuggestTitle = FT<{ id: number }, string>('commandSuggestTitle'); -export const SuggestSuccess = FT<{ channel: string }, string>('commandSuggestSuccess'); -export const ResolveSuggestionInvalidId = T('commandResolveSuggestionInvalidId'); -export const ResolveSuggestionMessageNotFound = T('commandResolveSuggestionMessageNotFound'); -export const ResolveSuggestionIdNotFound = T('commandResolveSuggestionIdNotFound'); -export const ResolveSuggestionDefaultComment = T('commandResolveSuggestionDefaultComment'); -export const ResolveSuggestionAuthorAdmin = T('commandResolveSuggestionAuthorAdmin'); -export const ResolveSuggestionAuthorModerator = T('commandResolveSuggestionAuthorModerator'); export const ResolveSuggestionActions = FT< { author: string; @@ -27,7 +10,7 @@ export const ResolveSuggestionActions = FT< consider: string; deny: string; } ->('commandResolveSuggestionActions'); +>('commands/suggestion:resolveSuggestionActions'); export const ResolveSuggestionActionsDms = FT< { author: string; @@ -38,9 +21,26 @@ export const ResolveSuggestionActionsDms = FT< consider: string; deny: string; } ->('commandResolveSuggestionActionsDms'); -export const ResolveSuggestionDmFail = T('commandResolveSuggestionDmFail'); -export const ResolveSuggestionSuccess = FT<{ id: number; actionText: string }, string>('commandResolveSuggestionSuccess'); -export const ResolveSuggestionSuccessAcceptedText = T('commandResolveSuggestionSuccessAcceptedText'); -export const ResolveSuggestionSuccessDeniedText = T('commandResolveSuggestionSuccessDeniedText'); -export const ResolveSuggestionSuccessConsideredText = T('commandResolveSuggestionSuccessConsideredText'); +>('commands/suggestion:resolveSuggestionActionsDms'); +export const ResolveSuggestionAuthorAdmin = T('commands/suggestion:resolveSuggestionAuthorAdmin'); +export const ResolveSuggestionAuthorModerator = T('commands/suggestion:resolveSuggestionAuthorModerator'); +export const ResolveSuggestionDefaultComment = T('commands/suggestion:resolveSuggestionDefaultComment'); +export const ResolveSuggestionDescription = T('commands/suggestion:resolveSuggestionDescription'); +export const ResolveSuggestionDmFail = T('commands/suggestion:resolveSuggestionDmFail'); +export const ResolveSuggestionExtended = T('commands/suggestion:resolveSuggestionExtended'); +export const ResolveSuggestionIDNotFound = T('commands/suggestion:resolveSuggestionIdNotFound'); +export const ResolveSuggestionInvalidID = T('commands/suggestion:resolveSuggestionInvalidId'); +export const ResolveSuggestionMessageNotFound = T('commands/suggestion:resolveSuggestionMessageNotFound'); +export const ResolveSuggestionSuccess = FT<{ id: number; actionText: string }, string>('commands/suggestion:resolveSuggestionSuccess'); +export const ResolveSuggestionSuccessAcceptedText = T('commands/suggestion:resolveSuggestionSuccessAcceptedText'); +export const ResolveSuggestionSuccessConsideredText = T('commands/suggestion:resolveSuggestionSuccessConsideredText'); +export const ResolveSuggestionSuccessDeniedText = T('commands/suggestion:resolveSuggestionSuccessDeniedText'); +export const SuggestChannelPrompt = T('commands/suggestion:suggestChannelPrompt'); +export const SuggestDescription = T('commands/suggestion:suggestDescription'); +export const SuggestExtended = T('commands/suggestion:suggestExtended'); +export const SuggestNoPermissions = FT<{ username: string; channel: string }, string>('commands/suggestion:suggestNopermissions'); +export const SuggestNoSetup = FT<{ username: string }, string>('commands/suggestion:suggestNoSetup'); +export const SuggestNoSetupAbort = T('commands/suggestion:suggestNoSetupAbort'); +export const SuggestNoSetupAsk = FT<{ username: string }, string>('commands/suggestion:suggestNoSetupAsk'); +export const SuggestSuccess = FT<{ channel: string }, string>('commands/suggestion:suggestSuccess'); +export const SuggestTitle = FT<{ id: number }, string>('commands/suggestion:suggestTitle'); diff --git a/src/lib/types/namespaces/languages/commands/System.ts b/src/lib/types/namespaces/languages/commands/System.ts index 30d1e0c056b..7ac3ebdaf18 100644 --- a/src/lib/types/namespaces/languages/commands/System.ts +++ b/src/lib/types/namespaces/languages/commands/System.ts @@ -2,47 +2,52 @@ import { FT, T } from '#lib/types'; import { StatsGeneral, StatsUptime, StatsUsage } from '#root/commands/System/stats'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const Disable = FT<{ type: string; name: string }, string>('commandDisable'); -export const DisableDescription = T('commandDisableDescription'); -export const DisableWarn = T('commandDisableWarn'); -export const DmDescription = T('commandDmDescription'); -export const DmExtended = T('commandDmExtended'); -export const DmNotSent = T('commandDmNotSent'); -export const DmSent = T('commandDmSent'); -export const DonateDescription = T('commandDonateDescription'); -export const DonateExtended = T('commandDonateExtended'); -export const EchoDescription = T('commandEchoDescription'); -export const EchoExtended = T('commandEchoExtended'); -export const Enable = FT<{ type: string; name: string }, string>('commandEnable'); -export const EnableDescription = T('commandEnableDescription'); -export const EvalDescription = T('commandEvalDescription'); -export const EvalError = FT<{ time: string; output: string; type: string }, string>('commandEvalError'); -export const EvalExtended = T('commandEvalExtended'); -export const EvalTimeout = FT<{ seconds: number }, string>('commandEvalTimeout'); -export const ExecDescription = T('commandExecDescription'); -export const ExecExtended = T('commandExecExtended'); -export const FeedbackDescription = T('commandFeedbackDescription'); -export const FeedbackExtended = T('commandFeedbackExtended'); -export const Load = FT<{ time: string; type: string; name: string }, string>('commandLoad'); -export const LoadDescription = T('commandLoadDescription'); -export const LoadError = FT<{ type: string; name: string; error: string }, string>('commandLoadError'); -export const LoadFail = T('commandLoadFail'); -export const Reboot = T('commandReboot'); -export const RebootDescription = T('commandRebootDescription'); -export const Reload = FT<{ type: string; name: string; time: string }, string>('commandReload'); -export const ReloadAll = FT<{ type: string; time: string }, string>('commandReloadAll'); -export const ReloadDescription = T('commandReloadDescription'); -export const ReloadEverything = FT<{ time: string }, string>('commandReloadEverything'); -export const ReloadFailed = FT<{ type: string; name: string }, string>('commandReloadFailed'); -export const SetAvatarDescription = T('commandSetAvatarDescription'); -export const SetAvatarExtended = T('commandSetAvatarExtended'); -export const StatsDescription = T('commandStatsDescription'); -export const StatsExtended = T('commandStatsExtended'); +export const Disable = FT<{ type: string; name: string }, string>('commands/system:disable'); +export const DisableDescription = T('commands/system:disableDescription'); +export const DisableExtended = T('commands/system:disableExtended'); +export const DisableWarn = T('commands/system:disableWarn'); +export const DmDescription = T('commands/system:dmDescription'); +export const DmExtended = T('commands/system:dmExtended'); +export const DmNotSent = T('commands/system:dmNotSent'); +export const DmSent = T('commands/system:dmSent'); +export const DonateDescription = T('commands/system:donateDescription'); +export const DonateExtended = T('commands/system:donateExtended'); +export const EchoDescription = T('commands/system:echoDescription'); +export const EchoExtended = T('commands/system:echoExtended'); +export const Enable = FT<{ type: string; name: string }, string>('commands/system:enable'); +export const EnableDescription = T('commands/system:enableDescription'); +export const EnableExtended = T('commands/system:enableExtended'); +export const EvalDescription = T('commands/system:evalDescription'); +export const EvalError = FT<{ time: string; output: string; type: string }, string>('commands/system:evalError'); +export const EvalExtended = T('commands/system:evalExtended'); +export const EvalTimeout = FT<{ seconds: number }, string>('commands/system:evalTimeout'); +export const ExecDescription = T('commands/system:execDescription'); +export const ExecExtended = T('commands/system:execExtended'); +export const FeedbackDescription = T('commands/system:feedbackDescription'); +export const FeedbackExtended = T('commands/system:feedbackExtended'); +export const Load = FT<{ time: string; type: string; name: string }, string>('commands/system:load'); +export const LoadDescription = T('commands/system:loadDescription'); +export const LoadExtended = T('commands/system:loadExtended'); +export const LoadError = FT<{ type: string; name: string; error: string }, string>('commands/system:loadError'); +export const LoadFail = T('commands/system:loadFail'); +export const Reboot = T('commands/system:reboot'); +export const RebootDescription = T('commands/system:rebootDescription'); +export const RebootExtended = T('commands/system:rebootExtended'); +export const Reload = FT<{ type: string; name: string; time: string }, string>('commands/system:reload'); +export const ReloadAll = FT<{ type: string; time: string }, string>('commands/system:reloadAll'); +export const ReloadDescription = T('commands/system:reloadDescription'); +export const ReloadExtended = T('commands/system:reloadExtended'); +export const ReloadEverything = FT<{ time: string }, string>('commands/system:reloadEverything'); +export const ReloadFailed = FT<{ type: string; name: string }, string>('commands/system:reloadFailed'); +export const SetAvatarDescription = T('commands/system:setAvatarDescription'); +export const SetAvatarExtended = T('commands/system:setAvatarExtended'); +export const StatsDescription = T('commands/system:statsDescription'); +export const StatsExtended = T('commands/system:statsExtended'); export const StatsTitles = T<{ stats: string; uptime: string; serverUsage: string; -}>('commandStatsTitles'); +}>('commands/system:statsTitles'); export const StatsFields = FT< { stats: StatsGeneral; @@ -50,18 +55,20 @@ export const StatsFields = FT< usage: StatsUsage; }, { - stats: string[]; - uptime: string[]; - serverUsage: string[]; + stats: string; + uptime: string; + serverUsage: string; } ->('commandStatsFields'); -export const SupportDescription = T('commandSupportDescription'); -export const SupportEmbedDescription = T('commandSupportEmbedDescription'); -export const SupportEmbedTitle = FT<{ username: string }, string>('commandSupportEmbedTitle'); -export const SupportExtended = T('commandSupportExtended'); -export const TransferDescription = T('commandTransferDescription'); -export const TransferError = T('commandTransferError'); -export const TransferFailed = FT<{ type: string; name: string }, string>('commandTransferFailed'); -export const TransferSuccess = FT<{ type: string; name: string }, string>('commandTransferSuccess'); -export const Unload = FT<{ type: string; name: string }, string>('commandUnload'); -export const UnloadDescription = T('commandUnloadDescription'); +>('commands/system:statsFields'); +export const SupportDescription = T('commands/system:supportDescription'); +export const SupportEmbedDescription = T('commands/system:supportEmbedDescription'); +export const SupportEmbedTitle = FT<{ username: string }, string>('commands/system:supportEmbedTitle'); +export const SupportExtended = T('commands/system:supportExtended'); +export const TransferDescription = T('commands/system:transferDescription'); +export const TransferError = T('commands/system:transferError'); +export const TransferFailed = FT<{ type: string; name: string }, string>('commands/system:transferFailed'); +export const TransferSuccess = FT<{ type: string; name: string }, string>('commands/system:transferSuccess'); +export const Unload = FT<{ type: string; name: string }, string>('commands/system:unload'); +export const UnloadDescription = T('commands/system:unloadDescription'); +export const UnloadExtended = T('commands/system:unloadExtended'); +export const UnloadWarn = T('commands/system:unloadWarn'); diff --git a/src/lib/types/namespaces/languages/commands/Tags.ts b/src/lib/types/namespaces/languages/commands/Tags.ts index 2aee62db516..fe8cef3c0bd 100644 --- a/src/lib/types/namespaces/languages/commands/Tags.ts +++ b/src/lib/types/namespaces/languages/commands/Tags.ts @@ -1,16 +1,16 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const TagAdded = FT<{ name: string; content: string }, string>('commandTagAdded'); -export const TagContentRequired = T('commandTagContentRequired'); -export const TagDescription = T('commandTagDescription'); -export const TagEdited = FT<{ name: string; content: string }, string>('commandTagEdited'); -export const TagExists = FT<{ tag: string }, string>('commandTagExists'); -export const TagExtended = T('commandTagExtended'); -export const TagListEmpty = T('commandTagListEmpty'); -export const TagNameNotAllowed = T('commandTagNameNotAllowed'); -export const TagNameTooLong = T('commandTagNameTooLong'); -export const TagNotExists = FT<{ tag: string }, string>('commandTagNotexists'); -export const TagPermissionLevel = T('commandTagPermissionlevel'); -export const TagRemoved = FT<{ name: string }, string>('commandTagRemoved'); -export const TagReset = T('commandTagReset'); +export const TagAdded = FT<{ name: string; content: string }, string>('commands/tags:added'); +export const TagContentRequired = T('commands/tags:contentRequired'); +export const TagDescription = T('commands/tags:description'); +export const TagEdited = FT<{ name: string; content: string }, string>('commands/tags:edited'); +export const TagExists = FT<{ tag: string }, string>('commands/tags:exists'); +export const TagExtended = T('commands/tags:extended'); +export const TagListEmpty = T('commands/tags:listEmpty'); +export const TagNameNotAllowed = T('commands/tags:nameNotAllowed'); +export const TagNameTooLong = T('commands/tags:nameTooLong'); +export const TagNotExists = FT<{ tag: string }, string>('commands/tags:notexists'); +export const TagPermissionLevel = T('commands/tags:permissionlevel'); +export const TagRemoved = FT<{ name: string }, string>('commands/tags:removed'); +export const TagReset = T('commands/tags:reset'); diff --git a/src/lib/types/namespaces/languages/commands/Tools.ts b/src/lib/types/namespaces/languages/commands/Tools.ts index 9b68129256f..6e150a53740 100644 --- a/src/lib/types/namespaces/languages/commands/Tools.ts +++ b/src/lib/types/namespaces/languages/commands/Tools.ts @@ -2,29 +2,29 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; import { Guild, GuildMember, User } from 'discord.js'; -export const WikipediaNotfound = T('commandWikipediaNotfound'); -export const YoutubeNotfound = T('commandYoutubeNotfound'); -export const YoutubeIndexNotfound = T('commandYoutubeIndexNotfound'); -export const DefineDescription = T('commandDefineDescription'); -export const DefineExtended = T('commandDefineExtended'); -export const DefineNotfound = T('commandDefineNotfound'); -export const DefinePronounciation = T('commandDefinePronounciation'); -export const DefineUnknown = T('commandDefineUnknown'); -export const AvatarDescription = T('commandAvatarDescription'); -export const AvatarExtended = T('commandAvatarExtended'); -export const ColorDescription = T('commandColorDescription'); -export const ColorExtended = T('commandColorExtended'); -export const ContentDescription = T('commandContentDescription'); -export const ContentExtended = T('commandContentExtended'); -export const EmojiDescription = T('commandEmojiDescription'); -export const EmojiExtended = T('commandEmojiExtended'); -export const CountryDescription = T('commandCountryDescription'); -export const CountryExtended = T('commandCountryExtended'); +export const WikipediaNotFound = T('commands/tools:wikipediaNotfound'); +export const YouTubeNotFound = T('commands/tools:youtubeNotfound'); +export const YouTubeIndexNotFound = T('commands/tools:youtubeIndexNotfound'); +export const DefineDescription = T('commands/tools:defineDescription'); +export const DefineExtended = T('commands/tools:defineExtended'); +export const DefineNotFound = T('commands/tools:defineNotfound'); +export const DefinePronunciation = T('commands/tools:definePronounciation'); +export const DefineUnknown = T('commands/tools:defineUnknown'); +export const AvatarDescription = T('commands/tools:avatarDescription'); +export const AvatarExtended = T('commands/tools:avatarExtended'); +export const ColorDescription = T('commands/tools:colorDescription'); +export const ColorExtended = T('commands/tools:colorExtended'); +export const ContentDescription = T('commands/tools:contentDescription'); +export const ContentExtended = T('commands/tools:contentExtended'); +export const EmojiDescription = T('commands/tools:emojiDescription'); +export const EmojiExtended = T('commands/tools:emojiExtended'); +export const CountryDescription = T('commands/tools:countryDescription'); +export const CountryExtended = T('commands/tools:countryExtended'); export const CountryTitles = T<{ OVERVIEW: string; LANGUAGES: string; OTHER: string; -}>('commandCountryTitles'); +}>('commands/tools:countryTitles'); export const CountryFields = T<{ overview: { officialName: string; @@ -36,10 +36,10 @@ export const CountryFields = T<{ area: string; currencies: string; }; -}>('commandCountryFields'); -export const EshopDescription = T('commandEshopDescription'); -export const EshopExtended = T('commandEshopExtended'); -export const EshopNotInDatabase = T('commandEshopNotInDatabase'); +}>('commands/tools:countryFields'); +export const EshopDescription = T('commands/tools:eshopDescription'); +export const EshopExtended = T('commands/tools:eshopExtended'); +export const EshopNotInDatabase = T('commands/tools:eshopNotInDatabase'); export const EshopTitles = T<{ price: string; availability: string; @@ -50,12 +50,12 @@ export const EshopTitles = T<{ noCategories: string; nsuid: 'NSUID'; esrb: 'ESRB'; -}>('commandEshopTitles'); -export const EshopPricePaid = FT<{ price: number }, string>('commandEshopPricePaid'); -export const EshopPriceFree = T('commandEshopPriceFree'); -export const HoroscopeDescription = T('commandHoroscopeDescription'); -export const HoroscopeExtended = T('commandHoroscopeExtended'); -export const HoroscopeInvalidSunsign = FT<{ sign: string; maybe: string }, string>('commandHoroscopeInvalidSunsign'); +}>('commands/tools:eshopTitles'); +export const EshopPricePaid = FT<{ price: number }, string>('commands/tools:eshopPricePaid'); +export const EshopPriceFree = T('commands/tools:eshopPriceFree'); +export const HoroscopeDescription = T('commands/tools:horoscopeDescription'); +export const HoroscopeExtended = T('commands/tools:horoscopeExtended'); +export const HoroscopeInvalidSunsign = FT<{ sign: string; maybe: string }, string>('commands/tools:horoscopeInvalidSunsign'); export const HoroscopeTitles = FT< { sign: string; @@ -69,9 +69,9 @@ export const HoroscopeTitles = FT< metadataTitle: string; metadata: readonly string[]; } ->('commandHoroscopeTitles'); -export const IgdbDescription = T('commandIgdbDescription'); -export const IgdbExtended = T('commandIgdbExtended'); +>('commands/tools:horoscopeTitles'); +export const IgdbDescription = T('commands/tools:igdbDescription'); +export const IgdbExtended = T('commands/tools:igdbExtended'); export const IgdbTitles = T<{ userScore: string; ageRating: string; @@ -79,7 +79,7 @@ export const IgdbTitles = T<{ genres: string; developers: string; platform: string; -}>('commandIgdbTitles'); +}>('commands/tools:igdbTitles'); export const IgdbData = T<{ noDevelopers: string; noPlatforms: string; @@ -88,10 +88,10 @@ export const IgdbData = T<{ noSummary: string; noAgeRatings: string; noGenres: string; -}>('commandIgdbData'); -export const ItunesDescription = T('commandItunesDescription'); -export const ItunesExtended = T('commandItunesExtended'); -export const ItunesTitles = T<{ +}>('commands/tools:igdbData'); +export const ITunesDescription = T('commands/tools:itunesDescription'); +export const ITunesExtended = T('commands/tools:itunesExtended'); +export const ITunesTitles = T<{ artist: string; collection: string; collectionPrice: string; @@ -101,9 +101,9 @@ export const ItunesTitles = T<{ primaryGenre: string; preview: string; previewLabel: string; -}>('commandItunesTitles'); -export const MoviesDescription = T('commandMoviesDescription'); -export const MoviesExtended = T('commandMoviesExtended'); +}>('commands/tools:itunesTitles'); +export const MoviesDescription = T('commands/tools:moviesDescription'); +export const MoviesExtended = T('commands/tools:moviesExtended'); export const MoviesTitles = T<{ runtime: string; userScore: string; @@ -113,7 +113,7 @@ export const MoviesTitles = T<{ homePage: string; collection: string; genres: string; -}>('commandMoviesTitles'); +}>('commands/tools:moviesTitles'); export const MoviesData = T<{ variableRuntime: string; movieInProduction: string; @@ -121,36 +121,36 @@ export const MoviesData = T<{ none: string; notPartOfCollection: string; noGenres: string; -}>('commandMoviesData'); -export const ShowsDescription = T('commandShowsDescription'); -export const ShowsExtended = T('commandShowsExtended'); +}>('commands/tools:moviesData'); +export const ShowsDescription = T('commands/tools:showsDescription'); +export const ShowsExtended = T('commands/tools:showsExtended'); export const ShowsTitles = T<{ episodeRuntime: string; userScore: string; status: string; firstAirDate: string; genres: string; -}>('commandShowsTitles'); +}>('commands/tools:showsTitles'); export const ShowsData = T<{ variableRuntime: string; unknownUserScore: string; noGenres: string; -}>('commandShowsData'); -export const DuckDuckGoDescription = T('commandDuckDuckGoDescription'); -export const DuckDuckGoExtended = T('commandDuckDuckGoExtended'); -export const PriceDescription = T('commandPriceDescription'); -export const PriceExtended = T('commandPriceExtended'); -export const QuoteDescription = T('commandQuoteDescription'); -export const QuoteExtended = T('commandQuoteExtended'); -export const PollDescription = T('commandPollDescription'); -export const PollExtended = T('commandPollExtended'); -export const PollReactionLimit = T('commandPollReactionLimit'); -export const VoteDescription = T('commandVoteDescription'); -export const VoteExtended = T('commandVoteExtended'); -export const TopInvitesDescription = T('commandTopInvitesDescription'); -export const TopInvitesExtended = T('commandTopInvitesExtended'); -export const TopInvitesNoInvites = T('commandTopInvitesNoInvites'); -export const TopInvitesTop10InvitesFor = FT<{ guild: Guild }, string>('commandTopInvitesTop10InvitesFor'); +}>('commands/tools:showsData'); +export const DuckDuckGoDescription = T('commands/tools:duckDuckGoDescription'); +export const DuckDuckGoExtended = T('commands/tools:duckDuckGoExtended'); +export const PriceDescription = T('commands/tools:priceDescription'); +export const PriceExtended = T('commands/tools:priceExtended'); +export const QuoteDescription = T('commands/tools:quoteDescription'); +export const QuoteExtended = T('commands/tools:quoteExtended'); +export const PollDescription = T('commands/tools:pollDescription'); +export const PollExtended = T('commands/tools:pollExtended'); +export const PollReactionLimit = T('commands/tools:pollReactionLimit'); +export const VoteDescription = T('commands/tools:voteDescription'); +export const VoteExtended = T('commands/tools:voteExtended'); +export const TopInvitesDescription = T('commands/tools:topInvitesDescription'); +export const TopInvitesExtended = T('commands/tools:topInvitesExtended'); +export const TopInvitesNoInvites = T('commands/tools:topInvitesNoInvites'); +export const TopInvitesTop10InvitesFor = FT<{ guild: Guild }, string>('commands/tools:topInvitesTop10InvitesFor'); export const TopInvitesEmbedData = T<{ channel: string; link: string; @@ -160,34 +160,36 @@ export const TopInvitesEmbedData = T<{ neverExpress: string; temporary: string; uses: string; -}>('commandTopInvitesEmbedData'); -export const UrbanDescription = T('commandUrbanDescription'); -export const UrbanExtended = T('commandUrbanExtended'); -export const WhoisDescription = T('commandWhoisDescription'); -export const WhoisExtended = T('commandWhoisExtended'); -export const AvatarNone = T('commandAvatarNone'); -export const Color = FT<{ hex: string; rgb: string; hsl: string }, string[]>('commandColor'); -export const EmojiCustom = FT<{ emoji: string; id: string }, string[]>('commandEmojiCustom'); -export const EmojiTwemoji = FT<{ emoji: string; id: string }, string[]>('commandEmojiTwemoji'); -export const EmojiInvalid = T('commandEmojiInvalid'); -export const EmojiTooLarge = FT<{ emoji: string }, string>('commandEmojiTooLarge'); -export const EmotesDescription = T('commandEmotesDescription'); -export const EmotesExtended = T('commandEmotesExtended'); -export const EmotesTitle = T('commandEmotesTitle'); -export const PriceCurrency = FT<{ fromCurrency: string; fromAmount: number; worths: string[] }, string>('commandPriceCurrency'); -export const PriceCurrencyNotFound = T('commandPriceCurrencyNotFound'); -export const QuoteMessage = T('commandQuoteMessage'); -export const DuckDuckGoNotfound = T('commandDuckDuckGoNotfound'); -export const DuckDuckGoLookalso = T('commandDuckDuckGoLookalso'); -export const UrbanNotFound = T('commandUrbanNotFound'); -export const UrbanIndexNotfound = T('commandUrbanIndexNotfound'); +}>('commands/tools:topInvitesEmbedData'); +export const UrbanDescription = T('commands/tools:urbanDescription'); +export const UrbanExtended = T('commands/tools:urbanExtended'); +export const WhoisDescription = T('commands/tools:whoisDescription'); +export const WhoisExtended = T('commands/tools:whoisExtended'); +export const AvatarNone = T('commands/tools:avatarNone'); +export const Color = FT<{ hex: string; rgb: string; hsl: string }, string>('commands/tools:color'); +export const EmojiCustom = FT<{ emoji: string; id: string }, string>('commands/tools:emojiCustom'); +export const EmojiTwemoji = FT<{ emoji: string; id: string }, string>('commands/tools:emojiTwemoji'); +export const EmojiInvalid = T('commands/tools:emojiInvalid'); +export const EmojiTooLarge = FT<{ emoji: string }, string>('commands/tools:emojiTooLarge'); +export const EmotesDescription = T('commands/tools:emotesDescription'); +export const EmotesExtended = T('commands/tools:emotesExtended'); +export const EmotesTitle = T('commands/tools:emotesTitle'); +export const PriceCurrency = FT<{ fromCurrency: string; fromAmount: number; worths: string[] }, string>('commands/tools:priceCurrency'); +export const PriceCurrencyNotFound = T('commands/tools:priceCurrencyNotFound'); +export const QuoteMessage = T('commands/tools:quoteMessage'); +export const DuckDuckGoNotFound = T('commands/tools:duckDuckGoNotfound'); +export const DuckDuckGoLookAlso = T('commands/tools:duckDuckGoLookalso'); +export const UrbanNotFound = T('commands/tools:urbanNotFound'); +export const UrbanIndexNotFound = T('commands/tools:urbanIndexNotfound'); export const WhoisMemberTitles = T<{ joined: string; createdAt: string; -}>('commandWhoisMemberTitles'); +}>('commands/tools:whoisMemberTitles'); export const WhoisMemberFields = FT< { member: GuildMember; + createdTimestampOffset: number; + joinedTimestampOffset: number; }, { joinedUnknown: string; @@ -195,24 +197,24 @@ export const WhoisMemberFields = FT< createdAt: string; footer: string; } ->('commandWhoisMemberFields'); -export const WhoisMemberRoles = FT<{ count: number }, string>('commandWhoisMemberRoles'); -export const WhoisMemberRolesPlural = FT<{ count: number }, string>('commandWhoisMemberRolesPlural'); -export const WhoisMemberPermissions = T('commandWhoisMemberPermissions'); -export const WhoisMemberPermissionsAll = T('commandWhoisMemberPermissionsAll'); +>('commands/tools:whoisMemberFields'); +export const WhoisMemberRoles = FT<{ count: number }, string>('commands/tools:whoisMemberRoles'); +export const WhoisMemberPermissions = T('commands/tools:whoisMemberPermissions'); +export const WhoisMemberPermissionsAll = T('commands/tools:whoisMemberPermissionsAll'); export const WhoisUserTitles = T<{ createdAt: string; -}>('commandWhoisUserTitles'); +}>('commands/tools:whoisUserTitles'); export const WhoisUserFields = FT< { user: User; + createdTimestampOffset: number; }, { createdAt: string; footer: string; } ->('commandWhoisUserFields'); -export const WikipediaDescription = T('commandWikipediaDescription'); -export const WikipediaExtended = T('commandWikipediaExtended'); -export const YoutubeDescription = T('commandYoutubeDescription'); -export const YoutubeExtended = T('commandYoutubeExtended'); +>('commands/tools:whoisUserFields'); +export const WikipediaDescription = T('commands/tools:wikipediaDescription'); +export const WikipediaExtended = T('commands/tools:wikipediaExtended'); +export const YouTubeDescription = T('commands/tools:youtubeDescription'); +export const YouTubeExtended = T('commands/tools:youtubeExtended'); diff --git a/src/lib/types/namespaces/languages/commands/Twitch.ts b/src/lib/types/namespaces/languages/commands/Twitch.ts index abdbe1ba03e..5f5c1e405f3 100644 --- a/src/lib/types/namespaces/languages/commands/Twitch.ts +++ b/src/lib/types/namespaces/languages/commands/Twitch.ts @@ -1,51 +1,55 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const FollowageDescription = T('commandFollowageDescription'); -export const FollowageExtended = T('commandFollowageExtended'); -export const TwitchDescription = T('commandTwitchDescription'); -export const TwitchExtended = T('commandTwitchExtended'); -export const TwitchSubscriptionDescription = T('commandTwitchSubscriptionDescription'); -export const TwitchSubscriptionExtended = T('commandTwitchSubscriptionExtended'); -export const Followage = FT<{ user: string; channel: string; time: number }, string>('commandFollowage'); -export const FollowageMissingEntries = T('commandFollowageMissingEntries'); -export const FollowageNotFollowing = T('commandFollowageNotFollowing'); -export const TwitchNoEntries = T('commandTwitchNoEntries'); +export const FollowageDescription = T('commands/twitch:followageDescription'); +export const FollowageExtended = T('commands/twitch:followageExtended'); +export const TwitchDescription = T('commands/twitch:twitchDescription'); +export const TwitchExtended = T('commands/twitch:twitchExtended'); +export const TwitchSubscriptionDescription = T('commands/twitch:twitchSubscriptionDescription'); +export const TwitchSubscriptionExtended = T('commands/twitch:twitchSubscriptionExtended'); +export const Followage = FT<{ user: string; channel: string; time: number }, string>('commands/twitch:followage'); +export const FollowageMissingEntries = T('commands/twitch:followageMissingEntries'); +export const FollowageNotFollowing = T('commands/twitch:followageNotFollowing'); +export const TwitchNoEntries = T('commands/twitch:twitchNoEntries'); export const TwitchTitles = T<{ followers: string; views: string; clickToVisit: string; partner: string; -}>('commandTwitchTitles'); -export const TwitchPartnershipWithoutAffiliate = T('commandTwitchPartnershipWithoutAffiliate'); +}>('commands/twitch:twitchTitles'); +export const TwitchPartnershipWithoutAffiliate = T('commands/twitch:twitchPartnershipWithoutAffiliate'); export const TwitchAffiliateStatus = T<{ affiliated: string; partnered: string; -}>('commandTwitchAffiliateStatus'); -export const TwitchCreatedAt = T('commandTwitchCreatedAt'); -export const TwitchSubscriptionRequiredStreamer = T('commandTwitchSubscriptionRequiredStreamer'); -export const TwitchSubscriptionStreamerNotFound = T('commandTwitchSubscriptionStreamerNotFound'); -export const TwitchSubscriptionRequiredChannel = T('commandTwitchSubscriptionRequiredChannel'); -export const TwitchSubscriptionRequiredStatus = T('commandTwitchSubscriptionRequiredStatus'); -export const TwitchSubscriptionStatusValues = T<[string, string]>('commandTwitchSubscriptionStatusValues'); -export const TwitchSubscriptionInvalidStatus = T('commandTwitchSubscriptionInvalidStatus'); -export const TwitchSubscriptionRequiredContent = T('commandTwitchSubscriptionRequiredContent'); -export const TwitchSubscriptionAddDuplicated = T('commandTwitchSubscriptionAddDuplicated'); -export const TwitchSubscriptionAddSuccessOffline = FT<{ name: string; channel: string }, string>('commandTwitchSubscriptionAddSuccessOffline'); -export const TwitchSubscriptionAddSuccessLive = FT<{ name: string; channel: string }, string>('commandTwitchSubscriptionAddSuccessLive'); -export const TwitchSubscriptionRemoveStreamerNotSubscribed = T('commandTwitchSubscriptionRemoveStreamerNotSubscribed'); -export const TwitchSubscriptionRemoveEntryNotExists = T('commandTwitchSubscriptionRemoveEntryNotExists'); -export const TwitchSubscriptionRemoveSuccessOffline = FT<{ name: string; channel: string }, string>('commandTwitchSubscriptionRemoveSuccessOffline'); -export const TwitchSubscriptionRemoveSuccessLive = FT<{ name: string; channel: string }, string>('commandTwitchSubscriptionRemoveSuccessLive'); -export const TwitchSubscriptionResetEmpty = T('commandTwitchSubscriptionResetEmpty'); -export const TwitchSubscriptionResetSuccess = FT<{ count: number }, string>('commandTwitchSubscriptionResetSuccess'); -export const TwitchSubscriptionResetSuccessPlural = FT<{ count: number }, string>('commandTwitchSubscriptionResetSuccessPlural'); -export const TwitchSubscriptionResetStreamerNotSubscribed = T('commandTwitchSubscriptionResetStreamerNotSubscribed'); -export const TwitchSubscriptionResetChannelSuccess = FT<{ name: string; count: number }, string>('commandTwitchSubscriptionResetChannelSuccess'); -export const TwitchSubscriptionResetChannelSuccessPlural = FT<{ name: string; count: number }, string>( - 'commandTwitchSubscriptionResetChannelSuccessPlural' +}>('commands/twitch:twitchAffiliateStatus'); +export const TwitchCreatedAt = T('commands/twitch:twitchCreatedAt'); +export const TwitchSubscriptionRequiredStreamer = T('commands/twitch:twitchSubscriptionRequiredStreamer'); +export const TwitchSubscriptionStreamerNotFound = T('commands/twitch:twitchSubscriptionStreamerNotFound'); +export const TwitchSubscriptionRequiredChannel = T('commands/twitch:twitchSubscriptionRequiredChannel'); +export const TwitchSubscriptionRequiredStatus = T('commands/twitch:twitchSubscriptionRequiredStatus'); +export const TwitchSubscriptionStatusValues = T<[string, string]>('commands/twitch:twitchSubscriptionStatusValues'); +export const TwitchSubscriptionInvalidStatus = T('commands/twitch:twitchSubscriptionInvalidStatus'); +export const TwitchSubscriptionRequiredContent = T('commands/twitch:twitchSubscriptionRequiredContent'); +export const TwitchSubscriptionAddDuplicated = T('commands/twitch:twitchSubscriptionAddDuplicated'); +export const TwitchSubscriptionAddSuccessOffline = FT<{ name: string; channel: string }, string>( + 'commands/twitch:twitchSubscriptionAddSuccessOffline' ); -export const TwitchSubscriptionShowStreamerNotSubscribed = T('commandTwitchSubscriptionShowStreamerNotSubscribed'); -export const TwitchSubscriptionShowStatus = T<[string, string]>('commandTwitchSubscriptionShowStatus'); -export const TwitchSubscriptionShowEmpty = T('commandTwitchSubscriptionShowEmpty'); -export const TwitchSubscriptionShowUnknownUser = T('commandTwitchSubscriptionShowUnknownUser'); +export const TwitchSubscriptionAddSuccessLive = FT<{ name: string; channel: string }, string>('commands/twitch:twitchSubscriptionAddSuccessLive'); +export const TwitchSubscriptionRemoveStreamerNotSubscribed = T('commands/twitch:twitchSubscriptionRemoveStreamerNotSubscribed'); +export const TwitchSubscriptionRemoveEntryNotExists = T('commands/twitch:twitchSubscriptionRemoveEntryNotExists'); +export const TwitchSubscriptionRemoveSuccessOffline = FT<{ name: string; channel: string }, string>( + 'commands/twitch:twitchSubscriptionRemoveSuccessOffline' +); +export const TwitchSubscriptionRemoveSuccessLive = FT<{ name: string; channel: string }, string>( + 'commands/twitch:twitchSubscriptionRemoveSuccessLive' +); +export const TwitchSubscriptionResetEmpty = T('commands/twitch:twitchSubscriptionResetEmpty'); +export const TwitchSubscriptionResetSuccess = FT<{ count: number }, string>('commands/twitch:twitchSubscriptionResetSuccess'); +export const TwitchSubscriptionResetStreamerNotSubscribed = T('commands/twitch:twitchSubscriptionResetStreamerNotSubscribed'); +export const TwitchSubscriptionResetChannelSuccess = FT<{ name: string; count: number }, string>( + 'commands/twitch:twitchSubscriptionResetChannelSuccess' +); +export const TwitchSubscriptionShowStreamerNotSubscribed = T('commands/twitch:twitchSubscriptionShowStreamerNotSubscribed'); +export const TwitchSubscriptionShowStatus = T<[string, string]>('commands/twitch:twitchSubscriptionShowStatus'); +export const TwitchSubscriptionShowEmpty = T('commands/twitch:twitchSubscriptionShowEmpty'); +export const TwitchSubscriptionShowUnknownUser = T('commands/twitch:twitchSubscriptionShowUnknownUser'); diff --git a/src/lib/types/namespaces/languages/commands/Weeb.ts b/src/lib/types/namespaces/languages/commands/Weeb.ts index 66d51f7b2a0..6272348bcbb 100644 --- a/src/lib/types/namespaces/languages/commands/Weeb.ts +++ b/src/lib/types/namespaces/languages/commands/Weeb.ts @@ -1,77 +1,77 @@ import { FT, T } from '#lib/types'; import { LanguageHelpDisplayOptions } from '#utils/LanguageHelp'; -export const Bang = FT<{ user: string }, string>('commandWbang'); -export const BangDescription = T('commandWbangDescription'); -export const BangExtended = T('commandWbangExtended'); -export const Banghead = T('commandWbanghead'); -export const BangheadDescription = T('commandWbangheadDescription'); -export const BangheadExtended = T('commandWbangheadExtended'); -export const Bite = FT<{ user: string }, string>('commandWbite'); -export const BiteDescription = T('commandWbiteDescription'); -export const BiteExtended = T('commandWbiteExtended'); -export const Blush = T('commandWblush'); -export const BlushDescription = T('commandWblushDescription'); -export const BlushExtended = T('commandWblushExtended'); -export const Cry = FT<{ user: string }, string>('commandWcry'); -export const CryDescription = T('commandWcryDescription'); -export const CryExtended = T('commandWcryExtended'); -export const Cuddle = FT<{ user: string }, string>('commandWcuddle'); -export const CuddleDescription = T('commandWcuddleDescription'); -export const CuddleExtended = T('commandWcuddleExtended'); -export const Dance = T('commandWdance'); -export const DanceDescription = T('commandWdanceDescription'); -export const DanceExtended = T('commandWdanceExtended'); -export const Greet = FT<{ user: string }, string>('commandWgreet'); -export const GreetDescription = T('commandWgreetDescription'); -export const GreetExtended = T('commandWgreetExtended'); -export const Hug = FT<{ user: string }, string>('commandWhug'); -export const HugDescription = T('commandWhugDescription'); -export const HugExtended = T('commandWhugExtended'); -export const Kiss = FT<{ user: string }, string>('commandWkiss'); -export const KissDescription = T('commandWkissDescription'); -export const KissExtended = T('commandWkissExtended'); -export const Lewd = T('commandWlewd'); -export const LewdDescription = T('commandWlewdDescription'); -export const LewdExtended = T('commandWlewdExtended'); -export const Lick = FT<{ user: string }, string>('commandWlick'); -export const LickDescription = T('commandWlickDescription'); -export const LickExtended = T('commandWlickExtended'); -export const Neko = T('commandWneko'); -export const NekoDescription = T('commandWnekoDescription'); -export const NekoExtended = T('commandWnekoExtended'); -export const Nom = T('commandWnom'); -export const NomDescription = T('commandWnomDescription'); -export const NomExtended = T('commandWnomExtended'); -export const Pat = FT<{ user: string }, string>('commandWpat'); -export const PatDescription = T('commandWpatDescription'); -export const PatExtended = T('commandWpatExtended'); -export const Pout = T('commandWpout'); -export const PoutDescription = T('commandWpoutDescription'); -export const PoutExtended = T('commandWpoutExtended'); -export const Punch = FT<{ user: string }, string>('commandWpunch'); -export const PunchDescription = T('commandWpunchDescription'); -export const PunchExtended = T('commandWpunchExtended'); -export const Slap = FT<{ user: string }, string>('commandWslap'); -export const SlapDescription = T('commandWslapDescription'); -export const SlapExtended = T('commandWslapExtended'); -export const Sleepy = T('commandWsleepy'); -export const SleepyDescription = T('commandWsleepyDescription'); -export const SleepyExtended = T('commandWsleepyExtended'); -export const Smile = T('commandWsmile'); -export const SmileDescription = T('commandWsmileDescription'); -export const SmileExtended = T('commandWsmileExtended'); -export const Smug = T('commandWsmug'); -export const SmugDescription = T('commandWsmugDescription'); -export const SmugExtended = T('commandWsmugExtended'); -export const Stare = FT<{ user: string }, string>('commandWstare'); -export const StareDescription = T('commandWstareDescription'); -export const StareExtended = T('commandWstareExtended'); -export const Thumbsup = T('commandWthumbsup'); -export const ThumbsupDescription = T('commandWthumbsupDescription'); -export const ThumbsupExtended = T('commandWthumbsupExtended'); -export const Tickle = FT<{ user: string }, string>('commandWtickle'); -export const TickleDescription = T('commandWtickleDescription'); -export const TickleExtended = T('commandWtickleExtended'); -export const UnavailableError = T('commandWeebUnavailableError'); -export const UnexpectedError = T('commandWeebUnexpectedError'); +export const Bang = FT<{ user: string }, string>('commands/weeb:wbang'); +export const BangDescription = T('commands/weeb:wbangDescription'); +export const BangExtended = T('commands/weeb:wbangExtended'); +export const BangHead = T('commands/weeb:wbanghead'); +export const BangHeadDescription = T('commands/weeb:wbangheadDescription'); +export const BangHeadExtended = T('commands/weeb:wbangheadExtended'); +export const Bite = FT<{ user: string }, string>('commands/weeb:wbite'); +export const BiteDescription = T('commands/weeb:wbiteDescription'); +export const BiteExtended = T('commands/weeb:wbiteExtended'); +export const Blush = T('commands/weeb:wblush'); +export const BlushDescription = T('commands/weeb:wblushDescription'); +export const BlushExtended = T('commands/weeb:wblushExtended'); +export const Cry = FT<{ user: string }, string>('commands/weeb:wcry'); +export const CryDescription = T('commands/weeb:wcryDescription'); +export const CryExtended = T('commands/weeb:wcryExtended'); +export const Cuddle = FT<{ user: string }, string>('commands/weeb:wcuddle'); +export const CuddleDescription = T('commands/weeb:wcuddleDescription'); +export const CuddleExtended = T('commands/weeb:wcuddleExtended'); +export const Dance = T('commands/weeb:wdance'); +export const DanceDescription = T('commands/weeb:wdanceDescription'); +export const DanceExtended = T('commands/weeb:wdanceExtended'); +export const Greet = FT<{ user: string }, string>('commands/weeb:wgreet'); +export const GreetDescription = T('commands/weeb:wgreetDescription'); +export const GreetExtended = T('commands/weeb:wgreetExtended'); +export const Hug = FT<{ user: string }, string>('commands/weeb:whug'); +export const HugDescription = T('commands/weeb:whugDescription'); +export const HugExtended = T('commands/weeb:whugExtended'); +export const Kiss = FT<{ user: string }, string>('commands/weeb:wkiss'); +export const KissDescription = T('commands/weeb:wkissDescription'); +export const KissExtended = T('commands/weeb:wkissExtended'); +export const Lewd = T('commands/weeb:wlewd'); +export const LewdDescription = T('commands/weeb:wlewdDescription'); +export const LewdExtended = T('commands/weeb:wlewdExtended'); +export const Lick = FT<{ user: string }, string>('commands/weeb:wlick'); +export const LickDescription = T('commands/weeb:wlickDescription'); +export const LickExtended = T('commands/weeb:wlickExtended'); +export const Neko = T('commands/weeb:wneko'); +export const NekoDescription = T('commands/weeb:wnekoDescription'); +export const NekoExtended = T('commands/weeb:wnekoExtended'); +export const Nom = T('commands/weeb:wnom'); +export const NomDescription = T('commands/weeb:wnomDescription'); +export const NomExtended = T('commands/weeb:wnomExtended'); +export const Pat = FT<{ user: string }, string>('commands/weeb:wpat'); +export const PatDescription = T('commands/weeb:wpatDescription'); +export const PatExtended = T('commands/weeb:wpatExtended'); +export const Pout = T('commands/weeb:wpout'); +export const PoutDescription = T('commands/weeb:wpoutDescription'); +export const PoutExtended = T('commands/weeb:wpoutExtended'); +export const Punch = FT<{ user: string }, string>('commands/weeb:wpunch'); +export const PunchDescription = T('commands/weeb:wpunchDescription'); +export const PunchExtended = T('commands/weeb:wpunchExtended'); +export const Slap = FT<{ user: string }, string>('commands/weeb:wslap'); +export const SlapDescription = T('commands/weeb:wslapDescription'); +export const SlapExtended = T('commands/weeb:wslapExtended'); +export const Sleepy = T('commands/weeb:wsleepy'); +export const SleepyDescription = T('commands/weeb:wsleepyDescription'); +export const SleepyExtended = T('commands/weeb:wsleepyExtended'); +export const Smile = T('commands/weeb:wsmile'); +export const SmileDescription = T('commands/weeb:wsmileDescription'); +export const SmileExtended = T('commands/weeb:wsmileExtended'); +export const Smug = T('commands/weeb:wsmug'); +export const SmugDescription = T('commands/weeb:wsmugDescription'); +export const SmugExtended = T('commands/weeb:wsmugExtended'); +export const Stare = FT<{ user: string }, string>('commands/weeb:wstare'); +export const StareDescription = T('commands/weeb:wstareDescription'); +export const StareExtended = T('commands/weeb:wstareExtended'); +export const ThumbsUp = T('commands/weeb:wthumbsup'); +export const ThumbsUpDescription = T('commands/weeb:wthumbsupDescription'); +export const ThumbsUpExtended = T('commands/weeb:wthumbsupExtended'); +export const Tickle = FT<{ user: string }, string>('commands/weeb:wtickle'); +export const TickleDescription = T('commands/weeb:wtickleDescription'); +export const TickleExtended = T('commands/weeb:wtickleExtended'); +export const UnavailableError = T('commands/weeb:weebUnavailableError'); +export const UnexpectedError = T('commands/weeb:weebUnexpectedError'); diff --git a/src/lib/types/namespaces/languages/settings/Gateway.ts b/src/lib/types/namespaces/languages/settings/Gateway.ts index 2ed1c2eb84b..7b8d1fd82d1 100644 --- a/src/lib/types/namespaces/languages/settings/Gateway.ts +++ b/src/lib/types/namespaces/languages/settings/Gateway.ts @@ -1,9 +1,5 @@ -import { FT, T } from '#lib/types'; +import { FT } from '#lib/types'; -export const KeyNoext = FT<{ key: string }, string>('settingGatewayKeyNoext'); -export const ChooseKey = FT<{ keys: string }, string>('settingGatewayChooseKey'); -export const UnconfigurableFolder = T('settingGatewayUnconfigurableFolder'); -export const UnconfigurableKey = FT<{ key: string }, string>('settingGatewayUnconfigurableKey'); -export const MissingValue = FT<{ path: string; value: string }, string>('settingGatewayMissingValue'); -export const DuplicateValue = FT<{ path: string; value: string }, string>('settingGatewayDuplicateValue'); -export const InvalidFilteredValue = FT<{ path: string; value: unknown }, string>('settingGatewayInvalidFilteredValue'); +export const ChooseKey = FT<{ keys: string }, string>('settings:validationChooseKey'); +export const MissingValue = FT<{ path: string; value: string }, string>('settings:validationMissingValue'); +export const DuplicateValue = FT<{ path: string; value: string }, string>('settings:validationDuplicatedValue'); diff --git a/src/lib/util/ExceededLengthParser.ts b/src/lib/util/ExceededLengthParser.ts index c7a82ada83c..8fd30e584ac 100644 --- a/src/lib/util/ExceededLengthParser.ts +++ b/src/lib/util/ExceededLengthParser.ts @@ -12,7 +12,7 @@ export async function handleMessage( case 'file': { if (message.channel.attachable) { return message.channel.send( - await message.fetchLocale( + await message.resolveKey( options.time !== undefined && options.footer !== undefined ? LanguageKeys.System.ExceededLengthOutputFileWithTypeAndTime : LanguageKeys.System.ExceededLengthOutputFile, @@ -37,7 +37,7 @@ export async function handleMessage( if (!options.url) options.url = await getHaste(options.content ? options.content : options.result!, options.language ?? 'md').catch(() => null); if (options.url) - return message.sendLocale( + return message.sendTranslated( options.time !== undefined && options.footer !== undefined ? LanguageKeys.System.ExceededLengthOutputHastebinWithTypeAndTime : LanguageKeys.System.ExceededLengthOutputHastebin, @@ -51,7 +51,7 @@ export async function handleMessage( case 'log': { if (options.canLogToConsole) { message.client.emit(Events.Log, options.result); - return message.sendLocale( + return message.sendTranslated( options.time !== undefined && options.footer !== undefined ? LanguageKeys.System.ExceededLengthOutputConsoleWithTypeAndTime : LanguageKeys.System.ExceededLengthOutputConsole, @@ -78,7 +78,7 @@ export async function handleMessage( { code: 'md' } ); } - return message.sendLocale( + return message.sendTranslated( options.success ? options.time !== undefined && options.footer !== undefined ? LanguageKeys.System.ExceededLengthOutputWithTypeAndTime @@ -105,7 +105,7 @@ async function getTypeOutput(message: KlasaMessage, let _choice: { content: string } | undefined = undefined; do { _choice = await message - .prompt(await message.fetchLocale(LanguageKeys.System.ExceededLengthChooseOutput, { output: _options })) + .prompt(await message.resolveKey(LanguageKeys.System.ExceededLengthChooseOutput, { output: _options })) .catch(() => ({ content: 'none' })); } while (!_options.concat('none', 'abort').includes(_choice.content)); options.sendAs = _choice.content.toLowerCase(); diff --git a/src/lib/util/FuzzySearch.ts b/src/lib/util/FuzzySearch.ts index 3bc9e5efe8e..fd64ad7502d 100644 --- a/src/lib/util/FuzzySearch.ts +++ b/src/lib/util/FuzzySearch.ts @@ -70,17 +70,17 @@ export class FuzzySearch { if (results.length === 1) return results[0]; if (results.length > 10) results.length = 10; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const { content: n } = await message.prompt( - language.get(LanguageKeys.FuzzySearch.Matches, { + t(LanguageKeys.FuzzySearch.Matches, { matches: results.length - 1, codeblock: codeBlock('http', results.map(([id, result], i) => `${i} : [ ${id.padEnd(18, ' ')} ] ${this.kAccess(result)}`).join('\n')) }) ); - if (n.toLowerCase() === 'abort') throw language.get(LanguageKeys.FuzzySearch.Aborted); + if (n.toLowerCase() === 'abort') throw t(LanguageKeys.FuzzySearch.Aborted); const parsed = Number(n); - if (!Number.isSafeInteger(parsed)) throw language.get(LanguageKeys.FuzzySearch.InvalidNumber); - if (parsed < 0 || parsed >= results.length) throw language.get(LanguageKeys.FuzzySearch.InvalidIndex); + if (!Number.isSafeInteger(parsed)) throw t(LanguageKeys.FuzzySearch.InvalidNumber); + if (parsed < 0 || parsed >= results.length) throw t(LanguageKeys.FuzzySearch.InvalidIndex); return results[parsed]; } } diff --git a/src/lib/util/GameIntegration/FFXIVUtils.ts b/src/lib/util/GameIntegration/FFXIVUtils.ts index 2fe5c3c6bbc..d8fe376b575 100644 --- a/src/lib/util/GameIntegration/FFXIVUtils.ts +++ b/src/lib/util/GameIntegration/FFXIVUtils.ts @@ -3,7 +3,7 @@ import { TOKENS } from '#root/config'; import { Mime } from '#utils/constants'; import { fetch, FetchMethods, FetchResultTypes } from '#utils/util'; import { toTitleCase } from '@sapphire/utilities'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { FFXIV } from './FFXIVTypings'; export const FFXIVServers = [ @@ -85,7 +85,7 @@ const FFXIV_HEADERS = { 'Content-Type': Mime.Types.ApplicationJson }; -export async function getCharacterDetails(i18n: Language, id: number) { +export async function getCharacterDetails(t: TFunction, id: number) { try { const url = new URL(`${FFXIV_BASE_URL}/character/${id}`); url.searchParams.append('extended', '1'); @@ -121,17 +121,17 @@ export async function getCharacterDetails(i18n: Language, id: number) { FetchResultTypes.JSON ); } catch { - throw i18n.get(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); + throw t(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); } } -export async function searchCharacter(i18n: Language, name: string, server?: string) { +export async function searchCharacter(t: TFunction, name: string, server?: string) { try { const url = new URL(`${FFXIV_BASE_URL}/character/search`); url.searchParams.append('name', name); if (server) { if (FFXIVServers.includes(server.toLowerCase())) url.searchParams.append('server', toTitleCase(server)); - else throw i18n.get(LanguageKeys.Commands.GameIntegration.FFXIVInvalidServer); + else throw t(LanguageKeys.Commands.GameIntegration.FFXIVInvalidServer); } return await fetch>( @@ -144,11 +144,11 @@ export async function searchCharacter(i18n: Language, name: string, server?: str FetchResultTypes.JSON ); } catch { - throw i18n.get(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); + throw t(LanguageKeys.Commands.GameIntegration.FFXIVNoCharacterFound); } } -export async function searchItem(i18n: Language, item: string) { +export async function searchItem(t: TFunction, item: string) { try { const url = new URL(`${FFXIV_BASE_URL}/search`); @@ -181,7 +181,7 @@ export async function searchItem(i18n: Language, item: string) { FetchResultTypes.JSON ); } catch { - throw i18n.get(LanguageKeys.Commands.GameIntegration.FFXIVNoItemFound); + throw t(LanguageKeys.Commands.GameIntegration.FFXIVNoItemFound); } } diff --git a/src/lib/util/Games/ConnectFour/Game.ts b/src/lib/util/Games/ConnectFour/Game.ts index dffc880b574..5697c2dfe7e 100644 --- a/src/lib/util/Games/ConnectFour/Game.ts +++ b/src/lib/util/Games/ConnectFour/Game.ts @@ -5,14 +5,15 @@ import { LongLivingReactionCollector } from '#utils/LongLivingReactionCollector' import { floatPromise, pickRandom } from '#utils/util'; import { RESTJSONErrorCodes } from 'discord-api-types/v6'; import { DiscordAPIError, Permissions, TextChannel } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; import { Board } from './Board'; import { Player, PlayerColor } from './Player'; export class Game { public readonly board: Board; public message: KlasaMessage; - public language: Language; + public t: TFunction = null!; public players: readonly [Player | null, Player | null]; public winner: Player | null; public llrc: LongLivingReactionCollector | null; @@ -24,7 +25,6 @@ export class Game { public constructor(message: KlasaMessage) { this.board = new Board(); this.message = message; - this.language = message.client.languages.default; this.players = [null, null]; this.winner = null; this.llrc = null; @@ -66,10 +66,10 @@ export class Game { } public async run() { - this.language = await this.message.fetchLanguage(); - this.message = await this.message.send(pickRandom(this.language.get(LanguageKeys.System.Loading))); + this.t = await this.message.fetchT(); + this.message = await this.message.send(pickRandom(this.t(LanguageKeys.System.Loading))); for (const reaction of ConnectFourConstants.Reactions) await this.message.react(reaction); - this.content = this.language.get( + this.content = this.t( this.next!.color === PlayerColor.Blue ? LanguageKeys.Commands.Games.C4GameNextTurn0 : LanguageKeys.Commands.Games.C4GameNext, { user: this.next!.name @@ -99,8 +99,7 @@ export class Game { error instanceof DiscordAPIError && (error.code === RESTJSONErrorCodes.UnknownChannel || error.code === RESTJSONErrorCodes.UnknownMessage) ) { - if (error.code !== RESTJSONErrorCodes.UnknownChannel) - await this.message.alert(this.language.get(LanguageKeys.Commands.Games.C4GameDraw)); + if (error.code !== RESTJSONErrorCodes.UnknownChannel) await this.message.alert(this.t(LanguageKeys.Commands.Games.C4GameDraw)); this.stop(); } else { this.message.client.emit(Events.Wtf, error); diff --git a/src/lib/util/Games/ConnectFour/Player.ts b/src/lib/util/Games/ConnectFour/Player.ts index 271734af9e3..20a2e327b74 100644 --- a/src/lib/util/Games/ConnectFour/Player.ts +++ b/src/lib/util/Games/ConnectFour/Player.ts @@ -32,7 +32,7 @@ export abstract class Player { : next!.color === PlayerColor.Blue ? LanguageKeys.Commands.Games.C4GameNextTurn0 : LanguageKeys.Commands.Games.C4GameNext; - this.game.content = this.game.language.get(languageKey, { + this.game.content = this.game.t(languageKey, { user: next!.name }); } diff --git a/src/lib/util/Games/ConnectFour/PlayerHuman.ts b/src/lib/util/Games/ConnectFour/PlayerHuman.ts index e1365e6e3a6..263f05f7394 100644 --- a/src/lib/util/Games/ConnectFour/PlayerHuman.ts +++ b/src/lib/util/Games/ConnectFour/PlayerHuman.ts @@ -35,7 +35,7 @@ export class PlayerHuman extends Player { if (this.game.stopped) return; if (!reaction) { - this.game.content = this.game.language.get(LanguageKeys.Commands.Games.GamesTimeout); + this.game.content = this.game.t(LanguageKeys.Commands.Games.GamesTimeout); this.game.stop(); } else if (!this.drop(ConnectFourConstants.Reactions.indexOf(reaction))) { return this.start(); diff --git a/src/lib/util/Games/Slotmachine.ts b/src/lib/util/Games/Slotmachine.ts index 04979a6cbe6..b6f1ad119bd 100644 --- a/src/lib/util/Games/Slotmachine.ts +++ b/src/lib/util/Games/Slotmachine.ts @@ -5,7 +5,7 @@ import { socialFolder } from '#utils/constants'; import { Image, loadImage } from 'canvas'; import { Canvas } from 'canvas-constructor'; import { Message } from 'discord.js'; -import type { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { join } from 'path'; const enum Icons { @@ -102,16 +102,16 @@ export class Slotmachine { const winnings = this.winnings * (await this.fetchBoost()) - this.bet; const amount = lost ? this.settings.money - this.bet : this.settings.money + winnings; - const lang = await this.message.fetchLanguage(); - if (amount < 0) throw lang.get(LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney); + const t = await this.message.fetchT(); + if (amount < 0) throw t(LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney); this.settings.money += lost ? -this.bet : winnings; await this.settings.save(); - return [await this.render(rolls, this.settings.profile!.darkTheme, lang), amount] as [Buffer, number]; + return [await this.render(rolls, this.settings.profile!.darkTheme, t), amount] as [Buffer, number]; } - private async render(rolls: readonly Icons[], darkTheme: boolean, lang: Language) { + private async render(rolls: readonly Icons[], darkTheme: boolean, t: TFunction) { const playerHasWon = this.winnings > 0; const canvas = new Canvas(300, 150) @@ -129,11 +129,15 @@ export class Slotmachine { .setTextFont('30px RobotoLight') .setTextAlign('right') .printText( - lang.get(playerHasWon ? LanguageKeys.Commands.Games.SlotmachineCanvasTextWon : LanguageKeys.Commands.Games.SlotmachineCanvasTextLost), + t(playerHasWon ? LanguageKeys.Commands.Games.SlotMachineCanvasTextWon : LanguageKeys.Commands.Games.SlotMachineCanvasTextLost), 280, 60 ) - .printText(playerHasWon ? (this.winnings - this.bet).toString() : (this.winnings + this.bet).toString(), 230, 100) + .printText( + t(LanguageKeys.Globals.NumberCompactValue, { value: playerHasWon ? this.winnings - this.bet : this.winnings + this.bet }), + 230, + 100 + ) .printImage(Slotmachine.images.SHINY!, 240, 68, 38, 39) .restore(); diff --git a/src/lib/util/Games/TriviaManager.ts b/src/lib/util/Games/TriviaManager.ts index 9d3e246bd49..5c37b73420f 100644 --- a/src/lib/util/Games/TriviaManager.ts +++ b/src/lib/util/Games/TriviaManager.ts @@ -1,18 +1,5 @@ -/* eslint-disable @typescript-eslint/no-use-before-define */ import { fetch, FetchResultTypes } from '#utils/util'; -export async function getQuestion(category: number, difficulty = QuestionDifficulty.Easy, questionType = QuestionType.Multiple) { - const url = new URL('https://opentdb.com/api.php'); - url.searchParams.append('amount', '1'); - url.searchParams.append('category', category.toString()); - url.searchParams.append('difficulty', difficulty); - url.searchParams.append('type', questionType); - - const { response_code, results } = await fetch(url, FetchResultTypes.JSON); - if (response_code === 0 && results.length) return results[0]; - throw new Error('Invalid request'); -} - export interface TriviaResultOk { response_code: number; results: QuestionData[]; @@ -68,3 +55,15 @@ export const CATEGORIES = { manga: 31, cartoon: 32 }; + +export async function getQuestion(category: number, difficulty = QuestionDifficulty.Easy, questionType = QuestionType.Multiple) { + const url = new URL('https://opentdb.com/api.php'); + url.searchParams.append('amount', '1'); + url.searchParams.append('category', category.toString()); + url.searchParams.append('difficulty', difficulty); + url.searchParams.append('type', questionType); + + const { response_code, results } = await fetch(url, FetchResultTypes.JSON); + if (response_code === 0 && results.length) return results[0]; + throw new Error('Invalid request'); +} diff --git a/src/lib/util/Games/WheelOfFortune.ts b/src/lib/util/Games/WheelOfFortune.ts index 72c6ddf00a0..0c93034bb71 100644 --- a/src/lib/util/Games/WheelOfFortune.ts +++ b/src/lib/util/Games/WheelOfFortune.ts @@ -6,7 +6,7 @@ import { roundNumber } from '@sapphire/utilities'; import { Image, loadImage } from 'canvas'; import { Canvas } from 'canvas-constructor'; import { Message } from 'discord.js'; -import type { Language } from 'klasa'; +import { TFunction } from 'i18next'; import { join } from 'path'; const enum Arrows { @@ -82,15 +82,15 @@ export class WheelOfFortune { const lost = this.winnings < 0; const final = this.settings.money + this.winnings; - const language = await this.message.fetchLanguage(); + const t = await this.message.fetchT(); if (lost && final < 0) { - throw language.get(LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney); + throw t(LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney); } this.settings.money += this.winnings; await this.settings.save(); - return [await this.render(this.settings.profile!.darkTheme, language), final] as const; + return [await this.render(this.settings.profile!.darkTheme, t), final] as const; } /** The boost */ @@ -116,7 +116,7 @@ export class WheelOfFortune { ); } - private async render(darkTheme: boolean, lang: Language): Promise { + private async render(darkTheme: boolean, t: TFunction): Promise { const playerHasWon = this.winnings > 0; const { x: arrowX, y: arrowY } = kArrows.get(WheelOfFortune.kMultipliers[this.spin])!; @@ -129,13 +129,11 @@ export class WheelOfFortune { .setTextFont('30px RobotoLight') .setTextAlign('right') .printText( - lang.get( - playerHasWon ? LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextWon : LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextLost - ), + t(playerHasWon ? LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextWon : LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextLost), 280, 60 ) - .printText((playerHasWon ? this.winnings : -this.winnings).toString(), 230, 100) + .printText(t(LanguageKeys.Globals.NumberCompactValue, { value: playerHasWon ? this.winnings : -this.winnings }), 230, 100) .printImage(WheelOfFortune.images.SHINY!, 240, 68, 38, 39) .printImage(WheelOfFortune.images.ARROWS!, arrowX, arrowY, kArrowSize, kArrowSize, kIconSize + 12, kIconSize + 12, kIconSize, kIconSize) .restore(); diff --git a/src/lib/util/Google.ts b/src/lib/util/Google.ts index 28ab5d01f57..961ab320105 100644 --- a/src/lib/util/Google.ts +++ b/src/lib/util/Google.ts @@ -20,6 +20,7 @@ export const enum GoogleResponseCodes { InvalidRequest = 'INVALID_REQUEST', OverQueryLimit = 'OVER_QUERY_LIMIT', UnknownError = 'UNKNOWN_ERROR', + PermissionDenied = 'PERMISSION_DENIED', Ok = 'OK', Failed = 'FAILED' } @@ -30,8 +31,8 @@ export async function queryGoogleMapsAPI(message: KlasaMessage, location: string url.searchParams.append('key', TOKENS.GOOGLE_MAPS_API_KEY); const { results, status } = await fetch(url, FetchResultTypes.JSON); - if (status !== GoogleResponseCodes.Ok) throw await message.fetchLocale(handleNotOK(status, message.client)); - if (results.length === 0) throw await message.fetchLocale(LanguageKeys.Commands.Google.MessagesErrorZeroResults); + if (status !== GoogleResponseCodes.Ok) throw await message.resolveKey(handleNotOK(status, message.client)); + if (results.length === 0) throw await message.resolveKey(LanguageKeys.Commands.Google.MessagesErrorZeroResults); return { formattedAddress: results[0].formatted_address, @@ -52,8 +53,9 @@ export async function queryGoogleCustomSearchAPI(mes if (type === CustomSearchType.Image) url.searchParams.append('searchType', 'image'); return await fetch>(url, FetchResultTypes.JSON); - } catch { - throw await message.fetchLocale(handleNotOK(GoogleResponseCodes.UnknownError, message.client)); + } catch (err) { + const { error } = err.toJSON() as GoogleResultError; + throw await message.resolveKey(handleNotOK(error.status, message.client)); } } @@ -67,6 +69,9 @@ export function handleNotOK(status: GoogleResponseCodes, client: Client): Custom return LanguageKeys.Commands.Google.MessagesErrorInvalidRequest; case GoogleResponseCodes.OverQueryLimit: return LanguageKeys.Commands.Google.MessagesErrorOverQueryLimit; + case GoogleResponseCodes.PermissionDenied: + client.emit(Events.Wtf, 'Google::handleNotOK | Permission Denied'); + return LanguageKeys.Commands.Google.MessagesErrorPermissionDenied; default: client.emit(Events.Wtf, `Google::handleNotOK | Unknown Error: ${status}`); return LanguageKeys.Commands.Google.MessagesErrorUnknown; @@ -159,3 +164,18 @@ interface GoogleImage { thumbnailWidth: number; width: number; } + +export interface GoogleResultError { + error: GoogleResultErrorData; +} + +export interface GoogleResultErrorData { + code: number; + errors: GoogleResultErrorDataErrorEntry[]; + message: string; + status: GoogleResponseCodes; +} + +export interface GoogleResultErrorDataErrorEntry { + code: number; +} diff --git a/src/lib/util/LanguageHelp.ts b/src/lib/util/LanguageHelp.ts index 2c1d5fa6f66..c7f891b2a4e 100644 --- a/src/lib/util/LanguageHelp.ts +++ b/src/lib/util/LanguageHelp.ts @@ -30,7 +30,7 @@ export class LanguageHelp { // Extended help if (extendedHelp) { - output.push(LanguageHelp.resolveMultilineString(extendedHelp, options.multiline ?? false), ''); + output.push(extendedHelp, ''); } // Explained usage @@ -52,27 +52,17 @@ export class LanguageHelp { // Reminder if (reminder) { - output.push(this.reminder!, LanguageHelp.resolveMultilineString(reminder, options.multiline ?? false)); + output.push(this.reminder!, reminder); } return output.join('\n'); } - - public static resolveMultilineString(str: string | string[], multiline: boolean): string { - return Array.isArray(str) - ? LanguageHelp.resolveMultilineString(str.join(multiline ? '\n' : ' '), multiline) - : str - .split('\n') - .map((line) => line.trim()) - .join(multiline ? '\n' : ' '); - } } export interface LanguageHelpDisplayOptions { - extendedHelp?: string[] | string; - explainedUsage?: Array<[string, string]>; - possibleFormats?: Array<[string, string]>; + extendedHelp?: string; + explainedUsage?: [string, string][]; + possibleFormats?: [string, string][]; examples?: string[]; - reminder?: string[] | string; - multiline?: boolean; + reminder?: string; } diff --git a/src/lib/util/Music/Decorators.ts b/src/lib/util/Music/Decorators.ts index b60e2b726b9..10e42f12123 100644 --- a/src/lib/util/Music/Decorators.ts +++ b/src/lib/util/Music/Decorators.ts @@ -5,55 +5,55 @@ import { createFunctionInhibitor } from '@skyra/decorators'; export function requireMusicPlaying(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.guild.audio.playing, - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicNotPlaying) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicNotPlaying) ); } export function requireMusicPaused(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.guild.audio.paused, - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicPaused) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicPaused) ); } export function requireSongPresent(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.guild.audio.getCurrentTrack().then((value) => value !== null), - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicNothingPlaying) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicNothingPlaying) ); } export function requireDj(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.member.isDJ(), - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicDjMember) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicDjMember) ); } export function requireQueueNotEmpty(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.guild.audio.canStart(), - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicQueueEmpty) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicQueueEmpty) ); } export function requireUserInVoiceChannel(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.member.voice.channel !== null, - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicUserVoiceChannel) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicUserVoiceChannel) ); } export function requireSkyraInVoiceChannel(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.guild.audio.voiceChannelID !== null, - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicBotVoiceChannel) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicBotVoiceChannel) ); } export function requireSameVoiceChannel(): MethodDecorator { return createFunctionInhibitor( (message: GuildMessage) => message.member.voice.channelID === message.guild.audio.voiceChannelID, - (message: GuildMessage) => message.sendLocale(LanguageKeys.Inhibitors.MusicBothVoiceChannel) + (message: GuildMessage) => message.sendTranslated(LanguageKeys.Inhibitors.MusicBothVoiceChannel) ); } diff --git a/src/lib/util/PromptList.ts b/src/lib/util/PromptList.ts index 46a3f3a715b..d8783988c54 100644 --- a/src/lib/util/PromptList.ts +++ b/src/lib/util/PromptList.ts @@ -25,14 +25,14 @@ export async function prompt(message: Message, entries: PromptListResolvable) { async function ask(message: Message, list: readonly string[]) { const possibles = list.length; const codeblock = codeBlock('asciidoc', list.join('\n')); - const language = await message.fetchLanguage(); + const t = await message.fetchT(); const responseMessage = await message.channel.send( - language.get(possibles === 1 ? LanguageKeys.PromptList.MultipleChoice : LanguageKeys.PromptList.MultipleChoicePlural, { + t(LanguageKeys.PromptList.MultipleChoice, { list: codeblock, count: possibles }) ); - const abortOptions = language.get(LanguageKeys.Misc.TextPromptAbortOptions); + const abortOptions = t(LanguageKeys.Misc.TextPromptAbortOptions); const promptFilter = (m: Message) => m.author === message.author && (abortOptions.includes(m.content.toLowerCase()) || !Number.isNaN(Number(m.content))); let response: Message | null = null; @@ -40,7 +40,7 @@ async function ask(message: Message, list: readonly string[]) { let attempts = 0; do { if (attempts !== 0) { - await message.sendLocale(LanguageKeys.PromptList.AttemptFailed, [{ list: codeblock, attempt: attempts, maxAttempts: kAttempts }]); + await message.send(t(LanguageKeys.PromptList.AttemptFailed, { list: codeblock, attempt: attempts, maxAttempts: kAttempts })); } response = await message.channel .awaitMessages(promptFilter, kPromptOptions) @@ -48,7 +48,7 @@ async function ask(message: Message, list: readonly string[]) { if (response) { if (response.deletable) response.nuke().catch(() => null); - if (abortOptions.includes(response.content.toLowerCase())) throw language.get(LanguageKeys.PromptList.Aborted); + if (abortOptions.includes(response.content.toLowerCase())) throw t(LanguageKeys.PromptList.Aborted); n = Number(response.content); if (!Number.isNaN(n) && n >= 1 && n <= possibles) { await responseMessage.delete(); diff --git a/src/lib/util/RootDir.ts b/src/lib/util/RootDir.ts new file mode 100644 index 00000000000..28499bb3476 --- /dev/null +++ b/src/lib/util/RootDir.ts @@ -0,0 +1,31 @@ +import { readFileSync } from 'fs'; +import { dirname, join } from 'path'; + +function getProcessMainModule(): string | undefined { + return (Reflect.get(process, 'mainModule') as NodeJS.Module | undefined)?.path; +} + +function getRequireMain(): string | undefined { + return require.main?.path; +} + +function getPackageMain(): string | undefined { + const cwd = process.cwd(); + + try { + const file = readFileSync(join(cwd, 'package.json'), 'utf8'); + return dirname(join(cwd, JSON.parse(file).main)); + } catch { + return undefined; + } +} + +function getProcessCwd(): string { + return process.cwd(); +} + +let path: string | null = null; +export function getRootDirectory(): string { + if (path === null) path = getProcessMainModule() ?? getRequireMain() ?? getPackageMain() ?? getProcessCwd(); + return path; +} diff --git a/src/lib/util/Security/ModerationActions.ts b/src/lib/util/Security/ModerationActions.ts index 81f07dd1003..84673d71e34 100644 --- a/src/lib/util/Security/ModerationActions.ts +++ b/src/lib/util/Security/ModerationActions.ts @@ -17,12 +17,12 @@ import { MessageEmbed, PermissionOverwriteOption, Permissions, - PermissionString, Role, RoleData, User } from 'discord.js'; -import { KlasaMessage, Language } from 'klasa'; +import { TFunction } from 'i18next'; +import { KlasaMessage } from 'klasa'; export const enum ModerationSetupRestriction { Reaction = 'rolesRestrictedReaction', @@ -260,7 +260,7 @@ export class ModerationActions { public async unWarning(rawOptions: ModerationActionOptions, caseID: number, sendOptions?: ModerationActionsSendOptions) { const oldModerationLog = await this.guild.moderation.fetch(caseID); if (oldModerationLog === null || !oldModerationLog.isType(Moderation.TypeCodes.Warning)) - throw await this.guild.fetchLocale(LanguageKeys.Commands.Moderation.GuildWarnNotFound); + throw await this.guild.resolveKey(LanguageKeys.Commands.Moderation.GuildWarnNotFound); await oldModerationLog.invalidate(); const options = ModerationActions.fillOptions(rawOptions, Moderation.TypeCodes.UnWarn); @@ -280,13 +280,13 @@ export class ModerationActions { .patch({ data: { nick: nickname }, reason: moderationLog.reason - ? await this.guild.fetchLocale( + ? await this.guild.resolveKey( nickname ? LanguageKeys.Commands.Moderation.ActionSetNicknameSet : LanguageKeys.Commands.Moderation.ActionSetNicknameRemoved, { reason: moderationLog.reason } ) - : await this.guild.fetchLocale( + : await this.guild.resolveKey( nickname ? LanguageKeys.Commands.Moderation.ActionSetNicknameNoReasonSet : LanguageKeys.Commands.Moderation.ActionSetNicknameNoReasonRemoved @@ -392,12 +392,12 @@ export class ModerationActions { await this.removeStickyMute(options.userID); const oldModerationLog = await this.cancelLastLogTaskFromUser(options.userID, Moderation.TypeCodes.Mute); if (typeof oldModerationLog === 'undefined') { - throw await this.guild.fetchLocale(LanguageKeys.Commands.Moderation.MuteNotExists); + throw await this.guild.resolveKey(LanguageKeys.Commands.Moderation.MuteNotExists); } // If Skyra does not have permissions to manage permissions, abort. if (!(await this.fetchMe()).permissions.has(Permissions.FLAGS.MANAGE_ROLES)) { - throw await this.guild.fetchLocale(LanguageKeys.Commands.Moderation.MuteCannotManageRoles); + throw await this.guild.resolveKey(LanguageKeys.Commands.Moderation.MuteCannotManageRoles); } await this.unmuteUser(options, oldModerationLog); @@ -421,27 +421,27 @@ export class ModerationActions { } public async softBan(rawOptions: ModerationActionOptions, days: number, sendOptions?: ModerationActionsSendOptions) { - const options = ModerationActions.fillOptions(rawOptions, Moderation.TypeCodes.Softban); + const options = ModerationActions.fillOptions(rawOptions, Moderation.TypeCodes.SoftBan); const moderationLog = this.guild.moderation.create(options); await this.sendDM(moderationLog, sendOptions); - const language = await this.guild.fetchLanguage(); + const t = await this.guild.fetchT(); await api(this.guild.client) .guilds(this.guild.id) .bans(options.userID) .put({ query: { 'delete-message-days': days }, reason: moderationLog.reason - ? language.get(LanguageKeys.Commands.Moderation.ActionSoftbanReason, { reason: moderationLog.reason! }) - : language.get(LanguageKeys.Commands.Moderation.ActionSoftbanNoReason) + ? t(LanguageKeys.Commands.Moderation.ActionSoftBanReason, { reason: moderationLog.reason! }) + : t(LanguageKeys.Commands.Moderation.ActionSoftBanNoReason) }); await api(this.guild.client) .guilds(this.guild.id) .bans(options.userID) .delete({ reason: moderationLog.reason - ? language.get(LanguageKeys.Commands.Moderation.ActionUnSoftbanReason, { reason: moderationLog.reason! }) - : language.get(LanguageKeys.Commands.Moderation.ActionUnSoftbanNoReason) + ? t(LanguageKeys.Commands.Moderation.ActionUnSoftBanReason, { reason: moderationLog.reason! }) + : t(LanguageKeys.Commands.Moderation.ActionUnSoftBanNoReason) }); return (await moderationLog.create())!; } @@ -623,20 +623,20 @@ export class ModerationActions { } public async muteSetup(message: KlasaMessage) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); - if (roleID && this.guild.roles.cache.has(roleID)) throw language.get(LanguageKeys.Commands.Moderation.ActionSetupMuteExists); - if (this.guild.roles.cache.size >= 250) throw language.get(LanguageKeys.Commands.Moderation.ActionSetupTooManyRoles); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[GuildSettings.Roles.Muted], settings.getLanguage()]); + if (roleID && this.guild.roles.cache.has(roleID)) throw t(LanguageKeys.Commands.Moderation.ActionSetupMuteExists); + if (this.guild.roles.cache.size >= 250) throw t(LanguageKeys.Commands.Moderation.ActionSetupTooManyRoles); // Set up the shared role setup return this.sharedRoleSetup(message, RoleDataKey.Muted, GuildSettings.Roles.Muted); } public async restrictionSetup(message: KlasaMessage, path: ModerationSetupRestriction) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[path], settings.getLanguage()]); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[path], settings.getLanguage()]); if (!isNullish(roleID) && this.guild.roles.cache.has(roleID)) { - throw language.get(LanguageKeys.Commands.Moderation.ActionSetupRestrictionExists); + throw t(LanguageKeys.Commands.Moderation.ActionSetupRestrictionExists); } - if (this.guild.roles.cache.size >= 250) throw language.get(LanguageKeys.Commands.Moderation.ActionSetupTooManyRoles); + if (this.guild.roles.cache.size >= 250) throw t(LanguageKeys.Commands.Moderation.ActionSetupTooManyRoles); // Set up the shared role setup return this.sharedRoleSetup(message, ModerationActions.getRoleDataKeyFromSchemaKey(path), path); @@ -647,7 +647,7 @@ export class ModerationActions { await api(this.guild.client).guilds(this.guild.id).bans(user.id).get(); return true; } catch (error) { - if (!(error instanceof DiscordAPIError)) throw await this.guild.fetchLocale(LanguageKeys.System.FetchBansFail); + if (!(error instanceof DiscordAPIError)) throw await this.guild.resolveKey(LanguageKeys.System.FetchBansFail); if (error.code === RESTJSONErrorCodes.UnknownBan) return false; throw error; } @@ -670,20 +670,17 @@ export class ModerationActions { data: roleData, reason: `[Role Setup] Authorized by ${message.author.username} (${message.author.id}).` }); - const language = await this.guild.writeSettings((settings) => { + const t = await this.guild.writeSettings((settings) => { settings[path] = role.id; return settings.getLanguage(); }); if ( await message.ask( - language.get(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupAsk, { + t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupAsk, { role: role.name, channels: this.manageableChannelCount, - permissions: language.list( - this.displayPermissions(language, key).map((permission) => `\`${permission}\``), - language.get(LanguageKeys.Globals.And) - ) + permissions: this.displayPermissions(t, key).map((permission) => `\`${permission}\``) }) ) ) { @@ -692,12 +689,11 @@ export class ModerationActions { } } - private displayPermissions(language: Language, key: RoleDataKey) { + private displayPermissions(t: TFunction, key: RoleDataKey) { const options = kRoleChannelOverwriteOptions.get(key)!; const output: string[] = []; - const permissions = language.PERMISSIONS; for (const keyOption of Object.keys(options.category.options)) { - output.push(permissions[keyOption as PermissionString] || keyOption); + output.push(t(`permissions:${keyOption}`, keyOption)); } return output; } @@ -728,16 +724,14 @@ export class ModerationActions { ? LanguageKeys.Commands.Moderation.ModerationDmDescriptionWithDuration : LanguageKeys.Commands.Moderation.ModerationDmDescription; - const language = await this.guild.fetchLanguage(); - const description = language - .get(descriptionKey, { - guild: this.guild.name, - title: entry.title, - reason: entry.reason, - duration: entry.duration - }) - .join('\n'); - const embed = new MessageEmbed().setDescription(description).setFooter(language.get(LanguageKeys.Commands.Moderation.ModerationDmFooter)); + const t = await this.guild.fetchT(); + const description = t(descriptionKey, { + guild: this.guild.name, + title: entry.title, + reason: entry.reason, + duration: entry.duration + }); + const embed = new MessageEmbed().setDescription(description).setFooter(t(LanguageKeys.Commands.Moderation.ModerationDmFooter)); if (sendOptions.moderator) { embed.setAuthor(sendOptions.moderator.username, sendOptions.moderator.displayAvatarURL({ size: 128, format: 'png', dynamic: true })); @@ -747,14 +741,14 @@ export class ModerationActions { } private async addStickyMute(id: string) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); return this.guild.stickyRoles.add(id, roleID); } private async removeStickyMute(id: string) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); return this.guild.stickyRoles.remove(id, roleID); } @@ -764,19 +758,19 @@ export class ModerationActions { return this.muteUserInGuild(member, await this.getReason('mute', rawOptions.reason || null)); } catch (error) { if (error.code === RESTJSONErrorCodes.UnknownMember) - throw await this.guild.fetchLocale(LanguageKeys.Commands.Moderation.ActionRequiredMember); + throw await this.guild.resolveKey(LanguageKeys.Commands.Moderation.ActionRequiredMember); throw error; } } private async muteUserInGuild(member: GuildMember, reason: string) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); const role = this.guild.roles.cache.get(roleID); if (typeof role === 'undefined') { await this.guild.writeSettings([[GuildSettings.Roles.Muted, null]]); - throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); } const { position } = (await this.fetchMe()).roles.highest; @@ -824,28 +818,28 @@ export class ModerationActions { */ private async unmuteUserInGuildWithoutData(member: GuildMember, reason: string) { // Retrieve the role ID of the mute role, return false if it does not exist. - const [roleID, language] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings.rolesMuted, settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); // Retrieve the role instance from the role ID, reset and return false if it does not exist. const role = this.guild.roles.cache.get(roleID); if (typeof role === 'undefined') { await this.guild.writeSettings([[GuildSettings.Roles.Muted, null]]); - throw language.get(LanguageKeys.Commands.Moderation.MuteNotConfigured); + throw t(LanguageKeys.Commands.Moderation.MuteNotConfigured); } // If the user has the role, begin processing the data. if (member.roles.cache.has(roleID)) { // Fetch self and check if the bot has enough role hierarchy to manage the role, return false when not. const { position } = (await this.fetchMe()).roles.highest; - if (role.position >= position) throw language.get(LanguageKeys.Commands.Moderation.MuteLowHierarchy); + if (role.position >= position) throw t(LanguageKeys.Commands.Moderation.MuteLowHierarchy); // Remove the role from the member. await member.roles.remove(roleID, reason); return; } - throw language.get(LanguageKeys.Commands.Moderation.MuteNotInMember); + throw t(LanguageKeys.Commands.Moderation.MuteNotInMember); } private unmuteExtractRoles(member: GuildMember, roleID: string | Nullish, selfPosition: number, rawIdentifiers: readonly string[] | null) { @@ -868,26 +862,26 @@ export class ModerationActions { } private async addStickyRestriction(id: string, key: KeyOfType) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Misc.RestrictionNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Misc.RestrictionNotConfigured); return this.guild.stickyRoles.add(id, roleID); } private async addRestrictionRole(id: string, key: KeyOfType) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Misc.RestrictionNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Misc.RestrictionNotConfigured); await api(this.guild.client).guilds(this.guild.id).members(id).roles(roleID).put(); } private async removeStickyRestriction(id: string, key: KeyOfType) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Misc.RestrictionNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Misc.RestrictionNotConfigured); return this.guild.stickyRoles.remove(id, roleID); } private async removeRestrictionRole(id: string, key: KeyOfType) { - const [roleID, language] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); - if (isNullish(roleID)) throw language.get(LanguageKeys.Misc.RestrictionNotConfigured); + const [roleID, t] = await this.guild.readSettings((settings) => [settings[key], settings.getLanguage()]); + if (isNullish(roleID)) throw t(LanguageKeys.Misc.RestrictionNotConfigured); try { await api(this.guild.client).guilds(this.guild.id).members(id).roles(roleID).delete(); } catch (error) { @@ -937,15 +931,15 @@ export class ModerationActions { } private async getReason(action: keyof ModerationAction, reason: string | null, revoke = false) { - const language = await this.guild.fetchLanguage(); - const actions = language.get(LanguageKeys.Commands.Moderation.moderationActions); + const t = await this.guild.fetchT(); + const actions = t(LanguageKeys.Commands.Moderation.Actions); if (!reason) return revoke - ? language.get(LanguageKeys.Commands.Moderation.ActionRevokeNoReason, { action: actions[action] }) - : language.get(LanguageKeys.Commands.Moderation.ActionApplyNoReason, { action: actions[action] }); + ? t(LanguageKeys.Commands.Moderation.ActionRevokeNoReason, { action: actions[action] }) + : t(LanguageKeys.Commands.Moderation.ActionApplyNoReason, { action: actions[action] }); return revoke - ? language.get(LanguageKeys.Commands.Moderation.ActionRevokeReason, { action: actions[action], reason }) - : language.get(LanguageKeys.Commands.Moderation.ActionApplyReason, { action: actions[action], reason }); + ? t(LanguageKeys.Commands.Moderation.ActionRevokeReason, { action: actions[action], reason }) + : t(LanguageKeys.Commands.Moderation.ActionApplyReason, { action: actions[action], reason }); } private async retrieveLastLogFromUser(userID: string, type: Moderation.TypeCodes, extra: (log: ModerationEntity) => boolean = () => true) { diff --git a/src/lib/util/Tracking/Analytics/structures/AnalyticsData.ts b/src/lib/util/Tracking/Analytics/structures/AnalyticsData.ts index ce25ed6a225..39094b1f870 100644 --- a/src/lib/util/Tracking/Analytics/structures/AnalyticsData.ts +++ b/src/lib/util/Tracking/Analytics/structures/AnalyticsData.ts @@ -1,6 +1,6 @@ import { ENABLE_INFLUX, INFLUX_OPTIONS, INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET } from '#root/config'; import { enumerable } from '#utils/util'; -import { InfluxDB, QueryApi, WriteApi, WritePrecision } from '@influxdata/influxdb-client'; +import { InfluxDB, QueryApi, WriteApi } from '@influxdata/influxdb-client'; export class AnalyticsData { @enumerable(false) @@ -12,7 +12,7 @@ export class AnalyticsData { public messageCount = 0; public constructor() { - this.writeApi = this.influx!.getWriteApi(INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET, WritePrecision.s); + this.writeApi = this.influx!.getWriteApi(INFLUX_ORG, INFLUX_ORG_ANALYTICS_BUCKET, 's'); this.queryApi = this.influx!.getQueryApi(INFLUX_ORG); } } diff --git a/src/lib/util/constants.ts b/src/lib/util/constants.ts index 3e29dacffd0..febd73aee8d 100644 --- a/src/lib/util/constants.ts +++ b/src/lib/util/constants.ts @@ -1,6 +1,11 @@ /* eslint-disable @typescript-eslint/no-namespace */ +import { LanguageFormatters } from '#lib/types/Constants'; import { Colors } from '#lib/types/constants/Constants'; -import { DEV } from '#root/config'; +import { DEV, VERSION as SKYRA_VERSION } from '#root/config'; +import { getHandler } from '#root/languages/index'; +import { CATEGORIES as TRIVIA_CATEGORIES } from '#utils/Games/TriviaManager'; +import { codeBlock, toTitleCase } from '@sapphire/utilities'; +import i18next, { FormatFunction } from 'i18next'; import { KlasaClientOptions } from 'klasa'; import { join } from 'path'; @@ -90,7 +95,7 @@ export namespace Moderation { Kick = 0b00000001, Mute = 0b00000010, Prune = 0b00000011, - Softban = 0b00000100, + SoftBan = 0b00000100, VoiceKick = 0b00000101, VoiceMute = 0b00000110, Warning = 0b00000111, @@ -120,7 +125,7 @@ export namespace Moderation { Warning = TypeVariation.Warning, Mute = TypeVariation.Mute, Kick = TypeVariation.Kick, - Softban = TypeVariation.Softban, + SoftBan = TypeVariation.SoftBan, Ban = TypeVariation.Ban, VoiceMute = TypeVariation.VoiceMute, VoiceKick = TypeVariation.VoiceKick, @@ -176,7 +181,7 @@ export namespace Moderation { [TypeCodes.Warning, { color: Colors.Yellow, title: 'Warning' }], [TypeCodes.Mute, { color: Colors.Amber, title: 'Mute' }], [TypeCodes.Kick, { color: Colors.Orange, title: 'Kick' }], - [TypeCodes.Softban, { color: Colors.DeepOrange, title: 'Softban' }], + [TypeCodes.SoftBan, { color: Colors.DeepOrange, title: 'SoftBan' }], [TypeCodes.Ban, { color: Colors.Red, title: 'Ban' }], [TypeCodes.VoiceMute, { color: Colors.Amber, title: 'Voice Mute' }], [TypeCodes.VoiceKick, { color: Colors.Orange, title: 'Voice Kick' }], @@ -288,6 +293,109 @@ export const clientOptions: Partial = { nms: { everyone: 5, role: 2 + }, + i18n: { + defaultMissingKey: 'default', + defaultNS: 'globals', + i18next: (_: string[], languages: string[]) => ({ + debug: DEV, + supportedLngs: languages, + preload: languages, + returnObjects: true, + returnEmptyString: false, + returnNull: false, + load: 'all', + lng: 'en-US', + fallbackLng: 'en-US', + defaultNS: 'globals', + overloadTranslationOptionHandler: (args) => ({ defaultValue: args[1] ?? 'globals:default' }), + initImmediate: false, + interpolation: { + escapeValue: false, + defaultVariables: { + TRIVIA_CATEGORIES: Object.keys(TRIVIA_CATEGORIES ?? {}).join(', '), + VERSION: SKYRA_VERSION, + LOADING: Emojis.Loading, + SHINY: Emojis.Shiny, + GREENTICK: Emojis.GreenTick, + REDCROSS: Emojis.RedCross, + /* Permissions */ + ADMINISTRATOR: 'ADMINISTRATOR', + VIEW_AUDIT_LOG: 'VIEW_AUDIT_LOG', + MANAGE_GUILD: 'MANAGE_GUILD', + MANAGE_ROLES: 'MANAGE_ROLES', + MANAGE_CHANNELS: 'MANAGE_CHANNELS', + KICK_MEMBERS: 'KICK_MEMBERS', + BAN_MEMBERS: 'BAN_MEMBERS', + CREATE_INSTANT_INVITE: 'CREATE_INSTANT_INVITE', + CHANGE_NICKNAME: 'CHANGE_NICKNAME', + MANAGE_NICKNAMES: 'MANAGE_NICKNAMES', + MANAGE_EMOJIS: 'MANAGE_EMOJIS', + MANAGE_WEBHOOKS: 'MANAGE_WEBHOOKS', + VIEW_CHANNEL: 'VIEW_CHANNEL', + SEND_MESSAGES: 'SEND_MESSAGES', + SEND_TTS_MESSAGES: 'SEND_TTS_MESSAGES', + MANAGE_MESSAGES: 'MANAGE_MESSAGES', + EMBED_LINKS: 'EMBED_LINKS', + ATTACH_FILES: 'ATTACH_FILES', + READ_MESSAGE_HISTORY: 'READ_MESSAGE_HISTORY', + MENTION_EVERYONE: 'MENTION_EVERYONE', + USE_EXTERNAL_EMOJIS: 'USE_EXTERNAL_EMOJIS', + ADD_REACTIONS: 'ADD_REACTIONS', + CONNECT: 'CONNECT', + SPEAK: 'SPEAK', + STREAM: 'STREAM', + MUTE_MEMBERS: 'MUTE_MEMBERS', + DEAFEN_MEMBERS: 'DEAFEN_MEMBERS', + MOVE_MEMBERS: 'MOVE_MEMBERS', + USE_VAD: 'USE_VAD', + PRIORITY_SPEAKER: 'PRIORITY_SPEAKER', + VIEW_GUILD_INSIGHTS: 'VIEW_GUILD_INSIGHTS' + }, + format: (...[value, format, language, options]: Parameters) => { + switch (format as LanguageFormatters) { + case LanguageFormatters.AndList: { + return getHandler(language!).listAnd.format(value as string[]); + } + case LanguageFormatters.OrList: { + return getHandler(language!).listOr.format(value as string[]); + } + case LanguageFormatters.Permissions: { + return i18next.t(`permissions:${value}`, { ...options, lng: language }); + } + case LanguageFormatters.HumanLevels: { + return i18next.t(`humanLevels:${value}`, { ...options, lng: language }); + } + case LanguageFormatters.ToTitleCase: { + return toTitleCase(value); + } + case LanguageFormatters.JsCodeBlock: { + return codeBlock('js', value); + } + case LanguageFormatters.Number: { + return getHandler(language!).number.format(value as number); + } + case LanguageFormatters.NumberCompact: { + return getHandler(language!).numberCompact.format(value as number); + } + case LanguageFormatters.Ordinal: { + return getHandler(language!).ordinal(value as number); + } + case LanguageFormatters.Duration: { + return getHandler(language!).duration.format(value as number, options?.precision ?? 2); + } + case LanguageFormatters.TimeDate: + return getHandler(language!).timeDate.format(value as number); + case LanguageFormatters.TimeFull: + case LanguageFormatters.Timestamp: { + return getHandler(language!).timeFull.format(value as number); + } + default: + return value as string; + } + } + } + }) } }; diff --git a/src/lib/util/debounce/THIRD_PARTY_LICENSES.md b/src/lib/util/debounce/THIRD_PARTY_LICENSES.md deleted file mode 100644 index 77c42f1408a..00000000000 --- a/src/lib/util/debounce/THIRD_PARTY_LICENSES.md +++ /dev/null @@ -1,47 +0,0 @@ -Copyright OpenJS Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. diff --git a/src/lib/util/debounce/index.ts b/src/lib/util/debounce/index.ts deleted file mode 100644 index 756966afab7..00000000000 --- a/src/lib/util/debounce/index.ts +++ /dev/null @@ -1,182 +0,0 @@ -/* eslint-disable @typescript-eslint/init-declarations */ -/** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ - -interface DebounceSettings { - /** - * The number of milliseconds to delay. - * @default 0 - */ - wait?: number; - - /** - * The maximum time `func` is allowed to be delayed before it's invoked - * @default null - */ - maxWait?: number | null; -} - -interface DebouncedFunc { - /** - * Call the original function, but applying the debounce rules. - * - * If the debounced function can be run immediately, this calls it and returns its return - * value. - * - * Otherwise, it returns the return value of the last invokation, or undefined if the debounced - * function was not invoked yet. - */ - (...args: FnArgumentsType): FnReturnType | undefined; - - /** - * Throw away any pending invokation of the debounced function. - */ - cancel(): void; - - /** - * If there is a pending invokation of the debounced function, invoke it immediately and return - * its return value. - * - * Otherwise, return the value from the last invokation, or undefined if the debounced function - * was never invoked. - */ - flush(): FnReturnType | undefined; -} - -/** - * Creates a debounced function that delays invoking func until after wait milliseconds have elapsed since - * the last time the debounced function was invoked. The debounced function comes with a cancel method to - * cancel delayed invocations and a flush method to immediately invoke them. Provide an options object to - * indicate that func should be invoked on the leading and/or trailing edge of the wait timeout. Subsequent - * calls to the debounced function return the result of the last func invocation. - * - * Note: If leading and trailing options are true, func is invoked on the trailing edge of the timeout only - * if the the debounced function is invoked more than once during the wait timeout. - * - * See David Corbacho’s article for details over the differences between _.debounce and _.throttle. - * - * @param func The function to debounce. - * @param wait The number of milliseconds to delay. - * @param options The options object. - * @return Returns the new debounced function. - */ -export function debounce( - func: (...args: FnArgumentsType) => FnReturnType, - options: DebounceSettings = {} -): DebouncedFunc { - let lastArgs: FnArgumentsType | undefined; - let result: FnReturnType | undefined; - let timerId: NodeJS.Timeout | undefined; - let lastCallTime: number | undefined; - let lastInvokeTime = 0; - - const wait = options.wait ?? 0; - const maxWait = typeof options.maxWait === 'number' ? Math.max(options.maxWait, wait) : null; - - function invokeFunc(time: number) { - const args = lastArgs; - - lastArgs = undefined; - lastInvokeTime = time; - result = func(...args!); - return result; - } - - function leadingEdge(time: number) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return result; - } - - function remainingWait(time: number) { - const timeSinceLastCall = time - lastCallTime!; - const timeSinceLastInvoke = time - lastInvokeTime; - const result = wait - timeSinceLastCall; - - return maxWait === null ? result : Math.min(result, maxWait - timeSinceLastInvoke); - } - - function shouldInvoke(time: number) { - const timeSinceLastCall = time - lastCallTime!; - const timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return ( - lastCallTime === undefined || // - timeSinceLastCall >= wait || - timeSinceLastCall < 0 || - (maxWait !== null && timeSinceLastInvoke >= maxWait) - ); - } - - function timerExpired() { - const time = Date.now(); - if (shouldInvoke(time)) { - trailingEdge(time); - return; - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - - function trailingEdge(time: number) { - timerId = undefined; - return invokeFunc(time); - } - - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - - lastInvokeTime = 0; - lastArgs = undefined; - lastCallTime = undefined; - timerId = undefined; - } - - function flush() { - return timerId === undefined ? result : trailingEdge(Date.now()); - } - - function debounced(...args: FnArgumentsType) { - const time = Date.now(); - const isInvoking = shouldInvoke(time); - - lastArgs = args; - lastCallTime = time; - - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxWait !== null) { - // Handle invocations in a tight loop. - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - - return result; - } - - debounced.cancel = cancel; - debounced.flush = flush; - - return debounced; -} diff --git a/src/lib/util/initClean.ts b/src/lib/util/initClean.ts index ad3e704a956..e2defdb41d2 100644 --- a/src/lib/util/initClean.ts +++ b/src/lib/util/initClean.ts @@ -1,8 +1,29 @@ -import { CLIENT_SECRET, INFLUX_OPTIONS, LAVALINK_PASSWORD, PGSQL_DATABASE_PASSWORD, TOKENS, WEBHOOK_ERROR } from '#root/config'; +import { + CLIENT_OPTIONS, + CLIENT_SECRET, + INFLUX_OPTIONS, + LAVALINK_PASSWORD, + PGSQL_DATABASE_OPTIONS, + PGSQL_DATABASE_PASSWORD, + REDIS_OPTIONS, + TOKENS, + WEBHOOK_ERROR +} from '#root/config'; import { initClean } from '#utils/clean'; const raw = Object.values(TOKENS) - .concat([CLIENT_SECRET, LAVALINK_PASSWORD, PGSQL_DATABASE_PASSWORD, WEBHOOK_ERROR.token!, INFLUX_OPTIONS.token!]) + .concat([ + CLIENT_SECRET, + LAVALINK_PASSWORD, + PGSQL_DATABASE_PASSWORD, + WEBHOOK_ERROR.token!, + INFLUX_OPTIONS.token!, + REDIS_OPTIONS.password, + PGSQL_DATABASE_OPTIONS.user, + PGSQL_DATABASE_OPTIONS.database, + // @ts-expect-error REDIS_OPTIONS is passed into audio + CLIENT_OPTIONS.audio.redis.password + ]) .filter((value) => typeof value === 'string' && value !== ''); initClean([...new Set(raw)]); diff --git a/src/lib/util/util.ts b/src/lib/util/util.ts index 5402184adda..f219b862859 100644 --- a/src/lib/util/util.ts +++ b/src/lib/util/util.ts @@ -90,16 +90,13 @@ export async function streamToBuffer(stream: NodeJS.ReadableStream): Promise [ - settings[GuildSettings.Roles.Subscriber], - settings.getLanguage() - ]); - if (!announcementID) throw language.get(LanguageKeys.Commands.Announcement.SubscribeNoRole); + const [announcementID, t] = await message.guild.readSettings((settings) => [settings[GuildSettings.Roles.Subscriber], settings.getLanguage()]); + if (!announcementID) throw t(LanguageKeys.Commands.Announcement.SubscribeNoRole); const role = message.guild.roles.cache.get(announcementID); - if (!role) throw language.get(LanguageKeys.Commands.Announcement.SubscribeNoRole); + if (!role) throw t(LanguageKeys.Commands.Announcement.SubscribeNoRole); - if (role.position >= message.guild.me!.roles.highest.position) throw language.get(LanguageKeys.System.HighestRole); + if (role.position >= message.guild.me!.roles.highest.position) throw t(LanguageKeys.System.HighestRole); return role; } diff --git a/src/monitors/Moderation/attachmentFilter.ts b/src/monitors/Moderation/attachmentFilter.ts index 4b7b93eec92..ab0fd3f77e2 100644 --- a/src/monitors/Moderation/attachmentFilter.ts +++ b/src/monitors/Moderation/attachmentFilter.ts @@ -4,7 +4,7 @@ import { GuildMessage } from '#lib/types'; import { Colors } from '#lib/types/constants/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; export default class extends ModerationMonitor { protected readonly reasonLanguageKey = LanguageKeys.Monitors.ModerationAttachments; @@ -32,16 +32,16 @@ export default class extends ModerationMonitor { return message.nuke(); } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.AttachmentFilter, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.AttachmentFilter, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language) { + protected onLogMessage(message: GuildMessage, t: TFunction) { return new MessageEmbed() .setDescription(message.content) .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.AttachmentFilterFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.AttachmentFilterFooter)}`) .setTimestamp(); } } diff --git a/src/monitors/Moderation/capitalsFilter.ts b/src/monitors/Moderation/capitalsFilter.ts index 68afc9ff983..2879f5c90ac 100644 --- a/src/monitors/Moderation/capitalsFilter.ts +++ b/src/monitors/Moderation/capitalsFilter.ts @@ -7,7 +7,7 @@ import { floatPromise } from '#utils/util'; import { codeBlock, cutText } from '@sapphire/utilities'; import { getCode, isUpper } from '@skyra/char'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; export default class extends ModerationMonitor { protected readonly reasonLanguageKey = LanguageKeys.Monitors.ModerationCapitals; @@ -47,23 +47,23 @@ export default class extends ModerationMonitor { return percentage >= maximumCapitals ? 1 : null; } - protected async onDelete(message: GuildMessage, language: Language, value: number) { + protected async onDelete(message: GuildMessage, t: TFunction, value: number) { floatPromise(this, message.nuke()); if (value > 25 && (await DbSet.fetchModerationDirectMessageEnabled(message.author.id))) { - await message.author.send(language.get(LanguageKeys.Monitors.CapsFilterDm, { message: codeBlock('md', cutText(message.content, 1900)) })); + await message.author.send(t(LanguageKeys.Monitors.CapsFilterDm, { message: codeBlock('md', cutText(message.content, 1900)) })); } } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.CapsFilter, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.CapsFilter, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language) { + protected onLogMessage(message: GuildMessage, t: TFunction) { return new MessageEmbed() .setDescription(message.content) .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.CapsfilterFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.CapsFilterFooter)}`) .setTimestamp(); } } diff --git a/src/monitors/Moderation/inviteFilter.ts b/src/monitors/Moderation/inviteFilter.ts index 3a7368d3696..d3999d5f19a 100644 --- a/src/monitors/Moderation/inviteFilter.ts +++ b/src/monitors/Moderation/inviteFilter.ts @@ -4,7 +4,7 @@ import { GuildMessage } from '#lib/types'; import { Colors } from '#lib/types/constants/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const enum CodeType { DiscordGG, @@ -56,21 +56,16 @@ export default class extends ModerationMonitor { return message.nuke(); } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.InviteFilterAlert, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.InviteFilterAlert, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language, links: readonly string[]) { + protected onLogMessage(message: GuildMessage, t: TFunction, links: readonly string[]) { return new MessageEmbed() .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setDescription( - language.get(links.length === 1 ? LanguageKeys.Monitors.InviteFilterLog : LanguageKeys.Monitors.InviteFilterLogPlural, { - links, - count: links.length - }) - ) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.InviteFooter)}`) + .setDescription(t(LanguageKeys.Monitors.InviteFilterLog, { links, count: links.length })) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.InviteFooter)}`) .setTimestamp(); } diff --git a/src/monitors/Moderation/linkFilter.ts b/src/monitors/Moderation/linkFilter.ts index 604fb58ccae..80ddcf59395 100644 --- a/src/monitors/Moderation/linkFilter.ts +++ b/src/monitors/Moderation/linkFilter.ts @@ -5,7 +5,7 @@ import { Colors } from '#lib/types/constants/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { urlRegex } from '#utils/Links/UrlRegex'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; export default class extends ModerationMonitor { protected readonly reasonLanguageKey = LanguageKeys.Monitors.ModerationLinks; @@ -45,15 +45,15 @@ export default class extends ModerationMonitor { return message.nuke(); } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.LinkMissing, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.LinkMissing, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language) { + protected onLogMessage(message: GuildMessage, t: TFunction) { return new MessageEmbed() .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.LinkFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.LinkFooter)}`) .setTimestamp(); } } diff --git a/src/monitors/Moderation/messageFilter.ts b/src/monitors/Moderation/messageFilter.ts index bebdbf9b4d1..c7036b519eb 100644 --- a/src/monitors/Moderation/messageFilter.ts +++ b/src/monitors/Moderation/messageFilter.ts @@ -5,7 +5,7 @@ import { Colors } from '#lib/types/constants/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { getContent } from '#utils/util'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; export default class extends ModerationMonitor { protected readonly reasonLanguageKey = LanguageKeys.Monitors.ModerationMessages; @@ -48,16 +48,16 @@ export default class extends ModerationMonitor { return message.nuke(); } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.MessageFilter, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.MessageFilter, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language) { + protected onLogMessage(message: GuildMessage, t: TFunction) { return new MessageEmbed() .setDescription(message.content) .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.MessageFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.MessageFooter)}`) .setTimestamp(); } diff --git a/src/monitors/Moderation/newLineFilter.ts b/src/monitors/Moderation/newLineFilter.ts index ebdcc5e7ea9..2ad300883c1 100644 --- a/src/monitors/Moderation/newLineFilter.ts +++ b/src/monitors/Moderation/newLineFilter.ts @@ -5,7 +5,7 @@ import { Colors } from '#lib/types/constants/Constants'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { getContent } from '#utils/util'; import { MessageEmbed, TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; const NEW_LINE = '\n'; @@ -39,16 +39,16 @@ export default class extends ModerationMonitor { return message.nuke(); } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.NewLineFilter, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.NewLineFilter, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language) { + protected onLogMessage(message: GuildMessage, t: TFunction) { return new MessageEmbed() .setDescription(message.content) .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.NewLineFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.NewLineFooter)}`) .setTimestamp(); } } diff --git a/src/monitors/Moderation/wordFilter.ts b/src/monitors/Moderation/wordFilter.ts index 35dbcf75a8e..551adade0cf 100644 --- a/src/monitors/Moderation/wordFilter.ts +++ b/src/monitors/Moderation/wordFilter.ts @@ -8,7 +8,7 @@ import { floatPromise, getContent } from '#utils/util'; import { codeBlock, cutText } from '@sapphire/utilities'; import { remove as removeConfusables } from 'confusables'; import { TextChannel } from 'discord.js'; -import { Language } from 'klasa'; +import { TFunction } from 'i18next'; export default class extends ModerationMonitor { protected readonly reasonLanguageKey = LanguageKeys.Monitors.ModerationWords; @@ -35,23 +35,23 @@ export default class extends ModerationMonitor { return regex ? this.filter(removeConfusables(content), regex) : null; } - protected async onDelete(message: GuildMessage, language: Language, value: FilterResults) { + protected async onDelete(message: GuildMessage, t: TFunction, value: FilterResults) { floatPromise(this, message.nuke()); if (message.content.length > 25 && (await DbSet.fetchModerationDirectMessageEnabled(message.author.id))) { - await message.author.send(language.get(LanguageKeys.Monitors.WordFilterDm, { filtered: codeBlock('md', cutText(value.filtered, 1900)) })); + await message.author.send(t(LanguageKeys.Monitors.WordFilterDm, { filtered: codeBlock('md', cutText(value.filtered, 1900)) })); } } - protected onAlert(message: GuildMessage, language: Language) { - return message.alert(language.get(LanguageKeys.Monitors.WordFilter, { user: message.author.toString() })); + protected onAlert(message: GuildMessage, t: TFunction) { + return message.alert(t(LanguageKeys.Monitors.WordFilter, { user: message.author.toString() })); } - protected onLogMessage(message: GuildMessage, language: Language, results: FilterResults) { + protected onLogMessage(message: GuildMessage, t: TFunction, results: FilterResults) { return new SkyraEmbed() .splitFields(cutText(results.highlighted, 4000)) .setColor(Colors.Red) .setAuthor(`${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true })) - .setFooter(`#${(message.channel as TextChannel).name} | ${language.get(LanguageKeys.Monitors.WordFooter)}`) + .setFooter(`#${(message.channel as TextChannel).name} | ${t(LanguageKeys.Monitors.WordFooter)}`) .setTimestamp(); } diff --git a/src/monitors/commandHandler.ts b/src/monitors/commandHandler.ts index a13139bfa5d..f00e8490e5f 100644 --- a/src/monitors/commandHandler.ts +++ b/src/monitors/commandHandler.ts @@ -35,7 +35,7 @@ export default class extends Monitor { const prefix = await this.client.fetchPrefix(message); if (!prefix) return; - return message.sendLocale(LanguageKeys.Misc.PrefixReminder, [{ prefix: prefix.length ? prefix : PREFIX }], { + return message.sendTranslated(LanguageKeys.Misc.PrefixReminder, [{ prefix: prefix.length ? prefix : PREFIX }], { allowedMentions: { users: [message.author.id], roles: [] } }); } diff --git a/src/monitors/imageLogs.ts b/src/monitors/imageLogs.ts index df4d1b52008..fcbd73bc79e 100644 --- a/src/monitors/imageLogs.ts +++ b/src/monitors/imageLogs.ts @@ -21,7 +21,7 @@ export default class extends Monitor { const [logChannel, ignoredChannels] = await message.guild.readSettings([GuildSettings.Channels.ImageLogs, GuildSettings.Channels.Ignore.All]); if (logChannel === null || ignoredChannels.includes(message.channel.id)) return; - const language = await message.fetchLanguage(); + const t = await message.fetchT(); for (const image of this.getAttachments(message)) { const dimensions = this.getDimensions(image.width, image.height); @@ -58,7 +58,7 @@ export default class extends Monitor { `${message.author.tag} (${message.author.id})`, message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) ) - .setDescription(`[${language.get(LanguageKeys.Misc.JumpTo)}](${message.url})`) + .setDescription(`[${t(LanguageKeys.Misc.JumpTo)}](${message.url})`) .setFooter(`#${(message.channel as TextChannel).name}`) .attachFiles([new MessageAttachment(buffer, filename)]) .setImage(`attachment://${filename}`) diff --git a/src/monitors/socialMonitor.ts b/src/monitors/socialMonitor.ts index e76a4831932..790c14b1524 100644 --- a/src/monitors/socialMonitor.ts +++ b/src/monitors/socialMonitor.ts @@ -68,14 +68,14 @@ export default class extends Monitor { await message.member!.roles.add(role); - const [shouldAchieve, achievementMessage, language] = await message.guild.readSettings((settings) => [ + const [shouldAchieve, achievementMessage, t] = await message.guild.readSettings((settings) => [ settings[GuildSettings.Social.Achieve], settings[GuildSettings.Social.AchieveMessage], settings.getLanguage() ]); if (shouldAchieve && message.channel.postable) { await message.channel.send( - this.getMessage(message.member!, role, achievementMessage || language.get(LanguageKeys.Monitors.SocialAchievement), points) + this.getMessage(message.member!, role, achievementMessage || t(LanguageKeys.Monitors.SocialAchievement), points) ); } } diff --git a/src/routes/commands.ts b/src/routes/commands.ts index 1f5c04a09a6..b4d06a8e052 100644 --- a/src/routes/commands.ts +++ b/src/routes/commands.ts @@ -1,33 +1,39 @@ import { ApiRequest } from '#lib/structures/api/ApiRequest'; import { ApiResponse } from '#lib/structures/api/ApiResponse'; +import { SkyraCommand } from '#lib/structures/SkyraCommand'; import { ratelimit } from '#utils/util'; -import { isFunction, isPrimitive } from '@sapphire/utilities'; import { ApplyOptions } from '@skyra/decorators'; +import { TFunction } from 'i18next'; +import { Command } from 'klasa'; import { Route, RouteOptions } from 'klasa-dashboard-hooks'; @ApplyOptions({ route: 'commands' }) -export default class extends Route { +export default class UserRoute extends Route { @ratelimit(2, 2500) public get(request: ApiRequest, response: ApiResponse) { const { lang, category } = request.query; - const language = (lang && this.client.languages.get(lang as string)) ?? this.client.languages.default; + const language = this.client.i18n.fetchT((lang as string) ?? 'en-US'); const commands = (category ? this.client.commands.filter((cmd) => cmd.category === category) : this.client.commands).filter( (cmd) => cmd.permissionLevel < 9 ); - const serializedCommands = commands.map((cmd) => ({ - bucket: cmd.bucket, - category: cmd.category, - cooldown: cmd.cooldown, - description: isFunction(cmd.description) && !isPrimitive(language) ? cmd.description(language) : cmd.description, - extendedHelp: isFunction(cmd.extendedHelp) && !isPrimitive(language) ? cmd.extendedHelp(language) : cmd.extendedHelp, - guarded: cmd.guarded, - guildOnly: !cmd.runIn.includes('dm'), - name: cmd.name, - permissionLevel: cmd.permissionLevel, - requiredPermissions: cmd.requiredPermissions.toArray(), - usage: cmd.usage.nearlyFullUsage - })); - return response.json(serializedCommands); + return response.json(commands.map(UserRoute.process.bind(null, language))); + } + + private static process(t: TFunction, cmd: Command) { + const command = cmd as SkyraCommand; + return { + bucket: command.bucket, + category: command.category, + cooldown: command.cooldown, + description: t(command.description), + extendedHelp: t(command.extendedHelp), + guarded: command.guarded, + guildOnly: !command.runIn.includes('dm'), + name: command.name, + permissionLevel: command.permissionLevel, + requiredPermissions: command.requiredPermissions.toArray(), + usage: command.usage.nearlyFullUsage + }; } } diff --git a/src/routes/guilds/guild/settings.ts b/src/routes/guilds/guild/settings.ts index 89181721a58..cbfb1db3ed5 100644 --- a/src/routes/guilds/guild/settings.ts +++ b/src/routes/guilds/guild/settings.ts @@ -93,7 +93,7 @@ export default class extends Route { const context: PartialSerializerUpdateContext = { entity, guild, - language: entity.getLanguage() + t: entity.getLanguage() }; const errors: string[] = []; diff --git a/src/serializers/autorole.ts b/src/serializers/autorole.ts index 486c38f79c5..beb38cdadd3 100644 --- a/src/serializers/autorole.ts +++ b/src/serializers/autorole.ts @@ -3,15 +3,15 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, guild }: SerializerUpdateContext) { const [id, rawPoints] = value.split(' '); - if (!id || !context.guild.roles.cache.has(id)) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidRole, { name: 'role' })); + if (!id || !guild.roles.cache.has(id)) { + return this.error(t(LanguageKeys.Resolvers.InvalidRole, { name: 'role' })); } const points = Number(rawPoints); if (!Number.isSafeInteger(points)) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidInt, { name: 'points' })); + return this.error(t(LanguageKeys.Resolvers.InvalidInt, { name: 'points' })); } return this.ok({ id, points }); @@ -21,8 +21,8 @@ export default class UserSerializer extends Serializer { return isObject(value) && Object.keys(value).length === 2 && typeof value.id === 'string' && typeof value.points === 'number'; } - public stringify(value: RolesAuto): string { - return `[${value.id} -> ${value.points.toLocaleString()}]`; + public stringify(value: RolesAuto, { t }: SerializerUpdateContext): string { + return `[${value.id} -> ${t(LanguageKeys.Globals.NumberValue, { value: value.points })}]`; } public equals(left: RolesAuto, right: RolesAuto): boolean { diff --git a/src/serializers/boolean.ts b/src/serializers/boolean.ts index f1eb740ca47..daaeaf4bdea 100644 --- a/src/serializers/boolean.ts +++ b/src/serializers/boolean.ts @@ -8,18 +8,18 @@ import { AliasPieceOptions } from 'klasa'; aliases: ['bool'] }) export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { const boolean = value.toLowerCase(); - if (context.language.get(LanguageKeys.Resolvers.BoolTrueOptions).includes(boolean)) return this.ok(true); - if (context.language.get(LanguageKeys.Resolvers.BoolFalseOptions).includes(boolean)) return this.ok(false); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidBool, { name: context.entry.name })); + if (t(LanguageKeys.Resolvers.BoolTrueOptions).includes(boolean)) return this.ok(true); + if (t(LanguageKeys.Resolvers.BoolFalseOptions).includes(boolean)) return this.ok(false); + return this.error(t(LanguageKeys.Resolvers.InvalidBool, { name: entry.name })); } public isValid(value: boolean): Awaited { return typeof value === 'boolean'; } - public stringify(value: boolean, context: SerializerUpdateContext): string { - return context.language.get(value ? LanguageKeys.Resolvers.BoolEnabled : LanguageKeys.Resolvers.BoolDisabled); + public stringify(value: boolean, { t }: SerializerUpdateContext): string { + return t(value ? LanguageKeys.Resolvers.BoolEnabled : LanguageKeys.Resolvers.BoolDisabled); } } diff --git a/src/serializers/categoryortextchannel.ts b/src/serializers/categoryortextchannel.ts index 4877107bf88..19eca733bf8 100644 --- a/src/serializers/categoryortextchannel.ts +++ b/src/serializers/categoryortextchannel.ts @@ -3,17 +3,17 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { - const channel = context.guild.channels.cache.get(value); + public parse(value: string, { t, entry, guild }: SerializerUpdateContext) { + const channel = guild.channels.cache.get(value); if (!channel) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name })); } if (channel.type === 'text' || channel.type === 'category') { return this.ok(channel.id); } - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name })); } public isValid(value: string, context: SerializerUpdateContext): Awaited { diff --git a/src/serializers/channel.ts b/src/serializers/channel.ts index b1fbaffd95a..bea090d4986 100644 --- a/src/serializers/channel.ts +++ b/src/serializers/channel.ts @@ -10,18 +10,18 @@ import { AliasPieceOptions } from 'klasa'; aliases: ['textchannel', 'voicechannel', 'categorychannel'] }) export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry, guild }: SerializerUpdateContext) { const id = UserSerializer.regex.channel.exec(value); - const channel = id ? context.guild.channels.cache.get(id[1]) : context.guild.channels.cache.find((r) => r.name === value); + const channel = id ? guild.channels.cache.get(id[1]) : guild.channels.cache.find((r) => r.name === value); if (!channel) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name })); } - if (this.isValidChannel(channel, context.entry.type)) { + if (this.isValidChannel(channel, entry.type)) { return this.ok(channel.id); } - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name })); } public isValid(value: string, context: SerializerUpdateContext): Awaited { diff --git a/src/serializers/commandautodelete.ts b/src/serializers/commandautodelete.ts index c486018c471..5c2b810ea96 100644 --- a/src/serializers/commandautodelete.ts +++ b/src/serializers/commandautodelete.ts @@ -3,15 +3,15 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { const [command, rawDuration] = value.split(' '); if (!command) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidPiece, { name: context.entry.name, piece: 'command' })); + return this.error(t(LanguageKeys.Resolvers.InvalidPiece, { name: entry.name, piece: 'command' })); } const duration = Number(rawDuration); if (!Number.isSafeInteger(duration) || duration < 0) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidDuration, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidDuration, { name: entry.name })); } return this.ok([command, duration] as const); @@ -27,8 +27,8 @@ export default class UserSerializer extends Serializer { ); } - public stringify(value: CommandAutoDelete, context: SerializerUpdateContext): string { - return `[${value[0]} -> ${context.language.duration(value[1], 2)}]`; + public stringify(value: CommandAutoDelete, { t }: SerializerUpdateContext): string { + return `[${value[0]} -> ${t(LanguageKeys.Globals.DurationValue, { value: value[1] })}]`; } public equals(left: CommandAutoDelete, right: CommandAutoDelete): boolean { diff --git a/src/serializers/customcommand.ts b/src/serializers/customcommand.ts index a931c9c070d..986cdd2f413 100644 --- a/src/serializers/customcommand.ts +++ b/src/serializers/customcommand.ts @@ -8,33 +8,33 @@ export default class UserSerializer extends Serializer { return this.error('Adding or.'); } - public isValid(value: CustomCommand, context: SerializerUpdateContext): Awaited { + public isValid(value: CustomCommand, { t }: SerializerUpdateContext): Awaited { if (typeof value.id !== 'string') { - throw new Error(context.language.get(LanguageKeys.Serializers.CustomCommands.InvalidId)); + throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidId)); } if (value.id.length > 50) { - throw context.language.get(LanguageKeys.Commands.Tags.TagNameTooLong); + throw t(LanguageKeys.Commands.Tags.TagNameTooLong); } if (value.id.includes('`') || value.id.includes(ZeroWidthSpace)) { - throw context.language.get(LanguageKeys.Commands.Tags.TagNameNotAllowed); + throw t(LanguageKeys.Commands.Tags.TagNameNotAllowed); } if (typeof value.embed !== 'boolean') { - throw new Error(context.language.get(LanguageKeys.Serializers.CustomCommands.InvalidEmbed)); + throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidEmbed)); } if (typeof value.color !== 'number') { - throw new Error(context.language.get(LanguageKeys.Serializers.CustomCommands.InvalidColor)); + throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidColor)); } if (typeof value.content !== 'string') { - throw new Error(context.language.get(LanguageKeys.Serializers.CustomCommands.InvalidContent)); + throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidContent)); } if (!Array.isArray(value.args) || value.args.some((arg) => typeof arg !== 'string')) { - throw new Error(context.language.get(LanguageKeys.Serializers.CustomCommands.InvalidArgs)); + throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidArgs)); } return true; diff --git a/src/serializers/disabledcommandchannel.ts b/src/serializers/disabledcommandchannel.ts index ebeb4c017d4..4b794611d1c 100644 --- a/src/serializers/disabledcommandchannel.ts +++ b/src/serializers/disabledcommandchannel.ts @@ -3,22 +3,22 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry, guild }: SerializerUpdateContext) { const [channelID, ...commandIDs] = value.split(' '); - const channel = context.guild.channels.cache.get(channelID); + const channel = guild.channels.cache.get(channelID); if (!channel) { - return this.error(context.language.get(LanguageKeys.Serializers.DisabledCommandChannels.ChannelDoesNotExist)); + return this.error(t(LanguageKeys.Serializers.DisabledCommandChannels.ChannelDoesNotExist)); } if (channel.type !== 'text') { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name })); } const commands: string[] = []; for (const command of commandIDs) { if (!this.client.commands.has(command)) { - return this.error(context.language.get(LanguageKeys.Serializers.DisabledCommandChannels.CommandDoesNotExist, { name: command })); + return this.error(t(LanguageKeys.Serializers.DisabledCommandChannels.CommandDoesNotExist, { name: command })); } commands.push(command); @@ -27,27 +27,27 @@ export default class UserSerializer extends Serializer { return this.ok({ channel: channel.id, commands }); } - public isValid(value: DisabledCommandChannel, context: SerializerUpdateContext): Awaited { - const channel = context.guild.channels.cache.get(value.channel); + public isValid(value: DisabledCommandChannel, { t, entry, guild }: SerializerUpdateContext): Awaited { + const channel = guild.channels.cache.get(value.channel); if (!channel) { - throw new Error(context.language.get(LanguageKeys.Serializers.DisabledCommandChannels.ChannelDoesNotExist)); + throw new Error(t(LanguageKeys.Serializers.DisabledCommandChannels.ChannelDoesNotExist)); } if (channel.type !== 'text') { - throw context.language.get(LanguageKeys.Resolvers.InvalidChannel, { name: context.entry.name }); + throw t(LanguageKeys.Resolvers.InvalidChannel, { name: entry.name }); } for (const command of value.commands) { if (!this.client.commands.has(command)) { - throw new Error(context.language.get(LanguageKeys.Serializers.DisabledCommandChannels.CommandDoesNotExist, { name: command })); + throw new Error(t(LanguageKeys.Serializers.DisabledCommandChannels.CommandDoesNotExist, { name: command })); } } return true; } - public stringify(value: DisabledCommandChannel, context: SerializerUpdateContext): string { - const name = context.guild.channels.cache.get(value.channel)?.name ?? context.language.get(LanguageKeys.Misc.UnknownChannel); + public stringify(value: DisabledCommandChannel, { t, guild }: SerializerUpdateContext): string { + const name = guild.channels.cache.get(value.channel)?.name ?? t(LanguageKeys.Misc.UnknownChannel); return `[${name} -> ${value.commands.join(' | ')}]`; } diff --git a/src/serializers/emoji.ts b/src/serializers/emoji.ts index b2d4e5f5551..b2e49562098 100644 --- a/src/serializers/emoji.ts +++ b/src/serializers/emoji.ts @@ -4,19 +4,19 @@ import { resolveEmoji } from '#utils/util'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { const resolved = resolveEmoji(value); if (resolved === null) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidEmoji, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidEmoji, { name: entry.name })); } return this.ok(resolved); } - public isValid(value: string, context: SerializerUpdateContext): Awaited { + public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaited { const resolved = resolveEmoji(value); if (resolved === null || value !== resolved) { - throw new Error(context.language.get(LanguageKeys.Resolvers.InvalidEmoji, { name: context.entry.name })); + throw new Error(t(LanguageKeys.Resolvers.InvalidEmoji, { name: entry.name })); } return true; diff --git a/src/serializers/guild.ts b/src/serializers/guild.ts index caff9e7c63b..628615918e2 100644 --- a/src/serializers/guild.ts +++ b/src/serializers/guild.ts @@ -3,16 +3,16 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { const guild = this.client.guilds.cache.get(value); if (guild) return this.ok(guild.id); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidGuild, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidGuild, { name: entry.name })); } - public isValid(value: string, context: SerializerUpdateContext): Awaited { + public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaited { const guild = this.client.guilds.cache.get(value); if (!guild) { - throw context.language.get(LanguageKeys.Resolvers.InvalidGuild, { name: context.entry.name }); + throw t(LanguageKeys.Resolvers.InvalidGuild, { name: entry.name }); } return true; diff --git a/src/serializers/invite.ts b/src/serializers/invite.ts index 991f46f2918..735604e99c8 100644 --- a/src/serializers/invite.ts +++ b/src/serializers/invite.ts @@ -4,25 +4,25 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class UserSerializer extends Serializer { private readonly kRegExp = /^(?:https?:\/\/)?(?:www.)?(?:discord\.gg\/|discordapp\.com\/invite\/)?(?[\w\d-]{2,})$/i; - public async parse(value: string, context: SerializerUpdateContext) { + public async parse(value: string, { t, entry }: SerializerUpdateContext) { const parsed = this.kRegExp.exec(value); if (parsed === null) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidInvite, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidInvite, { name: entry.name })); } const { code } = parsed.groups!; const invite = await this.client.invites.fetch(code); if (invite === null || !Reflect.has(invite, 'guildID')) { - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidInvite, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidInvite, { name: entry.name })); } return this.ok(code); } - public async isValid(value: string, context: SerializerUpdateContext): Promise { + public async isValid(value: string, { t, entry }: SerializerUpdateContext): Promise { const invite = await this.client.invites.fetch(value); if (invite === null || !Reflect.has(invite, 'guildID')) { - throw context.language.get(LanguageKeys.Resolvers.InvalidInvite, { name: context.entry.name }); + throw t(LanguageKeys.Resolvers.InvalidInvite, { name: entry.name }); } return true; diff --git a/src/serializers/language.ts b/src/serializers/language.ts new file mode 100644 index 00000000000..6ca1c70b642 --- /dev/null +++ b/src/serializers/language.ts @@ -0,0 +1,23 @@ +import { Serializer, SerializerUpdateContext } from '#lib/database'; +import { map } from '#lib/misc'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; +import { Awaited } from '@sapphire/utilities'; + +export default class UserSerializer extends Serializer { + private possibles: readonly string[] = []; + + public parse(value: string, { t, entry }: SerializerUpdateContext) { + const exists = this.client.i18n.languages.has(value); + if (exists) return this.ok(value); + return this.error(t(LanguageKeys.Resolvers.InvalidLanguage, { name: entry.name, possibles: this.possibles })); + } + + public isValid(value: string): Awaited { + return this.client.i18n.languages.has(value); + } + + public init() { + this.possibles = [...map(this.client.i18n.languages.keys(), (key) => `\`${key}\``)]; + return Promise.resolve(); + } +} diff --git a/src/serializers/number.ts b/src/serializers/number.ts index 342a839d502..c5ba4a96404 100644 --- a/src/serializers/number.ts +++ b/src/serializers/number.ts @@ -13,13 +13,13 @@ export default class UserSerializer extends Serializer { case 'integer': { const number = parseInt(value, 10); if (Number.isInteger(number)) return this.minOrMax(number, number, context); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidInt, { name: context.entry.name })); + return this.error(context.t(LanguageKeys.Resolvers.InvalidInt, { name: context.entry.name })); } case 'number': case 'float': { const number = parseFloat(value); if (!Number.isNaN(number)) return this.minOrMax(number, number, context); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidFloat, { name: context.entry.name })); + return this.error(context.t(LanguageKeys.Resolvers.InvalidFloat, { name: context.entry.name })); } } @@ -30,12 +30,12 @@ export default class UserSerializer extends Serializer { switch (context.entry.type) { case 'integer': { if (typeof value === 'number' && Number.isInteger(value) && this.minOrMax(value, value, context)) return true; - throw context.language.get(LanguageKeys.Resolvers.InvalidInt, { name: context.entry.name }); + throw context.t(LanguageKeys.Resolvers.InvalidInt, { name: context.entry.name }); } case 'number': case 'float': { if (typeof value === 'number' && !Number.isNaN(value) && this.minOrMax(value, value, context)) return true; - throw context.language.get(LanguageKeys.Resolvers.InvalidFloat, { name: context.entry.name }); + throw context.t(LanguageKeys.Resolvers.InvalidFloat, { name: context.entry.name }); } } diff --git a/src/serializers/permissionnode.ts b/src/serializers/permissionnode.ts index 33bfb284a2f..4155e6ea794 100644 --- a/src/serializers/permissionnode.ts +++ b/src/serializers/permissionnode.ts @@ -6,57 +6,57 @@ import { Command } from 'klasa'; export default class UserSerializer extends Serializer { public parse(_: string, context: SerializerUpdateContext) { - return this.error(context.language.get(LanguageKeys.Serializers.Unsupported)); + return this.error(context.t(LanguageKeys.Serializers.Unsupported)); } - public async isValid(value: PermissionsNode, { language, entry, entity: { guild } }: SerializerUpdateContext): Promise { + public async isValid(value: PermissionsNode, { t, entry, guild }: SerializerUpdateContext): Promise { // Safe-guard checks against arbitrary data - if (!isObject(value)) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalid); - if (Object.keys(value).length !== 3) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalid); - if (typeof value.id !== 'string') throw language.get(LanguageKeys.Serializers.PermissionNodeInvalid); - if (!Array.isArray(value.allow)) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalid); - if (!Array.isArray(value.deny)) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalid); + if (!isObject(value)) throw t(LanguageKeys.Serializers.PermissionNodeInvalid); + if (Object.keys(value).length !== 3) throw t(LanguageKeys.Serializers.PermissionNodeInvalid); + if (typeof value.id !== 'string') throw t(LanguageKeys.Serializers.PermissionNodeInvalid); + if (!Array.isArray(value.allow)) throw t(LanguageKeys.Serializers.PermissionNodeInvalid); + if (!Array.isArray(value.deny)) throw t(LanguageKeys.Serializers.PermissionNodeInvalid); // Check for target validity let target: GuildMember | Role | undefined = undefined; if (entry.name === 'permissionsRoles') { const role = guild.roles.cache.get(value.id); - if (!role) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidTarget); + if (!role) throw t(LanguageKeys.Serializers.PermissionNodeInvalidTarget); target = role; } else { target = await guild.members.fetch(value.id).catch(() => { - throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidTarget); + throw t(LanguageKeys.Serializers.PermissionNodeInvalidTarget); }); } // The @everyone role should not have allows if (target.id === guild.id && value.allow.length !== 0) { - throw language.get(LanguageKeys.Serializers.PermissionNodeSecurityEveryoneAllows); + throw t(LanguageKeys.Serializers.PermissionNodeSecurityEveryoneAllows); } // The owner cannot have allows nor denies if (target.id === guild.ownerID) { - throw language.get(LanguageKeys.Serializers.PermissionNodeSecurityOwner); + throw t(LanguageKeys.Serializers.PermissionNodeSecurityOwner); } // Check all commands const commands = new Map(); for (const allowed of value.allow) { - if (commands.has(allowed)) throw language.get(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: allowed }); + if (commands.has(allowed)) throw t(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: allowed }); const command = this.client.commands.get(allowed); - if (!command) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: allowed }); - if (command.permissionLevel >= 9) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: allowed }); + if (!command) throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: allowed }); + if (command.permissionLevel >= 9) throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: allowed }); commands.set(allowed, command); } for (const denied of value.deny) { - if (commands.has(denied)) throw language.get(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: denied }); + if (commands.has(denied)) throw t(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: denied }); const command = this.client.commands.get(denied); - if (!command) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: denied }); - if (command.permissionLevel >= 9) throw language.get(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: denied }); - if (command.guarded) throw language.get(LanguageKeys.Serializers.PermissionNodeSecurityGuarded, { command: denied }); + if (!command) throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: denied }); + if (command.permissionLevel >= 9) throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: denied }); + if (command.guarded) throw t(LanguageKeys.Serializers.PermissionNodeSecurityGuarded, { command: denied }); commands.set(denied, command); } diff --git a/src/serializers/piece.ts b/src/serializers/piece.ts index c9790d9e864..4ba1937775f 100644 --- a/src/serializers/piece.ts +++ b/src/serializers/piece.ts @@ -11,20 +11,20 @@ export default class UserSerializer extends Serializer { this.aliases = [...this.client.pieceStores.keys()].map((type) => type.slice(0, -1)); } - public parse(value: string, { entry, language }: SerializerUpdateContext) { + public parse(value: string, { entry, t }: SerializerUpdateContext) { const store = this.client.pieceStores.get(`${entry.type}s`); - if (!store) return this.error(language.get(LanguageKeys.Resolvers.InvalidStore, { store: entry.type })); + if (!store) return this.error(t(LanguageKeys.Resolvers.InvalidStore, { store: entry.type })); const parsed = store.get(value) as Piece | undefined; if (parsed && parsed instanceof store.holds) return this.ok(parsed.name); - return this.error(language.get(LanguageKeys.Resolvers.InvalidPiece, { name: entry.name, piece: entry.type })); + return this.error(t(LanguageKeys.Resolvers.InvalidPiece, { name: entry.name, piece: entry.type })); } - public isValid(value: string, { entry, language }: SerializerUpdateContext): Awaited { + public isValid(value: string, { entry, t }: SerializerUpdateContext): Awaited { const store = this.client.pieceStores.get(`${entry.type}s`); - if (!store) throw language.get(LanguageKeys.Resolvers.InvalidStore, { store: entry.type }); + if (!store) throw t(LanguageKeys.Resolvers.InvalidStore, { store: entry.type }); const parsed = store.get(value); if (parsed && parsed instanceof store.holds) return true; - throw language.get(LanguageKeys.Resolvers.InvalidPiece, { name: entry.name, piece: entry.type }); + throw t(LanguageKeys.Resolvers.InvalidPiece, { name: entry.name, piece: entry.type }); } public serialize(value: string, { entry }: SerializerUpdateContext) { diff --git a/src/serializers/reactionrole.ts b/src/serializers/reactionrole.ts index 6567e461c2f..56bfd5cf824 100644 --- a/src/serializers/reactionrole.ts +++ b/src/serializers/reactionrole.ts @@ -4,11 +4,11 @@ import { displayEmoji } from '#utils/util'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(_: string, context: SerializerUpdateContext) { - return this.error(context.language.get(LanguageKeys.Serializers.Unsupported)); + public parse(_: string, { t }: SerializerUpdateContext) { + return this.error(t(LanguageKeys.Serializers.Unsupported)); } - public isValid(value: ReactionRole, context: SerializerUpdateContext): Awaited { + public isValid(value: ReactionRole, { t }: SerializerUpdateContext): Awaited { if ( isObject(value) && Object.keys(value).length === 4 && @@ -19,12 +19,12 @@ export default class UserSerializer extends Serializer { ) return true; - throw context.language.get(LanguageKeys.Serializers.ReactionRoleInvalid); + throw t(LanguageKeys.Serializers.ReactionRoleInvalid); } - public stringify(value: ReactionRole, { language, entity: { guild } }: SerializerUpdateContext) { + public stringify(value: ReactionRole, { t, guild }: SerializerUpdateContext) { const emoji = displayEmoji(value.emoji); - const role = guild.roles.cache.get(value.role)?.name ?? language.get(LanguageKeys.Misc.UnknownRole); + const role = guild.roles.cache.get(value.role)?.name ?? t(LanguageKeys.Misc.UnknownRole); const url = `https://discord.com/channels/${guild.id}/${value.channel}/${value.message}`; return `${emoji} | ${url} -> ${role}`; } diff --git a/src/serializers/role.ts b/src/serializers/role.ts index be1254b0755..686e09ae051 100644 --- a/src/serializers/role.ts +++ b/src/serializers/role.ts @@ -3,19 +3,19 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry, guild }: SerializerUpdateContext) { const id = UserSerializer.regex.role.exec(value); - const role = id ? context.guild.roles.cache.get(id[1]) : context.guild.roles.cache.find((r) => r.name === value); + const role = id ? guild.roles.cache.get(id[1]) : guild.roles.cache.find((r) => r.name === value); if (role) return this.ok(role.id); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidRole, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidRole, { name: entry.name })); } - public isValid(value: string, context: SerializerUpdateContext): Awaited { - if (context.guild.roles.cache.has(value)) return true; - throw context.language.get(LanguageKeys.Resolvers.InvalidRole, { name: context.entry.name }); + public isValid(value: string, { t, entry, guild }: SerializerUpdateContext): Awaited { + if (guild.roles.cache.has(value)) return true; + throw t(LanguageKeys.Resolvers.InvalidRole, { name: entry.name }); } - public stringify(value: string, context: SerializerUpdateContext) { - return context.guild.roles.cache.get(value)?.name ?? value; + public stringify(value: string, { guild }: SerializerUpdateContext) { + return guild.roles.cache.get(value)?.name ?? value; } } diff --git a/src/serializers/snowflake.ts b/src/serializers/snowflake.ts index ff8ae662b2d..bd8f82aeba4 100644 --- a/src/serializers/snowflake.ts +++ b/src/serializers/snowflake.ts @@ -15,22 +15,22 @@ export default class UserSerializer extends Serializer { */ private readonly kMinimum = new Date(2015, 1, 28).getTime(); - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { if (this.kRegExp.test(value)) { const snowflake = DiscordSnowflake.deconstruct(value); const timestamp = Number(snowflake.timestamp); if (timestamp >= this.kMinimum && timestamp < Date.now()) return this.ok(value); } - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidSnowflake, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidSnowflake, { name: entry.name })); } - public isValid(value: string, context: SerializerUpdateContext): Awaited { + public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaited { if (this.kRegExp.test(value)) { const snowflake = DiscordSnowflake.deconstruct(value); const timestamp = Number(snowflake.timestamp); if (timestamp >= this.kMinimum && timestamp < Date.now()) return true; } - throw context.language.get(LanguageKeys.Resolvers.InvalidSnowflake, { name: context.entry.name }); + throw t(LanguageKeys.Resolvers.InvalidSnowflake, { name: entry.name }); } } diff --git a/src/serializers/stickyrole.ts b/src/serializers/stickyrole.ts index 2af4f80cb60..99601096e6e 100644 --- a/src/serializers/stickyrole.ts +++ b/src/serializers/stickyrole.ts @@ -3,26 +3,26 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(_: string, context: SerializerUpdateContext) { - return this.error(context.language.get(LanguageKeys.Serializers.Unsupported)); + public parse(_: string, { t }: SerializerUpdateContext) { + return this.error(t(LanguageKeys.Serializers.Unsupported)); } - public isValid(value: StickyRole, context: SerializerUpdateContext): Awaited { + public isValid(value: StickyRole, { t, guild }: SerializerUpdateContext): Awaited { if ( isObject(value) && Object.keys(value).length === 2 && typeof value.user === 'string' && Array.isArray(value.roles) && - value.roles.every((role) => typeof role === 'string' && context.guild.roles.cache.has(role)) + value.roles.every((role) => typeof role === 'string' && guild.roles.cache.has(role)) ) return true; - throw context.language.get(LanguageKeys.Serializers.StickyRoleInvalid); + throw t(LanguageKeys.Serializers.StickyRoleInvalid); } - public stringify(value: StickyRole, context: SerializerUpdateContext) { - const username = this.client.users.cache.get(value.user)?.username ?? context.language.get(LanguageKeys.Misc.UnknownUser); - const roles = value.roles.map((role) => context.guild.roles.cache.get(role)?.name ?? context.language.get(LanguageKeys.Misc.UnknownRole)); + public stringify(value: StickyRole, { t, guild }: SerializerUpdateContext) { + const username = this.client.users.cache.get(value.user)?.username ?? t(LanguageKeys.Misc.UnknownUser); + const roles = value.roles.map((role) => guild.roles.cache.get(role)?.name ?? t(LanguageKeys.Misc.UnknownRole)); return `[${username} -> ${roles}]`; } } diff --git a/src/serializers/triggeralias.ts b/src/serializers/triggeralias.ts index 9aa4fdc7757..26cc9b9dd3c 100644 --- a/src/serializers/triggeralias.ts +++ b/src/serializers/triggeralias.ts @@ -3,16 +3,16 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t }: SerializerUpdateContext) { const values = value.split(' '); if (values.length === 2) return this.ok({ input: values[0], output: values[1] }); - return this.error(context.language.get(LanguageKeys.Serializers.TriggerAliasInvalid)); + return this.error(t(LanguageKeys.Serializers.TriggerAliasInvalid)); } - public isValid(value: TriggerAlias, context: SerializerUpdateContext): Awaited { + public isValid(value: TriggerAlias, { t }: SerializerUpdateContext): Awaited { if (isObject(value) && Object.keys(value).length === 2 && typeof value.input === 'string' && typeof value.output === 'string') return true; - throw context.language.get(LanguageKeys.Serializers.TriggerAliasInvalid); + throw t(LanguageKeys.Serializers.TriggerAliasInvalid); } public equals(left: TriggerAlias, right: TriggerAlias): boolean { diff --git a/src/serializers/triggerinclude.ts b/src/serializers/triggerinclude.ts index f2bb6348387..ce7babd69e6 100644 --- a/src/serializers/triggerinclude.ts +++ b/src/serializers/triggerinclude.ts @@ -4,20 +4,20 @@ import { resolveEmoji } from '#utils/util'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(value: string, context: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { const values = value.split(' '); - if (values.length !== 3) return this.error(context.language.get(LanguageKeys.Serializers.TriggerIncludeInvalid)); + if (values.length !== 3) return this.error(t(LanguageKeys.Serializers.TriggerIncludeInvalid)); const [action, input, output] = values; - if (action !== 'react') return this.error(context.language.get(LanguageKeys.Serializers.TriggerIncludeInvalidAction)); + if (action !== 'react') return this.error(t(LanguageKeys.Serializers.TriggerIncludeInvalidAction)); const resolved = resolveEmoji(output); - if (resolved === null) return this.error(context.language.get(LanguageKeys.Resolvers.InvalidEmoji, { name: context.entry.name })); + if (resolved === null) return this.error(t(LanguageKeys.Resolvers.InvalidEmoji, { name: entry.name })); return this.ok({ action: action as 'react', input, output: resolved }); } - public isValid(data: TriggerIncludes, { language }: SerializerUpdateContext): Awaited { + public isValid(data: TriggerIncludes, { t }: SerializerUpdateContext): Awaited { if ( isObject(data) && Object.keys(data).length === 3 && @@ -27,7 +27,7 @@ export default class UserSerializer extends Serializer { ) return true; - throw language.get(LanguageKeys.Serializers.TriggerIncludeInvalid); + throw t(LanguageKeys.Serializers.TriggerIncludeInvalid); } public equals(left: TriggerIncludes, right: TriggerIncludes): boolean { diff --git a/src/serializers/twitchsubscription.ts b/src/serializers/twitchsubscription.ts index 46ffeb75696..4dbddc8ddba 100644 --- a/src/serializers/twitchsubscription.ts +++ b/src/serializers/twitchsubscription.ts @@ -2,19 +2,19 @@ import { NotificationsStreamsTwitchStreamer, NotificationsStreamTwitch, Serializ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class UserSerializer extends Serializer { - public parse(_: string, context: SerializerUpdateContext) { - return this.error(context.language.get(LanguageKeys.Serializers.Unsupported)); + public parse(_: string, { t }: SerializerUpdateContext) { + return this.error(t(LanguageKeys.Serializers.Unsupported)); } - public isValid(data: NotificationsStreamTwitch, { language }: SerializerUpdateContext) { + public isValid(data: NotificationsStreamTwitch, { t }: SerializerUpdateContext) { // Validate that data is a tuple [string, x[]]. if (!Array.isArray(data) || data.length !== 2 || typeof data[0] !== 'string' || !Array.isArray(data[1])) { - return Promise.reject(language.get(LanguageKeys.Serializers.TwitchSubscriptionInvalid)); + return Promise.reject(t(LanguageKeys.Serializers.TwitchSubscriptionInvalid)); } // Validate that all entries from the second index in the tuple are indeed correct values. if (data[1].some((streamer) => !this.validateStreamer(streamer))) { - return Promise.reject(language.get(LanguageKeys.Serializers.TwitchSubscriptionInvalidStreamer)); + return Promise.reject(t(LanguageKeys.Serializers.TwitchSubscriptionInvalidStreamer)); } // Return without further modifications diff --git a/src/serializers/uniqueroleset.ts b/src/serializers/uniqueroleset.ts index 806801d090d..03f1e237fdd 100644 --- a/src/serializers/uniqueroleset.ts +++ b/src/serializers/uniqueroleset.ts @@ -3,26 +3,26 @@ import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { Awaited, isObject } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { - public parse(_: string, context: SerializerUpdateContext) { - return this.error(context.language.get(LanguageKeys.Serializers.Unsupported)); + public parse(_: string, { t }: SerializerUpdateContext) { + return this.error(t(LanguageKeys.Serializers.Unsupported)); } - public isValid(value: UniqueRoleSet, context: SerializerUpdateContext): Awaited { + public isValid(value: UniqueRoleSet, { t, guild }: SerializerUpdateContext): Awaited { if ( isObject(value) && Object.keys(value).length === 2 && typeof value.name === 'string' && Array.isArray(value.roles) && - value.roles.every((role) => typeof role === 'string' && context.guild.roles.cache.has(role)) + value.roles.every((role) => typeof role === 'string' && guild.roles.cache.has(role)) ) return true; - throw context.language.get(LanguageKeys.Serializers.UniqueRoleSetInvalid); + throw t(LanguageKeys.Serializers.UniqueRoleSetInvalid); } - public stringify(value: UniqueRoleSet, { language, entity: { guild } }: SerializerUpdateContext) { + public stringify(value: UniqueRoleSet, { t, entity: { guild } }: SerializerUpdateContext) { return `[${value.name} -> \`${value.roles - .map((role) => guild.roles.cache.get(role)?.name ?? language.get(LanguageKeys.Misc.UnknownRole)) + .map((role) => guild.roles.cache.get(role)?.name ?? t(LanguageKeys.Misc.UnknownRole)) .join('` | `')}\`]`; } } diff --git a/src/serializers/url.ts b/src/serializers/url.ts index ffacbf96089..f614a8d4759 100644 --- a/src/serializers/url.ts +++ b/src/serializers/url.ts @@ -5,32 +5,32 @@ import { Awaited } from '@sapphire/utilities'; export default class UserSerializer extends Serializer { private readonly kProtocol = /^https?:\/\//; - public parse(value: string, { language, entry }: SerializerUpdateContext) { + public parse(value: string, { t, entry }: SerializerUpdateContext) { try { const { hostname } = new URL(this.kProtocol.test(value) ? value : `https://${value}`); if (hostname.length <= 128) return this.ok(hostname); - return this.error(language.get(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 })); + return this.error(t(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 })); } catch { - return this.error(language.get(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 })); + return this.error(t(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 })); } } - public isValid(value: string, { language, entry }: SerializerUpdateContext): Awaited { + public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaited { try { const { hostname } = new URL(this.kProtocol.test(value) ? value : `https://${value}`); return hostname.length <= 128; } catch { - throw new Error(language.get(LanguageKeys.Resolvers.InvalidUrl, { name: entry.name })); + throw new Error(t(LanguageKeys.Resolvers.InvalidUrl, { name: entry.name })); } } - public validate(data: string, { entry, language }: SerializerUpdateContext) { + public validate(data: string, { entry, t }: SerializerUpdateContext) { try { const { hostname } = new URL(this.kProtocol.test(data) ? data : `https://${data}`); - if (hostname.length > 128) throw language.get(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 }); + if (hostname.length > 128) throw t(LanguageKeys.Resolvers.MinmaxMaxInclusive, { name: entry.name, max: 128 }); return hostname; } catch { - throw language.get(LanguageKeys.Resolvers.InvalidUrl, { name: entry.name }); + throw t(LanguageKeys.Resolvers.InvalidUrl, { name: entry.name }); } } diff --git a/src/serializers/user.ts b/src/serializers/user.ts index bc2f31db78d..dc5fe55fbb7 100644 --- a/src/serializers/user.ts +++ b/src/serializers/user.ts @@ -2,14 +2,14 @@ import { Serializer, SerializerUpdateContext } from '#lib/database'; import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; export default class UserSerializer extends Serializer { - public async parse(value: string, context: SerializerUpdateContext) { + public async parse(value: string, { t, entry }: SerializerUpdateContext) { const id = Serializer.regex.userOrMember.exec(value); const user = id ? await this.client.users.fetch(id[1]).catch(() => null) : null; if (user) return this.ok(user.id); - return this.error(context.language.get(LanguageKeys.Resolvers.InvalidUser, { name: context.entry.name })); + return this.error(t(LanguageKeys.Resolvers.InvalidUser, { name: entry.name })); } - public async isValid(value: string, context: SerializerUpdateContext): Promise { + public async isValid(value: string, { t, entry }: SerializerUpdateContext): Promise { try { // If it's not a valid snowflake, throw if (!Serializer.regex.snowflake.test(value)) throw undefined; @@ -18,7 +18,7 @@ export default class UserSerializer extends Serializer { await this.client.users.fetch(value); return true; } catch { - throw context.language.get(LanguageKeys.Resolvers.InvalidUser, { name: context.entry.name }); + throw t(LanguageKeys.Resolvers.InvalidUser, { name: entry.name }); } } diff --git a/src/tasks/moderationEndAddRole.ts b/src/tasks/moderationEndAddRole.ts index 1db211cdd7a..6f785c26d6f 100644 --- a/src/tasks/moderationEndAddRole.ts +++ b/src/tasks/moderationEndAddRole.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions, Role } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData<{ role: Role }>) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unAddRole( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Role removed after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Role removed after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, data.extraData.role, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) diff --git a/src/tasks/moderationEndBan.ts b/src/tasks/moderationEndBan.ts index 295cb3c7e2f..1b0c49b8c18 100644 --- a/src/tasks/moderationEndBan.ts +++ b/src/tasks/moderationEndBan.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.BAN_MEMBERS)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unBan( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Ban released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Ban released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndMute.ts b/src/tasks/moderationEndMute.ts index 25b1df6c582..016e9341564 100644 --- a/src/tasks/moderationEndMute.ts +++ b/src/tasks/moderationEndMute.ts @@ -1,14 +1,16 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild } from 'discord.js'; export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { + const t = await guild.fetchT(); await guild.security.actions.unMute( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Mute released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Mute released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndRemoveRole.ts b/src/tasks/moderationEndRemoveRole.ts index bac2152557b..2b457fa55ae 100644 --- a/src/tasks/moderationEndRemoveRole.ts +++ b/src/tasks/moderationEndRemoveRole.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions, Role } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData<{ role: Role }>) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unRemoveRole( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Role re-added after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Role re-added after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, data.extraData.role, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) diff --git a/src/tasks/moderationEndRestrictionAttachment.ts b/src/tasks/moderationEndRestrictionAttachment.ts index 433fe230a71..a37600188d1 100644 --- a/src/tasks/moderationEndRestrictionAttachment.ts +++ b/src/tasks/moderationEndRestrictionAttachment.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unRestrictAttachment( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Attachment Restricted released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Attachment Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndRestrictionEmbed.ts b/src/tasks/moderationEndRestrictionEmbed.ts index d39f3ccdc32..e4cf475d9b6 100644 --- a/src/tasks/moderationEndRestrictionEmbed.ts +++ b/src/tasks/moderationEndRestrictionEmbed.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unRestrictEmbed( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Embed Restricted released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Embed Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndRestrictionReaction.ts b/src/tasks/moderationEndRestrictionReaction.ts index e5296c201f8..03b0b2520c4 100644 --- a/src/tasks/moderationEndRestrictionReaction.ts +++ b/src/tasks/moderationEndRestrictionReaction.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unRestrictReaction( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Reaction Restricted released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Reaction Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndRestrictionVoice.ts b/src/tasks/moderationEndRestrictionVoice.ts index 2fae57788a2..6ce5b7930a2 100644 --- a/src/tasks/moderationEndRestrictionVoice.ts +++ b/src/tasks/moderationEndRestrictionVoice.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unRestrictVoice( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Voice Restricted released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Voice Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndSetNickname.ts b/src/tasks/moderationEndSetNickname.ts index 2d729906baf..69d063d72cd 100644 --- a/src/tasks/moderationEndSetNickname.ts +++ b/src/tasks/moderationEndSetNickname.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData<{ oldName: string }>) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MANAGE_NICKNAMES)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unSetNickname( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Nickname reverted after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Nickname reverted after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, data.extraData.oldName, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) diff --git a/src/tasks/moderationEndVoiceMute.ts b/src/tasks/moderationEndVoiceMute.ts index bfc85e23138..4591acceb92 100644 --- a/src/tasks/moderationEndVoiceMute.ts +++ b/src/tasks/moderationEndVoiceMute.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.MUTE_MEMBERS)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unVoiceMute( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Voice Mute released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Voice Mute released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) ); diff --git a/src/tasks/moderationEndWarning.ts b/src/tasks/moderationEndWarning.ts index eab61b63beb..6cc017967ce 100644 --- a/src/tasks/moderationEndWarning.ts +++ b/src/tasks/moderationEndWarning.ts @@ -1,4 +1,5 @@ import { ModerationData, ModerationTask } from '#lib/structures/ModerationTask'; +import { LanguageKeys } from '#lib/types/namespaces/LanguageKeys'; import { CLIENT_ID } from '#root/config'; import { Guild, Permissions } from 'discord.js'; @@ -6,11 +7,13 @@ export default class extends ModerationTask { protected async handle(guild: Guild, data: ModerationData) { const me = guild.me === null ? await guild.members.fetch(CLIENT_ID) : guild.me; if (!me.permissions.has(Permissions.FLAGS.BAN_MEMBERS)) return null; + + const t = await guild.fetchT(); await guild.security.actions.unWarning( { moderatorID: CLIENT_ID, userID: data.userID, - reason: `[MODERATION] Warning released after ${this.client.languages.default.duration(data.duration)}` + reason: `[MODERATION] Warning released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` }, data.caseID, await this.getTargetDM(guild, await this.client.users.fetch(data.userID)) diff --git a/src/tasks/syncResourceAnalytics.ts b/src/tasks/syncResourceAnalytics.ts index 382d6c1e77e..32d1241d601 100644 --- a/src/tasks/syncResourceAnalytics.ts +++ b/src/tasks/syncResourceAnalytics.ts @@ -1,5 +1,5 @@ -import { Events } from '#lib/types/Enums'; import { Task } from '#lib/database'; +import { Events } from '#lib/types/Enums'; export default class extends Task { public run() { diff --git a/src/tasks/twitchRefreshSubscriptions.ts b/src/tasks/twitchRefreshSubscriptions.ts index baa2234c665..aba923c64c6 100644 --- a/src/tasks/twitchRefreshSubscriptions.ts +++ b/src/tasks/twitchRefreshSubscriptions.ts @@ -1,4 +1,4 @@ -import { DbSet, PartialResponseValue, ResponseType, TwitchStreamSubscriptionEntity, Task } from '#lib/database'; +import { DbSet, PartialResponseValue, ResponseType, Task, TwitchStreamSubscriptionEntity } from '#lib/database'; import { Events } from '#lib/types/Enums'; import { TwitchHooksAction } from '#utils/Notifications/Twitch'; import { blueBright } from 'colorette'; diff --git a/src/tsconfig.json b/src/tsconfig.json index eb013354cda..cfb1b6cda20 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -7,6 +7,7 @@ "paths": { "#utils/*": ["lib/util/*"], "#lib/*": ["lib/*"], + "#languages": ["languages/index"], "#root/*": ["*"] }, "composite": true diff --git a/tests/languages/i18n.test.ts b/tests/languages/i18n.test.ts deleted file mode 100644 index 63c402ab747..00000000000 --- a/tests/languages/i18n.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { client } from '#mocks/MockInstances'; -import { createLanguageStore } from '#mocks/MockLanguageStore'; -import English from '#root/languages/en-US'; -import Spanish from '#root/languages/es-ES'; -import { isObject } from '@sapphire/utilities'; - -/** - * Convert an object to a tuple. - * @description Adopted from `@sapphire/utilities`'s `objectToTuples`, but without including values which will never match between languages - * @param original The object to convert - * @param prefix The prefix for the key - */ -function objectToTuples>(original: T, prefix = ''): string[] { - const entries: string[] = []; - for (const [key, value] of Object.entries(original)) { - if (isObject(value)) { - entries.push(...objectToTuples(value as Record, `${prefix}${key}.`)); - } else { - entries.push(`${prefix}${key}`); - } - } - - return entries; -} - -describe('i18n tests', () => { - const englishLanguageStore = createLanguageStore(client, 'english-store', English); - const spanishLanguageStore = createLanguageStore(client, 'spanish-store', Spanish); - - const english = new English(englishLanguageStore, ['en-US.ts'], ''); - const spanish = new Spanish(spanishLanguageStore, ['es-ES.ts'], ''); - - describe('Tuple based comparison testing', () => { - test('GIVEN language files THEN should have identical language keys', () => { - const englishTuple = objectToTuples(english.language); - const spanishTuple = objectToTuples(spanish.language); - - expect(spanishTuple).toStrictEqual(englishTuple); - }); - - test('GIVEN language files THEN should have identical permission nodes', () => { - const englishTuple = objectToTuples(english.PERMISSIONS); - const spanishTuple = objectToTuples(spanish.PERMISSIONS); - - expect(spanishTuple).toStrictEqual(englishTuple); - }); - }); - - describe('English language testing', () => { - test('GIVEN English Language THEN should parse all ordinals', () => { - expect(english.ordinal(0)).toBe('0th'); - expect(english.ordinal(1)).toBe('1st'); - expect(english.ordinal(2)).toBe('2nd'); - expect(english.ordinal(3)).toBe('3rd'); - expect(english.ordinal(4)).toBe('4th'); - expect(english.ordinal(5)).toBe('5th'); - expect(english.ordinal(10)).toBe('10th'); - }); - - test('GIVEN English language THEN should have noop init', async () => { - const spy = jest.spyOn(english, 'init'); - - await english.init(); - - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith(); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - expect(english.init()).resolves.toBe(undefined); - - expect(spy).toHaveBeenCalledTimes(2); - }); - }); - - describe('Spanish language testing', () => { - test('GIVEN Spanish Language THEN should parse all ordinals', () => { - expect(spanish.ordinal(0)).toBe('0mo'); - expect(spanish.ordinal(1)).toBe('1ro'); - expect(spanish.ordinal(2)).toBe('2do'); - expect(spanish.ordinal(3)).toBe('3ro'); - expect(spanish.ordinal(4)).toBe('4to'); - expect(spanish.ordinal(5)).toBe('5to'); - expect(spanish.ordinal(6)).toBe('6to'); - expect(spanish.ordinal(7)).toBe('7mo'); - expect(spanish.ordinal(8)).toBe('8vo'); - expect(spanish.ordinal(9)).toBe('9no'); - expect(spanish.ordinal(10)).toBe('10mo'); - }); - - test('GIVEN Spanish language THEN should have noop init', async () => { - const spy = jest.spyOn(spanish, 'init'); - - await spanish.init(); - - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith(); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - expect(spanish.init()).resolves.toBe(undefined); - - expect(spy).toHaveBeenCalledTimes(2); - }); - }); -}); diff --git a/tests/lib/util/LanguageHelp.test.ts b/tests/lib/util/LanguageHelp.test.ts index 6e91f97cc0b..dd313cb5f36 100644 --- a/tests/lib/util/LanguageHelp.test.ts +++ b/tests/lib/util/LanguageHelp.test.ts @@ -10,8 +10,7 @@ describe('LanguageHelp builder', () => { test('GIVEN basic command display THEN parses correctly', () => { const commandHelp = builder.display('add', { extendedHelp: [ - `Add songs to the playing queue and prepare for musical enjoyment! - I can play from YouTube, Bandcamp, SoundCloud, Twitch, Vimeo, or Mixer.`, + 'Add songs to the playing queue and prepare for musical enjoyment!\nI can play from YouTube, Bandcamp, SoundCloud, Twitch, Vimeo, or Mixer.', '- To play from YouTube either give me something to search, a video link, or a playlist link.', '- To play from SoundCloud give me a SoundCloud link, or if you want me to search include either `--sc` or `--soundcloud` in your message.', "- To play from Mixer give me the URL of a Mixer streamer, I'm sorry but I cannot (yet) play Mixer VODs.", @@ -26,8 +25,7 @@ describe('LanguageHelp builder', () => { 'https://vimeo.com/channels/music/239029778', 'https://mixer.com/Ninja', 'https://thedisappointed.bandcamp.com/album/escapism-2' - ], - multiline: true + ] }); const expectedOutput = `Add songs to the playing queue and prepare for musical enjoyment! @@ -53,42 +51,9 @@ I can play from YouTube, Bandcamp, SoundCloud, Twitch, Vimeo, or Mixer. expect(commandHelp).toBe(expectedOutput); }); - test('GIVEN extended help w/ possible formats & w/ mutliline string & w/ reminder THEN parses correctly', () => { - const commandHelp = builder.display('sample', { - extendedHelp: `This is line 1 - This is line 2 - This is line 3`, - reminder: 'Ava is trash', - possibleFormats: [ - ['Jest', 'The good stuff'], - ['Jasmine', 'The inspiration'], - ['Mocha', 'The grandfather'], - ['Ava', 'The Sham'] - ], - examples: [''] - }); - - const expectedOutput = `This is line 1 This is line 2 This is line 3 - -🔢 | ***Possible formats*** -→ **Jest**: The good stuff -→ **Jasmine**: The inspiration -→ **Mocha**: The grandfather -→ **Ava**: The Sham - -🔗 | ***Examples*** -→ Skyra, sample - -⏰ | ***Reminder*** -Ava is trash`; - - expect(commandHelp).toBe(expectedOutput); - }); - test('GIVEN extended help w/o extendedHelp THEN parses correctly', () => { const commandHelp = builder.display('sample', { - reminder: ['This goes to 9000', 'Actually 9001'], - multiline: true + reminder: ['This goes to 9000', 'Actually 9001'].join('\n') }); const expectedOutput = `🔗 | ***Examples*** @@ -100,18 +65,4 @@ Actually 9001`; expect(commandHelp).toBe(expectedOutput); }); - - test('GIVEN extended w/ array value w/o multiline THEN parses correctly', () => { - const commandHelp = builder.display('sample', { - reminder: ['This goes to 9000', 'Actually 9001'] - }); - - const expectedOutput = `🔗 | ***Examples*** -→ Skyra, sample - -⏰ | ***Reminder*** -This goes to 9000 Actually 9001`; - - expect(commandHelp).toBe(expectedOutput); - }); }); diff --git a/tests/lib/util/TriviaManager.test.ts b/tests/lib/util/TriviaManager.test.ts index 643e03757a4..9be72c4e9c5 100644 --- a/tests/lib/util/TriviaManager.test.ts +++ b/tests/lib/util/TriviaManager.test.ts @@ -1,5 +1,5 @@ -import nock = require('nock'); -import { getQuestion, QuestionDifficulty, QuestionType } from '#utils/Games/TriviaManager'; +import { CATEGORIES, getQuestion, QuestionDifficulty, QuestionType } from '#utils/Games/TriviaManager'; +import nock from 'nock'; describe('TriviaManager', () => { // eslint-disable-next-line @typescript-eslint/init-declarations @@ -31,7 +31,7 @@ describe('TriviaManager', () => { }); test('getQuestion', async () => { - const data = await getQuestion(9, QuestionDifficulty.Easy, QuestionType.Boolean); + const data = await getQuestion(CATEGORIES.general, QuestionDifficulty.Easy, QuestionType.Boolean); expect(data.category).toBe('General Knowledge'); expect(data.difficulty).toBe(QuestionDifficulty.Easy); expect(data.type).toBe(QuestionType.Boolean); diff --git a/tests/lib/util/util.test.ts b/tests/lib/util/util.test.ts index 5796d153eb2..c84f12ecd2b 100644 --- a/tests/lib/util/util.test.ts +++ b/tests/lib/util/util.test.ts @@ -2,6 +2,7 @@ import { client } from '#mocks/MockInstances'; import { Mime, Time } from '#utils/constants'; import * as utils from '#utils/util'; import Collection from '@discordjs/collection'; +import type { DeepPartial } from '@sapphire/utilities'; import { Image } from 'canvas'; import { CategoryChannel, @@ -15,12 +16,12 @@ import { TextChannel, VoiceChannel } from 'discord.js'; -import { createReadStream, promises as fsPromises } from 'fs'; +import { createReadStream } from 'fs'; +import { readFile } from 'fs/promises'; import { mockRandom, resetMockRandom } from 'jest-mock-random'; import { KlasaMessage } from 'klasa'; +import nock from 'nock'; import { resolve } from 'path'; -import { DeepPartial } from 'typeorm'; -import nock = require('nock'); describe('Utils', () => { describe('IMAGE_EXTENSION', () => { @@ -492,7 +493,7 @@ describe('Utils', () => { describe('getImage', () => { test('GIVEN message w/ attachments w/ image w/o proxyURL attachment THEN returns url', async () => { const filePath = resolve(__dirname, '..', '..', '..', 'tests', 'mocks', 'image.png'); - const buffer = await fsPromises.readFile(filePath); + const buffer = await readFile(filePath); const fakeAttachment = new MessageAttachment(buffer, 'image.png'); fakeAttachment.url = filePath; fakeAttachment.height = 32; @@ -509,7 +510,7 @@ describe('Utils', () => { test('GIVEN message w/ attachments w/ image w/ proxyURL attachment THEN returns url', async () => { const filePath = resolve(__dirname, '..', '..', '..', 'tests', 'mocks', 'image.png'); - const buffer = await fsPromises.readFile(filePath); + const buffer = await readFile(filePath); const fakeAttachment = new MessageAttachment(buffer, 'image.png'); fakeAttachment.url = filePath; fakeAttachment.proxyURL = filePath; @@ -527,7 +528,7 @@ describe('Utils', () => { test('GIVEN message w/ attachments w/o image attachment THEN passes through to embed checking', async () => { const filePath = resolve(__dirname, '..', '..', '..', 'tests', 'mocks', 'image.png'); - const buffer = await fsPromises.readFile(filePath); + const buffer = await readFile(filePath); const fakeAttachment = new MessageAttachment(buffer, 'image.png'); fakeAttachment.url = 'not_an_image'; fakeAttachment.proxyURL = 'not_an_image'; diff --git a/tests/mocks/MockInstances.ts b/tests/mocks/MockInstances.ts index 07ade2312b7..fed1b0f5190 100644 --- a/tests/mocks/MockInstances.ts +++ b/tests/mocks/MockInstances.ts @@ -1,7 +1,3 @@ -import English from '#root/languages/en-US'; import { Client } from 'klasa'; -import { createLanguageStore } from './MockLanguageStore'; export const client = new Client(); - -client.languages = createLanguageStore(client, 'english', English); diff --git a/tests/mocks/MockLanguageStore.ts b/tests/mocks/MockLanguageStore.ts deleted file mode 100644 index 7076089c0a3..00000000000 --- a/tests/mocks/MockLanguageStore.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Client, LanguageStore as InternalLanguageStore } from 'klasa'; - -export class MockLanguageStore extends InternalLanguageStore { - public constructor(client: Client, name: string, holds: any) { - super(client, name, holds); - } -} - -export function createLanguageStore(...[client, name, holds]: ConstructorParameters): InternalLanguageStore { - return new MockLanguageStore(client, name, holds) as InternalLanguageStore; -} diff --git a/yarn.lock b/yarn.lock index 4c7a2a33075..16a1e6f1dad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,61 +2,60 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" + "@babel/generator" "^7.12.10" "@babel/helper-module-transforms" "^7.12.1" "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" + "@babel/parser" "^7.12.10" "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" lodash "^4.17.19" - resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.12.11" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.10" -"@babel/helper-member-expression-to-functions@^7.12.1": +"@babel/helper-member-expression-to-functions@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== @@ -85,12 +84,12 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c" - integrity sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw== +"@babel/helper-optimise-call-expression@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== dependencies: - "@babel/types" "^7.12.7" + "@babel/types" "^7.12.10" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": version "7.10.4" @@ -98,14 +97,14 @@ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== "@babel/helper-replace-supers@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" - integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" + integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/helper-member-expression-to-functions" "^7.12.7" + "@babel/helper-optimise-call-expression" "^7.12.10" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.11" "@babel/helper-simple-access@^7.12.1": version "7.12.1" @@ -114,17 +113,17 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.11" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== "@babel/helpers@^7.12.5": version "7.12.5" @@ -144,10 +143,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" - integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -233,7 +232,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/runtime@^7.11.2": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -249,27 +248,27 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" - integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== + dependencies: + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" @@ -435,10 +434,10 @@ combined-stream "^1.0.8" mime-types "^2.1.12" -"@eslint/eslintrc@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" - integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -451,22 +450,22 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@favware/graphql-pokemon@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@favware/graphql-pokemon/-/graphql-pokemon-5.0.0.tgz#f6679791a207687936b983d9db6072122938ba9a" - integrity sha512-mCeh4PjMA9VxiO3TrwhNIoDycV92w9V3ek5L/uoJD0YPphP2+L+0yzyDYX9LCPzBc+JwpIBEf5Xn/kbPEvlmWA== +"@favware/graphql-pokemon@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@favware/graphql-pokemon/-/graphql-pokemon-5.0.1.tgz#c13e67d5330cb82712bea5e21eb4d4ed65f7c231" + integrity sha512-ZRf+o7zV+vvxyMqVKT27oC9ih11BR/M4Z9QAgnHqn7hK/pZLhbXjif+Kh+xIoW0FDCUv9UIxR6CXxV8pn69nRQ== dependencies: graphql "^15.4.0" -"@influxdata/influxdb-client-apis@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@influxdata/influxdb-client-apis/-/influxdb-client-apis-1.8.0.tgz#3f7234d0b19739a9476e9761bf2d0f6e090a2fad" - integrity sha512-nFtmLGmo3HakkO9INU7tBGDCkFeuPKofobn5EVCSS70BscUAshVLoy3srEt8jQ1N+VVUJT0V4EZn8OeMwi0Bfw== +"@influxdata/influxdb-client-apis@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@influxdata/influxdb-client-apis/-/influxdb-client-apis-1.9.0.tgz#7247227c0cd5901f334c482fb088d6af2ef9b1b0" + integrity sha512-OmFTnuMxSX71fRrz91tq0TCfOKJz7KrlEkQ0UFCcGML2823Ok/EM8AJcugDJzHgPfYVpJubqMHelLKPbeQUj9g== -"@influxdata/influxdb-client@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@influxdata/influxdb-client/-/influxdb-client-1.8.0.tgz#6ea82b07c950e896e07ec9f5d10c247dfcf8e999" - integrity sha512-fygvCHBUrcuduMRZf1oGhQzvIJG6gEA+0JX4ffxq5cxAeHKUGCYt30GafBc23QyrnCc50zc0IsPSG2Tw47aw+w== +"@influxdata/influxdb-client@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@influxdata/influxdb-client/-/influxdb-client-1.9.0.tgz#0178d88c325550fd18cfa54821dd273b3466798a" + integrity sha512-wJ+qfGukxMxpDE5d2XHiOspKheWTb1PdPOd2eD3MVuh8hjr6fqyJ3zuacTp/WVubeyppPhM4vYcDjkKCg1OEhA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -660,25 +659,25 @@ resolved "https://registry.yarnpkg.com/@klasa/async-queue/-/async-queue-0.0.1.tgz#0075c504781bae570ab4cd47ae58a12de67cc57d" integrity sha512-k3fPWnnRL4YB5u2w6KypXRL0NPjJSgnvzKsjCjGkfoyGKrGqS1L9VVbsrRpf8LuwLbP7tjmyCK5dxmmn1w4jng== -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" "@playlyfe/gql@^2.6.2": @@ -705,114 +704,136 @@ parse-glob "3.0.4" promise-retry "1.1.1" -"@sapphire/eslint-config@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@sapphire/eslint-config/-/eslint-config-1.0.4.tgz#d984b0c8102708c00b81674e23e0533772b32102" - integrity sha512-+ZeDjjGM4PNclE7soVzHXHuLxtv+nz+u9ssT0RSnQBlSgKPeYsaao4KvU62maIk4KxHD6bPNGvLL4JDVm8EHqQ== +"@sapphire/eslint-config@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sapphire/eslint-config/-/eslint-config-2.0.0.tgz#33d07dfe37b583010fbc32c555e2ae5e9ff4de68" + integrity sha512-f/tNgR9nP8Tjb0MdQ9OjKnbSfTQGJFWGlX1dUb+o0vW3uwx0J2IBXBslCn1rsuz1mzp7XsVzj2jSxyASBugyUQ== -"@sapphire/snowflake@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-1.2.0.tgz#123801ded292abf8d0f710cd608236425bbfbd4e" - integrity sha512-S0hEr0Z9KjE21sIxnaDgRQKHyHxDvR39XQ9oraqQXI1cda1TpHr4Y22ooF204PbQCvDdmSrYyOtzoONojju/og== +"@sapphire/pieces@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sapphire/pieces/-/pieces-1.1.0.tgz#ec82ea79fc3c87bd4c712cb4c8021b5663eb49b8" + integrity sha512-/XmIkHGHi4ycit/+dvY5ZwWLY/z10k5aXxRT8WbHtqDpc5yyhG7zR1U6fqKD9VNU8Ii1hqB2eEzWNeAvlTnwyw== + dependencies: + "@discordjs/collection" "^0.1.6" -"@sapphire/time-utilities@^1.2.0": +"@sapphire/plugin-i18next@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@sapphire/time-utilities/-/time-utilities-1.2.0.tgz#a632d711b6bcbc63440b005e131cdbd7c1b6a61c" - integrity sha512-jzIiJ6FzXrDomwelCACB6yVSQ0Kn0lSNXmR0CzGRC+W8c/yr5CVH+SMEMNsf+ts53RK1EwWIT7EmqQN36ajnPQ== + resolved "https://registry.yarnpkg.com/@sapphire/plugin-i18next/-/plugin-i18next-1.2.0.tgz#a6d43d080e6dfa9aeed9d064c3daf6937db5467f" + integrity sha512-4FwU4kAkZvLnnWzL7k00rKUQ2SsWcNuoZ2YhFhx0qp6mFjo1Pa0gogFFSS7eP2cqIZyQ3wBP0QFgehezxKo39Q== dependencies: - "@sapphire/utilities" "^1.1.1" + "@sapphire/utilities" "^1.3.1" + i18next "^19.8.4" + i18next-fs-backend "^1.0.7" + tslib "^2.1.0" -"@sapphire/ts-config@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@sapphire/ts-config/-/ts-config-1.0.3.tgz#e923ca8b04a1f759961cee309ed8f64880bfa9a1" - integrity sha512-Id//WIO0zAj07TqO8wkr9IboQwzW/ZKuTP2BA2UlnmnJ4j3ShkKazRa2m3p6FWpnlUbDf2GN8In1lYc+GXTvNQ== +"@sapphire/prettier-config@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@sapphire/prettier-config/-/prettier-config-1.0.5.tgz#fd2a91c79dbc0327bd78655dc9ce1a5d65ac5490" + integrity sha512-I4ReoMcm/+ZZLFy5asbsXAFZyYdHNMinLTJ7wlBX6h2M0jcbWCY4/GtyFkIMengd3tkLrxD6YiMJOPFgV5nLvw== -"@sapphire/type@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@sapphire/type/-/type-1.1.0.tgz#4409d3a6d2a50e9410352619acc70c39bbd29358" - integrity sha512-pBsWF2ZQQU/nHsE0E+tfkEd4CW3Rkc2v4OneSCvvTYv616KKQUaHma4z19NJoXrAw3tqlAsFEll8Gi+6FCal8g== +"@sapphire/snowflake@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-1.2.3.tgz#9f4b97435c20ecfc613715ec2600eeb78a4c2dff" + integrity sha512-48GQFS8NG7wrDWS0mSBVFM6OE/Pux4En4K/heux2LPcLYwg3xipuVjnSAecDFeyvrNCUaAEIrHv9REt3W40Ygw== -"@sapphire/utilities@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@sapphire/utilities/-/utilities-1.1.1.tgz#899b033312794ecfb48efa81b6e97ecc7b2879d4" - integrity sha512-G4I963k2bhBXRS+ZlpOLzDjks51MuZrBPsq8/hA7FUKbRkO1VizQAzY/cTQA1vVZI6jOHPxZRWJD0xWPNbjLuA== - -"@sentry/core@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.27.6.tgz#3ceeb58acd857f1e17d52d3087bfecb506adc1f7" - integrity sha512-izCS5iyc6HAfpW1AsGXLAKetx82C1Sq1siAh97tOlSK58PVJAEH/WMiej9WuZJxCDTOtj94QtoLflssrZyAtFg== - dependencies: - "@sentry/hub" "5.27.6" - "@sentry/minimal" "5.27.6" - "@sentry/types" "5.27.6" - "@sentry/utils" "5.27.6" +"@sapphire/time-utilities@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sapphire/time-utilities/-/time-utilities-1.2.3.tgz#7676687932a95606325960e84ee23a6f3fecbda4" + integrity sha512-8DXVKEo3/40sKPROi0QHhRbjkMrJ44E9daJ5IQXQ7w55Zy0kUqR/DuQ22eET1tftpzXhLvXEv7Nbb/NUxUxTgA== + dependencies: + "@sapphire/utilities" "^1.3.1" + +"@sapphire/ts-config@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sapphire/ts-config/-/ts-config-2.0.0.tgz#414f47a134e8016193e1685c7ca999dfdcd54bf2" + integrity sha512-gYjOTGZ9jMOWJoCbxbMZo7hspBDzz7gX2CJnt7iB4C4xR8gOXA2EpZLFD8e9b8EWmwclQWiQjdZYGGRqMEVovw== + +"@sapphire/type@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@sapphire/type/-/type-1.1.3.tgz#14bd34461785fae5161c046689b65094b2caa44a" + integrity sha512-gs5RlTjVpzfZQeX1T6b0O9lAuAMwNLLxMypeXPBNY9C1MHpF+bXc3raooat/bCcLhESsogKZZke0CC6gJxK59w== + +"@sapphire/utilities@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@sapphire/utilities/-/utilities-1.3.1.tgz#32f2af73b0ac0131bad579439ce33fb7d5c1e624" + integrity sha512-4HBXS2q3le89rDgjN6r+wPi5T+s1Dd1iGo+OUwSo8rEM7Fp7ukZwdYwDz5cWQ0FWlC3VIHBtdoMosafuX1UfKQ== + +"@sentry/core@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.29.2.tgz#9e05fe197234161d57aabaf52fab336a7c520d81" + integrity sha512-7WYkoxB5IdlNEbwOwqSU64erUKH4laavPsM0/yQ+jojM76ErxlgEF0u//p5WaLPRzh3iDSt6BH+9TL45oNZeZw== + dependencies: + "@sentry/hub" "5.29.2" + "@sentry/minimal" "5.29.2" + "@sentry/types" "5.29.2" + "@sentry/utils" "5.29.2" tslib "^1.9.3" -"@sentry/hub@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.27.6.tgz#a94adbe32c45dda7ad5adf742b82e0a022eb9c2f" - integrity sha512-bOMky3iu7zEghSaWmTayfme5tCpUok841qDCGxGKuyAtOhBDsgGNS/ApNEEDF2fyX0oo4G1cHYPWhX90ZFf/xA== +"@sentry/hub@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.29.2.tgz#208f10fe6674695575ad74182a1151f71d6df00a" + integrity sha512-LaAIo2hwUk9ykeh9RF0cwLy6IRw+DjEee8l1HfEaDFUM6TPGlNNGObMJNXb9/95jzWp7jWwOpQjoIE3jepdQJQ== dependencies: - "@sentry/types" "5.27.6" - "@sentry/utils" "5.27.6" + "@sentry/types" "5.29.2" + "@sentry/utils" "5.29.2" tslib "^1.9.3" -"@sentry/integrations@^5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.27.6.tgz#c78c5b334c5e3d30f38a7f9e09ec0ad9e8e26aaa" - integrity sha512-wRsvSrP48YZ3Jq3RNIHzS+cnlLgQL0S2Qpq5fUPrUngEGuOHKcunOpKOT11VbKjzNWM15662wD4GsONIUA2UFA== +"@sentry/integrations@^5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.29.2.tgz#bd00dfd81f8a9448a5ccf87a3eb7d12035088ad9" + integrity sha512-bH50B0xubbHrJFq8xZRxOc5BgXe1PXKfC0OqQkhhSd+Bu2WDLCHcn0CEzV+8thZTYkipAoFAFJNdEWcsM2Wcew== dependencies: - "@sentry/types" "5.27.6" - "@sentry/utils" "5.27.6" + "@sentry/types" "5.29.2" + "@sentry/utils" "5.29.2" localforage "1.8.1" tslib "^1.9.3" -"@sentry/minimal@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.27.6.tgz#783012ed94668be168f2b521e0ea6295c76ce2b0" - integrity sha512-pKhzVQX9nL4m1dcnb2i2Y47IWVNs+K3wiYLgCB9hl9+ApxppfOc+fquiFoCloST3IuaD4yly2TtbOJgAMWcMxQ== +"@sentry/minimal@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.29.2.tgz#420bebac8d03d30980fdb05c72d7b253d8aa541b" + integrity sha512-0aINSm8fGA1KyM7PavOBe1GDZDxrvnKt+oFnU0L+bTcw8Lr+of+v6Kwd97rkLRNOLw621xP076dL/7LSIzMuhw== dependencies: - "@sentry/hub" "5.27.6" - "@sentry/types" "5.27.6" + "@sentry/hub" "5.29.2" + "@sentry/types" "5.29.2" tslib "^1.9.3" -"@sentry/node@^5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.27.6.tgz#a9ab20bf305d802914b41040ef3b328c2b681120" - integrity sha512-ogKL4F3wSZuzNeHOGKPqQPbZ87Bd/dC8wk7Rwbui3SIMgtoUmO3rSOR4Edwar6mf330cA6CY9roylWdcaSqmZA== +"@sentry/node@^5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.29.2.tgz#f0f0b4b2be63c9ddd702729fab998cead271dff1" + integrity sha512-98m1ZejmJgA+eiz6jEFyYYfp6kJZQnx6d6KrJDMxGfss4YTmmJY57bE4xStnjjk7WINDGzlCiHuk+wJFMBjuoA== dependencies: - "@sentry/core" "5.27.6" - "@sentry/hub" "5.27.6" - "@sentry/tracing" "5.27.6" - "@sentry/types" "5.27.6" - "@sentry/utils" "5.27.6" + "@sentry/core" "5.29.2" + "@sentry/hub" "5.29.2" + "@sentry/tracing" "5.29.2" + "@sentry/types" "5.29.2" + "@sentry/utils" "5.29.2" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/tracing@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.27.6.tgz#34a827c6e7a819b0eb0e409063203209abd19dad" - integrity sha512-ms3vprEId+hi8hcqtf8weqsNGASaDXAZzIOT4g2gASGpwLb5hLuScpM8z6Yhu5FGjb8DektlW5OrXJSsStIozw== +"@sentry/tracing@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.29.2.tgz#6012788547d2ab7893799d82c4941bda145dcd47" + integrity sha512-iumYbVRpvoU3BUuIooxibydeaOOjl5ysc+mzsqhRs2NGW/C3uKAsFXdvyNfqt3bxtRQwJEhwJByLP2u3pLThpw== dependencies: - "@sentry/hub" "5.27.6" - "@sentry/minimal" "5.27.6" - "@sentry/types" "5.27.6" - "@sentry/utils" "5.27.6" + "@sentry/hub" "5.29.2" + "@sentry/minimal" "5.29.2" + "@sentry/types" "5.29.2" + "@sentry/utils" "5.29.2" tslib "^1.9.3" -"@sentry/types@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.27.6.tgz#b5054eafcb8ac11d4bc4787c7bc7fc113cad8b80" - integrity sha512-XOW9W8DrMk++4Hk7gWi9o5VR0o/GrqGfTKyFsHSIjqt2hL6kiMPvKeb2Hhmp7Iq37N2bDmRdWpM5m+68S2Jk6w== +"@sentry/types@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.29.2.tgz#ac87383df1222c2d9b9f8f9ed7a6b86ea41a098a" + integrity sha512-dM9wgt8wy4WRty75QkqQgrw9FV9F+BOMfmc0iaX13Qos7i6Qs2Q0dxtJ83SoR4YGtW8URaHzlDtWlGs5egBiMA== -"@sentry/utils@5.27.6": - version "5.27.6" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.27.6.tgz#cd8486469ae9716a21a4bc7e828e5aeee0ed9727" - integrity sha512-/QMVLv+zrTfiIj2PU+SodSbSzD5MmamMOaljkDsRIVsj6gpkm1/VG1g2+40TZ0FbQ4hCW2F+iR7cnqzZBNmchA== +"@sentry/utils@5.29.2": + version "5.29.2" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.29.2.tgz#99a5cdda2ea19d34a41932f138d470adcb3ee673" + integrity sha512-nEwQIDjtFkeE4k6yIk4Ka5XjGRklNLThWLs2xfXlL7uwrYOH2B9UBBOOIRUraBm/g/Xrra3xsam/kRxuiwtXZQ== dependencies: - "@sentry/types" "5.27.6" + "@sentry/types" "5.29.2" tslib "^1.9.3" "@sinonjs/commons@^1.7.0": @@ -837,13 +858,13 @@ bindings "^1.5.0" node-addon-api "*" -"@skyra/audio@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@skyra/audio/-/audio-1.0.1.tgz#ec0ca19a995bdc94a622c44a510a1a47e53d051a" - integrity sha512-IPwAOlxs6sC7fpIzU2GAh2GeUR7u/vZtKy4y+BS3Ds+p5/O/QNme/H9cR6315qKwK1btmmFl0JAv72jZQZT+RA== +"@skyra/audio@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@skyra/audio/-/audio-1.0.2.tgz#c0a58934bae32300517166ab826c01332f41586b" + integrity sha512-N4zN0Z7HCi5sFmlNjcYS0Uka21MnxcICQy0/77i9lrcZ94uzQjsOwz4a0O9GRcY68Z1yaHFVaRHf14HA/S4N3w== dependencies: backoff "^2.5.0" - ws "^7.3.1" + ws "^7.4.1" "@skyra/char@^1.0.1": version "1.0.1" @@ -855,10 +876,10 @@ resolved "https://registry.yarnpkg.com/@skyra/decorators/-/decorators-3.0.0.tgz#eaa4287c07dd4eaaa2ebd8ec590c538b5379a659" integrity sha512-C0ooDOLzjtm4Iu0U4KxTIPEE2PNCN8rcTEpHphIFxxxQ5xZleu5ecX70KrPxXjmLKF/h3JUaDVt08KBeZwiC2Q== -"@skyra/saelem@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@skyra/saelem/-/saelem-3.0.0.tgz#11b2ab5e70448f818c00aa1323dcefdfd652ad0c" - integrity sha512-ui/kvhk/qnDNAHrGK1Dw1/RgKG/IZXSAwusVXSvWgMEY6DJwNqRInPMkGE1xyozJlIxkzhE0td+JnosQtvac2Q== +"@skyra/saelem@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@skyra/saelem/-/saelem-3.0.1.tgz#2e0f20449dbfa95525cc235c6d663ac73462e443" + integrity sha512-9s3RwEZh8YtEwQn4EDpDx6uzohmo+k8w7GsCSJh6p4iCstz2ioIxnbc7I3VaDgd/yu/yqCoMIC9jHcw8lxQyCQ== dependencies: graphql "^15.4.0" @@ -894,9 +915,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.0.16" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.16.tgz#0bbbf70c7bc4193210dd27e252c51260a37cd6a7" - integrity sha512-S63Dt4CZOkuTmpLGGWtT/mQdVORJOpx6SZWGVaP56dda/0Nx5nEe82K7/LAm8zYr6SfMq+1N2OreIOrHAx656w== + version "7.11.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" + integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== dependencies: "@babel/types" "^7.3.0" @@ -907,10 +928,10 @@ dependencies: "@types/node" "*" -"@types/diff@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-4.0.2.tgz#2e9bb89f9acc3ab0108f0f3dc4dbdcf2fff8a99c" - integrity sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ== +"@types/diff@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.0.tgz#eb71e94feae62548282c4889308a3dfb57e36020" + integrity sha512-jrm2K65CokCCX4NmowtA+MfXyuprZC13jbRuwprs6/04z/EcFg/MCwYdsHn+zgV4CQBiATiI7AEq7y1sZCtWKA== "@types/graceful-fs@^4.1.2": version "4.1.4" @@ -924,10 +945,17 @@ resolved "https://registry.yarnpkg.com/@types/he/-/he-1.1.1.tgz#19e14033c4ee8f1a702c74dcc6182664839ac2b7" integrity sha512-jpzrsR1ns0n3kyWt92QfOUQhIuJGQ9+QGa7M62rO6toe98woQjnsnzjdMtsQXCdvjjmqjS2ZBCC7xKw0cdzU+Q== -"@types/ioredis@^4.17.8": - version "4.17.8" - resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.17.8.tgz#a761c9adac03a9f0413157691fdae247262eb523" - integrity sha512-13WwLG9jMvzjabpBydDXKSPdvAnKI8pZOKk9rEFp3QizyJS8riyNyVRV5ATvU1DCKsz31KM9g90etnTGgMFh3g== +"@types/i18next-fs-backend@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/i18next-fs-backend/-/i18next-fs-backend-1.0.0.tgz#3fb0374f4d376375b7cc1d3729bca663d104fa64" + integrity sha512-PotQ0NE17NavxXCsdyq9qIKZQOB7+A5O/2nDdvfbfm6/IgvvC1YUO6hxK3nIHASu+QGjO1QV5J8PJw4OL12LMQ== + dependencies: + i18next "^19.7.0" + +"@types/ioredis@^4.17.11": + version "4.17.11" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.17.11.tgz#08ee0324ec0c0770b025a66a9fb6534ca1d87c8e" + integrity sha512-XAg9kOLyClyyP2BjfO9NWQmDDJFTNxvz2qkE+BMBfQoAN0/o6X53X2gefgfm4bn89A9462DyzNEL1q23oeCRSg== dependencies: "@types/node" "*" @@ -950,10 +978,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@26.x", "@types/jest@^26.0.15": - version "26.0.15" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz#12e02c0372ad0548e07b9f4e19132b834cb1effe" - integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog== +"@types/jest@26.x", "@types/jest@^26.0.20": + version "26.0.20" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.20.tgz#cd2f2702ecf69e86b586e1f5223a60e454056307" + integrity sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -981,10 +1009,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^14.14.10": - version "14.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" - integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== +"@types/node@*", "@types/node@^14.14.20": + version "14.14.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340" + integrity sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1010,9 +1038,9 @@ "@types/pg-types" "*" "@types/prettier@^2.0.0": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00" - integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ== + version "2.1.6" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.6.tgz#f4b1efa784e8db479cdb8b14403e2144b1e9ff03" + integrity sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA== "@types/stack-utils@^2.0.0": version "2.0.0" @@ -1027,72 +1055,73 @@ "@types/node" "*" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== "@types/yargs@^15.0.0": - version "15.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.10.tgz#0fe3c8173a0d5c3e780b389050140c3f5ea6ea74" - integrity sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ== + version "15.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.12.tgz#6234ce3e3e3fa32c5db301a170f96a599c960d74" + integrity sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.2.tgz#cf9102ec800391caa574f589ffe0623cca1d9308" - integrity sha512-gQ06QLV5l1DtvYtqOyFLXD9PdcILYqlrJj2l+CGDlPtmgLUzc1GpqciJFIRvyfvgLALpnxYINFuw+n9AZhPBKQ== +"@typescript-eslint/eslint-plugin@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.13.0.tgz#5f580ea520fa46442deb82c038460c3dd3524bb6" + integrity sha512-ygqDUm+BUPvrr0jrXqoteMqmIaZ/bixYOc3A4BRwzEPTZPi6E+n44rzNZWaB0YvtukgP+aoj0i/fyx7FkM2p1w== dependencies: - "@typescript-eslint/experimental-utils" "4.8.2" - "@typescript-eslint/scope-manager" "4.8.2" + "@typescript-eslint/experimental-utils" "4.13.0" + "@typescript-eslint/scope-manager" "4.13.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" + lodash "^4.17.15" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.2.tgz#8909a5732f19329cf5ef0c39766170476bff5e50" - integrity sha512-hpTw6o6IhBZEsQsjuw/4RWmceRyESfAiEzAEnXHKG1X7S5DXFaZ4IO1JO7CW1aQ604leQBzjZmuMI9QBCAJX8Q== +"@typescript-eslint/experimental-utils@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.13.0.tgz#9dc9ab375d65603b43d938a0786190a0c72be44e" + integrity sha512-/ZsuWmqagOzNkx30VWYV3MNB/Re/CGv/7EzlqZo5RegBN8tMuPaBgNK6vPBCQA8tcYrbsrTdbx3ixMRRKEEGVw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.8.2" - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/typescript-estree" "4.8.2" + "@typescript-eslint/scope-manager" "4.13.0" + "@typescript-eslint/types" "4.13.0" + "@typescript-eslint/typescript-estree" "4.13.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.8.2.tgz#78dccbe5124de2b8dea2d4c363dee9f769151ca8" - integrity sha512-u0leyJqmclYr3KcXOqd2fmx6SDGBO0MUNHHAjr0JS4Crbb3C3d8dwAdlazy133PLCcPn+aOUFiHn72wcuc5wYw== +"@typescript-eslint/parser@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.13.0.tgz#c413d640ea66120cfcc37f891e8cb3fd1c9d247d" + integrity sha512-KO0J5SRF08pMXzq9+abyHnaGQgUJZ3Z3ax+pmqz9vl81JxmTTOUfQmq7/4awVfq09b6C4owNlOgOwp61pYRBSg== dependencies: - "@typescript-eslint/scope-manager" "4.8.2" - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/typescript-estree" "4.8.2" + "@typescript-eslint/scope-manager" "4.13.0" + "@typescript-eslint/types" "4.13.0" + "@typescript-eslint/typescript-estree" "4.13.0" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.8.2.tgz#a18388c63ae9c17adde519384f539392f2c4f0d9" - integrity sha512-qHQ8ODi7mMin4Sq2eh/6eu03uVzsf5TX+J43xRmiq8ujng7ViQSHNPLOHGw/Wr5dFEoxq/ubKhzClIIdQy5q3g== +"@typescript-eslint/scope-manager@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.13.0.tgz#5b45912a9aa26b29603d8fa28f5e09088b947141" + integrity sha512-UpK7YLG2JlTp/9G4CHe7GxOwd93RBf3aHO5L+pfjIrhtBvZjHKbMhBXTIQNkbz7HZ9XOe++yKrXutYm5KmjWgQ== dependencies: - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/visitor-keys" "4.8.2" + "@typescript-eslint/types" "4.13.0" + "@typescript-eslint/visitor-keys" "4.13.0" -"@typescript-eslint/types@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.2.tgz#c862dd0e569d9478eb82d6aee662ea53f5661a36" - integrity sha512-z1/AVcVF8ju5ObaHe2fOpZYEQrwHyZ7PTOlmjd3EoFeX9sv7UekQhfrCmgUO7PruLNfSHrJGQvrW3Q7xQ8EoAw== +"@typescript-eslint/types@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.13.0.tgz#6a7c6015a59a08fbd70daa8c83dfff86250502f8" + integrity sha512-/+aPaq163oX+ObOG00M0t9tKkOgdv9lq0IQv/y4SqGkAXmhFmCfgsELV7kOCTb2vVU5VOmVwXBXJTDr353C1rQ== -"@typescript-eslint/typescript-estree@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.2.tgz#eeec34707d8577600fb21661b5287226cc8b3bed" - integrity sha512-HToGNwI6fekH0dOw3XEVESUm71Onfam0AKin6f26S2FtUmO7o3cLlWgrIaT1q3vjB3wCTdww3Dx2iGq5wtUOCg== +"@typescript-eslint/typescript-estree@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.13.0.tgz#cf6e2207c7d760f5dfd8d18051428fadfc37b45e" + integrity sha512-9A0/DFZZLlGXn5XA349dWQFwPZxcyYyCFX5X88nWs2uachRDwGeyPz46oTsm9ZJE66EALvEns1lvBwa4d9QxMg== dependencies: - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/visitor-keys" "4.8.2" + "@typescript-eslint/types" "4.13.0" + "@typescript-eslint/visitor-keys" "4.13.0" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" @@ -1100,12 +1129,12 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.2.tgz#62cd3fbbbf65f8eccfbe6f159eb1b84a243a3f77" - integrity sha512-Vg+/SJTMZJEKKGHW7YC21QxgKJrSbxoYYd3MEUGtW7zuytHuEcksewq0DUmo4eh/CTNrVJGSdIY9AtRb6riWFw== +"@typescript-eslint/visitor-keys@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.13.0.tgz#9acb1772d3b3183182b6540d3734143dce9476fe" + integrity sha512-6RoxWK05PAibukE7jElqAtNMq+RWZyqJ6Q/GdIxaiUj2Ept8jh8+FUVlbq9WxMYxkmEOPvCE5cRSyupMpwW31g== dependencies: - "@typescript-eslint/types" "4.8.2" + "@typescript-eslint/types" "4.13.0" eslint-visitor-keys "^2.0.0" JSONStream@^1.0.4: @@ -1128,7 +1157,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -acorn-jsx@^5.2.0: +acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== @@ -1153,7 +1182,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1163,6 +1192,16 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -1200,13 +1239,6 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1315,11 +1347,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -1381,9 +1408,9 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" - integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" @@ -1519,10 +1546,10 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bufferutil@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" - integrity sha512-AtnG3W6M8B2n4xDQ5R+70EXvOpnXsFYg/AK2yTZd+HQ/oxAdz+GI+DvjmhBw3L0ole+LJ0ngqY4JMbDzkfNzhA== +bufferutil@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" + integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== dependencies: node-gyp-build "^4.2.0" @@ -1654,16 +1681,16 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-highlight@^2.1.4: - version "2.1.8" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.8.tgz#aa3130b481649d631ab913ae60becf81c69c3887" - integrity sha512-mFuTW5UOV3/S0wZE9/1b0EcAM0XOJIhoAWPhWm5voiJ6ugVBkvYBIEL7sbHo9sEtWdEmwDIWab32qpaRI3cfqQ== + version "2.1.10" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.10.tgz#26a087da9209dce4fcb8cf5427dc97cd96ac173a" + integrity sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw== dependencies: chalk "^4.0.0" highlight.js "^10.0.0" mz "^2.4.0" parse5 "^5.1.1" parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^15.0.0" + yargs "^16.0.0" cli-truncate@^2.1.0: version "2.1.0" @@ -1724,13 +1751,6 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1738,11 +1758,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1761,9 +1776,9 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" commander@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commitizen@^4.0.3: version "4.2.2" @@ -1876,9 +1891,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.1: - version "3.8.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.0.tgz#0fc2d4941cadf80538b030648bb64d230b4da0ce" - integrity sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA== + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" + integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== core-util-is@~1.0.0: version "1.0.2" @@ -1896,6 +1911,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2034,9 +2054,9 @@ delegates@^1.0.0: integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= denque@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" + integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== dentist@1.0.3: version "1.0.3" @@ -2085,10 +2105,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -discord-api-types@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.9.1.tgz#8b02b12abc027f1500301c917c1acaa5a344354d" - integrity sha512-k2stVgxzgCM04vW45+z+/A+iF/RViAl5xs89E6Dz5toE0jCYXE5bPa6DZct6LJwJiXlK9I2f46pnwUhnKRrU4A== +discord-api-types@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.12.1.tgz#98fd362ff71681bd4daa97e28a30ece87ae67f38" + integrity sha512-x8dhQqPZUtIEKjDHMdA6D3aAsZUMoeo58fAgFA5WOAdSh+uVyRsvny4+25b+RIRasG2Zf2UpDUsx8NKO5zk/6g== discord.js@^12.5.1: version "12.5.1" @@ -2128,11 +2148,6 @@ emittery@^0.7.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2184,15 +2199,15 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -eslint-config-prettier@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz#c1ae4106f74e6c0357f44adb076771d032ac0e97" - integrity sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ== +eslint-config-prettier@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz#5402eb559aa94b894effd6bddfa0b1ca051c858f" + integrity sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA== -eslint-plugin-prettier@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" - integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== +eslint-plugin-prettier@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz#7079cfa2497078905011e6f82e8dd8453d1371b7" + integrity sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -2221,13 +2236,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" - integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== +eslint@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.1" + "@eslint/eslintrc" "^0.2.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2237,10 +2252,10 @@ eslint@^7.14.0: eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" - espree "^7.3.0" + espree "^7.3.1" esquery "^1.2.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" globals "^12.1.0" @@ -2260,17 +2275,17 @@ eslint@^7.14.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.4" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" - acorn-jsx "^5.2.0" + acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" esprima@^4.0.0: @@ -2453,9 +2468,9 @@ fast-levenshtein@^2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== dependencies: reusify "^1.0.4" @@ -2492,12 +2507,12 @@ figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-uri-to-path@1.0.0: version "1.0.0" @@ -2557,12 +2572,12 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-versions@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" - integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== +find-versions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== dependencies: - semver-regex "^2.0.0" + semver-regex "^3.1.2" findup-sync@^3.0.0: version "3.0.0" @@ -2574,19 +2589,18 @@ findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== flow-runtime@0.14.0: version "0.14.0" @@ -2651,9 +2665,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.2.1.tgz#1fb02ded2036a8ac288d507a65962bd87b97628d" - integrity sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== function-bind@^1.1.1: version "1.1.1" @@ -2731,14 +2745,14 @@ gifencoder@^2.0.1: canvas "^2.2.0" git-raw-commits@^2.0.0: - version "2.0.8" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.8.tgz#65cef91ae8307281b6ee31ca481fa1164e166156" - integrity sha512-6Gk7tQHGMLEL1bSnrMJTCVt2AQl4EmCcJDtzs/JJacCb2+TNEyHM67Gp7Ri9faF7OcGpjGGRjHLvs/AG7QKZ2Q== + version "2.0.9" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.9.tgz#5cbc707a615cb77b71e687f8a1ee54af46208b22" + integrity sha512-hSpNpxprVno7IOd4PZ93RQ+gNdzPAIrW0x8av6JQDJGV4k1mR9fE01dl8sEqi2P7aKmmwiGUn1BCPuf16Ae0Qw== dependencies: dargs "^7.0.0" lodash.template "^4.0.2" meow "^8.0.0" - split2 "^2.0.0" + split2 "^3.0.0" through2 "^4.0.0" glob-base@^0.3.0: @@ -2827,9 +2841,9 @@ globals@^12.1.0: type-fest "^0.8.1" globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + version "11.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" + integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -2959,9 +2973,9 @@ he@^1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== highlight.js@^10.0.0: - version "10.4.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" - integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== + version "10.5.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.5.0.tgz#3f09fede6a865757378f2d9ebdcbc15ba268f98f" + integrity sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw== homedir-polyfill@^1.0.1: version "1.0.3" @@ -3000,22 +3014,34 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -husky@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" - integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== +husky@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.7.tgz#ca47bbe6213c1aa8b16bbd504530d9600de91e88" + integrity sha512-0fQlcCDq/xypoyYSJvEuzbDPHFf8ZF9IXKJxlrnvxABTSzK1VPT2RKYQKrcgJ+YD39swgoB6sbzywUqFxUiqjw== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" cosmiconfig "^7.0.0" - find-versions "^3.2.0" + find-versions "^4.0.0" opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" + pkg-dir "^5.0.0" please-upgrade-node "^3.2.0" slash "^3.0.0" which-pm-runs "^1.0.0" +i18next-fs-backend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/i18next-fs-backend/-/i18next-fs-backend-1.0.7.tgz#00ca4587e306f8948740408389dda73461a5d07f" + integrity sha512-aAZ3rvshe1Zbl6JSCWrWWqbZS5JpmVNG+84YqLcgdYcm9uAxzw4xWxnA/a3044Nm2PKXE62CT+pIZjk7OEYtTw== + +i18next@^19.7.0, i18next@^19.8.4: + version "19.8.4" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.8.4.tgz#447718f2a26319b8debdbcc6fbc1a9761be7316b" + integrity sha512-FfVPNWv+felJObeZ6DSXZkj9QM1Ivvh7NcFCgA8XPtJWHz0iXVa9BUy+QY8EPrCLE+vWgDfV/sc96BgXVo6HAA== + dependencies: + "@babel/runtime" "^7.12.0" + iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3051,9 +3077,9 @@ immediate@~3.0.5: integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -3090,9 +3116,9 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.4, ini@~1.3.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@6.5.2: version "6.5.2" @@ -3120,10 +3146,10 @@ invariant@2.2.2: dependencies: loose-envify "^1.0.0" -ioredis@^4.19.2: - version "4.19.2" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.19.2.tgz#e3eab394c653cea5aea07c0c784d8c772dce8801" - integrity sha512-SZSIwMrbd96b7rJvJwyTWSP6XQ0m1kAIIqBnwglJKrIJ6na7TeY4F2EV2vDY0xm/fLrUY8cEg81dR7kVFt2sKA== +ioredis@^4.19.4: + version "4.19.4" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.19.4.tgz#11112005f87ad3acac247ada3b22eb31b947f7c7" + integrity sha512-3haQWw9dpEjcfVcRktXlayVNrrqvvc2io7Q/uiV2UsYw8/HC2YwwJr78Wql7zu5bzwci0x9bZYA69U7KkevAvw== dependencies: cluster-key-slot "^1.1.0" debug "^4.1.1" @@ -3789,9 +3815,9 @@ jest@^26.6.3: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1, js-yaml@^3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3811,6 +3837,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -3866,13 +3897,13 @@ kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^4.0.0, kind-of@^5.0.0, klasa-dashboard-hooks@skyra-project/klasa-dashboard-hooks#master: version "0.0.1-dev" - resolved "https://codeload.github.com/skyra-project/klasa-dashboard-hooks/tar.gz/ae9c323f56c300b65e50cf91e8bec7915d0755bf" + resolved "https://codeload.github.com/skyra-project/klasa-dashboard-hooks/tar.gz/a3c0082cb4c46dde36b65daaf1f5489aef1f51d9" dependencies: - node-fetch "^2.6.0" + node-fetch "^2.6.1" klasa@skyra-project/klasa#settings: version "0.5.0-dev" - resolved "https://codeload.github.com/skyra-project/klasa/tar.gz/e0020fb8fa6b09f31c30ad8fae63cdea0d67224f" + resolved "https://codeload.github.com/skyra-project/klasa/tar.gz/8ab2e1bb4197ef9888f3b3089e96c1c81e354e25" dependencies: fs-nextra "^0.5.1" @@ -3911,10 +3942,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@^10.5.2: - version "10.5.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.2.tgz#acfaa0093af3262aee3130b2e22438941530bdd1" - integrity sha512-e8AYR1TDlzwB8VVd38Xu2lXDZf6BcshVqKVuBQThDJRaJLobqKnpbm4dkwJ2puypQNbLr9KF/9mfA649mAGvjA== +lint-staged@^10.5.3: + version "10.5.3" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.3.tgz#c682838b3eadd4c864d1022da05daa0912fb1da5" + integrity sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -4012,7 +4043,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash@4.17.15, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: +lodash@4.17.15, lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -4100,9 +4131,9 @@ map-visit@^1.0.0: object-visit "^1.0.0" meow@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.0.0.tgz#1aa10ee61046719e334ffdc038bb5069250ec99a" - integrity sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg== + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.2.2" @@ -4158,17 +4189,17 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== mime-types@^2.1.12: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== dependencies: - mime-db "1.44.0" + mime-db "1.45.0" mimic-fn@^1.0.0: version "1.2.0" @@ -4256,11 +4287,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multimatch@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" @@ -4314,9 +4350,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" - integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -4338,11 +4374,11 @@ nock@^13.0.5: propagate "^2.0.0" node-addon-api@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681" - integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" + integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== -node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -4363,9 +4399,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620" - integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" + integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== dependencies: growly "^1.3.0" is-wsl "^2.2.0" @@ -4783,6 +4819,13 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -4862,9 +4905,9 @@ pretty-quick@^3.1.0: multimatch "^4.0.0" prism-media@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.2.tgz#4f1c841f248b67d325a24b4e6b1a491b8f50a24f" - integrity sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.3.tgz#37bbb11726674a73fe56a2df4de76aa91d2141b7" + integrity sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A== process-nextick-args@~2.0.0: version "2.0.1" @@ -5049,6 +5092,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -5091,7 +5139,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -5130,13 +5178,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -5144,7 +5185,7 @@ rimraf@^2.6.1: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -5220,21 +5261,28 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== +semver-regex@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" + integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.2, semver@7.x, semver@^7.2.1, semver@^7.3.2: +semver@7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.x, semver@^7.2.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -5326,15 +5374,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -5444,9 +5483,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -5462,7 +5501,7 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" -split2@^3.1.1: +split2@^3.0.0, split2@^3.1.1: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== @@ -5524,15 +5563,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -5645,15 +5675,15 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" tar@^4: version "4.4.13" @@ -5810,12 +5840,13 @@ ts-jest@^26.4.4: semver "7.x" yargs-parser "20.x" -ts-node@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" - integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== dependencies: arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" source-map-support "^0.5.17" @@ -5831,10 +5862,15 @@ tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.19.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.19.1.tgz#d8566e0c51c82f32f9c25a4d367cd62409a547a9" + integrity sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw== dependencies: tslib "^1.8.1" @@ -5916,10 +5952,10 @@ typeorm@0.2.28: yargonaut "^1.1.2" yargs "^16.0.3" -typescript@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz#6369ef22516fe5e10304aae5a5c4862db55380e9" - integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== +typescript@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== union-value@^1.0.0: version "1.0.1" @@ -5955,9 +5991,9 @@ unset-value@^1.0.0: isobject "^3.0.0" uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -5978,10 +6014,10 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" -utf-8-validate@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" - integrity sha512-jtJM6fpGv8C1SoH4PtG22pGto6x+Y8uPprW0tw3//gGFhDDTiuksgradgFN6yRayDP4SyZZa6ZMGHLIa17+M8A== +utf-8-validate@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" + integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== dependencies: node-gyp-build "^4.2.0" @@ -5991,9 +6027,9 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= uuid@^8.3.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" - integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: version "2.2.0" @@ -6001,9 +6037,9 @@ v8-compile-cache@^2.0.3: integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== v8-to-istanbul@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz#b4fe00e35649ef7785a9b7fcebcea05f37c332fc" - integrity sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA== + version "7.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" + integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -6093,17 +6129,10 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^7.3.1, ws@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== +ws@^7.3.1, ws@^7.4.1, ws@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xml2js@^0.4.23: version "0.4.23" @@ -6124,9 +6153,9 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== y18n@^5.0.5: version "5.0.5" @@ -6170,7 +6199,7 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.0.0, yargs@^15.1.0, yargs@^15.4.1: +yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -6187,10 +6216,10 @@ yargs@^15.0.0, yargs@^15.1.0, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.0.3: - version "16.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" - integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== +yargs@^16.0.0, yargs@^16.0.3: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" escalade "^3.1.1"