diff --git a/.all-contributorsrc b/.all-contributorsrc index 7a87b7e33b9..427145f1a05 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -29,7 +29,7 @@ "translation" ], "login": "kyranet", - "name": "Antonio Román", + "name": "Aura Román", "profile": "https://github.com/kyranet" }, { diff --git a/.docker/README.md b/.docker/README.md deleted file mode 100644 index 2c19898d8b7..00000000000 --- a/.docker/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Skyra Dockerfiles - -This folder contains all the files required to control Docker development environments for Skyra. Most of the meat of -the content is in the `docker-compose.yml` file which has the info on which images can be build and as which containers -they would be ran. In order to easily control the docker-compose file there is a powershell, `control.ps1`. - -Skyra currently has the following microservices that can be dockerized: - -- PostgreSQL Database - - Service name in docker-compose: `postgres` - - Image used: `skyrabot/postgres:latest` - - For more information see [skyra-project/docker-images] -- Saelem - - Service name in docker-compose: `saelem` - - Image used: `skyrabot/saelem:latest` - - For more information see [skyra-project/saelem] -- InfluxDB - - Service name in docker-compose: `influx` - - Image used: `quay.io/influxdb/influxdb:2.0.0-beta` - - For more information see [influxdb] - - Additional instructions - 1. After starting the InfluxDB container go to [locahost:8285] - 1. Create a user to your liking, ensuring you take note of the Organization name and Initial bucket name, you need those for the next two steps - The recommended value for Organization is: `Skyra-Project` - The recommended value for Initial bucket name is: `analytics` - 1. In [the config file] set the value of `INFLUX_ORG` to the value of the Organization name - 1. In [the config file] set the value of `INFLUX_ORG_ANALYTICS_BUCKET` to the value of the Initial bucket name - 1. Once on the InfluxDB homepage click the "Data" tab on the left sidebar - 1. Open the "Tokens" tab in the new view - 1. Click on your token, which should be YourUsername's Token (YourUsername being what you entered before as the username) - 1. Click the "Copy to clipboard" button then paste set that value for `INFLUX_TOKEN` in [the config file] -- Redis - - Service name in docker-compose: `redis` - - Image used: `redis:alpine` - - For more information see [redis] -- Hasteserver - - Service name in docker-compose: `hasteserver` - - Image used: `skyrabot/haste-server:latest` - - For more information see [skyra-project/docker-images] - - - -[`.env.local`]: ./configs/.env.local -[`.env`]: ./configs/.env -[`configs`]: ./configs/ -[`redis.conf`]: ./configs/redis.conf -[`redis.local.conf`]: ./configs/redis.local.conf -[influxdb]: https://v2.docs.influxdata.com/v2.0/get-started/#download-and-run-influxdb-v2-0-beta -[locahost:8285]: http://localhost:8285 -[redis]: https://hub.docker.com/_/redis -[skyra-project/docker-images]: https://github.com/skyra-project/docker-images -[skyra-project/saelem]: https://github.com/skyra-project/saelem -[the config file]: ../src/config.ts diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml deleted file mode 100644 index 5ae3fb3f934..00000000000 --- a/.docker/docker-compose.yml +++ /dev/null @@ -1,110 +0,0 @@ -version: '2.4' -services: - hasteserver: - container_name: hasteserver - depends_on: - - redis - environment: - PORT: 8290 - STORAGE_DB: 2 - STORAGE_EXPIRE_SECONDS: 21600 - STORAGE_HOST: redis - STORAGE_PASSWORD: redis - STORAGE_PORT: 8287 - STORAGE_TYPE: redis - image: 'skyrabot/haste-server:latest' - networks: - - skyra - ports: - - '8290:8290' - restart: always - - influx: - command: 'influxd run --bolt-path /var/lib/influxdb2/influxd.bolt --engine-path /var/lib/influxdb2/engine --store bolt' - container_name: influxdb - image: 'influxdb:2.3-alpine' - networks: - - skyra - ports: - - '8285:8086' - restart: always - volumes: - - 'influx-data:/var/lib/influxdb2' - - swapi: - container_name: star-wars-api - image: 'skyrabot/star-wars-api:latest' - networks: - - skyra - ports: - - '8293:8293' - restart: always - - postgres: - container_name: postgres - image: 'skyrabot/postgres:latest' - networks: - - skyra - ports: - - '5432:5432' - restart: always - volumes: - - 'postgres-data:/var/lib/postgresql/data' - - redis: - command: 'redis-server --port 8287 --requirepass redis' - container_name: redis - image: 'redis:alpine' - networks: - - skyra - ports: - - '8287:8287' - restart: always - - saelem: - container_name: saelem - depends_on: - - redis - environment: - PORT: 8284 - SAELEM_REDIS_DATABASE: 0 - SAELEM_REDIS_HOST: redis - SAELEM_REDIS_PASSWORD: redis - SAELEM_REDIS_PORT: 8287 - image: 'skyrabot/saelem:latest' - networks: - - skyra - ports: - - '8284:8284' - restart: always - - skyra: - build: - context: ../ - container_name: skyra - depends_on: - - hasteserver - - influx - - redis - - saelem - - postgres - env_file: - - ../src/.env.development - - ../src/.env.development.local - image: 'skyrabot/skyra:latest' - networks: - - skyra - ports: - - '8282:8282' - - '7282:7282' - restart: always - tty: true - -volumes: - postgres-data: - external: true - influx-data: - external: true - -networks: - skyra: diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index e9ab7e4225d..00000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "@sapphire", - "rules": { - "@typescript-eslint/no-base-to-string": 0, - "@typescript-eslint/no-throw-literal": 0, - "no-catch-shadow": 0 - }, - "parserOptions": { - "warnOnUnsupportedTypeScriptVersion": false - }, - "overrides": [ - { - "files": ["src/commands/**/*.ts", "**/jest.config.ts"], - "rules": { - "@typescript-eslint/require-await": 0 - } - } - ] -} diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 53ca95a50a6..00000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "assets"] - path = assets - url = https://github.com/skyra-project/wardrobe.git - branch = main diff --git a/.prettierignore b/.prettierignore index 4d676902311..e75a6cdd825 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,2 @@ -src/languages/**/*.json +**/locales/**/*.json dist/ diff --git a/.vscode/Skyra.code-snippets b/.vscode/Skyra.code-snippets deleted file mode 100644 index c1de5793574..00000000000 --- a/.vscode/Skyra.code-snippets +++ /dev/null @@ -1,32 +0,0 @@ -{ - // Place your Skyra workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and - // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope - // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is - // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: - // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. - // Placeholders with the same ids are connected. - "SkyraCommand": { - "scope": "typescript", - "prefix": "command", - "body": [ - "import { SkyraCommand } from '#lib/structures';", - "import { LanguageKeys } from '#lib/i18n/languageKeys';", - "import { ApplyOptions } from '@sapphire/decorators';", - "import type { Message } from 'discord.js';", - "", - "@ApplyOptions({", - "\tcooldown: 10,", - "\tdescription: LanguageKeys.Commands.$1.${TM_FILENAME_BASE/(.{1})/${1:/upcase}/}Description,", - "\tdetailedDescription: LanguageKeys.Commands.$1.${TM_FILENAME_BASE/(.{1})/${1:/upcase}/}Extended,", - "\tpermissions: [$2],", - "})", - "export class UserCommand extends SkyraCommand {", - "\tpublic async messageRun(message: Message, args: SkyraCommand.Args) {", - "\t\treturn $3;", - "\t}", - "}", - "" - ], - "description": "Creates a SkyraCommand" - } -} diff --git a/README.md b/README.md index 372ea0d0440..140d49e0678 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,6 @@ - [`Node.js`]: To run the project. - [`PostgreSQL`]: To store persistent data. -### Optional additions - -- [`Hasteserver`]: Self hosted Pastebin (https://hastebin.skyra.pw) that we can reliably use. -- [`InfluxDB`]: Metrics platform. -- [`Redis`]: Caching for [`Saelem`]. -- [`Saelem`]: Horoscope API. -- [`Star-Wars-Api`]: Star Wars API. - ### [Set-Up - Refer to CONTRIBUTING.md] ## Translating Skyra @@ -100,7 +92,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d - + diff --git a/assets b/assets deleted file mode 160000 index e2ab80476cf..00000000000 --- a/assets +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e2ab80476cf6f8015ea3fb9e1f4aaabef586ef1f diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 09ed3f6da2f..00000000000 --- a/babel.config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - presets: [ - [ - '@babel/preset-env', - { - targets: { - node: true - } - } - ], - '@babel/preset-typescript' - ], - plugins: [ - [ - '@babel/plugin-proposal-decorators', - { - legacy: true - } - ], - '@babel/plugin-proposal-class-properties', - 'const-enum' - ] -}; diff --git a/jest.config.mjs b/jest.config.mjs deleted file mode 100644 index a63b6d1056c..00000000000 --- a/jest.config.mjs +++ /dev/null @@ -1,57 +0,0 @@ -/** @type {import('@jest/types').Config.InitialOptions} */ -const config = { - coverageProvider: 'v8', - displayName: 'unit test', - testMatch: ['/tests/**/*.test.ts'], - moduleNameMapper: { - '^#utils/(.*)$': '/src/lib/util/$1', - '^#lib/(.*)$': '/src/lib/$1', - '^#root/(.*)$': '/src/$1', - '^#mocks/(.*)$': '/tests/mocks/$1' - }, - setupFilesAfterEnv: ['/tests/jest.setup.ts'], - collectCoverageFrom: ['/src/lib/**/*.ts'], - coveragePathIgnorePatterns: [ - '/src/lib/api', - '/src/lib/customCommands', - '/src/lib/database/entities', - '/src/lib/database/index.ts', - '/src/lib/database/migrations', - '/src/lib/database/repositories', - '/src/lib/database/settings', - '/src/lib/database/utils', - '/src/lib/discord', - '/src/lib/env', - '/src/lib/extensions', - '/src/lib/games/base', - '/src/lib/games/connect-four', - '/src/lib/games/HungerGamesUsage.ts', - '/src/lib/games/Slotmachine.ts', - '/src/lib/games/tic-tac-toe', - '/src/lib/games/WheelOfFortune.ts', - '/src/lib/i18n/structures/Augments.d.ts', - '/src/lib/moderation', - '/src/lib/setup/PaginatedMessage.ts', - '/src/lib/SkyraClient.ts', - '/src/lib/structures', - '/src/lib/types', - '/src/lib/util/APIs', - '/src/lib/util/Color.ts', - '/src/lib/util/decorators.ts', - '/src/lib/util/External', - '/src/lib/util/Leaderboard.ts', - '/src/lib/util/Links', - '/src/lib/util/LongLivingReactionCollector.ts', - '/src/lib/util/Models', - '/src/lib/util/Notifications', - '/src/lib/util/Parsers', - '/src/lib/util/PreciseTimeout.ts', - '/src/lib/util/PromptList.ts', - '/src/lib/util/Security/GuildSecurity.ts', - '/src/lib/util/Security/ModerationActions.ts', - '/src/lib/util/Timers.ts', - '/src/lib/weather' - ] -}; - -export default config; diff --git a/ormconfig.js b/ormconfig.js deleted file mode 100644 index 006b7b92db6..00000000000 --- a/ormconfig.js +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -module.exports = require('./dist/lib/database/database.config').config; diff --git a/package.json b/package.json index fce07ecbcb9..3df80a409a3 100644 --- a/package.json +++ b/package.json @@ -1,150 +1,51 @@ { - "name": "skyra", - "version": "6.1.0", + "name": "skyra-root", + "version": "7.0.0", "description": "Multipurpose Discord Bot built on Sapphire Framework", "author": "Skyra Project", "license": "Apache-2.0", - "main": "./dist/Skyra.js", - "imports": { - "#lib/*": "./dist/lib/*.js", - "#lib/customCommands": "./dist/lib/customCommands/index.js", - "#lib/database": "./dist/lib/database/index.js", - "#lib/database/entities": "./dist/lib/database/entities/index.js", - "#lib/database/keys": "./dist/lib/database/keys/index.js", - "#lib/database/settings": "./dist/lib/database/settings/index.js", - "#lib/discord": "./dist/lib/discord/index.js", - "#lib/moderation": "./dist/lib/moderation/index.js", - "#lib/moderation/managers": "./dist/lib/moderation/managers/index.js", - "#lib/moderation/workers": "./dist/lib/moderation/workers/index.js", - "#lib/structures": "./dist/lib/structures/index.js", - "#lib/structures/managers": "./dist/lib/structures/managers/index.js", - "#lib/structures/color": "./dist/lib/structures/color/index.js", - "#lib/setup": "./dist/lib/setup/index.js", - "#lib/types": "./dist/lib/types/index.js", - "#lib/weather": "./dist/lib/weather/index.js", - "#lib/i18n/languageKeys": "./dist/lib/i18n/languageKeys/index.js", - "#root/*": "./dist/*.js", - "#languages": "./dist/languages/index.js", - "#utils/*": "./dist/lib/util/*.js", - "#utils/common": "./dist/lib/util/common/index.js", - "#utils/functions": "./dist/lib/util/functions/index.js" - }, + "private": true, + "type": "module", + "workspaces": [ + "projects/*" + ], "scripts": { - "build": "tsc -b src", - "dev": "yarn build && yarn start", - "watch": "tsc -b src -w", - "watch:start": "tsc-watch -b src --onSuccess \"yarn start\"", - "clean": "node scripts/build/clean.mjs", - "start": "node --enable-source-maps dist/Skyra.js", - "start:profiler:0x": "0x --collect-only dist/Skyra.js", - "test": "jest", - "lint": "eslint --fix --ext ts src tests", - "format": "prettier --write --loglevel=warn \"{src,tests}/**/*.{js,ts,json}\"", - "scripts:tlds": "node scripts/tlds.mjs", - "scripts:migration": "node scripts/migrations.mjs", - "dockerps": "pwsh -NoLogo ./.docker/control.ps1", - "typeorm:schema:resync": "docker container rm -f postgres && docker volume rm postgres-data && docker volume create postgres-data && docker-compose -f ./.docker/docker-compose.yml up -d postgres && sleep 3 && yarn typeorm schema:sync", + "build": "yarn workspaces foreach --parallel --topological run build", + "test": "yarn workspaces foreach --parallel --topological run test", + "lint": "yarn workspaces foreach --parallel --topological run lint", + "format": "yarn workspaces foreach --parallel --topological run format", "update": "yarn upgrade-interactive", "postinstall": "husky install .github/husky" }, - "dependencies": { - "@discordjs/builders": "^1.0.0", - "@discordjs/collection": "^1.0.0", - "@influxdata/influxdb-client": "^1.27.0", - "@influxdata/influxdb-client-apis": "^1.27.0", - "@napi-rs/canvas": "^0.1.25", - "@sapphire/async-queue": "^1.3.2", - "@sapphire/decorators": "^4.3.8", - "@sapphire/discord.js-utilities": "^4.11.3", - "@sapphire/fetch": "^2.4.1", - "@sapphire/framework": "^2.5.1", - "@sapphire/plugin-api": "^3.2.4", - "@sapphire/plugin-editable-commands": "^1.2.2", - "@sapphire/plugin-i18next": "^2.5.4", - "@sapphire/plugin-logger": "^2.2.3", - "@sapphire/plugin-subcommands": "^2.2.2", - "@sapphire/ratelimits": "^2.4.4", - "@sapphire/snowflake": "^3.2.2", - "@sapphire/stopwatch": "^1.4.1", - "@sapphire/time-utilities": "^1.7.5", - "@sapphire/type": "^2.2.4", - "@sapphire/utilities": "^3.7.0", - "@sentry/integrations": "^7.7.0", - "@sentry/node": "^7.7.0", - "@skyra/ai": "^1.2.0", - "@skyra/char": "^1.0.2", - "@skyra/env-utilities": "^1.0.2", - "@skyra/gifenc": "^1.0.0", - "@skyra/jaro-winkler": "^1.1.0", - "@skyra/saelem": "^3.0.34", - "@skyra/tags": "^1.1.3", - "async-rwlock": "^1.1.1", - "bufferutil": "^4.0.6", - "canvas-constructor": "^6.0.2", - "colorette": "^2.0.19", - "confusables": "^1.1.1", - "diff": "^5.1.0", - "discord-api-types": "~0.33.5", - "discord.js": "^13.9.1", - "he": "^1.2.0", - "ioredis": "^5.2.2", - "pg": "^8.7.3", - "tslib": "1.11.2", - "typeorm": "0.2.28", - "typeorm-naming-strategies": "^2.0.0", - "utf-8-validate": "^5.0.9", - "ws": "^8.8.1", - "zlib-sync": "^0.1.7" - }, "devDependencies": { - "0x": "^5.4.0", - "@babel/core": "^7.18.9", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.18.9", - "@babel/preset-env": "^7.18.9", - "@babel/preset-typescript": "^7.18.6", "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", "@sapphire/eslint-config": "^4.3.7", "@sapphire/prettier-config": "^1.4.3", "@sapphire/ts-config": "^3.3.4", - "@skyra/star-wars-api": "^2.0.30", - "@types/backoff": "^2.5.2", - "@types/diff": "^5.0.2", - "@types/he": "^1.1.2", - "@types/jest": "^28.1.6", - "@types/node": "^18.0.6", - "@types/pg": "^8.6.5", - "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7", - "babel-plugin-const-enum": "^1.2.0", + "@types/gradient-string": "^1.1.2", + "@types/node": "^18.6.3", + "@typescript-eslint/eslint-plugin": "^5.32.0", + "@typescript-eslint/parser": "^5.32.0", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.20.0", + "eslint": "^8.21.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", - "jest": "^28.1.3", - "jest-mock-random": "^1.1.1", "lint-staged": "^13.0.3", - "nock": "^13.2.9", "prettier": "^2.7.1", "pretty-quick": "^3.1.3", - "ts-node": "^10.9.1", - "tsc-watch": "^5.0.3", - "typescript": "^4.7.4" + "prisma": "^4.1.1", + "typescript": "^4.7.4", + "vitest": "^0.20.2" }, "resolutions": { "ansi-regex": "^5.0.1", + "discord-api-types": "^0.36.3", "minimist": "^1.2.6" }, "engines": { - "node": "^16", - "npm": "^7" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/skyra-project/skyra.git" + "node": ">=18.0.0" }, "commitlint": { "extends": [ @@ -160,5 +61,14 @@ } }, "prettier": "@sapphire/prettier-config", - "packageManager": "yarn@3.2.2" + "eslintConfig": { + "extends": "@sapphire", + "rules": { + "@typescript-eslint/no-base-to-string": "off" + } + }, + "packageManager": "yarn@3.2.2", + "volta": { + "node": "18.7.0" + } } diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 00000000000..a5fbe7ce593 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,497 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Guild { + id BigInt @id @map("id") + + log GuildLogs? + moderation GuildModeration? + autoModeration GuildAutoModeration? + roles GuildRoles? + + cases ModerationAction[] + stickyRoles StickyRole[] +} + +model GuildModeration { + id BigInt @id @map("id") + /// The guild entry is from. + guild Guild @relation(fields: [id], references: [id], onDelete: Cascade) + + /// The moderation logs channel. + channelId BigInt? @map("channel_id") + /// Whether or not bans issued manually should be logged. + trackBans Boolean @default(false) @map("track_bans") + /// Whether or not timeouts issued manually should be included. + trackTimeouts Boolean @default(false) @map("track_timeouts") +} + +model GuildAutoModeration { + id BigInt @id @map("id") + /// The guild entry is from. + guild Guild @relation(fields: [id], references: [id], onDelete: Cascade) + + /// The moderation logs channel. + channelId BigInt? @map("channel_id") + /// Whether or not to track Discord's native automod actions. + trackNative Boolean @default(false) @map("track_native") + + attachments GuildAutoModerationAttachments? + capitals GuildAutoModerationCapitals? + invites GuildAutoModerationInvites? + links GuildAutoModerationLinks? + mentions GuildAutoModerationMentions? + newlines GuildAutoModerationNewlines? + words GuildAutoModerationWords? +} + +enum GuildAutoModerationHardAction { + VoiceKick + Warning + Timeout + Kick + Softban + Ban +} + +model GuildAutoModerationAttachments { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationCapitals { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The amount of characters at which the message won't be ignored by this subsystem. + minimum Int @map("minimum") + /// The percentage of uppercase characters a message may have for an infraction. + maximum Int @map("maximum") + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationLinks { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The allowed domain links. + allowed String[] @default([]) + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationNewlines { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The amount of newlines characters a message may have for an infraction. + maximum Int @map("maximum") + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationInvites { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The allowed invite codes. + allowedCodes String[] @default([]) @map("allowed_codes") + /// The allowed invite codes. + allowedGuilds BigInt[] @default([]) @map("allowed_guilds") + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationWords { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The filtered words. + words String[] @default([]) @map("words") + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationMentions { + id BigInt @id @map("id") + /// The parent where all automod information is at. + parent GuildAutoModeration @relation(fields: [id], references: [id], onDelete: Cascade) + + /// Whether or not the subsystem is enabled. + enabled Boolean? @map("enabled") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + softAction Int @map("soft_action") + + /// The action to do in each infraction. Holds a bitfield value, where: + /// + /// - 1st bit (0b00X): Whether or not to delete the message. + /// - 2nd bit (0b0X0): Whether or not to send an alert to the channel. + /// - 3rd bit (0bX00): Whether or not to log the infraction. + hardAction GuildAutoModerationHardAction @map("hard_action") + /// The duration in seconds of the hard action. Only applicable to Warning, Timeout, and Ban. + /// + /// In the case of Timeout, if none is given, the action will be ignored. + hardActionDuration Int? @map("hard_action_duration") + + /// The amount of infractions a user can do before triggering the hard action. + thresholdMaximum Int @map("threshold_maximum") + /// The amount of time in seconds to pool the amount of infractions. + thresholdDuration Int @map("threshold_duration") + + /// The overrides for the point system. + overrides GuildAutoModerationMentionsOverrides[] + + /// The roles that are ignored by this subsystem. + ignoredRoles BigInt[] @default([]) @map("ignored_roles") + /// The channels that are ignored by this subsystem. + ignoredChannels BigInt[] @default([]) @map("ignored_channels") +} + +model GuildAutoModerationMentionsOverrides { + id BigInt @id @default(autoincrement()) @map("id") + + parentId BigInt @map("parent_id") + /// The parent where all automod information is at. + parent GuildAutoModerationMentions @relation(fields: [parentId], references: [id], onDelete: Cascade) + + /// The roles affected by this override. + roles BigInt[] @map("roles") + /// The users affected by this override. + users BigInt[] @map("users") + + points Int @map("points") +} + +model GuildLogs { + id BigInt @id @map("id") + /// The guild entry is from. + guild Guild @relation(fields: [id], references: [id], onDelete: Cascade) + + /// The member add logs channel. + memberAdd BigInt? @map("member_add") + /// The member remove logs channel. + memberRemove BigInt? @map("member_remove") + /// The member nickname update logs channel. + memberNickNameUpdate BigInt? @map("member_nickname_update") + /// The member username update logs channel. + memberUserNameUpdate BigInt? @map("member_username_update") + + /// The message delete logs channel. + messageDelete BigInt? @map("message_delete") + /// The message delete logs NSFW channel. + messageDeleteNsfw BigInt? @map("message_delete_nsfw") + /// The message update logs channel. + messageUpdate BigInt? @map("message_update") + /// The message update logs NSFW channel. + messageUpdateNsfw BigInt? @map("message_update_nsfw") + + /// The message prune logs channel. + prune BigInt? @map("prune") + /// The message reaction logs channel. + reaction BigInt? @map("reaction") + + /// The role create logs channel. + roleCreate BigInt? @map("role_create") + /// The role update logs channel. + roleUpdate BigInt? @map("role_update") + /// The role delete logs channel. + roleDelete BigInt? @map("role_delete") + + /// The channel create logs channel. + channelCreate BigInt? @map("channel_create") + /// The channel update logs channel. + channelUpdate BigInt? @map("channel_update") + /// The channel delete logs channel. + channelDelete BigInt? @map("channel_delete") + + /// The emoji create logs channel. + emojiCreate BigInt? @map("emoji_create") + /// The emoji update logs channel. + emojiUpdate BigInt? @map("emoji_update") + /// The emoji delete logs channel. + emojiDelete BigInt? @map("emoji_delete") + + /// The emoji reaction add logs channel. + emojiAdd BigInt? @map("emoji_add") + /// Whether or not twemoji reactions should be logged. + emojiAddIncludeTwemoji Boolean @default(false) @map("emoji_add_include_twemoji") + + /// The server update logs channel. + serverUpdate BigInt? @map("server_update") + + /// The channels to ignore logs from. + ignoreAll BigInt[] @default([]) @map("ignore_all") + /// The channels to ignore message updates from. + ignoreMessages BigInt[] @default([]) @map("ignore_messages") + /// The channels to ignore reaction updates from. + ignoreReactions BigInt[] @default([]) @map("ignore_reactions") +} + +model GuildRoles { + id BigInt @id @map("id") + /// The guild entry is from. + guild Guild @relation(fields: [id], references: [id], onDelete: Cascade) + + /// The roles to be given to any new user. + initial BigInt[] @default([]) @map("initial") + /// The roles to be given to any new human user. + initialHumans BigInt[] @default([]) @map("initial_humans") + /// The roles to be given to any new bot user. + initialRobots BigInt[] @default([]) @map("initial_robots") +} + +model StickyRole { + /// The entry's case number ID. + userId BigInt @map("user_id") + /// The guild this entry was issued at. + guild Guild @relation(fields: [guildId], references: [id]) + /// The ID of the guild this entry was issued at. + guildId BigInt @map("guild_id") + + /// The sticky role IDs + roleIds BigInt[] @map("role_ids") + + @@id([userId, guildId]) +} + +enum ModerationActionType { + AddRole + RemoveRole + Nickname + AddWarning + RemoveWarning + Timeout + TimeoutEnd + Kick + Softban + Ban + Unban +} + +model ModerationAction { + /// The entry's case number ID. + id Int @map("id") + /// The guild this entry was issued at. + guild Guild @relation(fields: [guildId], references: [id]) + /// The ID of the guild this entry was issued at. + guildId BigInt @map("guild_id") + /// The moderation action type. + action ModerationActionType @map("action") + /// Holds a bitfield value, where: + /// + /// - 1st bit (0b000X): Whether or not the entry is hidden. + metadata Int @map("metadata") + /// The creation time of this entry. + createdAt DateTime @default(now()) @map("created_at") + /// The duration in seconds of this action, `0` is considered no duration. + duration Int @map("duration") + /// The target user. + targetId BigInt @map("target_id") + /// The moderator who issued this action. + moderatorId BigInt @map("moderator_id") + /// The moderation log this entry refers to, if any. + referenceId Int? @map("reference_id") + + @@id([id, guildId]) +} + +model User { + /// The ID of the user. + id BigInt @id @map("id") + /// Whether or not moderation actions should DM the user. + report Boolean @default(true) @map("report") +} diff --git a/projects/bot/Dockerfile b/projects/bot/Dockerfile new file mode 100644 index 00000000000..950f7ef789a --- /dev/null +++ b/projects/bot/Dockerfile @@ -0,0 +1,62 @@ +# ================ # +# Base Stage # +# ================ # + +FROM node:16-buster-slim as base + +WORKDIR /usr/src/app + +ENV HUSKY=0 +ENV CI=true + +RUN apt-get update && \ + apt-get upgrade -y --no-install-recommends && \ + apt-get install -y --no-install-recommends build-essential python3 libfontconfig1 dumb-init && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +COPY --chown=node:node yarn.lock . +COPY --chown=node:node package.json . +COPY --chown=node:node projects/bot/package.json projects/bot/package.json +COPY --chown=node:node .yarnrc.yml . +COPY --chown=node:node .yarn/ .yarn/ + +ENTRYPOINT ["dumb-init", "--"] + +# ================ # +# Builder Stage # +# ================ # + +FROM base as builder + +ENV NODE_ENV="development" + +COPY --chown=node:node tsconfig.base.json tsconfig.base.json +COPY --chown=node:node scripts/ scripts/ +COPY --chown=node:node projects/bot/scripts/ projects/bot/scripts/ +COPY --chown=node:node projects/bot/src/ projects/bot/src/ + +RUN yarn install --immutable +RUN cd projects/bot/ && yarn run build + +# ================ # +# Runner Stage # +# ================ # + +FROM base AS runner + +ENV NODE_ENV="production" +ENV NODE_OPTIONS="--enable-source-maps --max_old_space_size=4096" + +COPY --chown=node:node projects/bot/scripts/workerTsLoader.js projects/bot/scripts/workerTsLoader.js +COPY --chown=node:node projects/bot/src/.env projects/bot/src/.env +COPY --chown=node:node --from=builder /usr/src/app/projects/bot/dist projects/bot/dist + +RUN yarn workspaces focus --all --production +RUN chown node:node /usr/src/app/ + +USER node + +WORKDIR /usr/src/app/projects/bot + +CMD [ "yarn", "run", "start" ] diff --git a/projects/bot/package.json b/projects/bot/package.json new file mode 100644 index 00000000000..04cfd61e418 --- /dev/null +++ b/projects/bot/package.json @@ -0,0 +1,47 @@ +{ + "name": "skyra", + "version": "7.0.0", + "description": "Multipurpose Discord Bot built on Sapphire Framework", + "author": "Skyra Project", + "license": "Apache-2.0", + "private": true, + "main": "dist/main.js", + "type": "module", + "imports": { + "#lib/*": "./dist/lib/*.js" + }, + "scripts": { + "build": "tsc -b src", + "dev": "yarn build && yarn start", + "watch": "tsc -b src -w", + "prisma:generate": "yarn prisma generate", + "clean": "node scripts/clean.mjs", + "start": "node --enable-source-maps dist/main.js", + "test": "eslint --ext ts src", + "lint": "eslint --fix --ext ts src", + "format": "prettier --write --loglevel=warn \"src/**/*.{js,ts,mts,json}\"" + }, + "dependencies": { + "@discordjs/builders": "^1.1.0", + "@discordjs/collection": "^1.0.1", + "@prisma/client": "^4.1.1", + "@sapphire/async-queue": "^1.3.2", + "@sapphire/result": "^2.1.1", + "@sapphire/utilities": "^3.8.0", + "@sentry/integrations": "^7.8.0", + "@sentry/node": "^7.8.0", + "@skyra/env-utilities": "^1.0.2", + "@skyra/http-framework": "^0.7.0", + "@skyra/http-framework-i18n": "^0.2.0", + "@skyra/shared-http-pieces": "^0.0.40", + "@skyra/start-banner": "^1.0.2", + "colorette": "^2.0.19", + "discord-api-types": "^0.37.0", + "gradient-string": "^2.0.1", + "skyra-shared": "workspace:^", + "tslib": "^2.4.0" + }, + "devDependencies": { + "typescript": "^4.7.4" + } +} diff --git a/scripts/build/clean.mjs b/projects/bot/scripts/clean.mjs similarity index 75% rename from scripts/build/clean.mjs rename to projects/bot/scripts/clean.mjs index ff68751f4df..1bd25ff105e 100644 --- a/scripts/build/clean.mjs +++ b/projects/bot/scripts/clean.mjs @@ -1,6 +1,6 @@ import { rm } from 'node:fs/promises'; -const rootFolder = new URL('../../', import.meta.url); +const rootFolder = new URL('../', import.meta.url); const distFolder = new URL('dist/', rootFolder); const options = { recursive: true, force: true }; diff --git a/scripts/workerTsLoader.js b/projects/bot/scripts/workerTsLoader.js similarity index 100% rename from scripts/workerTsLoader.js rename to projects/bot/scripts/workerTsLoader.js diff --git a/src/.env b/projects/bot/src/.env similarity index 52% rename from src/.env rename to projects/bot/src/.env index f1ad5beb273..250359e9623 100644 --- a/src/.env +++ b/projects/bot/src/.env @@ -1,35 +1,20 @@ CLIENT_NAME='Skyra' -CLIENT_VERSION='6.1.0 [Sapphire Edition]' -CLIENT_PREFIX='s!' -CLIENT_REGEX_PREFIX='^(hey +)?(eva|skyra)[,! ]' +CLIENT_VERSION='7.0.0 [Testa Edition]' CLIENT_OWNERS='242043489611808769 268792781713965056' CLIENT_ID='266624760782258186' SHARDS='"auto"' -CLIENT_PRESENCE_NAME='Skyra, help' -CLIENT_PRESENCE_TYPE='LISTENING' - -SISTER_CLIENTS='338249781594030090 419828209966776330 444081201297227776' - -API_ENABLED=true -API_ORIGIN='http://127.0.0.1:3000' -API_PREFIX='/' -API_PORT=8282 - OAUTH_COOKIE='SKYRA_AUTH' OAUTH_DOMAIN_OVERWRITE='127.0.0.1' OAUTH_REDIRECT_URI='http://127.0.0.1:3000/oauth/callback' OAUTH_SCOPE='identify guilds' OAUTH_SECRET='' -TWITCH_CALLBACK='http://localhost/twitch/event_sub_verify/' - PGSQL_DATABASE_NAME='postgres' PGSQL_DATABASE_PASSWORD='postgres' PGSQL_DATABASE_USER='postgres' PGSQL_DATABASE_PORT=5432 PGSQL_DATABASE_HOST='localhost' -TYPEORM_DEBUG_LOGS=false REDIS_ENABLED=true REDIS_HOST='localhost' @@ -43,10 +28,6 @@ INFLUX_TOKEN='' INFLUX_ORG='Skyra-Project' INFLUX_ORG_ANALYTICS_BUCKET='analytics' -SAELEM_ENABLED=true -SAELEM_URL='http://localhost:8284' - -GRAPHQL_STARWARS_URL='https://swapi.skyra.pw' HASTEBIN_POST_URL='https://hastebin.skyra.pw' HASTEBIN_GET_URL='https://hastebin.skyra.pw' @@ -63,15 +44,4 @@ BOTS_ON_DISCORD_TOKEN='' CRYPTOCOMPARE_TOKEN='' DISCORD_BOT_LIST_TOKEN='' DISCORD_BOTS_TOKEN='' -GOOGLE_API_TOKEN='' -KITSU_ID='AWQO5J657S' -KITSU_TOKEN='NzYxODA5NmY0ODRjYTRmMzQ2YjMzNzNmZmFhNjY5ZGRmYjZlMzViN2VkZDIzMGUwYjM5ZjQ5NjAwZGI4ZTc5MHJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX21lZGlhJmZpbHRlcnM9Tk9UK2FnZVJhdGluZyUzQVIxOA==' -NINTENDO_ID='U3B6GR4UA3' -NINTENDO_TOKEN='6efbfb0f8f80defc44895018caf77504' -OWLBOT_TOKEN='' SENTRY_URL='' -THEMOVIEDATABASE_TOKEN='' -TOP_GG_TOKEN='' -TWITCH_CLIENT_ID='' -TWITCH_TOKEN='' -TWITCH_WEBHOOK_TOKEN='' diff --git a/projects/bot/src/.env.development b/projects/bot/src/.env.development new file mode 100644 index 00000000000..b3970ef38d8 --- /dev/null +++ b/projects/bot/src/.env.development @@ -0,0 +1,35 @@ +CLIENT_VERSION='7.0.0-dev [Testa Edition]' +CLIENT_OWNERS='' +CLIENT_ID='' + +OAUTH_SECRET='' + +PGSQL_DATABASE_NAME='skyra' +PGSQL_DATABASE_PASSWORD='postgres' +PGSQL_DATABASE_USER='postgres' +PGSQL_DATABASE_PORT=5432 +PGSQL_DATABASE_HOST='localhost' + +REDIS_ENABLED=true +REDIS_HOST='localhost' +REDIS_PORT=8287 +REDIS_DB=1 +REDIS_PASSWORD='redis' + +INFLUX_ENABLED=true +INFLUX_URL='http://localhost:8285' +INFLUX_TOKEN='' +INFLUX_ORG='Skyra-Project' +INFLUX_ORG_ANALYTICS_BUCKET='analytics' + +HASTEBIN_POST_URL='https://hastebin.skyra.pw' +HASTEBIN_GET_URL='https://hastebin.skyra.pw' + +WEBHOOK_ERROR_ID='648663047615021058' +WEBHOOK_ERROR_TOKEN='' + +WORKER_COUNT=2 + +# Tokens +DISCORD_TOKEN='' +SENTRY_URL='' diff --git a/src/.env.test b/projects/bot/src/.env.test similarity index 100% rename from src/.env.test rename to projects/bot/src/.env.test diff --git a/src/commands/System/Admin/eval.ts b/projects/bot/src/commands/Admin/eval.ts similarity index 100% rename from src/commands/System/Admin/eval.ts rename to projects/bot/src/commands/Admin/eval.ts diff --git a/src/commands/Management/Helpers/guild-info.ts b/projects/bot/src/commands/Management/Helpers/guild-info.ts similarity index 100% rename from src/commands/Management/Helpers/guild-info.ts rename to projects/bot/src/commands/Management/Helpers/guild-info.ts diff --git a/src/commands/Management/Helpers/role-info.ts b/projects/bot/src/commands/Management/Helpers/role-info.ts similarity index 100% rename from src/commands/Management/Helpers/role-info.ts rename to projects/bot/src/commands/Management/Helpers/role-info.ts diff --git a/src/commands/Management/Members/stickyRoles.ts b/projects/bot/src/commands/Management/Members/stickyRoles.ts similarity index 100% rename from src/commands/Management/Members/stickyRoles.ts rename to projects/bot/src/commands/Management/Members/stickyRoles.ts diff --git a/src/commands/Management/Message Filters/attachmentMode.ts b/projects/bot/src/commands/Management/Message Filters/attachmentMode.ts similarity index 100% rename from src/commands/Management/Message Filters/attachmentMode.ts rename to projects/bot/src/commands/Management/Message Filters/attachmentMode.ts diff --git a/src/commands/Management/Message Filters/capitalsMode.ts b/projects/bot/src/commands/Management/Message Filters/capitalsMode.ts similarity index 100% rename from src/commands/Management/Message Filters/capitalsMode.ts rename to projects/bot/src/commands/Management/Message Filters/capitalsMode.ts diff --git a/src/commands/Management/Message Filters/filter.ts b/projects/bot/src/commands/Management/Message Filters/filter.ts similarity index 100% rename from src/commands/Management/Message Filters/filter.ts rename to projects/bot/src/commands/Management/Message Filters/filter.ts diff --git a/src/commands/Management/Message Filters/filterMode.ts b/projects/bot/src/commands/Management/Message Filters/filterMode.ts similarity index 100% rename from src/commands/Management/Message Filters/filterMode.ts rename to projects/bot/src/commands/Management/Message Filters/filterMode.ts diff --git a/src/commands/Management/Message Filters/inviteMode.ts b/projects/bot/src/commands/Management/Message Filters/inviteMode.ts similarity index 100% rename from src/commands/Management/Message Filters/inviteMode.ts rename to projects/bot/src/commands/Management/Message Filters/inviteMode.ts diff --git a/src/commands/Management/Message Filters/linkMode.ts b/projects/bot/src/commands/Management/Message Filters/linkMode.ts similarity index 100% rename from src/commands/Management/Message Filters/linkMode.ts rename to projects/bot/src/commands/Management/Message Filters/linkMode.ts diff --git a/src/commands/Management/Message Filters/messageMode.ts b/projects/bot/src/commands/Management/Message Filters/messageMode.ts similarity index 100% rename from src/commands/Management/Message Filters/messageMode.ts rename to projects/bot/src/commands/Management/Message Filters/messageMode.ts diff --git a/src/commands/Management/Message Filters/newlineMode.ts b/projects/bot/src/commands/Management/Message Filters/newlineMode.ts similarity index 100% rename from src/commands/Management/Message Filters/newlineMode.ts rename to projects/bot/src/commands/Management/Message Filters/newlineMode.ts diff --git a/src/commands/Management/Reaction Filters/reactionMode.ts b/projects/bot/src/commands/Management/Reaction Filters/reactionMode.ts similarity index 100% rename from src/commands/Management/Reaction Filters/reactionMode.ts rename to projects/bot/src/commands/Management/Reaction Filters/reactionMode.ts diff --git a/src/commands/Moderation/Management/history.ts b/projects/bot/src/commands/Moderation/Management/history.ts similarity index 100% rename from src/commands/Moderation/Management/history.ts rename to projects/bot/src/commands/Moderation/Management/history.ts diff --git a/src/commands/Moderation/Management/moderations.ts b/projects/bot/src/commands/Moderation/Management/moderations.ts similarity index 100% rename from src/commands/Moderation/Management/moderations.ts rename to projects/bot/src/commands/Moderation/Management/moderations.ts diff --git a/src/commands/Moderation/Utilities/case.ts b/projects/bot/src/commands/Moderation/Utilities/case.ts similarity index 100% rename from src/commands/Moderation/Utilities/case.ts rename to projects/bot/src/commands/Moderation/Utilities/case.ts diff --git a/src/commands/Moderation/Utilities/permissions.ts b/projects/bot/src/commands/Moderation/Utilities/permissions.ts similarity index 100% rename from src/commands/Moderation/Utilities/permissions.ts rename to projects/bot/src/commands/Moderation/Utilities/permissions.ts diff --git a/src/commands/Moderation/Utilities/reason.ts b/projects/bot/src/commands/Moderation/Utilities/reason.ts similarity index 100% rename from src/commands/Moderation/Utilities/reason.ts rename to projects/bot/src/commands/Moderation/Utilities/reason.ts diff --git a/src/commands/Moderation/Utilities/slowmode.ts b/projects/bot/src/commands/Moderation/Utilities/slowmode.ts similarity index 100% rename from src/commands/Moderation/Utilities/slowmode.ts rename to projects/bot/src/commands/Moderation/Utilities/slowmode.ts diff --git a/src/commands/Moderation/Utilities/time.ts b/projects/bot/src/commands/Moderation/Utilities/time.ts similarity index 100% rename from src/commands/Moderation/Utilities/time.ts rename to projects/bot/src/commands/Moderation/Utilities/time.ts diff --git a/src/commands/Moderation/addrole.ts b/projects/bot/src/commands/Moderation/addrole.ts similarity index 100% rename from src/commands/Moderation/addrole.ts rename to projects/bot/src/commands/Moderation/addrole.ts diff --git a/src/commands/Moderation/ban.ts b/projects/bot/src/commands/Moderation/ban.ts similarity index 100% rename from src/commands/Moderation/ban.ts rename to projects/bot/src/commands/Moderation/ban.ts diff --git a/src/commands/Moderation/dehoist.ts b/projects/bot/src/commands/Moderation/dehoist.ts similarity index 100% rename from src/commands/Moderation/dehoist.ts rename to projects/bot/src/commands/Moderation/dehoist.ts diff --git a/src/commands/Moderation/kick.ts b/projects/bot/src/commands/Moderation/kick.ts similarity index 100% rename from src/commands/Moderation/kick.ts rename to projects/bot/src/commands/Moderation/kick.ts diff --git a/src/commands/Moderation/lockdown.ts b/projects/bot/src/commands/Moderation/lockdown.ts similarity index 100% rename from src/commands/Moderation/lockdown.ts rename to projects/bot/src/commands/Moderation/lockdown.ts diff --git a/src/commands/Moderation/mute.ts b/projects/bot/src/commands/Moderation/mute.ts similarity index 100% rename from src/commands/Moderation/mute.ts rename to projects/bot/src/commands/Moderation/mute.ts diff --git a/src/commands/Moderation/prune.ts b/projects/bot/src/commands/Moderation/prune.ts similarity index 100% rename from src/commands/Moderation/prune.ts rename to projects/bot/src/commands/Moderation/prune.ts diff --git a/src/commands/Moderation/removerole.ts b/projects/bot/src/commands/Moderation/removerole.ts similarity index 100% rename from src/commands/Moderation/removerole.ts rename to projects/bot/src/commands/Moderation/removerole.ts diff --git a/src/commands/Moderation/setnickname.ts b/projects/bot/src/commands/Moderation/setnickname.ts similarity index 100% rename from src/commands/Moderation/setnickname.ts rename to projects/bot/src/commands/Moderation/setnickname.ts diff --git a/src/commands/Moderation/softban.ts b/projects/bot/src/commands/Moderation/softban.ts similarity index 100% rename from src/commands/Moderation/softban.ts rename to projects/bot/src/commands/Moderation/softban.ts diff --git a/src/commands/Moderation/togglemoderationdm.ts b/projects/bot/src/commands/Moderation/togglemoderationdm.ts similarity index 100% rename from src/commands/Moderation/togglemoderationdm.ts rename to projects/bot/src/commands/Moderation/togglemoderationdm.ts diff --git a/src/commands/Moderation/unban.ts b/projects/bot/src/commands/Moderation/unban.ts similarity index 100% rename from src/commands/Moderation/unban.ts rename to projects/bot/src/commands/Moderation/unban.ts diff --git a/src/commands/Moderation/unmute.ts b/projects/bot/src/commands/Moderation/unmute.ts similarity index 100% rename from src/commands/Moderation/unmute.ts rename to projects/bot/src/commands/Moderation/unmute.ts diff --git a/src/commands/Moderation/unwarn.ts b/projects/bot/src/commands/Moderation/unwarn.ts similarity index 100% rename from src/commands/Moderation/unwarn.ts rename to projects/bot/src/commands/Moderation/unwarn.ts diff --git a/src/commands/Moderation/voicekick.ts b/projects/bot/src/commands/Moderation/voicekick.ts similarity index 100% rename from src/commands/Moderation/voicekick.ts rename to projects/bot/src/commands/Moderation/voicekick.ts diff --git a/src/commands/Moderation/warn.ts b/projects/bot/src/commands/Moderation/warn.ts similarity index 100% rename from src/commands/Moderation/warn.ts rename to projects/bot/src/commands/Moderation/warn.ts diff --git a/src/commands/Tools/whois.ts b/projects/bot/src/commands/Tools/whois.ts similarity index 83% rename from src/commands/Tools/whois.ts rename to projects/bot/src/commands/Tools/whois.ts index 09e07a71dad..0a92905a3fd 100644 --- a/src/commands/Tools/whois.ts +++ b/projects/bot/src/commands/Tools/whois.ts @@ -1,28 +1,20 @@ import { SkyraEmbed } from '#lib/discord'; import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; import type { GuildMessage } from '#lib/types'; import { months, seconds } from '#utils/common'; import { Colors, Emojis } from '#utils/constants'; import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { GuildMember, Permissions, PermissionString, Role, User } from 'discord.js'; +import { Command, RegisterCommand, RegisterSubCommand } from '@skyra/http-framework'; +import { applyLocalizedBuilder } from '@skyra/http-framework-i18n'; 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; -@ApplyOptions({ - aliases: ['userinfo', 'uinfo', 'user'], - description: LanguageKeys.Commands.Tools.WhoisDescription, - detailedDescription: LanguageKeys.Commands.Tools.WhoisExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { +@RegisterCommand((builder) => + applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.RootName, LanguageKeys.Commands.Whois.RootDescription).setDMPermission(false) +) +export class UserCommand extends Command { private readonly kAdministratorPermission = FLAGS.ADMINISTRATOR; private readonly kKeyPermissions: [PermissionString, bigint][] = [ ['BAN_MEMBERS', FLAGS.BAN_MEMBERS], @@ -37,6 +29,23 @@ export class UserCommand extends SkyraCommand { ['MENTION_EVERYONE', FLAGS.MENTION_EVERYONE] ]; + @RegisterSubCommand((builder) => + applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.User) // + .addUserOption((builder) => applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.OptionsUser)) + ) + public async handleUser(interaction: Command.Interaction) {} + + @RegisterSubCommand((builder) => + applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.Role) // + .addRoleOption((builder) => applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.OptionsRole)) + ) + public async handleRole(interaction: Command.Interaction) {} + + @RegisterSubCommand((builder) => applyLocalizedBuilder(builder, LanguageKeys.Commands.Whois.Server)) + public async handleServer(interaction: Command.Interaction) { + this.container.client + } + public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { const user = args.finished ? message.author : await args.pick('userName'); const member = await message.guild.members.fetch(user.id).catch(() => null); diff --git a/projects/bot/src/lib/Client.ts b/projects/bot/src/lib/Client.ts new file mode 100644 index 00000000000..748db387f61 --- /dev/null +++ b/projects/bot/src/lib/Client.ts @@ -0,0 +1,73 @@ +import { envParseInteger, envParseString } from '@skyra/env-utilities'; +import { Client, container } from '@skyra/http-framework'; +import { MessageBroker, Redis, Cache, RedisOptions } from 'skyra-shared'; +import * as Sentry from '@sentry/node'; +import { RewriteFrames } from '@sentry/integrations'; +import { fileURLToPath } from 'node:url'; + +export function createClient(options: ClientOptions = {}) { + new Client({ + discordToken: envParseString('DISCORD_TOKEN'), + discordPublicKey: envParseString('DISCORD_PUBLIC_KEY') + }); + + container.redis = new Redis({ + ...options.redis, + lazyConnect: true, + host: envParseString('REDIS_HOST'), + port: envParseInteger('REDIS_PORT'), + db: envParseInteger('REDIS_DB'), + password: envParseString('REDIS_PASSWORD') + }); + container.cache = new Cache({ + client: container.redis, + prefix: 's7' + }); + container.broker = new MessageBroker({ + redis: container.redis, + stream: envParseString('BROKER_STREAM_NAME'), + block: envParseInteger('BROKER_BLOCK', 5000), + max: envParseInteger('BROKER_MAX', 10) + }); + + const srcFolderURL = new URL('..', import.meta.url); + container.stores.registerPath(fileURLToPath(srcFolderURL)); + + // Load in Sentry for error logging + if (process.env.SENTRY_URL) { + Sentry.init({ + dsn: process.env.SENTRY_URL, + integrations: [ + new Sentry.Integrations.Modules(), + new Sentry.Integrations.FunctionToString(), + new Sentry.Integrations.LinkedErrors(), + new Sentry.Integrations.Console(), + new Sentry.Integrations.Http({ breadcrumbs: true, tracing: true }), + new RewriteFrames({ root: fileURLToPath(new URL('..', srcFolderURL)) }) + ] + }); + } +} + +export async function loadAll() { + await container.redis.connect(); + await container.stores.load(); + await container.client.load(); +} + +export interface ClientOptions { + redis?: Omit; +} + +declare module '@sapphire/pieces' { + interface Container { + broker: MessageBroker; + cache: Cache; + redis: Redis; + + // db: DbSet; + // schedule: ScheduleManager; + // settings: SettingsManager; + // workers: WorkerManager; + } +} diff --git a/projects/bot/src/lib/augments.d.ts b/projects/bot/src/lib/augments.d.ts new file mode 100644 index 00000000000..36cfee98e0d --- /dev/null +++ b/projects/bot/src/lib/augments.d.ts @@ -0,0 +1,21 @@ +import type { IntegerString } from '@skyra/env-utilities'; + +declare module '@skyra/env-utilities' { + interface Env { + CLIENT_VERSION: string; + + SENTRY_URL?: string; + + DISCORD_TOKEN: string; + DISCORD_PUBLIC_KEY: string; + + REDIS_HOST: string; + REDIS_PORT: IntegerString; + REDIS_DB: IntegerString; + REDIS_PASSWORD: string; + + BROKER_STREAM_NAME: string; + BROKER_BLOCK?: IntegerString; + BROKER_MAX?: IntegerString; + } +} diff --git a/src/lib/discord/GuildMemberFetchQueue.ts b/projects/bot/src/lib/discord/GuildMemberFetchQueue.ts similarity index 98% rename from src/lib/discord/GuildMemberFetchQueue.ts rename to projects/bot/src/lib/discord/GuildMemberFetchQueue.ts index 63a9b42c4ca..334e419963b 100644 --- a/src/lib/discord/GuildMemberFetchQueue.ts +++ b/projects/bot/src/lib/discord/GuildMemberFetchQueue.ts @@ -1,6 +1,8 @@ import { container } from '@sapphire/framework'; import { Time } from '@sapphire/time-utilities'; +// TODO: Move this to /gateway + /** * Represents a {@link GuildMemberFetchQueue.shards} entry. */ diff --git a/src/lib/i18n/languageKeys/index.ts b/projects/bot/src/lib/i18n/languageKeys/index.ts similarity index 100% rename from src/lib/i18n/languageKeys/index.ts rename to projects/bot/src/lib/i18n/languageKeys/index.ts diff --git a/src/lib/i18n/languageKeys/keys/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/All.ts diff --git a/src/lib/i18n/languageKeys/keys/Arguments.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Arguments.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Arguments.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Arguments.ts diff --git a/src/lib/i18n/languageKeys/keys/Assertions.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Assertions.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Assertions.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Assertions.ts diff --git a/src/lib/i18n/languageKeys/keys/Colors.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Colors.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Colors.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Colors.ts diff --git a/projects/bot/src/lib/i18n/languageKeys/keys/Commands.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Commands.ts new file mode 100644 index 00000000000..c546aeed8e5 --- /dev/null +++ b/projects/bot/src/lib/i18n/languageKeys/keys/Commands.ts @@ -0,0 +1,4 @@ +export * as Admin from './commands/Admin'; +export * as Management from './commands/Management'; +export * as Moderation from './commands/Moderation'; +export * as Whois from './commands/Whois'; diff --git a/src/lib/i18n/languageKeys/keys/FuzzySearch.ts b/projects/bot/src/lib/i18n/languageKeys/keys/FuzzySearch.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/FuzzySearch.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/FuzzySearch.ts diff --git a/src/lib/i18n/languageKeys/keys/Globals.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Globals.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Globals.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Globals.ts diff --git a/src/lib/i18n/languageKeys/keys/Guilds.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Guilds.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Guilds.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Guilds.ts diff --git a/src/lib/i18n/languageKeys/keys/Misc.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Misc.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Misc.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Misc.ts diff --git a/src/lib/i18n/languageKeys/keys/Preconditions.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Preconditions.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Preconditions.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Preconditions.ts diff --git a/src/lib/i18n/languageKeys/keys/PromptList.ts b/projects/bot/src/lib/i18n/languageKeys/keys/PromptList.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/PromptList.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/PromptList.ts diff --git a/src/lib/i18n/languageKeys/keys/Serializers.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Serializers.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Serializers.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Serializers.ts diff --git a/src/lib/i18n/languageKeys/keys/Settings.ts b/projects/bot/src/lib/i18n/languageKeys/keys/Settings.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/Settings.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/Settings.ts diff --git a/src/lib/i18n/languageKeys/keys/System.ts b/projects/bot/src/lib/i18n/languageKeys/keys/System.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/System.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/System.ts diff --git a/src/lib/i18n/languageKeys/keys/commands/Admin.ts b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Admin.ts similarity index 97% rename from src/lib/i18n/languageKeys/keys/commands/Admin.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/commands/Admin.ts index 401eafa2068..a23cf547eb2 100644 --- a/src/lib/i18n/languageKeys/keys/commands/Admin.ts +++ b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Admin.ts @@ -1,4 +1,3 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; import { FT, T } from '#lib/types'; export const ConfGet = FT<{ key: string; value: string }, string>('commands/admin:confGet'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Management.ts b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Management.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/commands/Management.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/commands/Management.ts diff --git a/src/lib/i18n/languageKeys/keys/commands/Moderation.ts b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Moderation.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/commands/Moderation.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/commands/Moderation.ts diff --git a/projects/bot/src/lib/i18n/languageKeys/keys/commands/Whois.ts b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Whois.ts new file mode 100644 index 00000000000..03ce27a7bb8 --- /dev/null +++ b/projects/bot/src/lib/i18n/languageKeys/keys/commands/Whois.ts @@ -0,0 +1,12 @@ +import { T } from '@skyra/http-framework-i18n'; + +export const RootName = T('commands/whois:name'); +export const RootDescription = T('commands/whois:description'); + +export const User = 'commands/whois:user'; +export const OptionsUser = 'commands/whois:optionsUser'; + +export const Role = 'commands/whois:role'; +export const OptionsRole = 'commands/whois:optionsRole'; + +export const Server = 'commands/whois:server'; diff --git a/src/lib/i18n/languageKeys/keys/events/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/All.ts diff --git a/src/lib/i18n/languageKeys/keys/events/NoMentionSpam.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/NoMentionSpam.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/NoMentionSpam.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/NoMentionSpam.ts diff --git a/src/lib/i18n/languageKeys/keys/events/errors/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/errors/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/errors/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/errors/All.ts diff --git a/src/lib/i18n/languageKeys/keys/events/guilds/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/guilds/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/All.ts diff --git a/src/lib/i18n/languageKeys/keys/events/guilds/Logs.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/Logs.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/guilds/Logs.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/Logs.ts diff --git a/src/lib/i18n/languageKeys/keys/events/guilds/Members.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/Members.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/guilds/Members.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/guilds/Members.ts diff --git a/src/lib/i18n/languageKeys/keys/events/messages/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/messages/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/messages/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/messages/All.ts diff --git a/src/lib/i18n/languageKeys/keys/events/moderation/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/moderation/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/moderation/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/moderation/All.ts diff --git a/src/lib/i18n/languageKeys/keys/events/moderation/Messages.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/moderation/Messages.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/moderation/Messages.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/moderation/Messages.ts diff --git a/src/lib/i18n/languageKeys/keys/events/reactions/All.ts b/projects/bot/src/lib/i18n/languageKeys/keys/events/reactions/All.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/events/reactions/All.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/events/reactions/All.ts diff --git a/src/lib/i18n/languageKeys/keys/settings/Channels.ts b/projects/bot/src/lib/i18n/languageKeys/keys/settings/Channels.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/settings/Channels.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/settings/Channels.ts diff --git a/src/lib/i18n/languageKeys/keys/settings/Gateway.ts b/projects/bot/src/lib/i18n/languageKeys/keys/settings/Gateway.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/settings/Gateway.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/settings/Gateway.ts diff --git a/src/lib/i18n/languageKeys/keys/settings/channels/Ignore.ts b/projects/bot/src/lib/i18n/languageKeys/keys/settings/channels/Ignore.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/settings/channels/Ignore.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/settings/channels/Ignore.ts diff --git a/src/lib/i18n/languageKeys/keys/settings/channels/Logs.ts b/projects/bot/src/lib/i18n/languageKeys/keys/settings/channels/Logs.ts similarity index 100% rename from src/lib/i18n/languageKeys/keys/settings/channels/Logs.ts rename to projects/bot/src/lib/i18n/languageKeys/keys/settings/channels/Logs.ts diff --git a/src/lib/moderation/index.ts b/projects/bot/src/lib/moderation/index.ts similarity index 100% rename from src/lib/moderation/index.ts rename to projects/bot/src/lib/moderation/index.ts diff --git a/src/lib/moderation/managers/ModerationManager.ts b/projects/bot/src/lib/moderation/managers/ModerationManager.ts similarity index 100% rename from src/lib/moderation/managers/ModerationManager.ts rename to projects/bot/src/lib/moderation/managers/ModerationManager.ts diff --git a/src/lib/moderation/managers/StickyRoleManager.ts b/projects/bot/src/lib/moderation/managers/StickyRoleManager.ts similarity index 100% rename from src/lib/moderation/managers/StickyRoleManager.ts rename to projects/bot/src/lib/moderation/managers/StickyRoleManager.ts diff --git a/src/lib/moderation/managers/index.ts b/projects/bot/src/lib/moderation/managers/index.ts similarity index 100% rename from src/lib/moderation/managers/index.ts rename to projects/bot/src/lib/moderation/managers/index.ts diff --git a/src/lib/moderation/structures/ModerationCommand.ts b/projects/bot/src/lib/moderation/structures/ModerationCommand.ts similarity index 100% rename from src/lib/moderation/structures/ModerationCommand.ts rename to projects/bot/src/lib/moderation/structures/ModerationCommand.ts diff --git a/src/lib/moderation/structures/ModerationListener.ts b/projects/bot/src/lib/moderation/structures/ModerationListener.ts similarity index 100% rename from src/lib/moderation/structures/ModerationListener.ts rename to projects/bot/src/lib/moderation/structures/ModerationListener.ts diff --git a/src/lib/moderation/structures/ModerationMessageListener.ts b/projects/bot/src/lib/moderation/structures/ModerationMessageListener.ts similarity index 100% rename from src/lib/moderation/structures/ModerationMessageListener.ts rename to projects/bot/src/lib/moderation/structures/ModerationMessageListener.ts diff --git a/src/lib/moderation/structures/ModerationTask.ts b/projects/bot/src/lib/moderation/structures/ModerationTask.ts similarity index 100% rename from src/lib/moderation/structures/ModerationTask.ts rename to projects/bot/src/lib/moderation/structures/ModerationTask.ts diff --git a/src/lib/moderation/structures/SelfModerationCommand.ts b/projects/bot/src/lib/moderation/structures/SelfModerationCommand.ts similarity index 100% rename from src/lib/moderation/structures/SelfModerationCommand.ts rename to projects/bot/src/lib/moderation/structures/SelfModerationCommand.ts diff --git a/src/lib/moderation/structures/SelfModeratorBitField.ts b/projects/bot/src/lib/moderation/structures/SelfModeratorBitField.ts similarity index 100% rename from src/lib/moderation/structures/SelfModeratorBitField.ts rename to projects/bot/src/lib/moderation/structures/SelfModeratorBitField.ts diff --git a/src/lib/moderation/structures/SetUpModerationCommand.ts b/projects/bot/src/lib/moderation/structures/SetUpModerationCommand.ts similarity index 100% rename from src/lib/moderation/structures/SetUpModerationCommand.ts rename to projects/bot/src/lib/moderation/structures/SetUpModerationCommand.ts diff --git a/src/lib/moderation/structures/index.ts b/projects/bot/src/lib/moderation/structures/index.ts similarity index 100% rename from src/lib/moderation/structures/index.ts rename to projects/bot/src/lib/moderation/structures/index.ts diff --git a/src/lib/moderation/workers/WorkerHandler.ts b/projects/bot/src/lib/moderation/workers/WorkerHandler.ts similarity index 100% rename from src/lib/moderation/workers/WorkerHandler.ts rename to projects/bot/src/lib/moderation/workers/WorkerHandler.ts diff --git a/src/lib/moderation/workers/WorkerManager.ts b/projects/bot/src/lib/moderation/workers/WorkerManager.ts similarity index 100% rename from src/lib/moderation/workers/WorkerManager.ts rename to projects/bot/src/lib/moderation/workers/WorkerManager.ts diff --git a/src/lib/moderation/workers/WorkerResponseHandler.ts b/projects/bot/src/lib/moderation/workers/WorkerResponseHandler.ts similarity index 100% rename from src/lib/moderation/workers/WorkerResponseHandler.ts rename to projects/bot/src/lib/moderation/workers/WorkerResponseHandler.ts diff --git a/src/lib/moderation/workers/errors/TimeoutError.ts b/projects/bot/src/lib/moderation/workers/errors/TimeoutError.ts similarity index 100% rename from src/lib/moderation/workers/errors/TimeoutError.ts rename to projects/bot/src/lib/moderation/workers/errors/TimeoutError.ts diff --git a/src/lib/moderation/workers/errors/index.ts b/projects/bot/src/lib/moderation/workers/errors/index.ts similarity index 100% rename from src/lib/moderation/workers/errors/index.ts rename to projects/bot/src/lib/moderation/workers/errors/index.ts diff --git a/src/lib/moderation/workers/index.ts b/projects/bot/src/lib/moderation/workers/index.ts similarity index 100% rename from src/lib/moderation/workers/index.ts rename to projects/bot/src/lib/moderation/workers/index.ts diff --git a/src/lib/moderation/workers/types.ts b/projects/bot/src/lib/moderation/workers/types.ts similarity index 100% rename from src/lib/moderation/workers/types.ts rename to projects/bot/src/lib/moderation/workers/types.ts diff --git a/src/lib/moderation/workers/worker.ts b/projects/bot/src/lib/moderation/workers/worker.ts similarity index 100% rename from src/lib/moderation/workers/worker.ts rename to projects/bot/src/lib/moderation/workers/worker.ts diff --git a/src/lib/structures/InviteStore.ts b/projects/bot/src/lib/structures/InviteStore.ts similarity index 100% rename from src/lib/structures/InviteStore.ts rename to projects/bot/src/lib/structures/InviteStore.ts diff --git a/projects/bot/src/lib/structures/index.ts b/projects/bot/src/lib/structures/index.ts new file mode 100644 index 00000000000..7c3ae56f2f7 --- /dev/null +++ b/projects/bot/src/lib/structures/index.ts @@ -0,0 +1,2 @@ +export * from './InviteStore'; +export * from './managers'; diff --git a/src/lib/structures/managers/LockdownManager.ts b/projects/bot/src/lib/structures/managers/LockdownManager.ts similarity index 100% rename from src/lib/structures/managers/LockdownManager.ts rename to projects/bot/src/lib/structures/managers/LockdownManager.ts diff --git a/src/lib/structures/managers/ScheduleManager.ts b/projects/bot/src/lib/structures/managers/ScheduleManager.ts similarity index 100% rename from src/lib/structures/managers/ScheduleManager.ts rename to projects/bot/src/lib/structures/managers/ScheduleManager.ts diff --git a/src/lib/structures/managers/index.ts b/projects/bot/src/lib/structures/managers/index.ts similarity index 100% rename from src/lib/structures/managers/index.ts rename to projects/bot/src/lib/structures/managers/index.ts diff --git a/src/lib/util/Links/TLDs.ts b/projects/bot/src/lib/util/Links/TLDs.ts similarity index 100% rename from src/lib/util/Links/TLDs.ts rename to projects/bot/src/lib/util/Links/TLDs.ts diff --git a/src/lib/util/Links/UrlRegex.ts b/projects/bot/src/lib/util/Links/UrlRegex.ts similarity index 100% rename from src/lib/util/Links/UrlRegex.ts rename to projects/bot/src/lib/util/Links/UrlRegex.ts diff --git a/src/lib/util/Parsers/ExceededLength.ts b/projects/bot/src/lib/util/Parsers/ExceededLength.ts similarity index 100% rename from src/lib/util/Parsers/ExceededLength.ts rename to projects/bot/src/lib/util/Parsers/ExceededLength.ts diff --git a/src/lib/util/Parsers/FuzzySearch.ts b/projects/bot/src/lib/util/Parsers/FuzzySearch.ts similarity index 100% rename from src/lib/util/Parsers/FuzzySearch.ts rename to projects/bot/src/lib/util/Parsers/FuzzySearch.ts diff --git a/src/lib/util/Sanitizer/clean.ts b/projects/bot/src/lib/util/Sanitizer/clean.ts similarity index 100% rename from src/lib/util/Sanitizer/clean.ts rename to projects/bot/src/lib/util/Sanitizer/clean.ts diff --git a/src/lib/util/Sanitizer/initClean.ts b/projects/bot/src/lib/util/Sanitizer/initClean.ts similarity index 100% rename from src/lib/util/Sanitizer/initClean.ts rename to projects/bot/src/lib/util/Sanitizer/initClean.ts diff --git a/src/lib/util/Security/GuildSecurity.ts b/projects/bot/src/lib/util/Security/GuildSecurity.ts similarity index 100% rename from src/lib/util/Security/GuildSecurity.ts rename to projects/bot/src/lib/util/Security/GuildSecurity.ts diff --git a/src/lib/util/Security/ModerationActions.ts b/projects/bot/src/lib/util/Security/ModerationActions.ts similarity index 100% rename from src/lib/util/Security/ModerationActions.ts rename to projects/bot/src/lib/util/Security/ModerationActions.ts diff --git a/src/lib/util/Security/RegexCreator.ts b/projects/bot/src/lib/util/Security/RegexCreator.ts similarity index 100% rename from src/lib/util/Security/RegexCreator.ts rename to projects/bot/src/lib/util/Security/RegexCreator.ts diff --git a/src/lib/util/bits.ts b/projects/bot/src/lib/util/bits.ts similarity index 100% rename from src/lib/util/bits.ts rename to projects/bot/src/lib/util/bits.ts diff --git a/src/lib/util/common/comparators.ts b/projects/bot/src/lib/util/common/comparators.ts similarity index 100% rename from src/lib/util/common/comparators.ts rename to projects/bot/src/lib/util/common/comparators.ts diff --git a/src/lib/util/common/guards.ts b/projects/bot/src/lib/util/common/guards.ts similarity index 100% rename from src/lib/util/common/guards.ts rename to projects/bot/src/lib/util/common/guards.ts diff --git a/src/lib/util/common/index.ts b/projects/bot/src/lib/util/common/index.ts similarity index 100% rename from src/lib/util/common/index.ts rename to projects/bot/src/lib/util/common/index.ts diff --git a/src/lib/util/common/iterators.ts b/projects/bot/src/lib/util/common/iterators.ts similarity index 100% rename from src/lib/util/common/iterators.ts rename to projects/bot/src/lib/util/common/iterators.ts diff --git a/src/lib/util/common/promises.ts b/projects/bot/src/lib/util/common/promises.ts similarity index 100% rename from src/lib/util/common/promises.ts rename to projects/bot/src/lib/util/common/promises.ts diff --git a/src/lib/util/common/times.ts b/projects/bot/src/lib/util/common/times.ts similarity index 100% rename from src/lib/util/common/times.ts rename to projects/bot/src/lib/util/common/times.ts diff --git a/src/lib/util/constants.ts b/projects/bot/src/lib/util/constants.ts similarity index 74% rename from src/lib/util/constants.ts rename to projects/bot/src/lib/util/constants.ts index faf9ba5fe6d..f7963644dc4 100644 --- a/src/lib/util/constants.ts +++ b/projects/bot/src/lib/util/constants.ts @@ -1,5 +1,4 @@ import { getRootData } from '@sapphire/pieces'; -import type { PostProcessorModule } from 'i18next'; import { join } from 'node:path'; export const mainFolder = getRootData().root; @@ -45,17 +44,6 @@ export const enum Emojis { FemaleSignEmoji = '<:2640:845772713729720320>' } -export const helpUsagePostProcessor: PostProcessorModule = { - type: 'postProcessor', - name: 'helpUsagePostProcessor', - process(value, [key]) { - // If the value is equal to the key then it is an empty usage, so return an empty string - if (value === key) return ''; - // Otherwise just return the value - return value; - } -}; - export const enum BrandingColors { Primary = 0x1e88e5, Secondary = 0xff9d01 @@ -64,18 +52,6 @@ export const enum BrandingColors { // eslint-disable-next-line @typescript-eslint/ban-types export type O = object; -export const enum CdnUrls { - AnilistLogo = 'https://cdn.skyra.pw/skyra-assets/anilist.png', - BannersBasePath = 'https://cdn.skyra.pw/skyra-assets/banners/', - CoinHeads = 'https://cdn.skyra.pw/skyra-assets/coins_heads.png', - CoinTails = 'https://cdn.skyra.pw/skyra-assets/coins_tails.png', - EscapeRopeGif = 'https://cdn.skyra.pw/skyra-assets/escape_rope.gif', - NodeJSLogo = 'https://cdn.skyra.pw/skyra-assets/nodejs_logo.png', - RevolvingHeartTwemoji = 'https://twemoji.maxcdn.com/72x72/1f49e.png', - StarWarsLogo = 'https://cdn.skyra.pw/skyra-assets/star-wars-api-logo.png', - TwitchLogo = 'https://cdn.skyra.pw/skyra-assets/twitch_logo.png' -} - export const enum LanguageFormatters { AndList = 'andList', Duration = 'duration', @@ -122,10 +98,3 @@ export const enum Colors { Yellow = 0xffeb3b, Yellow300 = 0xfff176 } - -export const enum CanvasColors { - BackgroundLight = '#FAFAFA', - BackgroundDark = '#212121', - IndicatorGreen = '#4CAF50', - IndicatorRed = '#F44336' -} diff --git a/src/lib/util/formatters.ts b/projects/bot/src/lib/util/formatters.ts similarity index 100% rename from src/lib/util/formatters.ts rename to projects/bot/src/lib/util/formatters.ts diff --git a/src/lib/util/functions/booleans.ts b/projects/bot/src/lib/util/functions/booleans.ts similarity index 100% rename from src/lib/util/functions/booleans.ts rename to projects/bot/src/lib/util/functions/booleans.ts diff --git a/src/lib/util/functions/emojis.ts b/projects/bot/src/lib/util/functions/emojis.ts similarity index 100% rename from src/lib/util/functions/emojis.ts rename to projects/bot/src/lib/util/functions/emojis.ts diff --git a/src/lib/util/functions/guild.ts b/projects/bot/src/lib/util/functions/guild.ts similarity index 100% rename from src/lib/util/functions/guild.ts rename to projects/bot/src/lib/util/functions/guild.ts diff --git a/src/lib/util/functions/index.ts b/projects/bot/src/lib/util/functions/index.ts similarity index 100% rename from src/lib/util/functions/index.ts rename to projects/bot/src/lib/util/functions/index.ts diff --git a/src/lib/util/functions/numbers.ts b/projects/bot/src/lib/util/functions/numbers.ts similarity index 100% rename from src/lib/util/functions/numbers.ts rename to projects/bot/src/lib/util/functions/numbers.ts diff --git a/src/lib/util/functions/permissions.ts b/projects/bot/src/lib/util/functions/permissions.ts similarity index 100% rename from src/lib/util/functions/permissions.ts rename to projects/bot/src/lib/util/functions/permissions.ts diff --git a/src/lib/util/moderationConstants.ts b/projects/bot/src/lib/util/moderationConstants.ts similarity index 100% rename from src/lib/util/moderationConstants.ts rename to projects/bot/src/lib/util/moderationConstants.ts diff --git a/projects/bot/src/lib/util/util.ts b/projects/bot/src/lib/util/util.ts new file mode 100644 index 00000000000..31c5b9800b9 --- /dev/null +++ b/projects/bot/src/lib/util/util.ts @@ -0,0 +1,216 @@ +import type { ImageURLOptions } from '@discordjs/rest'; +import { DiscordSnowflake } from '@sapphire/snowflake'; +import { parseURL } from '@sapphire/utilities'; +import { container } from '@skyra/http-framework'; +import type { APIMessage, APIUser } from 'discord-api-types/v10'; +import type { Guild } from 'skyra-shared'; +import { ZeroWidthSpace } from './constants'; + +/** + * Image extensions: + * - bmp + * - jpg + * - jpeg + * - png + * - gif + * - webp + */ +export const IMAGE_EXTENSION = /\.(bmp|jpe?g|png|gif|webp)$/i; + +/** + * Media extensions + * - ...Image extensions + * - ...Audio extensions + * - ...Video extensions + */ +export const MEDIA_EXTENSION = /\.(bmp|jpe?g|png|gifv?|web[pm]|wav|mp[34]|ogg)$/i; + +export function radians(degrees: number) { + return (degrees * Math.PI) / 180; +} + +export function snowflakeAge(snowflake: string | bigint) { + return Math.max(Date.now() - DiscordSnowflake.timestampFrom(snowflake), 0); +} + +export function twemoji(emoji: string) { + const r: string[] = []; + let c = 0; + let p = 0; + let i = 0; + + while (i < emoji.length) { + c = emoji.charCodeAt(i++); + if (p) { + r.push((0x10000 + ((p - 0xd800) << 10) + (c - 0xdc00)).toString(16)); + p = 0; + } else if (c >= 0xd800 && c <= 0xdbff) { + p = c; + } else { + r.push(c.toString(16)); + } + } + return r.join('-'); +} + +/** + * Get the content from a message. + * @param message The Message instance to get the content from + */ +export function getContent(message: APIMessage): string | null { + if (message.content) return message.content; + for (const embed of message.embeds) { + if (embed.description) return embed.description; + if (embed.fields?.length) return embed.fields[0].value; + } + return null; +} + +/** + * Gets all the contents from a message. + * @param message The Message instance to get all contents from + */ +export function getAllContent(message: APIMessage): string { + const output: string[] = []; + if (message.content) output.push(message.content); + for (const embed of message.embeds) { + if (embed.author?.name) output.push(embed.author.name); + if (embed.title) output.push(embed.title); + if (embed.description) output.push(embed.description); + for (const field of embed.fields ?? []) output.push(`${field.name}\n${field.value}`); + if (embed.footer?.text) output.push(embed.footer.text); + } + + return output.join('\n'); +} + +export interface ImageAttachment { + url: string; + proxyURL: string; + height: number; + width: number; +} + +/** + * Get a image attachment from a message. + * @param message The Message instance to get the image url from + */ +export function getAttachment(message: APIMessage): ImageAttachment | null { + if (message.attachments.length) { + const attachment = message.attachments.find((att) => IMAGE_EXTENSION.test(att.url)); + if (attachment) { + return { + url: attachment.url, + proxyURL: attachment.proxy_url, + height: attachment.height!, + width: attachment.width! + }; + } + } + + for (const embed of message.embeds) { + if (embed.image) { + return { + url: embed.image.url, + proxyURL: embed.image.proxy_url!, + height: embed.image.height!, + width: embed.image.width! + }; + } + + if (embed.thumbnail) { + return { + url: embed.thumbnail.url, + proxyURL: embed.thumbnail.proxy_url!, + height: embed.thumbnail.height!, + width: embed.thumbnail.width! + }; + } + } + + return null; +} + +/** + * Get the image url from a message. + * @param message The Message instance to get the image url from + */ +export function getImage(message: APIMessage): string | null { + const attachment = getAttachment(message); + return attachment ? attachment.proxyURL || attachment.url : null; +} + +export function getDisplayAvatar(id: string, user: APIUser, options?: Readonly) { + if (user.avatar === null) return container.rest.cdn.defaultAvatar(Number(user.discriminator) % 5); + return container.rest.cdn.avatar(id, user.avatar, options); +} + +/** + * Parse a range + * @param input The input to parse + * @example + * parseRange('23..25'); + * // -> [23, 24, 25] + * @example + * parseRange('1..3,23..25'); + * // -> [1, 2, 3, 23, 24, 25] + */ +export function parseRange(input: string): number[] { + const set = new Set(); + for (const subset of input.split(',')) { + const [, stringMin, stringMax] = /(\d+) *\.{2,} *(\d+)/.exec(subset) || [subset, subset, subset]; + let min = Number(stringMin); + let max = Number(stringMax); + if (min > max) [max, min] = [min, max]; + + for (let i = Math.max(1, min); i <= max; ++i) set.add(i); + } + + return [...set]; +} + +/** + * Parses an URL and checks if the extension is valid. + * @param url The url to check + */ +export function getImageUrl(url: string): string | undefined { + const parsed = parseURL(url); + return parsed && IMAGE_EXTENSION.test(parsed.pathname) ? parsed.href : undefined; +} + +/** + * Clean all mentions from a body of text + * @param guild The guild for context + * @param input The input to clean + * @returns The input cleaned of mentions + * @license Apache-2.0 + * @copyright 2019 Aura Román + */ +export function cleanMentions(guild: Guild, input: string) { + return input.replace(/@(here|everyone)/g, `@${ZeroWidthSpace}$1`).replace(/<(@[!&]?|#)(\d{17,19})>/g, (match, type, id) => { + switch (type) { + case '@': + case '@!': { + const tag = guild.client.users.cache.get(id); + return tag ? `@${tag.username}` : `<${type}${ZeroWidthSpace}${id}>`; + } + case '@&': { + const role = guild.roles.cache.get(id); + return role ? `@${role.name}` : match; + } + case '#': { + const channel = guild.channels.cache.get(id); + return channel ? `#${channel.name}` : `<${type}${ZeroWidthSpace}${id}>`; + } + default: + return `<${type}${ZeroWidthSpace}${id}>`; + } + }); +} + +export const anyMentionRegExp = /<(@[!&]?|#)(\d{17,19})>/g; +export const hereOrEveryoneMentionRegExp = /@(?:here|everyone)/; + +export function cast(value: unknown): T { + return value as T; +} diff --git a/src/listeners/commands/commandDenied.ts b/projects/bot/src/listeners/commands/commandDenied.ts similarity index 100% rename from src/listeners/commands/commandDenied.ts rename to projects/bot/src/listeners/commands/commandDenied.ts diff --git a/src/listeners/commands/commandError.ts b/projects/bot/src/listeners/commands/commandError.ts similarity index 100% rename from src/listeners/commands/commandError.ts rename to projects/bot/src/listeners/commands/commandError.ts diff --git a/src/listeners/commands/commandRunAttach.ts b/projects/bot/src/listeners/commands/commandRunAttach.ts similarity index 100% rename from src/listeners/commands/commandRunAttach.ts rename to projects/bot/src/listeners/commands/commandRunAttach.ts diff --git a/src/listeners/commands/commandSuccessAnalytics.ts b/projects/bot/src/listeners/commands/commandSuccessAnalytics.ts similarity index 100% rename from src/listeners/commands/commandSuccessAnalytics.ts rename to projects/bot/src/listeners/commands/commandSuccessAnalytics.ts diff --git a/src/listeners/commands/commandSuccessAutoDelete.ts b/projects/bot/src/listeners/commands/commandSuccessAutoDelete.ts similarity index 100% rename from src/listeners/commands/commandSuccessAutoDelete.ts rename to projects/bot/src/listeners/commands/commandSuccessAutoDelete.ts diff --git a/src/listeners/commands/commandSuccessLogger.ts b/projects/bot/src/listeners/commands/commandSuccessLogger.ts similarity index 100% rename from src/listeners/commands/commandSuccessLogger.ts rename to projects/bot/src/listeners/commands/commandSuccessLogger.ts diff --git a/src/listeners/commands/unknownCommand.ts b/projects/bot/src/listeners/commands/unknownCommand.ts similarity index 100% rename from src/listeners/commands/unknownCommand.ts rename to projects/bot/src/listeners/commands/unknownCommand.ts diff --git a/src/listeners/errors/error.ts b/projects/bot/src/listeners/errors/error.ts similarity index 100% rename from src/listeners/errors/error.ts rename to projects/bot/src/listeners/errors/error.ts diff --git a/src/listeners/errors/listenerError.ts b/projects/bot/src/listeners/errors/listenerError.ts similarity index 100% rename from src/listeners/errors/listenerError.ts rename to projects/bot/src/listeners/errors/listenerError.ts diff --git a/src/listeners/errors/listenerErrorSentry.ts b/projects/bot/src/listeners/errors/listenerErrorSentry.ts similarity index 100% rename from src/listeners/errors/listenerErrorSentry.ts rename to projects/bot/src/listeners/errors/listenerErrorSentry.ts diff --git a/src/listeners/errors/taskError.ts b/projects/bot/src/listeners/errors/taskError.ts similarity index 100% rename from src/listeners/errors/taskError.ts rename to projects/bot/src/listeners/errors/taskError.ts diff --git a/src/listeners/errors/taskErrorSentry.ts b/projects/bot/src/listeners/errors/taskErrorSentry.ts similarity index 100% rename from src/listeners/errors/taskErrorSentry.ts rename to projects/bot/src/listeners/errors/taskErrorSentry.ts diff --git a/src/listeners/guildMessageLog.ts b/projects/bot/src/listeners/guildMessageLog.ts similarity index 100% rename from src/listeners/guildMessageLog.ts rename to projects/bot/src/listeners/guildMessageLog.ts diff --git a/src/listeners/guilds/bans/guildBanAdd.ts b/projects/bot/src/listeners/guilds/bans/guildBanAdd.ts similarity index 100% rename from src/listeners/guilds/bans/guildBanAdd.ts rename to projects/bot/src/listeners/guilds/bans/guildBanAdd.ts diff --git a/src/listeners/guilds/bans/guildBanRemove.ts b/projects/bot/src/listeners/guilds/bans/guildBanRemove.ts similarity index 100% rename from src/listeners/guilds/bans/guildBanRemove.ts rename to projects/bot/src/listeners/guilds/bans/guildBanRemove.ts diff --git a/src/listeners/guilds/channels/channelCreateNotify.ts b/projects/bot/src/listeners/guilds/channels/channelCreateNotify.ts similarity index 100% rename from src/listeners/guilds/channels/channelCreateNotify.ts rename to projects/bot/src/listeners/guilds/channels/channelCreateNotify.ts diff --git a/src/listeners/guilds/channels/channelDeleteNotify.ts b/projects/bot/src/listeners/guilds/channels/channelDeleteNotify.ts similarity index 100% rename from src/listeners/guilds/channels/channelDeleteNotify.ts rename to projects/bot/src/listeners/guilds/channels/channelDeleteNotify.ts diff --git a/src/listeners/guilds/channels/channelUpdateNotify.ts b/projects/bot/src/listeners/guilds/channels/channelUpdateNotify.ts similarity index 100% rename from src/listeners/guilds/channels/channelUpdateNotify.ts rename to projects/bot/src/listeners/guilds/channels/channelUpdateNotify.ts diff --git a/src/listeners/guilds/emojis/emojiCreateNotify.ts b/projects/bot/src/listeners/guilds/emojis/emojiCreateNotify.ts similarity index 100% rename from src/listeners/guilds/emojis/emojiCreateNotify.ts rename to projects/bot/src/listeners/guilds/emojis/emojiCreateNotify.ts diff --git a/src/listeners/guilds/emojis/emojiDeleteNotify.ts b/projects/bot/src/listeners/guilds/emojis/emojiDeleteNotify.ts similarity index 100% rename from src/listeners/guilds/emojis/emojiDeleteNotify.ts rename to projects/bot/src/listeners/guilds/emojis/emojiDeleteNotify.ts diff --git a/src/listeners/guilds/emojis/emojiUpdateNotify.ts b/projects/bot/src/listeners/guilds/emojis/emojiUpdateNotify.ts similarity index 100% rename from src/listeners/guilds/emojis/emojiUpdateNotify.ts rename to projects/bot/src/listeners/guilds/emojis/emojiUpdateNotify.ts diff --git a/src/listeners/guilds/guildUpdateNotify.ts b/projects/bot/src/listeners/guilds/guildUpdateNotify.ts similarity index 100% rename from src/listeners/guilds/guildUpdateNotify.ts rename to projects/bot/src/listeners/guilds/guildUpdateNotify.ts diff --git a/src/listeners/guilds/members/guildMemberAdd.ts b/projects/bot/src/listeners/guilds/members/guildMemberAdd.ts similarity index 100% rename from src/listeners/guilds/members/guildMemberAdd.ts rename to projects/bot/src/listeners/guilds/members/guildMemberAdd.ts diff --git a/src/listeners/guilds/members/guildMemberUpdateNicknameNotify.ts b/projects/bot/src/listeners/guilds/members/guildMemberUpdateNicknameNotify.ts similarity index 100% rename from src/listeners/guilds/members/guildMemberUpdateNicknameNotify.ts rename to projects/bot/src/listeners/guilds/members/guildMemberUpdateNicknameNotify.ts diff --git a/src/listeners/guilds/members/guildMemberUpdateRolesNotify.ts b/projects/bot/src/listeners/guilds/members/guildMemberUpdateRolesNotify.ts similarity index 100% rename from src/listeners/guilds/members/guildMemberUpdateRolesNotify.ts rename to projects/bot/src/listeners/guilds/members/guildMemberUpdateRolesNotify.ts diff --git a/src/listeners/guilds/members/notMutedMemberAddInitialRole.ts b/projects/bot/src/listeners/guilds/members/notMutedMemberAddInitialRole.ts similarity index 100% rename from src/listeners/guilds/members/notMutedMemberAddInitialRole.ts rename to projects/bot/src/listeners/guilds/members/notMutedMemberAddInitialRole.ts diff --git a/src/listeners/guilds/members/notMutedMemberAddNotify.ts b/projects/bot/src/listeners/guilds/members/notMutedMemberAddNotify.ts similarity index 100% rename from src/listeners/guilds/members/notMutedMemberAddNotify.ts rename to projects/bot/src/listeners/guilds/members/notMutedMemberAddNotify.ts diff --git a/src/listeners/guilds/members/rawGuildMemberRemove.ts b/projects/bot/src/listeners/guilds/members/rawGuildMemberRemove.ts similarity index 100% rename from src/listeners/guilds/members/rawGuildMemberRemove.ts rename to projects/bot/src/listeners/guilds/members/rawGuildMemberRemove.ts diff --git a/src/listeners/guilds/members/rawGuildMemberUpdate.ts b/projects/bot/src/listeners/guilds/members/rawGuildMemberUpdate.ts similarity index 100% rename from src/listeners/guilds/members/rawGuildMemberUpdate.ts rename to projects/bot/src/listeners/guilds/members/rawGuildMemberUpdate.ts diff --git a/src/listeners/guilds/members/rawMemberRemoveNotify.ts b/projects/bot/src/listeners/guilds/members/rawMemberRemoveNotify.ts similarity index 100% rename from src/listeners/guilds/members/rawMemberRemoveNotify.ts rename to projects/bot/src/listeners/guilds/members/rawMemberRemoveNotify.ts diff --git a/src/listeners/guilds/messages/guildUserMessageImageNotify.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessageImageNotify.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessageImageNotify.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessageImageNotify.ts diff --git a/src/listeners/guilds/messages/guildUserMessagePointsHandler.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessagePointsHandler.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessagePointsHandler.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessagePointsHandler.ts diff --git a/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMember.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMember.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessageSocialPointsAddMember.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMember.ts diff --git a/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardLevel.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardLevel.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardLevel.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardLevel.ts diff --git a/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardRole.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardRole.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardRole.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddMemberRewardRole.ts diff --git a/src/listeners/guilds/messages/guildUserMessageSocialPointsAddUser.ts b/projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddUser.ts similarity index 100% rename from src/listeners/guilds/messages/guildUserMessageSocialPointsAddUser.ts rename to projects/bot/src/listeners/guilds/messages/guildUserMessageSocialPointsAddUser.ts diff --git a/src/listeners/guilds/rawGuildCreateMemberFetch.ts b/projects/bot/src/listeners/guilds/rawGuildCreateMemberFetch.ts similarity index 100% rename from src/listeners/guilds/rawGuildCreateMemberFetch.ts rename to projects/bot/src/listeners/guilds/rawGuildCreateMemberFetch.ts diff --git a/src/listeners/guilds/rawGuildDelete.ts b/projects/bot/src/listeners/guilds/rawGuildDelete.ts similarity index 100% rename from src/listeners/guilds/rawGuildDelete.ts rename to projects/bot/src/listeners/guilds/rawGuildDelete.ts diff --git a/src/listeners/guilds/rawGuildDeleteMemberFetch.ts b/projects/bot/src/listeners/guilds/rawGuildDeleteMemberFetch.ts similarity index 100% rename from src/listeners/guilds/rawGuildDeleteMemberFetch.ts rename to projects/bot/src/listeners/guilds/rawGuildDeleteMemberFetch.ts diff --git a/src/listeners/guilds/roles/roleCreateNotify.ts b/projects/bot/src/listeners/guilds/roles/roleCreateNotify.ts similarity index 100% rename from src/listeners/guilds/roles/roleCreateNotify.ts rename to projects/bot/src/listeners/guilds/roles/roleCreateNotify.ts diff --git a/src/listeners/guilds/roles/roleDelete.ts b/projects/bot/src/listeners/guilds/roles/roleDelete.ts similarity index 100% rename from src/listeners/guilds/roles/roleDelete.ts rename to projects/bot/src/listeners/guilds/roles/roleDelete.ts diff --git a/src/listeners/guilds/roles/roleDeleteNotify.ts b/projects/bot/src/listeners/guilds/roles/roleDeleteNotify.ts similarity index 100% rename from src/listeners/guilds/roles/roleDeleteNotify.ts rename to projects/bot/src/listeners/guilds/roles/roleDeleteNotify.ts diff --git a/src/listeners/guilds/roles/roleUpdate.ts b/projects/bot/src/listeners/guilds/roles/roleUpdate.ts similarity index 100% rename from src/listeners/guilds/roles/roleUpdate.ts rename to projects/bot/src/listeners/guilds/roles/roleUpdate.ts diff --git a/src/listeners/guilds/roles/roleUpdateNotify.ts b/projects/bot/src/listeners/guilds/roles/roleUpdateNotify.ts similarity index 100% rename from src/listeners/guilds/roles/roleUpdateNotify.ts rename to projects/bot/src/listeners/guilds/roles/roleUpdateNotify.ts diff --git a/src/listeners/messages/guildMessageDeleteNotify.ts b/projects/bot/src/listeners/messages/guildMessageDeleteNotify.ts similarity index 100% rename from src/listeners/messages/guildMessageDeleteNotify.ts rename to projects/bot/src/listeners/messages/guildMessageDeleteNotify.ts diff --git a/src/listeners/messages/guildMessageDeleteRichDisplay.ts b/projects/bot/src/listeners/messages/guildMessageDeleteRichDisplay.ts similarity index 100% rename from src/listeners/messages/guildMessageDeleteRichDisplay.ts rename to projects/bot/src/listeners/messages/guildMessageDeleteRichDisplay.ts diff --git a/src/listeners/messages/guildMessageDeleteSnipe.ts b/projects/bot/src/listeners/messages/guildMessageDeleteSnipe.ts similarity index 100% rename from src/listeners/messages/guildMessageDeleteSnipe.ts rename to projects/bot/src/listeners/messages/guildMessageDeleteSnipe.ts diff --git a/src/listeners/messages/guildUserMessageMediaOnly.ts b/projects/bot/src/listeners/messages/guildUserMessageMediaOnly.ts similarity index 100% rename from src/listeners/messages/guildUserMessageMediaOnly.ts rename to projects/bot/src/listeners/messages/guildUserMessageMediaOnly.ts diff --git a/src/listeners/messages/messageCreate.ts b/projects/bot/src/listeners/messages/messageCreate.ts similarity index 100% rename from src/listeners/messages/messageCreate.ts rename to projects/bot/src/listeners/messages/messageCreate.ts diff --git a/src/listeners/messages/messageDelete.ts b/projects/bot/src/listeners/messages/messageDelete.ts similarity index 100% rename from src/listeners/messages/messageDelete.ts rename to projects/bot/src/listeners/messages/messageDelete.ts diff --git a/src/listeners/messages/messageDeleteBulkRemoveResponses.ts b/projects/bot/src/listeners/messages/messageDeleteBulkRemoveResponses.ts similarity index 100% rename from src/listeners/messages/messageDeleteBulkRemoveResponses.ts rename to projects/bot/src/listeners/messages/messageDeleteBulkRemoveResponses.ts diff --git a/src/listeners/messages/messageDeleteRemoveResponses.ts b/projects/bot/src/listeners/messages/messageDeleteRemoveResponses.ts similarity index 100% rename from src/listeners/messages/messageDeleteRemoveResponses.ts rename to projects/bot/src/listeners/messages/messageDeleteRemoveResponses.ts diff --git a/src/listeners/messages/messageUpdateNotify.ts b/projects/bot/src/listeners/messages/messageUpdateNotify.ts similarity index 100% rename from src/listeners/messages/messageUpdateNotify.ts rename to projects/bot/src/listeners/messages/messageUpdateNotify.ts diff --git a/src/listeners/messages/rawMessageDelete.ts b/projects/bot/src/listeners/messages/rawMessageDelete.ts similarity index 100% rename from src/listeners/messages/rawMessageDelete.ts rename to projects/bot/src/listeners/messages/rawMessageDelete.ts diff --git a/src/listeners/messages/rawMessageDeleteBulk.ts b/projects/bot/src/listeners/messages/rawMessageDeleteBulk.ts similarity index 100% rename from src/listeners/messages/rawMessageDeleteBulk.ts rename to projects/bot/src/listeners/messages/rawMessageDeleteBulk.ts diff --git a/src/listeners/messages/userMessageGuildHandler.ts b/projects/bot/src/listeners/messages/userMessageGuildHandler.ts similarity index 100% rename from src/listeners/messages/userMessageGuildHandler.ts rename to projects/bot/src/listeners/messages/userMessageGuildHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageAttachmentsHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageAttachmentsHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageAttachmentsHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageAttachmentsHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageCapitalsHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageCapitalsHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageCapitalsHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageCapitalsHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageInvitesHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageInvitesHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageInvitesHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageInvitesHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageLinksHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageLinksHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageLinksHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageLinksHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageMentionsHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageMentionsHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageMentionsHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageMentionsHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageMessagesHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageMessagesHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageMessagesHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageMessagesHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageNewLinesHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageNewLinesHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageNewLinesHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageNewLinesHandler.ts diff --git a/src/listeners/moderation/messages/guildUserMessageWordsHandler.ts b/projects/bot/src/listeners/moderation/messages/guildUserMessageWordsHandler.ts similarity index 100% rename from src/listeners/moderation/messages/guildUserMessageWordsHandler.ts rename to projects/bot/src/listeners/moderation/messages/guildUserMessageWordsHandler.ts diff --git a/src/listeners/moderation/moderationEntryAdd.ts b/projects/bot/src/listeners/moderation/moderationEntryAdd.ts similarity index 100% rename from src/listeners/moderation/moderationEntryAdd.ts rename to projects/bot/src/listeners/moderation/moderationEntryAdd.ts diff --git a/src/listeners/moderation/moderationEntryEdit.ts b/projects/bot/src/listeners/moderation/moderationEntryEdit.ts similarity index 100% rename from src/listeners/moderation/moderationEntryEdit.ts rename to projects/bot/src/listeners/moderation/moderationEntryEdit.ts diff --git a/src/listeners/reactions/rawMessageReactionAdd.ts b/projects/bot/src/listeners/reactions/rawMessageReactionAdd.ts similarity index 100% rename from src/listeners/reactions/rawMessageReactionAdd.ts rename to projects/bot/src/listeners/reactions/rawMessageReactionAdd.ts diff --git a/src/listeners/reactions/rawMessageReactionRemove.ts b/projects/bot/src/listeners/reactions/rawMessageReactionRemove.ts similarity index 100% rename from src/listeners/reactions/rawMessageReactionRemove.ts rename to projects/bot/src/listeners/reactions/rawMessageReactionRemove.ts diff --git a/src/listeners/reactions/rawReactionAddBlockList.ts b/projects/bot/src/listeners/reactions/rawReactionAddBlockList.ts similarity index 100% rename from src/listeners/reactions/rawReactionAddBlockList.ts rename to projects/bot/src/listeners/reactions/rawReactionAddBlockList.ts diff --git a/src/listeners/reactions/rawReactionAddNotify.ts b/projects/bot/src/listeners/reactions/rawReactionAddNotify.ts similarity index 100% rename from src/listeners/reactions/rawReactionAddNotify.ts rename to projects/bot/src/listeners/reactions/rawReactionAddNotify.ts diff --git a/src/listeners/reactions/rawReactionAddRole.ts b/projects/bot/src/listeners/reactions/rawReactionAddRole.ts similarity index 100% rename from src/listeners/reactions/rawReactionAddRole.ts rename to projects/bot/src/listeners/reactions/rawReactionAddRole.ts diff --git a/src/listeners/reactions/rawReactionRemoveRole.ts b/projects/bot/src/listeners/reactions/rawReactionRemoveRole.ts similarity index 100% rename from src/listeners/reactions/rawReactionRemoveRole.ts rename to projects/bot/src/listeners/reactions/rawReactionRemoveRole.ts diff --git a/src/listeners/userUpdate.ts b/projects/bot/src/listeners/userUpdate.ts similarity index 100% rename from src/listeners/userUpdate.ts rename to projects/bot/src/listeners/userUpdate.ts diff --git a/src/languages/en-US/commands/management.json b/projects/bot/src/locales/en-US/commands/management.json similarity index 71% rename from src/languages/en-US/commands/management.json rename to projects/bot/src/locales/en-US/commands/management.json index 2caec193277..5e22a5b5d2a 100644 --- a/src/languages/en-US/commands/management.json +++ b/projects/bot/src/locales/en-US/commands/management.json @@ -104,138 +104,51 @@ ], "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`." - ], - [ - "Command", - "The name of the command to allow or deny." - ] - ], - "examples": [ - "add staff allow warn", - "add moderators deny ban", - "remove staff allow warn", - "reset staff", - "show staff" + ["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`."], + ["Command", "The name of the command to allow or deny."] ], + "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." }, "managecommandautodeleteDescription": "Manage per-channel auto-delete timer.", "managecommandautodeleteExtended": { - "usages": [ - "add TextChannel Seconds", - "remove TextChannel", - "reset", - "show", - "" - ], + "usages": ["add TextChannel Seconds", "remove TextChannel", "reset", "show", ""], "extendedHelp": "This command manages this server's per-channel command auto-delete timer, it serves well to leave a channel clean from commands.", "explainedUsage": [ - [ - "add", - "Add an auto-delete timer for the specified channel." - ], - [ - "remove", - "Remove the auto-timer from the specified channel." - ], - [ - "reset", - "Clear all auto-delete timers." - ], - [ - "show", - "Show the auto-delete timer for all channels." - ] + ["add", "Add an auto-delete timer for the specified channel."], + ["remove", "Remove the auto-timer from the specified channel."], + ["reset", "Clear all auto-delete timers."], + ["show", "Show the auto-delete timer for all channels."] ], "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" - ] + "examples": ["show", "add #general 4s", "remove #general", "reset"] }, "manageCommandChannelDescription": "Manage per-channel blocked command list.", "manageCommandChannelExtended": { - "usages": [ - "add TextChannel Command", - "remove TextChannel Command", - "reset TextChannel", - "show TextChannel" - ], + "usages": ["add TextChannel Command", "remove TextChannel Command", "reset TextChannel", "show TextChannel"], "extendedHelp": "This command manages this server's per-channel blocked command list, 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 list of commands blocked in the specified channel." - ], - [ - "add [channel] ", - "Add a command to the specified channel's list of blocked commands." - ], - [ - "remove [channel] ", - "Remove a command from the specified channel's list of blocked commands." - ], - [ - "reset [channel]", - "Clear the list of commands blocked in the specified channel." - ] + ["show [channel]", "Show the list of commands blocked in the specified channel."], + ["add [channel] ", "Add a command to the specified channel's list of blocked commands."], + ["remove [channel] ", "Remove a command from the specified channel's list of blocked commands."], + ["reset [channel]", "Clear the list of commands blocked in the specified channel."] ], "reminder": "The channel argument is optional, but it uses fuzzy search when possible.", - "examples": [ - "add #general profile", - "remove #general profile", - "reset #general", - "show #general" - ] + "examples": ["add #general profile", "remove #general profile", "reset #general", "show #general"] }, "manageReactionRolesDescription": "Manage the reaction roles for this server.", "manageReactionRolesExtended": { - "usages": [ - "add Role", - "add Role TextChannel Emoji", - "remove Role Message", - "reset", - "show" - ], + "usages": ["add Role", "add Role TextChannel Emoji", "remove Role Message", "reset", "show"], "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." - ] + ["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": [ - "add @role", - "add @role #channel emoji", - "remove @role 123456789012345678", - "reset", - "show" - ] + "examples": ["add @role", "add @role #channel emoji", "remove @role 123456789012345678", "reset", "show"] }, "rolesAdded": "The following roles have been added to your profile: `{{roles}}`", "rolesAuditlog": "Authorized: Public Role Management | 'Roles' Command.", @@ -246,9 +159,7 @@ "rolesRemoved": "The following roles have been removed from your profile: `{{roles}}`", "setIgnoreChannelsDescription": "Set a channel to the ignore channel list.", "setIgnoreChannelsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "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": [ [ @@ -257,16 +168,11 @@ ] ], "reminder": "You cannot set the same channel twice, instead, Skyra will remove it.", - "examples": [ - "#general", - "here" - ] + "examples": ["#general", "here"] }, "setImageLogsDescription": "Set the image logs channel.", "setImageLogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "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": [ [ @@ -274,16 +180,11 @@ "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" - ] + "examples": ["#image-logs", "here"] }, "setMemberAddLogsDescription": "Set the member add logs channel.", "setMemberAddLogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "extendedHelp": "This command helps you setting up the member add log channel, which will receive a message each time a user joins.\nIf a muted user joins, it will send a special \"Muted Member Joined\" event.", "explainedUsage": [ [ @@ -291,17 +192,12 @@ "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" - ], + "examples": ["#member-logs", "here"], "reminder": "All messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra." }, "setMemberRemoveLogsDescription": "Set the member remove logs channel.", "setMemberRemoveLogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "extendedHelp": "This command helps you setting up the member remove log channel, which will receive a message each time a user leaves, is kicked, or is banned.\nIn the case of the last two, it will send a special \"User Kicked\" or \"User Banned\" event.", "explainedUsage": [ [ @@ -309,17 +205,12 @@ "A TextChannel. You can either put the name of the channel, tag it, or type in \"here\" to configure the channel this command was used in." ] ], - "examples": [ - "#member-logs", - "here" - ], + "examples": ["#member-logs", "here"], "reminder": "All messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra." }, "setMessageUpdateLogsDescription": "Set the message update logs channel.", "setMessageUpdateLogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "extendedHelp": "This command helps you setting up the message update log channel, which will receive a message each time a message is edited.", "explainedUsage": [ [ @@ -328,16 +219,11 @@ ] ], "reminder": "All messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.", - "examples": [ - "#message-logs", - "here" - ] + "examples": ["#message-logs", "here"] }, "setMessageDeleteLogsDescription": "Set the message delete logs channel.", "setMessageDeleteLogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "extendedHelp": "This command helps you setting up the message delete log channel, which will receive a message each time a message is deleted.", "explainedUsage": [ [ @@ -346,16 +232,11 @@ ] ], "reminder": "All messages are in embeds so you will need to enable the permission **{{EMBED_LINKS, permissions}}** for Skyra.\nDue to Discord limitations, Skyra cannot know who deleted a message.", - "examples": [ - "#message-logs", - "here" - ] + "examples": ["#message-logs", "here"] }, "setmodlogsDescription": "Set the mod logs channel.", "setmodlogsExtended": { - "usages": [ - "here/TextChannel" - ], + "usages": ["here/TextChannel"], "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.ban-add`, `events.ban-remove` via the `config` command.", "explainedUsage": [ [ @@ -364,28 +245,15 @@ ] ], "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" - ] + "examples": ["#mod-logs", "here"] }, "setprefixDescription": "Set Skyra's prefix.", "setprefixExtended": { - "usages": [ - "Prefix" - ], + "usages": ["Prefix"], "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}}`." - ] - ], + "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": [ - "&", - "=" - ] + "examples": ["&", "="] }, "guildInfoDescription": "Check the information of the server.", "guildInfoExtended": { @@ -393,53 +261,21 @@ }, "roleInfoDescription": "Check the information for a role.", "roleInfoExtended": { - "usages": [ - "Role", - "" - ], + "usages": ["Role", ""], "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, name, mention or id." - ] - ], - "examples": [ - "Administrator", - "Moderator", - "" - ] + "explainedUsage": [["Role", "The role name, name, mention or id."]], + "examples": ["Administrator", "Moderator", ""] }, "stickyRolesDescription": "Manage sticky roles for users.", "stickyRolesExtended": { - "usages": [ - "add User Role", - "remove User Role", - "reset User", - "show User", - "User" - ], + "usages": ["add User Role", "remove User Role", "reset User", "show User", "User"], "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" + ["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 server's flags for the attachments filter.", @@ -457,42 +293,15 @@ ], "extendedHelp": "The attachmentsMode command manages the behavior of the attachments system.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -521,42 +330,15 @@ ], "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", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -572,21 +354,9 @@ }, "filterDescription": "Manage this server's list of blocked words.", "filterExtended": { - "usages": [ - "add Word", - "remove Word", - "reset", - "show", - "" - ], + "usages": ["add Word", "remove Word", "reset", "show", ""], "extendedHelp": "The filter command manages the list of blocked words for this server and must have a filter mode set up (see: `Skyra, help filterMode`).\n\nSkyra's word filter can find matches even with special characters or spaces between the letters of a blocked word, as well as duplicated characters for enhanced filtering.", - "examples": [ - "add darn", - "remove darn", - "reset", - "show", - "" - ] + "examples": ["add darn", "remove darn", "reset", "show", ""] }, "filterModeDescription": "Manage this server's word filter modes.", "filterModeExtended": { @@ -603,42 +373,15 @@ ], "extendedHelp": "The filterMode command manages the behavior of the word filter system. Run `Skyra, help filter` for how to add words.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -667,42 +410,15 @@ ], "extendedHelp": "The inviteMode command manages the behavior of the invite filter system.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -731,42 +447,15 @@ ], "extendedHelp": "The linkMode command manages the behavior of the link system.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -795,42 +484,15 @@ ], "extendedHelp": "The messageMode command manages the behavior of the message filter system.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -859,42 +521,15 @@ ], "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", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -923,42 +558,15 @@ ], "extendedHelp": "The reactionMode command manages the behavior of the reaction filter system.", "explainedUsage": [ - [ - "Enable", - "$t(commands/management:commandModeEnable)" - ], - [ - "Disable", - "$t(commands/management:commandModeDisable)" - ], - [ - "Action Alert", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "Action Log", - "$t(commands/management:commandModeActionLog)" - ], - [ - "Action Delete", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "Punishment", - "$t(commands/management:commandModePunishment)" - ], - [ - "Punishment-Duration", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "Threshold-Maximum", - "$t(commands/management:commandModeThreshold)" - ], - [ - "Threshold-Duration", - "$t(commands/management:commandModeThresholdDuration)" - ] + ["Enable", "$t(commands/management:commandModeEnable)"], + ["Disable", "$t(commands/management:commandModeDisable)"], + ["Action Alert", "$t(commands/management:commandModeActionAlert)"], + ["Action Log", "$t(commands/management:commandModeActionLog)"], + ["Action Delete", "$t(commands/management:commandModeActionDelete)"], + ["Punishment", "$t(commands/management:commandModePunishment)"], + ["Punishment-Duration", "$t(commands/management:commandModePunishmentDuration)"], + ["Threshold-Maximum", "$t(commands/management:commandModeThreshold)"], + ["Threshold-Duration", "$t(commands/management:commandModeThresholdDuration)"] ], "reminder": "$t(commands/management:commandModeReminder)", "examples": [ @@ -974,21 +582,10 @@ }, "rolesDescription": "List, claim or unclaim public roles in this server.", "rolesExtended": { - "usages": [ - "Role", - "" - ], + "usages": ["Role", ""], "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." - ] - ], + "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 `{{prefix}}conf set roles.public ExamplePublicRole`.", - "examples": [ - "Designer Programmer", - "Designer" - ] + "examples": ["Designer Programmer", "Designer"] } } diff --git a/src/languages/en-US/commands/moderation.json b/projects/bot/src/locales/en-US/commands/moderation.json similarity index 63% rename from src/languages/en-US/commands/moderation.json rename to projects/bot/src/locales/en-US/commands/moderation.json index 16a657651af..b2137827ad0 100644 --- a/src/languages/en-US/commands/moderation.json +++ b/projects/bot/src/locales/en-US/commands/moderation.json @@ -10,29 +10,14 @@ "slowmodeReset": "The cooldown for this channel has been reset.", "timeDescription": "Set the timer.", "timeExtended": { - "usages": [ - "Case Duration", - "cancel Case Duration" - ], + "usages": ["Case Duration", "cancel Case Duration"], "extendedHelp": "Updates the timer for a moderation case..", "explainedUsage": [ - [ - "Cancel", - "Whether or not you want to cancel the timer. Defaults to \"no\"." - ], - [ - "Case", - "The case you want to update" - ], - [ - "Duration", - "The timer, ignored if `cancel` was defined." - ] + ["Cancel", "Whether or not you want to cancel the timer. Defaults to \"no\"."], + ["Case", "The case you want to update"], + ["Duration", "The timer, ignored if `cancel` was defined."] ], - "examples": [ - "cancel 1234", - "1234 6h" - ] + "examples": ["cancel 1234", "1234 6h"] }, "banNotBannable": "The target is not bannable for me.", "dehoistStarting": "I will start dehoisting {{count}} members...", @@ -84,31 +69,13 @@ "moderationDmDescriptionWithReasonWithDuration": "**❯ Server**: {{guild}}\n**❯ Type**: {{title}}\n**❯ Duration**: {{duration, duration}}\n**❯ Reason**: {{reason}}", "historyDescription": "Display the count of moderation cases from this server or from a user.", "historyExtended": { - "usages": [ - "", - "details", - "details User", - "overview User" - ], + "usages": ["", "details", "details User", "overview User"], "extendedHelp": "This command shows the amount of bans, mutes, kicks, and warnings, including temporary, that have not been appealed.", "explainedUsage": [ - [ - "details/overview", - "Whether to get a detailed view or just a summary. Defaults to \"overview\"." - ], - [ - "User", - "The user for whom to get the information. Defaults to you yourself." - ] + ["details/overview", "Whether to get a detailed view or just a summary. Defaults to \"overview\"."], + ["User", "The user for whom to get the information. Defaults to you yourself."] ], - "examples": [ - "", - "overview", - "details", - "@Pete", - "details @Pete", - "overview Pete" - ] + "examples": ["", "overview", "details", "@Pete", "details @Pete", "overview Pete"] }, "historyFooterNew": "This user has {{warnings}} {{warningsText}}, {{mutes}} {{mutesText}}, {{kicks}} {{kicksText}}, and {{bans}} {{bansText}}", "historyFooterWarning_one": "warning", @@ -121,103 +88,53 @@ "historyFooterBans_other": "bans", "moderationsDescription": "List all running moderation logs from this server.", "moderationsExtended": { - "usages": [ - "", - "mutes/warnings/all", - "User", - "mutes/warnings/all User" - ], + "usages": ["", "mutes/warnings/all", "User", "mutes/warnings/all User"], "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.", "explainedUsage": [ [ "mutes/warnings/all", "Whether to get just the mutes, just the warnings or everything. When providing either `mutes` or `warnings` then all moderations of that type are shown, not just the temporary ones." ], - [ - "User", - "The user for whom to get the information. Defaults to all users." - ] + ["User", "The user for whom to get the information. Defaults to all users."] ], - "examples": [ - "", - "@Pete", - "mutes @Pete", - "warnings" - ] + "examples": ["", "@Pete", "mutes @Pete", "warnings"] }, "moderationsEmpty": "There are no active moderations that will expire at some future date or time. If you want to see all moderations in this server use: `{{prefix}}history`.", "moderationsAmount_one": "There is 1 entry.", "moderationsAmount_other": "There are {{count}} entries.", "mutesDescription": "List all mutes from this server or from a user.", "mutesExtended": { - "usages": [ - "", - "User" - ], + "usages": ["", "User"], "extendedHelp": "This command shows either all mutes filed in this server, or all mutes filed in this server for a specific user.\nThis command uses a reaction-based menu and requires the permission **{{MANAGE_MESSAGES, permissions}}** to execute correctly.", - "examples": [ - "", - "@Pete" - ] + "examples": ["", "@Pete"] }, "warningsDescription": "List all warnings from this server or from a user.", "warningsExtended": { - "usages": [ - "", - "User" - ], + "usages": ["", "User"], "extendedHelp": "This command shows either all warnings filed in this server, or all warnings filed in this server for a specific user.\nThis command uses a reaction-based menu and requires the permission **{{MANAGE_MESSAGES, permissions}}** to execute correctly.", - "examples": [ - "", - "@Pete" - ] + "examples": ["", "@Pete"] }, "slowmodeDescription": "Set the channel's slowmode value in seconds.", "slowmodeExtended": { - "usages": [ - "reset/Seconds/Duration" - ], + "usages": ["reset/Seconds/Duration"], "extendedHelp": "This command requires **{{MANAGE_CHANNELS, permissions}}** and will modify the channel's ratelimit per user to any value between 0 and 6 hours.", - "examples": [ - "0", - "reset", - "4m" - ], + "examples": ["0", "reset", "4m"], "reminder": "To reset a channel's ratelimit per user, you can use either 0 or 'reset'." }, "banDescription": "Hit somebody with the ban hammer.", "banExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason", - "User --days" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason", "User --days"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to ban. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to ban. Can be up to a total of 10 users."], [ "Duration", "The amount of time this ban should last. For example 24h for 24 hours. The user(s) will be automatically unbanned after this time." ], - [ - "Reason", - "The reason for the ban. This will also show in the server's audit logs." - ], - [ - "--days", - "The amount of days of messages to prune. Should be a number between a minimum of 0 and maximum of 7." - ] + ["Reason", "The reason for the ban. This will also show in the server's audit logs."], + ["--days", "The amount of days of messages to prune. Should be a number between a minimum of 0 and maximum of 7."] ], "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be banned by me.\nNo, the server's owner cannot be banned.\nThis action can be optionally timed to create a temporary ban.", - "examples": [ - "@Pete", - "@Pete Spamming all channels.", - "@Pete @Jack @John 24h Raiding" - ] + "examples": ["@Pete", "@Pete Spamming all channels.", "@Pete @Jack @John 24h Raiding"] }, "dehoistDescription": "Shoot everyone with the Dehoistinator 3000", "dehoistExtended": { @@ -226,497 +143,221 @@ }, "kickDescription": "Hit somebody with the 👢.", "kickExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User Reason"], "extendedHelp": "This command requires **{{KICK_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be kicked by me. No, the server's owner cannot be kicked.", "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to kick. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the kick. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to kick. Can be up to a total of 10 users."], + ["Reason", "The reason for the kick. This will also show in the server's audit logs."] ], - "examples": [ - "@Sarah", - "@Sarah Spamming general chat." - ] + "examples": ["@Sarah", "@Sarah Spamming general chat."] }, "lockdownDescription": "Close the gates for this channel!", "lockdownExtended": { - "usages": [ - "", - "lock Role TextChannel Duration", - "unlock Role TextChannel", - "Role TextChannel Duration" - ], + "usages": ["", "lock Role TextChannel Duration", "unlock Role TextChannel", "Role TextChannel Duration"], "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.", "explainedUsage": [ [ "lock/unlock", "Whether to lock or unlock the channel. Defaults to \"lock\" if the channel is currently unlocked, or \"unlock\" if it is currently locked." ], - [ - "Role", - "The role to lock. Defaults to the `@everyone` role." - ], - [ - "TextChannel", - "The channel to lock. Defaults to the current channel." - ], - [ - "Duration", - "The amount of time this lock should last. Defaults to infinite." - ] - ], - "examples": [ - "", - "#general", - "lock #general 5m", - "unlock #general", - "lock Members #general" + ["Role", "The role to lock. Defaults to the `@everyone` role."], + ["TextChannel", "The channel to lock. Defaults to the current channel."], + ["Duration", "The amount of time this lock should last. Defaults to infinite."] ], + "examples": ["", "#general", "lock #general 5m", "unlock #general", "lock Members #general"], "reminder": "If your members need a role such as \"member\" to send messages in the channel to begin with then this command will not work. It is in our backlog of work to add make the role that should be locked configurable." }, "muteDescription": "Mute a user in all text and voice channels.", "muteExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to mute. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to mute. Can be up to a total of 10 users."], [ "Duration", "The amount of time this mute should last. For example 24h for 24 hours. The user(s) will be automatically unmuted after this time." ], - [ - "Reason", - "The reason for the mute. This will also show in the server's audit logs." - ] + ["Reason", "The reason for the mute. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Alphonse", - "@Alphonse Spamming all channels", - "@Alphonse 24h Spamming all channels" - ] + "examples": ["@Alphonse", "@Alphonse Spamming all channels", "@Alphonse 24h Spamming all channels"] }, "setNicknameDescription": "Change the nickname of a user.", "setNicknameExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Nickname", - "User1 Duration", - "User1 User2 Nickname Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Nickname", "User1 Duration", "User1 User2 Nickname Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to nickname. Can be up to a total of 10 users." - ], - [ - "Nickname", - "The new nickname to set. Not including this will make this command default to the user's username." - ], + ["User/User1/User2", "The user(s) to nickname. Can be up to a total of 10 users."], + ["Nickname", "The new nickname to set. Not including this will make this command default to the user's username."], [ "Duration", "The amount of time this nickname change should last. For example 24h for 24 hours. The user(s) will automatically get their current name back after this time." ], - [ - "Reason", - "The reason for this nickname change. This will also show in the server's audit logs." - ] + ["Reason", "The reason for this nickname change. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_NICKNAMES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server's owner nickname cannot be changed.", - "examples": [ - "@Pete peeehteeerrr", - "@ꓑ𝗲੮ẻ Pete Unmentionable name" - ], + "examples": ["@Pete peeehteeerrr", "@ꓑ𝗲੮ẻ Pete Unmentionable name"], "reminder": "Leaving out the new nickname will reset it back to the user's username" }, "addRoleDescription": "Adds a role to a user.", "addRoleExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Role", - "User1 Duration", - "User1 User2 role Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Role", "User1 Duration", "User1 User2 role Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to add a role to. Can be up to a total of 10 users." - ], - [ - "Role", - "The new role to assign" - ], + ["User/User1/User2", "The user(s) to add a role to. Can be up to a total of 10 users."], + ["Role", "The new role to assign"], [ "Duration", "The amount of time this role should be on this user. For example 24h for 24 hours. The user(s) will automatically have the role removed after this time." ], - [ - "Reason", - "The reason for adding this role. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this role. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server's owner roles cannot be changed.", - "examples": [ - "@John member", - "@John member Make John a member" - ] + "examples": ["@John member", "@John member Make John a member"] }, "removeroleDescription": "Removes a role from a user", "removeroleExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Role", - "User1 Duration", - "User1 User2 role Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Role", "User1 Duration", "User1 User2 role Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove a role from. Can be up to a total of 10 users." - ], - [ - "Role", - "The role to remove" - ], + ["User/User1/User2", "The user(s) to remove a role from. Can be up to a total of 10 users."], + ["Role", "The role to remove"], [ "Duration", "The amount of time this role should be removed from this user. For example 24h for 24 hours. The user(s) will automatically regain the role after this time." ], - [ - "Reason", - "The reason for removing this role. This will also show in the server's audit logs." - ] + ["Reason", "The reason for removing this role. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server's owner roles cannot be changed.", - "examples": [ - "@Paula member", - "@Paula member Remove member permissions from Paula" - ] + "examples": ["@Paula member", "@Paula member Remove member permissions from Paula"] }, "pruneDescription": "Prunes a certain amount of messages w/o filter.", "pruneExtended": { - "usages": [ - "Amount Flags User", - "Amount Flags after/before Message", - "Amount User", - "Amount User after/before Message", - "Amount --silent" - ], + "usages": ["Amount Flags User", "Amount Flags after/before Message", "Amount User", "Amount User after/before Message", "Amount --silent"], "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": [ - [ - "Amount", - "The amount of messages to delete." - ], - [ - "--f/file/files", - "Deletes messages with attachments." - ], - [ - "--a/author", - "Deletes your messages." - ], - [ - "--b/bot/bots", - "Deletes messages sent by bots." - ], - [ - "--h/human/humans", - "Deletes messages sent by users." - ], - [ - "--i/invite/invites", - "Deletes messages that contain invite links." - ], - [ - "--l/link/links", - "Deletes messages that contain any link." - ], - [ - "--y/you", - "Deletes my messages." - ], - [ - "--age=Duration", - "Deletes any message newer than Duration." - ], - [ - "--include/contain=Word", - "Deletes messages that contain Word." - ], - [ - "--p/pin/pins", - "Deletes pinned messages, unless specified, no other filter deletes pins." - ], - [ - "User", - "Deletes messages sent by the specified user." - ], - [ - "Position: after", - "Deletes messages sent after the specified message." - ], - [ - "Position: before", - "Deletes messages sent before the specified message." - ], + ["Amount", "The amount of messages to delete."], + ["--f/file/files", "Deletes messages with attachments."], + ["--a/author", "Deletes your messages."], + ["--b/bot/bots", "Deletes messages sent by bots."], + ["--h/human/humans", "Deletes messages sent by users."], + ["--i/invite/invites", "Deletes messages that contain invite links."], + ["--l/link/links", "Deletes messages that contain any link."], + ["--y/you", "Deletes my messages."], + ["--age=Duration", "Deletes any message newer than Duration."], + ["--include/contain=Word", "Deletes messages that contain Word."], + ["--p/pin/pins", "Deletes pinned messages, unless specified, no other filter deletes pins."], + ["User", "Deletes messages sent by the specified user."], + ["Position: after", "Deletes messages sent after the specified message."], + ["Position: before", "Deletes messages sent before the specified message."], [ "--s/silent", "Whether or not a response message should be sent, this will also delete your command message if there were less than 100 messages filtered." ] ], - "examples": [ - "50 --a", - "75 @kyra", - "20 --bots", - "60 --humans --files before 629992398700675082", - "30 --age=5m --contain=lol", - "100 --silent" - ], + "examples": ["50 --a", "75 @kyra", "20 --bots", "60 --humans --files before 629992398700675082", "30 --age=5m --contain=lol", "100 --silent"], "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": { - "usages": [ - "Case", - "Show Case", - "Delete Case" - ], + "usages": ["Case", "Show Case", "Delete Case"], "extendedHelp": "You can also get the latest moderation case by specifying the case ID as `latest`", "explainedUsage": [ - [ - "Show/Delete", - "Whether to show or delete a case. Defaults to show." - ], - [ - "Case", - "Number of the case ID to show or delete, or `latest` for the latest created case." - ] + ["Show/Delete", "Whether to show or delete a case. Defaults to show."], + ["Case", "Number of the case ID to show or delete, or `latest` for the latest created case."] ], - "examples": [ - "5", - "latest", - "delete 6", - "delete latest" - ] + "examples": ["5", "latest", "delete 6", "delete latest"] }, "caseDeleted": "{{GREENTICK}} Case {{case}} has been successfully deleted.", "permissionsDescription": "Check the permission for a member, or yours.", "permissionsExtended": { - "usages": [ - "", - "User" - ], - "explainedUsage": [ - [ - "User", - "The user for whom you want to check the permissions. Defaults to you yourself." - ] - ], + "usages": ["", "User"], + "explainedUsage": [["User", "The user for whom you want to check the permissions. Defaults to you yourself."]], "extendedHelp": "Ideal if you want to know the what permissions are granted to a member when they have a certain set of roles." }, "reasonDescription": "Edit the reason field from a moderation log case.", "reasonExtended": { - "usages": [ - "Case/Range Reason" - ], + "usages": ["Case/Range Reason"], "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!" - ] + "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": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to restrict attachments for. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to restrict attachments for. Can be up to a total of 10 users."], [ "Duration", "The amount of time this restriction should be on this user. For example 24h for 24 hours. The user(s) will automatically have the restriction lifted after this time." ], - [ - "Reason", - "The reason for adding this restriction. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Pete", - "@Pete Sending weird images", - "@Pete 24h Sending NSFW images" - ] + "examples": ["@Pete", "@Pete Sending weird images", "@Pete 24h Sending NSFW images"] }, "restrictEmbedDescription": "Restrict a user from attaching embeds in all channels.", "restrictEmbedExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to restrict embeds for. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to restrict embeds for. Can be up to a total of 10 users."], [ "Duration", "The amount of time this restriction should be on this user. For example 24h for 24 hours. The user(s) will automatically have the restriction lifted after this time." ], - [ - "Reason", - "The reason for adding this restriction. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Pete", - "@Pete Sending weird links", - "@Pete 24h Posted a spam link" - ], + "examples": ["@Pete", "@Pete Sending weird links", "@Pete 24h Posted a spam link"], "reminder": "Embeds are, for example, when a user sends a video it gets embedded in the chat." }, "restrictEmojiDescription": "Restrict a user from using external emojis in all channels.", "restrictEmojiExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to restrict external emojis for. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to restrict external emojis for. Can be up to a total of 10 users."], [ "Duration", "The amount of time this restriction should be on this user. For example 24h for 24 hours. The user(s) will automatically have the restriction lifted after this time." ], - [ - "Reason", - "The reason for adding this restriction. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Pete", - "@Pete Spamming external emojis", - "@Pete 24h Posted cringe" - ], + "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": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to restrict reacting to messages for. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to restrict reacting to messages for. Can be up to a total of 10 users."], [ "Duration", "The amount of time this restriction should be on this user. For example 24h for 24 hours. The user(s) will automatically have the restriction lifted after this time." ], - [ - "Reason", - "The reason for adding this restriction. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Pete", - "@Pete Spamming reactions", - "@Pete 24h Posting weird reactions" - ] + "examples": ["@Pete", "@Pete Spamming reactions", "@Pete 24h Posting weird reactions"] }, "restrictVoiceDescription": "Restrict a user from joining any voice channel.", "restrictVoiceExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to restrict voice channel interaction for. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to restrict voice channel interaction for. Can be up to a total of 10 users."], [ "Duration", "The amount of time this restriction should be on this user. For example 24h for 24 hours. The user(s) will automatically have the restriction lifted after this time." ], - [ - "Reason", - "The reason for adding this restriction. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}**, and only members with lower role hierarchy position can be managed by me.\nNo, the server'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 server, it will be added back.", - "examples": [ - "@Pete", - "@Pete Earraping in general voice channels", - "@Pete 24h Making weird noises" - ] + "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": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to softban. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the softban. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to softban. Can be up to a total of 10 users."], + ["Reason", "The reason for the softban. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be banned by me.\nNo, the server'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!" - ] + "examples": ["@Pete", "@Pete Spamming all channels", "@Pete 7 All messages sent in 7 are gone now, YEE HAH!"] }, "toggleModerationDmDescription": "Toggle moderation DMs.", "toggleModerationDmExtended": { @@ -724,283 +365,133 @@ }, "unbanDescription": "Unban somebody from this server.", "unbanExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to unban. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the ban removal. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to unban. Can be up to a total of 10 users."], + ["Reason", "The reason for the ban removal. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{BAN_MEMBERS, permissions}}**. It literally gets somebody from the rubbish bin, cleans them up, and allows the pass to this server's gates.", - "examples": [ - "@Pete", - "@Pete Turns out he was not the one who spammed all channels 🤷" - ] + "examples": ["@Pete", "@Pete Turns out he was not the one who spammed all channels 🤷"] }, "unmuteDescription": "Remove the scotch tape from a user.", "unmuteExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to unmute. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the mute removal. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to unmute. Can be up to a total of 10 users."], + ["Reason", "The reason for the mute removal. This will also show in the server's audit logs."] ], "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)." - ] + "examples": ["@Pete", "@Pete (Insert random joke here)."] }, "unrestrictAttachmentDescription": "Remove the attachment restriction from one or more users.", "unrestrictAttachmentExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove attachment restrictions from. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the removal of the attachment restriction. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to remove attachment restrictions from. Can be up to a total of 10 users."], + ["Reason", "The reason for the removal of the attachment restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", - "examples": [ - "@Pete" - ] + "examples": ["@Pete"] }, "unrestrictEmbedDescription": "Remove the embed restriction from one or more users.", "unrestrictEmbedExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove embed restrictions from. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the removal of the embed restriction. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to remove embed restrictions from. Can be up to a total of 10 users."], + ["Reason", "The reason for the removal of the embed restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", - "examples": [ - "@Pete" - ] + "examples": ["@Pete"] }, "unrestrictEmojiDescription": "Remove the external emoji restriction from one or more users.", "unrestrictEmojiExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove emoji restrictions from. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the removal of the emoji restriction. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to remove emoji restrictions from. Can be up to a total of 10 users."], + ["Reason", "The reason for the removal of the emoji restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", - "examples": [ - "@Pete" - ] + "examples": ["@Pete"] }, "unrestrictReactionDescription": "Remove the reaction restriction from one or more users.", "unrestrictReactionExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove reaction restrictions from. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the removal of the reaction restriction. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to remove reaction restrictions from. Can be up to a total of 10 users."], + ["Reason", "The reason for the removal of the reaction restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", - "examples": [ - "@Pete" - ] + "examples": ["@Pete"] }, "unrestrictVoiceDescription": "Remove the voice restriction from one or more users.", "unrestrictVoiceExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to remove voice restrictions from. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for the removal of the voice restriction. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to remove voice restrictions from. Can be up to a total of 10 users."], + ["Reason", "The reason for the removal of the voice restriction. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MANAGE_ROLES, permissions}}** and removes a user from the restricted people's list.", - "examples": [ - "@Pete" - ] + "examples": ["@Pete"] }, "unwarnDescription": "Appeal a warning moderation log case.", "unwarnExtended": { - "usages": [ - "Case", - "Case Reason" - ], + "usages": ["Case", "Case Reason"], "explainedUsage": [ [ "Case", "The case number to modify. You can find the case numbers through the `history` command or by looking in your moderation logs channel" ], - [ - "Reason", - "The reason for removing this warning." - ] + ["Reason", "The reason for removing this warning."] ], "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." - ] + "examples": ["0 Whoops, wrong dude.", "42 Turns out this was the definition of life."] }, "vmuteDescription": "Throw somebody's microphone out the window.", "vmuteExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to mute in voice channels. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to mute in voice channels. Can be up to a total of 10 users."], [ "Duration", "The amount of time this voice mute should apply for. For example 24h for 24 hours. The user(s) will automatically have the voice mute lifted after this time." ], - [ - "Reason", - "The reason for adding this voice mute. This will also show in the server's audit logs." - ] + ["Reason", "The reason for adding this voice mute. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MUTE_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be silenced by me.\nNo, the server'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" - ] + "examples": ["@Pete", "@Pete Singing too loud", "@Pete 24h Literally sang ear rape"] }, "voiceKickDescription": "Hit somebody with the 👢 for singing so bad and loud.", "voiceKickExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason", - "User1 User2 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason", "User1 User2 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to kick from their current voice channel. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for kicking the user(s) from the voice channel. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to kick from their current voice channel. Can be up to a total of 10 users."], + ["Reason", "The reason for kicking the user(s) from the voice channel. This will also show in the server's audit logs."] ], "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" - ] + "examples": ["@Pete", "@Pete Spamming all channels"] }, "vunmuteDescription": "Get somebody's microphone back so they can talk.", "vunmuteExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to unmute in voice channels. Can be up to a total of 10 users." - ], - [ - "Reason", - "The reason for removing the voice mute. This will also show in the server's audit logs." - ] + ["User/User1/User2", "The user(s) to unmute in voice channels. Can be up to a total of 10 users."], + ["Reason", "The reason for removing the voice mute. This will also show in the server's audit logs."] ], "extendedHelp": "This command requires **{{MUTE_MEMBERS, permissions}}**, and only members with lower role hierarchy position can be un-silenced by me.\nNo, the server's owner cannot be un-silenced.", - "examples": [ - "@Pete", - "@Pete Appealed his times signing hear rape." - ] + "examples": ["@Pete", "@Pete Appealed his times signing hear rape."] }, "warnDescription": "File a warning to somebody.", "warnExtended": { - "usages": [ - "User", - "User1 User2 User3...User10", - "User1 Duration", - "User1 User2 Duration Reason" - ], + "usages": ["User", "User1 User2 User3...User10", "User1 Duration", "User1 User2 Duration Reason"], "explainedUsage": [ - [ - "User/User1/User2", - "The user(s) to warn. Can be up to a total of 10 users." - ], + ["User/User1/User2", "The user(s) to warn. Can be up to a total of 10 users."], [ "Duration", "The amount of time this warn apply for. For example 24h for 24 hours. The user(s) will automatically have the warning removed after this time." ], - [ - "Reason", - "The reason for this warning." - ] + ["Reason", "The reason for this warning."] ], "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." - ] + "examples": ["@Pete Attempted to mention everyone."] } } diff --git a/src/languages/en-US/commands/system.json b/projects/bot/src/locales/en-US/commands/system.json similarity index 90% rename from src/languages/en-US/commands/system.json rename to projects/bot/src/locales/en-US/commands/system.json index 150c15729f5..3ad5abf57f5 100644 --- a/src/languages/en-US/commands/system.json +++ b/projects/bot/src/locales/en-US/commands/system.json @@ -1,20 +1,10 @@ { "evalDescription": "Evaluates arbitrary Javascript.", "evalExtended": { - "usages": [ - "Expression" - ], + "usages": ["Expression"], "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 {{ATTACH_FILES, permissions}} permission.", - "explainedUsage": [ - [ - "Expression", - "The expression to evaluate" - ] - ], - "examples": [ - "msg.author.username;", - "1 + 1;" - ], + "explainedUsage": [["Expression", "The expression to evaluate"]], + "examples": ["msg.author.username;", "1 + 1;"], "reminder": "Reserved for bot owners." }, "donateDescription": "Get information about how to donate to keep Skyra alive longer.", @@ -26,16 +16,9 @@ "disable": "+ Successfully disabled {{type}}: {{name}}", "disableDescription": "Re-disables or temporarily disables a command/preconditions/event. Default state restored on reboot.", "disableExtended": { - "usages": [ - "Piece" - ], + "usages": ["Piece"], "extendedHelp": "Disable a piece that was previously enabled", - "explainedUsage": [ - [ - "Piece", - "The piece to disable" - ] - ], + "explainedUsage": [["Piece", "The piece to disable"]], "reminder": "Reserved for bot owners." }, "disableWarn": "You probably don't want to disable that, since you wouldn't be able to run any command to enable it again", @@ -44,16 +27,9 @@ "enable": "+ Successfully enabled {{type}}: {{name}}", "enableDescription": "Re-enables or temporarily enables a command/preconditions. Default state restored on reboot.", "enableExtended": { - "usages": [ - "Piece" - ], + "usages": ["Piece"], "extendedHelp": "Enables a piece that was previously disabled", - "explainedUsage": [ - [ - "Piece", - "The piece to enable" - ] - ], + "explainedUsage": [["Piece", "The piece to enable"]], "reminder": "Reserved for bot owners." }, "reboot": "{{LOADING}} Rebooting...", diff --git a/src/languages/en-US/commands/tools.json b/projects/bot/src/locales/en-US/commands/tools.json similarity index 67% rename from src/languages/en-US/commands/tools.json rename to projects/bot/src/locales/en-US/commands/tools.json index ee48e4544b8..178f4d31e84 100644 --- a/src/languages/en-US/commands/tools.json +++ b/projects/bot/src/locales/en-US/commands/tools.json @@ -1,108 +1,51 @@ { "avatarDescription": "View somebody's avatar in full size.", "avatarExtended": { - "usages": [ - "", - "User" - ], + "usages": ["", "User"], "extendedHelp": "As this command's name says, it shows somebody's avatar.", - "explainedUsage": [ - [ - "User", - "The user to get the avatar for. Defaults to you yourself." - ] - ], + "explainedUsage": [["User", "The user to get the avatar for. Defaults to you yourself."]], "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": { - "usages": [ - "Color", - "Color Difference" - ], + "usages": ["Color", "Color Difference"], "extendedHelp": "The color command displays a set of colours with nearest tones given a difference between 1 and 255.", "explainedUsage": [ - [ - "Color", - "The color to check. Can be in the RGB, HSL, B10 (Base 10) or HEX format." - ], + ["Color", "The color to check. Can be in the RGB, HSL, B10 (Base 10) or HEX format."], [ "Difference", "A numeric difference between each shade of the color. Defaults to 10. If you don't know what this is, then you probably don't need it." ] ], - "examples": [ - "#dfdfdf 25", - "rgb(200, 130, 75)" - ], + "examples": ["#dfdfdf 25", "rgb(200, 130, 75)"], "possibleFormats": [ - [ - "HEX", - "#dfdfdf" - ], - [ - "RGB", - "rgb(200, 200, 200)" - ], - [ - "HSL", - "hsl(350, 100, 100)" - ], - [ - "B10", - "14671839" - ] + ["HEX", "#dfdfdf"], + ["RGB", "rgb(200, 200, 200)"], + ["HSL", "hsl(350, 100, 100)"], + ["B10", "14671839"] ] }, "contentDescription": "Get messages' raw content.", "contentExtended": { - "usages": [ - "Message", - "Channel Message", - "Channel Message --all/--format" - ], + "usages": ["Message", "Channel Message", "Channel Message --all/--format"], "extendedHelp": "Raw content will help you better copy-paste message content as you will not have to reproduce all the formatting.", "explainedUsage": [ - [ - "Channel", - "The channel in which the message is to get the content from. Defaults to the current channel" - ], - [ - "Message", - "ID of the message to get the content from." - ], - [ - "--all", - "Gets all content including embeds and formats them separated by lines." - ], - [ - "--format", - "Gets all content including embeds and formats them in a more readable format." - ] + ["Channel", "The channel in which the message is to get the content from. Defaults to the current channel"], + ["Message", "ID of the message to get the content from."], + ["--all", "Gets all content including embeds and formats them separated by lines."], + ["--format", "Gets all content including embeds and formats them in a more readable format."] ], - "examples": [ - "810103450544767026", - "#announcement 810103450544767026" - ] + "examples": ["810103450544767026", "#announcement 810103450544767026"] }, "contentEmpty": "The message does not contain any content I can source.", "countryDescription": "Shows information about a country.", "countryExtended": { - "usages": [ - "Country" - ], + "usages": ["Country"], "extendedHelp": "This command uses https://restcountries.eu to get information on the provided country.", - "explainedUsage": [ - [ - "Country", - "The name of the country." - ] - ], - "examples": [ - "United Kingdom" - ] + "explainedUsage": [["Country", "The name of the country."]], + "examples": ["United Kingdom"] }, "countryFields": { "other": { @@ -125,20 +68,10 @@ }, "createEmojiDescription": "Adds a custom emoji to your Discord server.", "createEmojiExtended": { - "usages": [ - "Emoji" - ], + "usages": ["Emoji"], "extendedHelp": "Using a custom emoji on another server, I can re-upload that emoji to the current server.", - "explainedUsage": [ - [ - "Emoji", - "A custom emoji on Discord." - ] - ], - "examples": [ - "<:Skyra:638508279357767680>", - "" - ], + "explainedUsage": [["Emoji", "A custom emoji on Discord."]], + "examples": ["<:Skyra:638508279357767680>", ""], "reminder": "Make sure the bot has {{MANAGE_EMOJIS_AND_STICKERS, permissions}} permissions in this server!" }, "createEmojiInvalidDiscordEmoji": "I could not resolve `{{parameter}}` to a valid Discord emoji. Make sure it is from a Discord server, and not a default emoji.", @@ -147,19 +80,10 @@ "createEmojiSuccess": "{{GREENTICK}} Success: {{emoji}} was created", "defineDescription": "Check the definition of a word.", "defineExtended": { - "usages": [ - "Word" - ], + "usages": ["Word"], "extendedHelp": "What does \"heel\" mean?", - "explainedUsage": [ - [ - "Word", - "The word or phrase you want to get the definition from." - ] - ], - "examples": [ - "heel" - ] + "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", @@ -167,16 +91,9 @@ "emojiCustom": "→ `Emoji ::` **{{emoji}}**\n→ `Type ::` **Custom**\n→ `ID ::` **{{id}}**", "emojiDescription": "Get info on an emoji.", "emojiExtended": { - "usages": [ - "Emoji" - ], + "usages": ["Emoji"], "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" - ] - ], + "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.", @@ -184,21 +101,10 @@ "emojiTwemoji": "→ `Emoji ::` `{{emoji}}`\n→ `Type ::` **Twemoji**\n→ `ID ::` **{{id}}**", "eshopDescription": "Request information for any American Nintendo Digital Store", "eshopExtended": { - "usages": [ - "Query" - ], + "usages": ["Query"], "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" - ] + "explainedUsage": [["Query", "The name of the game you're looking for."]], + "examples": ["Breath of the Wild", "Pokemon", "Splatoon"] }, "eshopNotInDatabase": "None available", "eshopPriceFree": "Free", @@ -216,37 +122,18 @@ }, "horoscopeDescription": "Get your latest horoscope", "horoscopeExtended": { - "usages": [ - "Sunsign", - "Sunsign today/tomorrow/yesterday" - ], + "usages": ["Sunsign", "Sunsign today/tomorrow/yesterday"], "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", - "If you want to get the horoscope of another day you can specify that Defaults to \"today\"." - ] + ["Sunsign", "The sun sign you want to get the horoscope for"], + ["today/tomorrow/yesterday", "If you want to get the horoscope of another day you can specify that Defaults to \"today\"."] ], - "examples": [ - "pisces", - "virgo tomorrow", - "gemini yesterday", - "aries today" - ] + "examples": ["pisces", "virgo tomorrow", "gemini yesterday", "aries today"] }, "horoscopeInvalidSunsign": "I was not able to resolve `{{parameter}}` to a valid sign, maybe try `{{maybe}}`?", "horoscopeTitles": { "dailyHoroscope": "Daily horoscope for {{sign}}", - "metadata": [ - "**Intensity:** {{intensity}}", - "**Keywords:** {{keywords, andList}}", - "**Mood:** {{mood}}", - "**Rating:** {{rating}}" - ], + "metadata": ["**Intensity:** {{intensity}}", "**Keywords:** {{keywords, andList}}", "**Mood:** {{mood}}", "**Rating:** {{rating}}"], "metadataTitle": "Metadata" }, "igdbData": { @@ -260,20 +147,10 @@ }, "igdbDescription": "Searches IGDB (Internet Game Database) for your favourite games", "igdbExtended": { - "usages": [ - "Query" - ], + "usages": ["Query"], "extendedHelp": "This command queries the IGDB API to show data on your favourite games.", - "explainedUsage": [ - [ - "Query", - "The name of the game to look up" - ] - ], - "examples": [ - "Breath of the Wild", - "Borderlands 3" - ] + "explainedUsage": [["Query", "The name of the game to look up"]], + "examples": ["Breath of the Wild", "Borderlands 3"] }, "igdbTitles": { "ageRating": "Age rating(s)", @@ -285,20 +162,10 @@ }, "itunesDescription": "Searches iTunes API for music tracks", "itunesExtended": { - "usages": [ - "Query" - ], + "usages": ["Query"], "extendedHelp": "This command queries the Apple iTunes API to show data on a music you request.", - "explainedUsage": [ - [ - "Query", - "The name of the song to look up" - ] - ], - "examples": [ - "Apocalyptica feat. Brent Smith", - "You're Gonna Go Far, Kid" - ] + "explainedUsage": [["Query", "The name of the song to look up"]], + "examples": ["Apocalyptica feat. Brent Smith", "You're Gonna Go Far, Kid"] }, "itunesTitles": { "artist": "Artist", @@ -321,21 +188,10 @@ }, "moviesDescription": "Searches TheMovieDatabase for any movie", "moviesExtended": { - "usages": [ - "Query" - ], + "usages": ["Query"], "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 to look up" - ] - ], - "examples": [ - "Ocean's Eleven y:2001", - "Star Wars Revenge of the Sith", - "Spirited Away" - ] + "explainedUsage": [["Query", "The name of the movie to look up"]], + "examples": ["Ocean's Eleven y:2001", "Star Wars Revenge of the Sith", "Spirited Away"] }, "moviesTitles": { "collection": "Collection", @@ -349,50 +205,24 @@ }, "pollDescription": "Simplifies reaction-based polls.", "pollExtended": { - "usages": [ - "Option1 Option2", - "Option1 Option2 Option3...Option20" - ], + "usages": ["Option1 Option2", "Option1 Option2 Option3...Option20"], "extendedHelp": "Separate your options using commas.", - "explainedUsage": [ - [ - "Option1/Option2/Option3/Option20", - "The options to poll. Minimum of 2, maximum of 20" - ] - ], - "examples": [ - "Make an anime channel, Make a gaming channel, Make a serious-discussion channel" - ] + "explainedUsage": [["Option1/Option2/Option3/Option20", "The options to poll. Minimum of 2, maximum of 20"]], + "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": { - "usages": [ - "Amount FromCurrency ToCurrency", - "Amount FromCurrency ToCurrency1 ToCurrency2 ToCurrency3...ToCurrencyX" - ], + "usages": ["Amount FromCurrency ToCurrency", "Amount FromCurrency ToCurrency1 ToCurrency2 ToCurrency3...ToCurrencyX"], "extendedHelp": "Convert between any two currencies, even if they are cryptocurrencies.", "explainedUsage": [ - [ - "Amount", - "The amount to convert. Default is 1." - ], - [ - "FromCurrency", - "The currency to convert from" - ], - [ - "ToCurrency", - "The currency to convert to, you can give multiple currencies to get results in each." - ] + ["Amount", "The amount to convert. Default is 1."], + ["FromCurrency", "The currency to convert from"], + ["ToCurrency", "The currency to convert to, you can give multiple currencies to get results in each."] ], - "examples": [ - "EUR USD", - "5 USD EUR", - "10 USD BAT" - ] + "examples": ["EUR USD", "5 USD EUR", "10 USD BAT"] }, "showsData": { "noGenres": "None on TheMovieDB", @@ -401,21 +231,10 @@ }, "showsDescription": "Searches The Movie Database for any show", "showsExtended": { - "usages": [ - "Query" - ], + "usages": ["Query"], "extendedHelp": "This command queries TheMovieDatabase for data on your favorite shows", - "explainedUsage": [ - [ - "Query", - "The name of the show to search" - ] - ], - "examples": [ - "Final Space", - "Gravity Falls", - "Rick and Morty" - ] + "explainedUsage": [["Query", "The name of the show to search"]], + "examples": ["Final Space", "Gravity Falls", "Rick and Morty"] }, "showsTitles": { "episodeRuntime": "Episode runtime", @@ -427,56 +246,28 @@ "systemTextTruncated": "{{definition}}... [continue reading]({{url}})", "urbanDescription": "Check the definition of a word on UrbanDictionary.", "urbanExtended": { - "usages": [ - "Word", - "Word Page" - ], + "usages": ["Word", "Word Page"], "extendedHelp": "What does \"spam\" mean?", "explainedUsage": [ - [ - "Word", - "The word or phrase you want to get the definition for." - ], - [ - "Page", - "The page you wish to read. Defaults to 1." - ] + ["Word", "The word or phrase you want to get the definition for."], + ["Page", "The page you wish to read. Defaults to 1."] ], - "examples": [ - "spam" - ] + "examples": ["spam"] }, "urbanNoDefinition": "There are no definitions for the query `{{parameter}}`!", "voteDescription": "Simplified reaction-based vote.", "voteExtended": { - "usages": [ - "Question" - ], - "examples": [ - "Should I implement the #anime channel?" - ], - "explainedUsage": [ - [ - "Question", - "The question to vote on." - ] - ] + "usages": ["Question"], + "examples": ["Should I implement the #anime channel?"], + "explainedUsage": [["Question", "The question to vote on."]] }, "voteContentNeeded": "{{REDCROSS}} You must give a topic for the poll.", "voteReactionBlocked": "{{REDCROSS}} I was not able to add the reactions necessary for this command to work because you have me blocked! 😢", "whoisDescription": "Who are you?", "whoisExtended": { - "usages": [ - "", - "User" - ], + "usages": ["", "User"], "extendedHelp": "Gets information on any server member. Also known as `userinfo` in many other bots.", - "explainedUsage": [ - [ - "User", - "The user to get information about. Defaults to you yourself." - ] - ] + "explainedUsage": [["User", "The user to get information about. Defaults to you yourself."]] }, "whoisMemberFields": { "createdAt": "{{memberCreatedAt}}\n{{memberCreatedAtOffset}}", @@ -502,31 +293,17 @@ }, "wikipediaDescription": "Search something through Wikipedia.", "wikipediaExtended": { - "usages": [ - "Page" - ], + "usages": ["Page"], "extendedHelp": "In NSFW channels I will also add the page image, if available. 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).", - "explainedUsage": [ - [ - "Page", - "The Wikipedia page to view" - ] - ], + "explainedUsage": [["Page", "The Wikipedia page to view"]], "reminder": "Most Wikipedia page titles are case sensitive. Some celebrities 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": { - "usages": [ - "Query" - ], + "usages": ["Query"], "extendedHelp": "If I have the {{MANAGE_MESSAGES, permissions}} {{ADD_REACTIONS, permissions}} permissions then I will provide the option to navigate through the top 10 results.", - "explainedUsage": [ - [ - "Query", - "The video(s) to look up through YouTube" - ] - ] + "explainedUsage": [["Query", "The video(s) to look up through YouTube"]] }, "youtubeNotfound": "I am sorry, I could not find something that could match your input in YouTube." } diff --git a/src/languages/en-US/errors.json b/projects/bot/src/locales/en-US/errors.json similarity index 99% rename from src/languages/en-US/errors.json rename to projects/bot/src/locales/en-US/errors.json index 1b274cf71b3..0488968805f 100644 --- a/src/languages/en-US/errors.json +++ b/projects/bot/src/locales/en-US/errors.json @@ -7,4 +7,4 @@ "modlogTimed": "This moderation log is already timed. Expires in {{remaining, duration}}", "unexpectedIssue": "An unexpected error popped up! Safely aborting this command...", "userNotInGuild": "This user is not in this server." -} \ No newline at end of file +} diff --git a/src/languages/en-US/events/errors.json b/projects/bot/src/locales/en-US/events/errors.json similarity index 99% rename from src/languages/en-US/events/errors.json rename to projects/bot/src/locales/en-US/events/errors.json index 7159d88c7c8..cc32ab669da 100644 --- a/src/languages/en-US/events/errors.json +++ b/projects/bot/src/locales/en-US/events/errors.json @@ -2,4 +2,4 @@ "string": "{{REDCROSS}} Dear {{mention}}, {{message}}", "unexpectedError": "{{REDCROSS}} I found an unexpected error, please report the steps you have taken to my developers!", "unexpectedErrorWithContext": "$t(events/errors:unexpectedError)\nYou may add `{{report}}` to the report so they can look what error was triggered." -} \ No newline at end of file +} diff --git a/src/languages/en-US/events/guilds-logs.json b/projects/bot/src/locales/en-US/events/guilds-logs.json similarity index 100% rename from src/languages/en-US/events/guilds-logs.json rename to projects/bot/src/locales/en-US/events/guilds-logs.json diff --git a/src/languages/en-US/events/guilds-members.json b/projects/bot/src/locales/en-US/events/guilds-members.json similarity index 99% rename from src/languages/en-US/events/guilds-members.json rename to projects/bot/src/locales/en-US/events/guilds-members.json index a873c474936..9046a385102 100644 --- a/src/languages/en-US/events/guilds-members.json +++ b/projects/bot/src/locales/en-US/events/guilds-members.json @@ -20,4 +20,4 @@ "nicknameUpdate": "Nickname Edited", "roleUpdate": "Roles Edited", "usernameUpdate": "Username Edited" -} \ No newline at end of file +} diff --git a/src/languages/en-US/events/messages.json b/projects/bot/src/locales/en-US/events/messages.json similarity index 100% rename from src/languages/en-US/events/messages.json rename to projects/bot/src/locales/en-US/events/messages.json diff --git a/src/languages/en-US/events/moderation.json b/projects/bot/src/locales/en-US/events/moderation.json similarity index 99% rename from src/languages/en-US/events/moderation.json rename to projects/bot/src/locales/en-US/events/moderation.json index bd3eb3425fe..4eabded00d6 100644 --- a/src/languages/en-US/events/moderation.json +++ b/projects/bot/src/locales/en-US/events/moderation.json @@ -31,4 +31,4 @@ "wordFilterFooter": "Filtered Word", "words": "[Auto-Moderation] Triggered word filter, no threshold.", "wordsWithMaximum": "[Auto-Moderation] Triggered word filter, reached {{amount}} out of {{maximum}} infractions." -} \ No newline at end of file +} diff --git a/src/languages/en-US/events/noMentionSpam.json b/projects/bot/src/locales/en-US/events/noMentionSpam.json similarity index 99% rename from src/languages/en-US/events/noMentionSpam.json rename to projects/bot/src/locales/en-US/events/noMentionSpam.json index b419aa2ef1b..c4ecb844045 100644 --- a/src/languages/en-US/events/noMentionSpam.json +++ b/projects/bot/src/locales/en-US/events/noMentionSpam.json @@ -3,4 +3,4 @@ "alert": "Be careful mentioning any more, as you are about to be banned for exceeding this server's mention threshold.", "message": "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! 😄", "modlog": "[NOMENTIONSPAM] Automatic: Mention Spam threshold exceeded.\nThreshold: {{threshold}}." -} \ No newline at end of file +} diff --git a/src/languages/en-US/events/reactions.json b/projects/bot/src/locales/en-US/events/reactions.json similarity index 51% rename from src/languages/en-US/events/reactions.json rename to projects/bot/src/locales/en-US/events/reactions.json index c80bdf75fad..a228f39ff32 100644 --- a/src/languages/en-US/events/reactions.json +++ b/projects/bot/src/locales/en-US/events/reactions.json @@ -2,5 +2,5 @@ "reaction": "Reaction Added", "filterFooter": "Filtered Reaction", "filter": "{{REDCROSS}} Hey {{user}}, please do not add that reaction!", - "selfRoleHierarchy": "{{REDCROSS}} My role needs to be higher than all self-assignable roles, otherwise I can't grant them to people!" + "selfRoleHierarchy": "{{REDCROSS}} My role needs to be higher than all self-assignable roles, otherwise I can't grant them to people!" } diff --git a/src/languages/en-US/events/twitch.json b/projects/bot/src/locales/en-US/events/twitch.json similarity index 98% rename from src/languages/en-US/events/twitch.json rename to projects/bot/src/locales/en-US/events/twitch.json index bac8bdc8191..0da0b3407b1 100644 --- a/src/languages/en-US/events/twitch.json +++ b/projects/bot/src/locales/en-US/events/twitch.json @@ -2,4 +2,4 @@ "embedDescription": "{{userName}} is now live!", "embedDescriptionWithGame": "{{userName}} is now live - Streaming {{gameName}}!", "offlinePostfix": "Skyra Twitch Notifications" -} \ No newline at end of file +} diff --git a/src/languages/en-US/fuzzySearch.json b/projects/bot/src/locales/en-US/fuzzySearch.json similarity index 99% rename from src/languages/en-US/fuzzySearch.json rename to projects/bot/src/locales/en-US/fuzzySearch.json index 79d02f8729d..d19a4ba17a3 100644 --- a/src/languages/en-US/fuzzySearch.json +++ b/projects/bot/src/locales/en-US/fuzzySearch.json @@ -3,4 +3,4 @@ "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." -} \ No newline at end of file +} diff --git a/src/languages/en-US/globals.json b/projects/bot/src/locales/en-US/globals.json similarity index 99% rename from src/languages/en-US/globals.json rename to projects/bot/src/locales/en-US/globals.json index 8b1acc9c66a..562660e6278 100644 --- a/src/languages/en-US/globals.json +++ b/projects/bot/src/locales/en-US/globals.json @@ -16,4 +16,4 @@ "orListValue": "{{value, orList}}", "dateFormat": "MM/DD/YYYY", "dateFormatExplanation": "Month/Day/Year" -} \ No newline at end of file +} diff --git a/src/languages/en-US/guilds.json b/projects/bot/src/locales/en-US/guilds.json similarity index 100% rename from src/languages/en-US/guilds.json rename to projects/bot/src/locales/en-US/guilds.json diff --git a/src/languages/en-GB/humanLevels.json b/projects/bot/src/locales/en-US/humanLevels.json similarity index 97% rename from src/languages/en-GB/humanLevels.json rename to projects/bot/src/locales/en-US/humanLevels.json index bd785d3ded8..a35c4b3c8dd 100644 --- a/src/languages/en-GB/humanLevels.json +++ b/projects/bot/src/locales/en-US/humanLevels.json @@ -4,4 +4,4 @@ "MEDIUM": "Medium", "HIGH": "High", "VERY_HIGH": "Highest" -} \ No newline at end of file +} diff --git a/src/languages/en-US/moderation.json b/projects/bot/src/locales/en-US/moderation.json similarity index 100% rename from src/languages/en-US/moderation.json rename to projects/bot/src/locales/en-US/moderation.json diff --git a/src/languages/en-US/moderationActions.json b/projects/bot/src/locales/en-US/moderationActions.json similarity index 99% rename from src/languages/en-US/moderationActions.json rename to projects/bot/src/locales/en-US/moderationActions.json index 2d176f3c6ef..e91d9b12dfd 100644 --- a/src/languages/en-US/moderationActions.json +++ b/projects/bot/src/locales/en-US/moderationActions.json @@ -35,4 +35,4 @@ "softbanReason": "[Action] Applying Softban | Reason: {{reason}}", "unSoftbanNoReason": "[Action] Applied Softban.", "unSoftbanReason": "[Action] Applied Softban | Reason: {{reason}}" -} \ No newline at end of file +} diff --git a/src/languages/en-US/permissions.json b/projects/bot/src/locales/en-US/permissions.json similarity index 100% rename from src/languages/en-US/permissions.json rename to projects/bot/src/locales/en-US/permissions.json diff --git a/src/languages/en-US/preconditions.json b/projects/bot/src/locales/en-US/preconditions.json similarity index 100% rename from src/languages/en-US/preconditions.json rename to projects/bot/src/locales/en-US/preconditions.json diff --git a/src/languages/en-US/promptList.json b/projects/bot/src/locales/en-US/promptList.json similarity index 99% rename from src/languages/en-US/promptList.json rename to projects/bot/src/locales/en-US/promptList.json index d9890801dc9..3d145c7b916 100644 --- a/src/languages/en-US/promptList.json +++ b/projects/bot/src/locales/en-US/promptList.json @@ -3,4 +3,4 @@ "attemptFailed": "Invalid input. Attempt **{{attempt}}** out of **{{maxAttempts}}**\n{{list}}", "multipleChoice_other": "There are {{count}} results. Please choose a number between 1 and {{count}}, or write **`CANCEL`** to cancel the prompt.\n{{list}}", "multipleChoice_one": "There are {{count}} result. Please choose a number between 1 and {{count}}, or write **`CANCEL`** to cancel the prompt.\n{{list}}" -} \ No newline at end of file +} diff --git a/src/languages/en-US/selfModeration.json b/projects/bot/src/locales/en-US/selfModeration.json similarity index 99% rename from src/languages/en-US/selfModeration.json rename to projects/bot/src/locales/en-US/selfModeration.json index f271ab76931..93cf3a24777 100644 --- a/src/languages/en-US/selfModeration.json +++ b/projects/bot/src/locales/en-US/selfModeration.json @@ -26,4 +26,4 @@ "softActionAlert": "Alert", "softActionDelete": "Delete", "softActionLog": "Log" -} \ No newline at end of file +} diff --git a/src/languages/en-US/settings.json b/projects/bot/src/locales/en-US/settings.json similarity index 100% rename from src/languages/en-US/settings.json rename to projects/bot/src/locales/en-US/settings.json diff --git a/src/languages/en-US/system.json b/projects/bot/src/locales/en-US/system.json similarity index 96% rename from src/languages/en-US/system.json rename to projects/bot/src/locales/en-US/system.json index ae4c6d543d3..85f00364a78 100644 --- a/src/languages/en-US/system.json +++ b/projects/bot/src/locales/en-US/system.json @@ -34,10 +34,6 @@ "parseError": "{{REDCROSS}} I failed to process the data I was given, sorry~!", "prefixReminder": "The prefix in this server is set to: `{{prefix}}`", "queryFail": "I am sorry, but the application could not resolve your request. Are you sure you wrote the name correctly?", - "textPromptAbortOptions": [ - "abort", - "cancel", - "stop" - ], + "textPromptAbortOptions": ["abort", "cancel", "stop"], "reminderHeader": "⏲ Hey there! You asked to be reminded at {{timestamp}} about:" } diff --git a/projects/bot/src/main.ts b/projects/bot/src/main.ts new file mode 100644 index 00000000000..c78ca17f563 --- /dev/null +++ b/projects/bot/src/main.ts @@ -0,0 +1,49 @@ +import { createClient, loadAll } from '#lib/Client'; +import { envParseString, setup } from '@skyra/env-utilities'; +import { createBanner } from '@skyra/start-banner'; +import { bold } from 'colorette'; +import gradient from 'gradient-string'; +import { container } from 'skyra-shared'; + +setup(new URL('../src/.env', import.meta.url)); + +createClient(); +await loadAll(); + +console.log( + gradient.vice.multiline( + createBanner({ + logo: [ + String.raw` / `, + String.raw` ${bold('/╬')}▓ `, + String.raw` ${bold('/▓▓')}╢ `, + String.raw` [${bold('▓▓')}▓╣/ `, + String.raw` [╢╢╣▓ `, + String.raw` %,╚╣╣@\ `, + String.raw` #,╙▓▓▓\╙N `, + String.raw` '╙ \▓▓▓╖╙╦ `, + String.raw` \@╣▓╗╢% `, + String.raw` ▓╣╢╢] `, + String.raw` /╣▓${bold('▓▓')}] `, + String.raw` ╢${bold('▓▓/')} `, + String.raw` ▓${bold('╬/')} `, + String.raw` / ` + ], + name: [ + String.raw` ________ __ ___ ___ ___ _______ __ `, + String.raw` /" )|/"| / ")|" \/" |/" \ /""\ `, + String.raw`(: \___/ (: |/ / \ \ /|: | / \ `, + String.raw` \___ \ | __/ \\ \/ |_____/ ) /' /\ \ `, + String.raw` __/ \\ (// _ \ / / // / // __' \ `, + String.raw` /" \ :) |: | \ \ / / |: __ \ / / \\ \ `, + String.raw`(_______/ (__| \__)|___/ |__| \___)(___/ \___) ` + ], + extra: [ + ` Skyra ${envParseString('CLIENT_VERSION')} Gateway`, + ...container.stores.map((store) => `├─ Loaded ${store.size.toString().padEnd(3, ' ')} ${store.name}.`), + ` └ Redis : ${container.redis.options.host}:${container.redis.options.port}` + ] + }) + ) +); +console.log('Ready'); diff --git a/src/routes/commands.ts b/projects/bot/src/routes/commands.ts similarity index 100% rename from src/routes/commands.ts rename to projects/bot/src/routes/commands.ts diff --git a/src/routes/guilds/guild.ts b/projects/bot/src/routes/guilds/guild.ts similarity index 100% rename from src/routes/guilds/guild.ts rename to projects/bot/src/routes/guilds/guild.ts diff --git a/src/routes/guilds/guild/channels.ts b/projects/bot/src/routes/guilds/guild/channels.ts similarity index 100% rename from src/routes/guilds/guild/channels.ts rename to projects/bot/src/routes/guilds/guild/channels.ts diff --git a/src/routes/guilds/guild/channels/channel.ts b/projects/bot/src/routes/guilds/guild/channels/channel.ts similarity index 100% rename from src/routes/guilds/guild/channels/channel.ts rename to projects/bot/src/routes/guilds/guild/channels/channel.ts diff --git a/src/routes/guilds/guild/members/member.ts b/projects/bot/src/routes/guilds/guild/members/member.ts similarity index 100% rename from src/routes/guilds/guild/members/member.ts rename to projects/bot/src/routes/guilds/guild/members/member.ts diff --git a/src/routes/guilds/guild/roles.ts b/projects/bot/src/routes/guilds/guild/roles.ts similarity index 100% rename from src/routes/guilds/guild/roles.ts rename to projects/bot/src/routes/guilds/guild/roles.ts diff --git a/src/routes/guilds/guild/roles/role.ts b/projects/bot/src/routes/guilds/guild/roles/role.ts similarity index 100% rename from src/routes/guilds/guild/roles/role.ts rename to projects/bot/src/routes/guilds/guild/roles/role.ts diff --git a/src/routes/guilds/guild/settings.ts b/projects/bot/src/routes/guilds/guild/settings.ts similarity index 100% rename from src/routes/guilds/guild/settings.ts rename to projects/bot/src/routes/guilds/guild/settings.ts diff --git a/src/routes/languages.ts b/projects/bot/src/routes/languages.ts similarity index 100% rename from src/routes/languages.ts rename to projects/bot/src/routes/languages.ts diff --git a/src/routes/main.ts b/projects/bot/src/routes/main.ts similarity index 100% rename from src/routes/main.ts rename to projects/bot/src/routes/main.ts diff --git a/src/routes/oauth/oauthUser.ts b/projects/bot/src/routes/oauth/oauthUser.ts similarity index 100% rename from src/routes/oauth/oauthUser.ts rename to projects/bot/src/routes/oauth/oauthUser.ts diff --git a/src/routes/users/user.ts b/projects/bot/src/routes/users/user.ts similarity index 100% rename from src/routes/users/user.ts rename to projects/bot/src/routes/users/user.ts diff --git a/src/routes/users/user/settings.ts b/projects/bot/src/routes/users/user/settings.ts similarity index 100% rename from src/routes/users/user/settings.ts rename to projects/bot/src/routes/users/user/settings.ts diff --git a/src/tasks/moderation/moderationEndAddRole.ts b/projects/bot/src/tasks/moderation/moderationEndAddRole.ts similarity index 100% rename from src/tasks/moderation/moderationEndAddRole.ts rename to projects/bot/src/tasks/moderation/moderationEndAddRole.ts diff --git a/src/tasks/moderation/moderationEndBan.ts b/projects/bot/src/tasks/moderation/moderationEndBan.ts similarity index 100% rename from src/tasks/moderation/moderationEndBan.ts rename to projects/bot/src/tasks/moderation/moderationEndBan.ts diff --git a/src/tasks/moderation/moderationEndMute.ts b/projects/bot/src/tasks/moderation/moderationEndMute.ts similarity index 100% rename from src/tasks/moderation/moderationEndMute.ts rename to projects/bot/src/tasks/moderation/moderationEndMute.ts diff --git a/src/tasks/moderation/moderationEndRemoveRole.ts b/projects/bot/src/tasks/moderation/moderationEndRemoveRole.ts similarity index 100% rename from src/tasks/moderation/moderationEndRemoveRole.ts rename to projects/bot/src/tasks/moderation/moderationEndRemoveRole.ts diff --git a/src/tasks/moderation/moderationEndSetNickname.ts b/projects/bot/src/tasks/moderation/moderationEndSetNickname.ts similarity index 100% rename from src/tasks/moderation/moderationEndSetNickname.ts rename to projects/bot/src/tasks/moderation/moderationEndSetNickname.ts diff --git a/src/tasks/moderation/moderationEndVoiceMute.ts b/projects/bot/src/tasks/moderation/moderationEndVoiceMute.ts similarity index 100% rename from src/tasks/moderation/moderationEndVoiceMute.ts rename to projects/bot/src/tasks/moderation/moderationEndVoiceMute.ts diff --git a/src/tasks/moderation/moderationEndWarning.ts b/projects/bot/src/tasks/moderation/moderationEndWarning.ts similarity index 100% rename from src/tasks/moderation/moderationEndWarning.ts rename to projects/bot/src/tasks/moderation/moderationEndWarning.ts diff --git a/src/tasks/poststats.ts b/projects/bot/src/tasks/poststats.ts similarity index 100% rename from src/tasks/poststats.ts rename to projects/bot/src/tasks/poststats.ts diff --git a/src/tasks/reminder.ts b/projects/bot/src/tasks/reminder.ts similarity index 100% rename from src/tasks/reminder.ts rename to projects/bot/src/tasks/reminder.ts diff --git a/src/tsconfig.json b/projects/bot/src/tsconfig.json similarity index 78% rename from src/tsconfig.json rename to projects/bot/src/tsconfig.json index 710ad25c220..aea036c8ff2 100644 --- a/src/tsconfig.json +++ b/projects/bot/src/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "allowJs": true, "outDir": "../dist", @@ -8,7 +8,7 @@ "paths": { "#utils/*": ["lib/util/*"], "#lib/*": ["lib/*"], - "#languages": ["languages/index"], + "#languages": ["locales/index"], "#root/*": ["*"] }, "composite": true diff --git a/tests/jest.setup.ts b/projects/bot/tests/jest.setup.ts similarity index 100% rename from tests/jest.setup.ts rename to projects/bot/tests/jest.setup.ts diff --git a/tests/lib/CommandMatcher.test.ts b/projects/bot/tests/lib/CommandMatcher.test.ts similarity index 100% rename from tests/lib/CommandMatcher.test.ts rename to projects/bot/tests/lib/CommandMatcher.test.ts diff --git a/tests/lib/RegexCreator.test.ts b/projects/bot/tests/lib/RegexCreator.test.ts similarity index 100% rename from tests/lib/RegexCreator.test.ts rename to projects/bot/tests/lib/RegexCreator.test.ts diff --git a/tests/lib/TriviaManager.test.ts b/projects/bot/tests/lib/TriviaManager.test.ts similarity index 100% rename from tests/lib/TriviaManager.test.ts rename to projects/bot/tests/lib/TriviaManager.test.ts diff --git a/tests/lib/bits.test.ts b/projects/bot/tests/lib/bits.test.ts similarity index 100% rename from tests/lib/bits.test.ts rename to projects/bot/tests/lib/bits.test.ts diff --git a/tests/lib/formatters.test.ts b/projects/bot/tests/lib/formatters.test.ts similarity index 100% rename from tests/lib/formatters.test.ts rename to projects/bot/tests/lib/formatters.test.ts diff --git a/tests/lib/moderation/workers/WorkerHandler.test.ts b/projects/bot/tests/lib/moderation/workers/WorkerHandler.test.ts similarity index 100% rename from tests/lib/moderation/workers/WorkerHandler.test.ts rename to projects/bot/tests/lib/moderation/workers/WorkerHandler.test.ts diff --git a/tests/lib/moderation/workers/WorkerManager.test.ts b/projects/bot/tests/lib/moderation/workers/WorkerManager.test.ts similarity index 100% rename from tests/lib/moderation/workers/WorkerManager.test.ts rename to projects/bot/tests/lib/moderation/workers/WorkerManager.test.ts diff --git a/tests/lib/moderation/workers/WorkerResponseHandler.test.ts b/projects/bot/tests/lib/moderation/workers/WorkerResponseHandler.test.ts similarity index 100% rename from tests/lib/moderation/workers/WorkerResponseHandler.test.ts rename to projects/bot/tests/lib/moderation/workers/WorkerResponseHandler.test.ts diff --git a/tests/lib/util.test.ts b/projects/bot/tests/lib/util.test.ts similarity index 100% rename from tests/lib/util.test.ts rename to projects/bot/tests/lib/util.test.ts diff --git a/tests/lib/util/common/times.test.ts b/projects/bot/tests/lib/util/common/times.test.ts similarity index 100% rename from tests/lib/util/common/times.test.ts rename to projects/bot/tests/lib/util/common/times.test.ts diff --git a/tests/lib/util/constants.test.ts b/projects/bot/tests/lib/util/constants.test.ts similarity index 100% rename from tests/lib/util/constants.test.ts rename to projects/bot/tests/lib/util/constants.test.ts diff --git a/tests/lib/util/formatters.test.ts b/projects/bot/tests/lib/util/formatters.test.ts similarity index 100% rename from tests/lib/util/formatters.test.ts rename to projects/bot/tests/lib/util/formatters.test.ts diff --git a/tests/lib/util/functions/emojis/areEmojisEqual.test.ts b/projects/bot/tests/lib/util/functions/emojis/areEmojisEqual.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/areEmojisEqual.test.ts rename to projects/bot/tests/lib/util/functions/emojis/areEmojisEqual.test.ts diff --git a/tests/lib/util/functions/emojis/getEmojiId.test.ts b/projects/bot/tests/lib/util/functions/emojis/getEmojiId.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/getEmojiId.test.ts rename to projects/bot/tests/lib/util/functions/emojis/getEmojiId.test.ts diff --git a/tests/lib/util/functions/emojis/getEmojiObject.test.ts b/projects/bot/tests/lib/util/functions/emojis/getEmojiObject.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/getEmojiObject.test.ts rename to projects/bot/tests/lib/util/functions/emojis/getEmojiObject.test.ts diff --git a/tests/lib/util/functions/emojis/getEmojiReactionFormat.test.ts b/projects/bot/tests/lib/util/functions/emojis/getEmojiReactionFormat.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/getEmojiReactionFormat.test.ts rename to projects/bot/tests/lib/util/functions/emojis/getEmojiReactionFormat.test.ts diff --git a/tests/lib/util/functions/emojis/getEmojiString.test.ts b/projects/bot/tests/lib/util/functions/emojis/getEmojiString.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/getEmojiString.test.ts rename to projects/bot/tests/lib/util/functions/emojis/getEmojiString.test.ts diff --git a/tests/lib/util/functions/emojis/getEmojiTextFormat.test.ts b/projects/bot/tests/lib/util/functions/emojis/getEmojiTextFormat.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/getEmojiTextFormat.test.ts rename to projects/bot/tests/lib/util/functions/emojis/getEmojiTextFormat.test.ts diff --git a/tests/lib/util/functions/emojis/isSerializedTwemoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isSerializedTwemoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isSerializedTwemoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isSerializedTwemoji.test.ts diff --git a/tests/lib/util/functions/emojis/isValidCustomEmoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isValidCustomEmoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isValidCustomEmoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isValidCustomEmoji.test.ts diff --git a/tests/lib/util/functions/emojis/isValidSerializedCustomEmoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isValidSerializedCustomEmoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isValidSerializedCustomEmoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isValidSerializedCustomEmoji.test.ts diff --git a/tests/lib/util/functions/emojis/isValidSerializedEmoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isValidSerializedEmoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isValidSerializedEmoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isValidSerializedEmoji.test.ts diff --git a/tests/lib/util/functions/emojis/isValidSerializedTwemoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isValidSerializedTwemoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isValidSerializedTwemoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isValidSerializedTwemoji.test.ts diff --git a/tests/lib/util/functions/emojis/isValidTwemoji.test.ts b/projects/bot/tests/lib/util/functions/emojis/isValidTwemoji.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/isValidTwemoji.test.ts rename to projects/bot/tests/lib/util/functions/emojis/isValidTwemoji.test.ts diff --git a/tests/lib/util/functions/emojis/resolveEmojiId.test.ts b/projects/bot/tests/lib/util/functions/emojis/resolveEmojiId.test.ts similarity index 100% rename from tests/lib/util/functions/emojis/resolveEmojiId.test.ts rename to projects/bot/tests/lib/util/functions/emojis/resolveEmojiId.test.ts diff --git a/tests/lib/util/sanitizeInput.test.ts b/projects/bot/tests/lib/util/sanitizeInput.test.ts similarity index 100% rename from tests/lib/util/sanitizeInput.test.ts rename to projects/bot/tests/lib/util/sanitizeInput.test.ts diff --git a/tests/tsconfig.json b/projects/bot/tests/tsconfig.json similarity index 58% rename from tests/tsconfig.json rename to projects/bot/tests/tsconfig.json index b49316b7aa4..0320b12e976 100644 --- a/tests/tsconfig.json +++ b/projects/bot/tests/tsconfig.json @@ -4,12 +4,9 @@ "noEmit": true, "incremental": false, "baseUrl": ".", + "types": ["vitest/globals"], "paths": { - "#utils/*": ["../src/lib/util/*"], - "#lib/*": ["../src/lib/*"], - "#languages": ["../src/languages/index"], - "#mocks/*": ["./mocks/*"], - "#root/*": ["../src/*"] + "#lib/*": ["../src/lib/*"] } }, "include": [".", "../src/**/*"], diff --git a/projects/bot/tsconfig.eslint.json b/projects/bot/tsconfig.eslint.json new file mode 100644 index 00000000000..388bb593b9f --- /dev/null +++ b/projects/bot/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.eslint.json", + "include": ["src", "tests"] +} diff --git a/projects/docker/README.md b/projects/docker/README.md new file mode 100644 index 00000000000..3161cba738a --- /dev/null +++ b/projects/docker/README.md @@ -0,0 +1,21 @@ +# Skyra Dockerfiles + +This folder contains all the files required to control Docker development environments for Skyra. Most of the meat of +the content is in the `docker-compose.yml` file which has the info on which images can be build and as which containers +they would be ran. In order to easily control the docker-compose file there is a powershell, `control.ps1`. + +Skyra currently has the following microservices that can be dockerized: + +- PostgreSQL Database + - Service name in docker-compose: `postgres` + - Image used: `skyrabot/postgres:latest` + - For more information see [skyra-project/docker-images] +- Redis + - Service name in docker-compose: `redis` + - Image used: `redis:alpine` + - For more information see [redis] + + + +[redis]: https://hub.docker.com/_/redis +[skyra-project/docker-images]: https://github.com/skyra-project/docker-images diff --git a/.docker/control.ps1 b/projects/docker/control.ps1 similarity index 100% rename from .docker/control.ps1 rename to projects/docker/control.ps1 diff --git a/projects/docker/docker-compose.yml b/projects/docker/docker-compose.yml new file mode 100644 index 00000000000..70785c7f775 --- /dev/null +++ b/projects/docker/docker-compose.yml @@ -0,0 +1,66 @@ +version: '2.4' +services: + postgres: + container_name: postgres + image: 'skyrabot/postgres:latest' + networks: + - skyra + ports: + - '5432:5432' + restart: always + volumes: + - 'postgres-data:/var/lib/postgresql/data' + + redis: + command: 'redis-server --port 8287 --requirepass redis' + container_name: redis + image: 'redis:alpine' + networks: + - skyra + ports: + - '8287:8287' + restart: always + + skyra: + build: + context: ../../ + dockerfile: ../bot/Dockerfile + container_name: skyra + depends_on: + - redis + - postgres + env_file: + - ../bot/src/.env.development + - ../bot/src/.env.development.local + image: 'skyrabot/skyra:latest' + networks: + - skyra + ports: + - '8282:8282' + - '7282:7282' + restart: always + tty: true + + gateway: + build: + context: ../../ + dockerfile: ../gateway/Dockerfile + container_name: skyra-gateway + env_file: + - ../gateway/src/.env.development + - ../gateway/src/.env.development.local + image: 'skyrabot/skyra-gateway:latest' + networks: + - skyra + # ports: + # - '8282:8282' + # - '7282:7282' + restart: always + tty: true + +volumes: + postgres-data: + external: true + +networks: + skyra: diff --git a/Dockerfile b/projects/gateway/Dockerfile similarity index 69% rename from Dockerfile rename to projects/gateway/Dockerfile index 6c812640db2..2b166f7da06 100644 --- a/Dockerfile +++ b/projects/gateway/Dockerfile @@ -17,12 +17,10 @@ RUN apt-get update && \ COPY --chown=node:node yarn.lock . COPY --chown=node:node package.json . -COPY --chown=node:node assets/ assets/ +COPY --chown=node:node projects/gateway/package.json projects/gateway/package.json COPY --chown=node:node .yarnrc.yml . COPY --chown=node:node .yarn/ .yarn/ -RUN sed -i 's/"postinstall": "husky install .github\/husky"/"postinstall": ""/' ./package.json - ENTRYPOINT ["dumb-init", "--"] # ================ # @@ -35,10 +33,11 @@ ENV NODE_ENV="development" COPY --chown=node:node tsconfig.base.json tsconfig.base.json COPY --chown=node:node scripts/ scripts/ -COPY --chown=node:node src/ src/ +COPY --chown=node:node projects/gateway/scripts/ projects/gateway/scripts/ +COPY --chown=node:node projects/gateway/src/ projects/gateway/src/ RUN yarn install --immutable -RUN yarn run build +RUN cd projects/gateway/ && yarn run build # ================ # # Runner Stage # @@ -49,13 +48,14 @@ FROM base AS runner ENV NODE_ENV="production" ENV NODE_OPTIONS="--enable-source-maps --max_old_space_size=4096" -COPY --chown=node:node scripts/workerTsLoader.js scripts/workerTsLoader.js -COPY --chown=node:node src/.env src/.env -COPY --chown=node:node --from=builder /usr/src/app/dist dist +COPY --chown=node:node projects/gateway/src/.env projects/gateway/src/.env +COPY --chown=node:node --from=builder /usr/src/app/projects/gateway/dist projects/gateway/dist RUN yarn workspaces focus --all --production RUN chown node:node /usr/src/app/ USER node +WORKDIR /usr/src/app/projects/gateway + CMD [ "yarn", "run", "start" ] diff --git a/projects/gateway/package.json b/projects/gateway/package.json new file mode 100644 index 00000000000..67ace98ad30 --- /dev/null +++ b/projects/gateway/package.json @@ -0,0 +1,36 @@ +{ + "name": "skyra-gateway", + "version": "7.0.0", + "description": "Multipurpose Discord Bot built on Sapphire Framework", + "author": "Skyra Project", + "license": "Apache-2.0", + "private": true, + "main": "dist/main.js", + "type": "module", + "imports": { + "#lib/*": "./dist/lib/*.js" + }, + "scripts": { + "build": "tsc -b src", + "dev": "yarn build && yarn start", + "watch": "tsc -b src -w", + "clean": "node scripts/clean.mjs", + "start": "node --enable-source-maps dist/main.js", + "test": "eslint --ext ts src", + "lint": "eslint --fix --ext ts src", + "format": "prettier --write --loglevel=warn \"src/**/*.{js,ts,mts,json}\"" + }, + "dependencies": { + "@discordjs/rest": "^1.0.1", + "@discordjs/ws": "^0.2.0", + "@sapphire/utilities": "^3.8.0", + "@skyra/env-utilities": "^1.0.2", + "@skyra/start-banner": "^1.0.2", + "discord-api-types": "^0.37.0", + "gradient-string": "^2.0.1", + "skyra-shared": "workspace:^" + }, + "devDependencies": { + "typescript": "^4.7.4" + } +} diff --git a/projects/gateway/scripts/clean.mjs b/projects/gateway/scripts/clean.mjs new file mode 100644 index 00000000000..1bd25ff105e --- /dev/null +++ b/projects/gateway/scripts/clean.mjs @@ -0,0 +1,8 @@ +import { rm } from 'node:fs/promises'; + +const rootFolder = new URL('../', import.meta.url); +const distFolder = new URL('dist/', rootFolder); + +const options = { recursive: true, force: true }; + +await rm(distFolder, options); diff --git a/projects/gateway/src/.env b/projects/gateway/src/.env new file mode 100644 index 00000000000..9b3c0a1932d --- /dev/null +++ b/projects/gateway/src/.env @@ -0,0 +1,15 @@ +CLIENT_VERSION='7.0.0 [Testa Edition]' + +# Discord Client Public Key +DISCORD_TOKEN= + +# Redis options +REDIS_HOST='localhost' +REDIS_PORT=8287 +REDIS_DB=0 +REDIS_PASSWORD='redis' + +# Redis Message Broker options +BROKER_STREAM_NAME='g-stream' +BROKER_BLOCK=5000 +BROKER_MAX=10 diff --git a/projects/gateway/src/.env.development b/projects/gateway/src/.env.development new file mode 100644 index 00000000000..1ac313506db --- /dev/null +++ b/projects/gateway/src/.env.development @@ -0,0 +1 @@ +CLIENT_VERSION='7.0.0-dev [Testa Edition]' diff --git a/projects/gateway/src/lib/Client.ts b/projects/gateway/src/lib/Client.ts new file mode 100644 index 00000000000..8090afc0506 --- /dev/null +++ b/projects/gateway/src/lib/Client.ts @@ -0,0 +1,60 @@ +import { REST, RESTOptions } from '@discordjs/rest'; +import { OptionalWebSocketManagerOptions, RequiredWebSocketManagerOptions, WebSocketManager } from '@discordjs/ws'; +import { envParseInteger, envParseString } from '@skyra/env-utilities'; +import { fileURLToPath } from 'node:url'; +import { Cache, container, ListenerStore, MessageBroker, Redis, type RedisOptions } from 'skyra-shared'; + +export function createClient(options: ClientOptions) { + const token = envParseString('DISCORD_TOKEN'); + container.rest = new REST(options.rest).setToken(token); + container.ws = new WebSocketManager({ + ...options.ws, + rest: container.rest, + token + }); + + container.redis = new Redis({ + ...options.redis, + lazyConnect: true, + host: envParseString('REDIS_HOST'), + port: envParseInteger('REDIS_PORT'), + db: envParseInteger('REDIS_DB'), + password: envParseString('REDIS_PASSWORD') + }); + container.cache = new Cache({ + client: container.redis, + prefix: 's7' + }); + container.broker = new MessageBroker({ + redis: container.redis, + stream: envParseString('BROKER_STREAM_NAME'), + block: envParseInteger('BROKER_BLOCK', 5000), + max: envParseInteger('BROKER_MAX', 10) + }); + + container.stores.register(new ListenerStore()); + // TODO: https://github.com/sapphiredev/pieces/pull/231 + container.stores.registerPath(fileURLToPath(new URL('..', import.meta.url))); +} + +export async function loadAll() { + await container.redis.connect(); + await container.stores.load(); + await container.ws.connect(); +} + +export interface ClientOptions { + redis?: Omit; + rest?: Partial; + ws: Omit, 'rest' | 'token'>; +} + +declare module '@sapphire/pieces' { + interface Container { + broker: MessageBroker; + cache: Cache; + redis: Redis; + rest: REST; + ws: WebSocketManager; + } +} diff --git a/projects/gateway/src/lib/actions/All.ts b/projects/gateway/src/lib/actions/All.ts new file mode 100644 index 00000000000..17076c34829 --- /dev/null +++ b/projects/gateway/src/lib/actions/All.ts @@ -0,0 +1,113 @@ +import { GatewayDispatchEvents, GatewayDispatchPayload } from 'discord-api-types/v10'; +import { handleChannelCreate } from './ChannelCreate'; +import { handleChannelDelete } from './ChannelDelete'; +import { handleChannelUpdate } from './ChannelUpdate'; +import { handleGuildBanAdd } from './GuildBanAdd'; +import { handleGuildBanRemove } from './GuildBanRemove'; +import { handleGuildCreate } from './GuildCreate'; +import { handleGuildDelete } from './GuildDelete'; +import { handleGuildEmojisUpdate } from './GuildEmojisUpdate'; +import { handleGuildMemberAdd } from './GuildMemberAdd'; +import { handleGuildMemberRemove } from './GuildMemberRemove'; +import { handleGuildMembersChunk } from './GuildMembersChunk'; +import { handleGuildMemberUpdate } from './GuildMemberUpdate'; +import { handleGuildRoleCreate } from './GuildRoleCreate'; +import { handleGuildRoleDelete } from './GuildRoleDelete'; +import { handleGuildRoleUpdate } from './GuildRoleUpdate'; +import { handleGuildStickersUpdate } from './GuildStickersUpdate'; +import { handleGuildUpdate } from './GuildUpdate'; +import { handleMessageCreate } from './MessageCreate'; +import { handleMessageDelete } from './MessageDelete'; +import { handleMessageDeleteBulk } from './MessageDeleteBulk'; +import { handleMessageReactionAdd } from './MessageReactionAdd'; +import { handleMessageReactionRemove } from './MessageReactionRemove'; +import { handleMessageReactionRemoveAll } from './MessageReactionRemoveAll'; +import { handleMessageReactionRemoveEmoji } from './MessageReactionRemoveEmoji'; +import { handleMessageUpdate } from './MessageUpdate'; + +export function all(payload: GatewayDispatchPayload) { + switch (payload.t) { + case GatewayDispatchEvents.ChannelCreate: + return handleChannelCreate(payload.d); + case GatewayDispatchEvents.ChannelDelete: + return handleChannelDelete(payload.d); + case GatewayDispatchEvents.ChannelUpdate: + return handleChannelUpdate(payload.d); + case GatewayDispatchEvents.GuildBanAdd: + return handleGuildBanAdd(payload.d); + case GatewayDispatchEvents.GuildBanRemove: + return handleGuildBanRemove(payload.d); + case GatewayDispatchEvents.GuildCreate: + return handleGuildCreate(payload.d); + case GatewayDispatchEvents.GuildDelete: + return handleGuildDelete(payload.d); + case GatewayDispatchEvents.GuildEmojisUpdate: + return handleGuildEmojisUpdate(payload.d); + case GatewayDispatchEvents.GuildMemberAdd: + return handleGuildMemberAdd(payload.d); + case GatewayDispatchEvents.GuildMemberRemove: + return handleGuildMemberRemove(payload.d); + case GatewayDispatchEvents.GuildMembersChunk: + return handleGuildMembersChunk(payload.d); + case GatewayDispatchEvents.GuildMemberUpdate: + return handleGuildMemberUpdate(payload.d); + case GatewayDispatchEvents.GuildRoleCreate: + return handleGuildRoleCreate(payload.d); + case GatewayDispatchEvents.GuildRoleDelete: + return handleGuildRoleDelete(payload.d); + case GatewayDispatchEvents.GuildRoleUpdate: + return handleGuildRoleUpdate(payload.d); + case GatewayDispatchEvents.GuildStickersUpdate: + return handleGuildStickersUpdate(payload.d); + case GatewayDispatchEvents.GuildUpdate: + return handleGuildUpdate(payload.d); + case GatewayDispatchEvents.MessageCreate: + return handleMessageCreate(payload.d); + case GatewayDispatchEvents.MessageDelete: + return handleMessageDelete(payload.d); + case GatewayDispatchEvents.MessageDeleteBulk: + return handleMessageDeleteBulk(payload.d); + case GatewayDispatchEvents.MessageReactionAdd: + return handleMessageReactionAdd(payload.d); + case GatewayDispatchEvents.MessageReactionRemove: + return handleMessageReactionRemove(payload.d); + case GatewayDispatchEvents.MessageReactionRemoveAll: + return handleMessageReactionRemoveAll(payload.d); + case GatewayDispatchEvents.MessageReactionRemoveEmoji: + return handleMessageReactionRemoveEmoji(payload.d); + case GatewayDispatchEvents.MessageUpdate: + return handleMessageUpdate(payload.d); + // case GatewayDispatchEvents.ChannelPinsUpdate: + // case GatewayDispatchEvents.GuildIntegrationsUpdate: + // case GatewayDispatchEvents.IntegrationCreate: + // case GatewayDispatchEvents.IntegrationDelete: + // case GatewayDispatchEvents.IntegrationUpdate: + // case GatewayDispatchEvents.InteractionCreate: + // case GatewayDispatchEvents.InviteCreate: + // case GatewayDispatchEvents.InviteDelete: + // case GatewayDispatchEvents.PresenceUpdate: + // case GatewayDispatchEvents.StageInstanceCreate: + // case GatewayDispatchEvents.StageInstanceDelete: + // case GatewayDispatchEvents.StageInstanceUpdate: + // case GatewayDispatchEvents.Ready: + // case GatewayDispatchEvents.Resumed: + // case GatewayDispatchEvents.ThreadCreate: + // case GatewayDispatchEvents.ThreadDelete: + // case GatewayDispatchEvents.ThreadListSync: + // case GatewayDispatchEvents.ThreadMembersUpdate: + // case GatewayDispatchEvents.ThreadMemberUpdate: + // case GatewayDispatchEvents.ThreadUpdate: + // case GatewayDispatchEvents.TypingStart: + // case GatewayDispatchEvents.UserUpdate: + // case GatewayDispatchEvents.VoiceServerUpdate: + // case GatewayDispatchEvents.VoiceStateUpdate: + // case GatewayDispatchEvents.WebhooksUpdate: + // case GatewayDispatchEvents.GuildScheduledEventCreate: + // case GatewayDispatchEvents.GuildScheduledEventUpdate: + // case GatewayDispatchEvents.GuildScheduledEventDelete: + // case GatewayDispatchEvents.GuildScheduledEventUserAdd: + // case GatewayDispatchEvents.GuildScheduledEventUserRemove: + default: + return null; + } +} diff --git a/projects/gateway/src/lib/actions/ChannelCreate.ts b/projects/gateway/src/lib/actions/ChannelCreate.ts new file mode 100644 index 00000000000..5a479464fc9 --- /dev/null +++ b/projects/gateway/src/lib/actions/ChannelCreate.ts @@ -0,0 +1,11 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayChannelCreateDispatchData } from 'discord-api-types/v10'; +import { Channel, container, RedisMessageType } from 'skyra-shared'; + +export async function handleChannelCreate(payload: GatewayChannelCreateDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + await container.cache.channels.set(payload.guild_id, Channel.fromAPI(payload)); + await container.broker.send({ type: RedisMessageType.ChannelCreate, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/ChannelDelete.ts b/projects/gateway/src/lib/actions/ChannelDelete.ts new file mode 100644 index 00000000000..80575e3379a --- /dev/null +++ b/projects/gateway/src/lib/actions/ChannelDelete.ts @@ -0,0 +1,11 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayChannelDeleteDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleChannelDelete(payload: GatewayChannelDeleteDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + await container.cache.channels.remove(payload.guild_id, payload.id); + await container.broker.send({ type: RedisMessageType.ChannelDelete, old: payload }); +} diff --git a/projects/gateway/src/lib/actions/ChannelUpdate.ts b/projects/gateway/src/lib/actions/ChannelUpdate.ts new file mode 100644 index 00000000000..46c4f6a00e9 --- /dev/null +++ b/projects/gateway/src/lib/actions/ChannelUpdate.ts @@ -0,0 +1,12 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayChannelUpdateDispatchData } from 'discord-api-types/v10'; +import { Channel, container, RedisMessageType } from 'skyra-shared'; + +export async function handleChannelUpdate(payload: GatewayChannelUpdateDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + const old = (await container.cache.channels.get(payload.guild_id, payload.id))?.toJSON() ?? null; + await container.cache.channels.set(payload.guild_id, Channel.fromAPI(payload)); + await container.broker.send({ type: RedisMessageType.ChannelUpdate, old, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/GuildBanAdd.ts b/projects/gateway/src/lib/actions/GuildBanAdd.ts new file mode 100644 index 00000000000..fc293e8f7cb --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildBanAdd.ts @@ -0,0 +1,6 @@ +import type { GatewayGuildBanAddDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildBanAdd(payload: GatewayGuildBanAddDispatchData) { + await container.broker.send({ type: RedisMessageType.GuildBanAdd, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/GuildBanRemove.ts b/projects/gateway/src/lib/actions/GuildBanRemove.ts new file mode 100644 index 00000000000..f4e0f9a9ece --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildBanRemove.ts @@ -0,0 +1,6 @@ +import type { GatewayGuildBanRemoveDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildBanRemove(payload: GatewayGuildBanRemoveDispatchData) { + await container.broker.send({ type: RedisMessageType.GuildBanRemove, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/GuildCreate.ts b/projects/gateway/src/lib/actions/GuildCreate.ts new file mode 100644 index 00000000000..0a932ce57d3 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildCreate.ts @@ -0,0 +1,26 @@ +import type { GatewayGuildCreateDispatchData } from 'discord-api-types/v10'; +import { Channel, container, Emoji, Guild, Member, Role, Sticker } from 'skyra-shared'; + +export async function handleGuildCreate(payload: GatewayGuildCreateDispatchData) { + await container.cache.guilds.set(Guild.fromAPI(payload)); + await container.cache.emojis.set( + payload.id, + payload.emojis.map((emoji) => Emoji.fromAPI(emoji)) + ); + await container.cache.channels.set( + payload.id, + payload.channels.map((entry) => Channel.fromAPI(entry)) + ); + await container.cache.members.set( + payload.id, + payload.members.map((entry) => Member.fromAPI(entry)) + ); + await container.cache.roles.set( + payload.id, + payload.roles.map((emoji) => Role.fromAPI(emoji)) + ); + await container.cache.stickers.set( + payload.id, + payload.stickers.map((emoji) => Sticker.fromAPI(emoji)) + ); +} diff --git a/projects/gateway/src/lib/actions/GuildDelete.ts b/projects/gateway/src/lib/actions/GuildDelete.ts new file mode 100644 index 00000000000..7f6318ffbcf --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildDelete.ts @@ -0,0 +1,9 @@ +import type { GatewayGuildDeleteDispatchData } from 'discord-api-types/v10'; +import { container } from 'skyra-shared'; + +export async function handleGuildDelete(payload: GatewayGuildDeleteDispatchData) { + for (const channelId of await container.cache.channels.keys(payload.id)) { + await container.cache.messages.clear(channelId); + } + await container.cache.guilds.remove(payload.id); +} diff --git a/projects/gateway/src/lib/actions/GuildEmojisUpdate.ts b/projects/gateway/src/lib/actions/GuildEmojisUpdate.ts new file mode 100644 index 00000000000..d312bc698d4 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildEmojisUpdate.ts @@ -0,0 +1,38 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayGuildEmojisUpdateDispatchData } from 'discord-api-types/v10'; +import { container, Emoji, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildEmojisUpdate(payload: GatewayGuildEmojisUpdateDispatchData) { + const oldEntries = await container.cache.emojis.entries(payload.guild_id); + + for (const emoji of payload.emojis) { + const updated = Emoji.fromAPI(emoji); + const old = oldEntries.get(updated.id); + + if (isNullish(old)) { + // A new emoji has been created: + await container.cache.emojis.set(payload.guild_id, updated); + await container.broker.send({ type: RedisMessageType.EmojiCreate, data: emoji, guild_id: payload.guild_id }); + } else if (!updated.equals(old)) { + // An emoji has been updated: + await container.cache.emojis.set(payload.guild_id, updated); + await container.broker.send({ type: RedisMessageType.EmojiUpdate, old: old.toJSON(), data: emoji, guild_id: payload.guild_id }); + } + + // Remove the processed entry from the retrieved map, as the current + // entry is a created, updated, or untouched one. + // + // The remaining entries will be deleted ones, so this operation comes + // handy to create a fast emoji deletion dispatch. + // + // On a side note, this does not mutate the actual cache, which is in + // Redis. + oldEntries.delete(updated.id); + } + + // Process deleted entries: + await container.cache.emojis.remove(payload.guild_id, [...oldEntries.keys()]); + for (const emoji of oldEntries.values()) { + await container.broker.send({ type: RedisMessageType.EmojiDelete, old: emoji.toJSON(), guild_id: payload.guild_id }); + } +} diff --git a/projects/gateway/src/lib/actions/GuildMemberAdd.ts b/projects/gateway/src/lib/actions/GuildMemberAdd.ts new file mode 100644 index 00000000000..f3d78164405 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildMemberAdd.ts @@ -0,0 +1,7 @@ +import type { GatewayGuildMemberAddDispatchData } from 'discord-api-types/v10'; +import { container, Member, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildMemberAdd(payload: GatewayGuildMemberAddDispatchData) { + await container.cache.members.set(payload.guild_id, Member.fromAPI(payload)); + await container.broker.send({ type: RedisMessageType.MemberAdd, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/GuildMemberRemove.ts b/projects/gateway/src/lib/actions/GuildMemberRemove.ts new file mode 100644 index 00000000000..6d51f9fc4c4 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildMemberRemove.ts @@ -0,0 +1,13 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayGuildMemberRemoveDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildMemberRemove(payload: GatewayGuildMemberRemoveDispatchData) { + const old = await container.cache.members.get(payload.guild_id, payload.user.id); + if (isNullish(old)) { + await container.broker.send({ type: RedisMessageType.MemberRemove, old: null, user: payload.user, guild_id: payload.guild_id }); + } else { + await container.cache.members.remove(payload.guild_id, old.id); + await container.broker.send({ type: RedisMessageType.MemberRemove, old: old.toJSON(), user: payload.user, guild_id: payload.guild_id }); + } +} diff --git a/projects/gateway/src/lib/actions/GuildMemberUpdate.ts b/projects/gateway/src/lib/actions/GuildMemberUpdate.ts new file mode 100644 index 00000000000..06ff549cc6c --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildMemberUpdate.ts @@ -0,0 +1,15 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayGuildMemberUpdateDispatchData } from 'discord-api-types/v10'; +import { container, Member, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildMemberUpdate(payload: GatewayGuildMemberUpdateDispatchData) { + const old = await container.cache.members.get(payload.guild_id, payload.user.id); + if (isNullish(old)) { + await container.cache.members.set(payload.guild_id, Member.fromAPI(payload)); + await container.broker.send({ type: RedisMessageType.MemberUpdate, old: null, data: payload }); + } else { + const data = old.patch(payload); + await container.cache.members.set(payload.guild_id, data); + await container.broker.send({ type: RedisMessageType.MemberUpdate, old: old.toJSON(), data: data.toJSON() }); + } +} diff --git a/projects/gateway/src/lib/actions/GuildMembersChunk.ts b/projects/gateway/src/lib/actions/GuildMembersChunk.ts new file mode 100644 index 00000000000..580f3ac47f7 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildMembersChunk.ts @@ -0,0 +1,9 @@ +import type { GatewayGuildMembersChunkDispatchData } from 'discord-api-types/v10'; +import { container, Member } from 'skyra-shared'; + +export async function handleGuildMembersChunk(payload: GatewayGuildMembersChunkDispatchData) { + await container.cache.members.set( + payload.guild_id, + payload.members.map((data) => Member.fromAPI(data)) + ); +} diff --git a/projects/gateway/src/lib/actions/GuildRoleCreate.ts b/projects/gateway/src/lib/actions/GuildRoleCreate.ts new file mode 100644 index 00000000000..2039676b397 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildRoleCreate.ts @@ -0,0 +1,7 @@ +import type { GatewayGuildRoleCreateDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType, Role } from 'skyra-shared'; + +export async function handleGuildRoleCreate(payload: GatewayGuildRoleCreateDispatchData) { + await container.cache.roles.set(payload.guild_id, Role.fromAPI(payload.role)); + await container.broker.send({ type: RedisMessageType.RoleCreate, data: payload.role, guild_id: payload.guild_id }); +} diff --git a/projects/gateway/src/lib/actions/GuildRoleDelete.ts b/projects/gateway/src/lib/actions/GuildRoleDelete.ts new file mode 100644 index 00000000000..eee21f82640 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildRoleDelete.ts @@ -0,0 +1,13 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayGuildRoleDeleteDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildRoleDelete(payload: GatewayGuildRoleDeleteDispatchData) { + const old = await container.cache.roles.get(payload.guild_id, payload.role_id); + if (isNullish(old)) { + await container.broker.send({ type: RedisMessageType.RoleDelete, old: { id: payload.role_id }, guild_id: payload.guild_id }); + } else { + await container.cache.roles.remove(payload.guild_id, old.id); + await container.broker.send({ type: RedisMessageType.RoleDelete, old: old.toJSON(), guild_id: payload.guild_id }); + } +} diff --git a/projects/gateway/src/lib/actions/GuildRoleUpdate.ts b/projects/gateway/src/lib/actions/GuildRoleUpdate.ts new file mode 100644 index 00000000000..844bc6cb98e --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildRoleUpdate.ts @@ -0,0 +1,8 @@ +import type { GatewayGuildRoleUpdateDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType, Role } from 'skyra-shared'; + +export async function handleGuildRoleUpdate(payload: GatewayGuildRoleUpdateDispatchData) { + const old = await container.cache.roles.get(payload.guild_id, payload.role.id); + await container.cache.roles.set(payload.guild_id, Role.fromAPI(payload.role)); + await container.broker.send({ type: RedisMessageType.RoleUpdate, old: old?.toJSON() ?? null, data: payload.role, guild_id: payload.guild_id }); +} diff --git a/projects/gateway/src/lib/actions/GuildStickersUpdate.ts b/projects/gateway/src/lib/actions/GuildStickersUpdate.ts new file mode 100644 index 00000000000..bfedcd2f96d --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildStickersUpdate.ts @@ -0,0 +1,38 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayGuildStickersUpdateDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType, Sticker } from 'skyra-shared'; + +export async function handleGuildStickersUpdate(payload: GatewayGuildStickersUpdateDispatchData) { + const oldEntries = await container.cache.stickers.entries(payload.guild_id); + + for (const sticker of payload.stickers) { + const updated = Sticker.fromAPI(sticker); + const old = oldEntries.get(updated.id); + + if (isNullish(old)) { + // A new sticker has been created: + await container.cache.stickers.set(payload.guild_id, updated); + await container.broker.send({ type: RedisMessageType.StickerCreate, data: sticker, guild_id: payload.guild_id }); + } else if (!updated.equals(old)) { + // A sticker has been updated: + await container.cache.stickers.set(payload.guild_id, updated); + await container.broker.send({ type: RedisMessageType.StickerUpdate, old: old.toJSON(), data: sticker, guild_id: payload.guild_id }); + } + + // Remove the processed entry from the retrieved map, as the current + // entry is a created, updated, or untouched one. + // + // The remaining entries will be deleted ones, so this operation comes + // handy to create a fast sticker deletion dispatch. + // + // On a side note, this does not mutate the actual cache, which is in + // Redis. + oldEntries.delete(updated.id); + } + + // Process deleted entries: + await container.cache.stickers.remove(payload.guild_id, [...oldEntries.keys()]); + for (const sticker of oldEntries.values()) { + await container.broker.send({ type: RedisMessageType.StickerDelete, old: sticker.toJSON(), guild_id: payload.guild_id }); + } +} diff --git a/projects/gateway/src/lib/actions/GuildUpdate.ts b/projects/gateway/src/lib/actions/GuildUpdate.ts new file mode 100644 index 00000000000..4cc103cd9b7 --- /dev/null +++ b/projects/gateway/src/lib/actions/GuildUpdate.ts @@ -0,0 +1,9 @@ +import type { GatewayGuildUpdateDispatchData } from 'discord-api-types/v10'; +import { container, Guild, RedisMessageType } from 'skyra-shared'; + +export async function handleGuildUpdate(payload: GatewayGuildUpdateDispatchData) { + const old = await container.cache.guilds.get(payload.id); + const data = Guild.fromAPI(payload); + await container.cache.guilds.set(data); + await container.broker.send({ type: RedisMessageType.GuildUpdate, old: old?.toJSON() ?? null, data: data.toJSON() }); +} diff --git a/projects/gateway/src/lib/actions/MessageCreate.ts b/projects/gateway/src/lib/actions/MessageCreate.ts new file mode 100644 index 00000000000..b693782f8a7 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageCreate.ts @@ -0,0 +1,11 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayMessageCreateDispatchData } from 'discord-api-types/v10'; +import { container, Message, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageCreate(payload: GatewayMessageCreateDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + await container.cache.messages.set(payload.channel_id, Message.fromAPI(payload)); + await container.broker.send({ type: RedisMessageType.MessageCreate, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/MessageDelete.ts b/projects/gateway/src/lib/actions/MessageDelete.ts new file mode 100644 index 00000000000..f834d113792 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageDelete.ts @@ -0,0 +1,19 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayMessageDeleteDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageDelete(payload: GatewayMessageDeleteDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + const old = await container.cache.messages.get(payload.channel_id, payload.id); + if (isNullish(old)) { + await container.broker.send({ + type: RedisMessageType.MessageDelete, + old: { id: payload.id, channel_id: payload.channel_id, guild_id: payload.guild_id } + }); + } else { + await container.cache.messages.remove(payload.channel_id, payload.id); + await container.broker.send({ type: RedisMessageType.MessageDelete, old: old.toJSON() }); + } +} diff --git a/projects/gateway/src/lib/actions/MessageDeleteBulk.ts b/projects/gateway/src/lib/actions/MessageDeleteBulk.ts new file mode 100644 index 00000000000..991d18d7c99 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageDeleteBulk.ts @@ -0,0 +1,18 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayMessageDeleteBulkDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageDeleteBulk(payload: GatewayMessageDeleteBulkDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + const entries = await container.cache.messages.get(payload.channel_id, payload.ids); + await container.cache.messages.remove(payload.channel_id, payload.ids); + + await container.broker.send({ + type: RedisMessageType.MessageDeleteBulk, + old: payload.ids.map((id) => entries.get(BigInt(id))?.toJSON() ?? { id }), + channel_id: payload.channel_id, + guild_id: payload.guild_id + }); +} diff --git a/projects/gateway/src/lib/actions/MessageReactionAdd.ts b/projects/gateway/src/lib/actions/MessageReactionAdd.ts new file mode 100644 index 00000000000..01a9a3e38b5 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageReactionAdd.ts @@ -0,0 +1,6 @@ +import type { GatewayMessageReactionAddDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageReactionAdd(payload: GatewayMessageReactionAddDispatchData) { + await container.broker.send({ type: RedisMessageType.MessageReactionAdd, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/MessageReactionRemove.ts b/projects/gateway/src/lib/actions/MessageReactionRemove.ts new file mode 100644 index 00000000000..c871a852981 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageReactionRemove.ts @@ -0,0 +1,6 @@ +import type { GatewayMessageReactionRemoveDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageReactionRemove(payload: GatewayMessageReactionRemoveDispatchData) { + await container.broker.send({ type: RedisMessageType.MessageReactionRemove, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/MessageReactionRemoveAll.ts b/projects/gateway/src/lib/actions/MessageReactionRemoveAll.ts new file mode 100644 index 00000000000..d339ac3f71b --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageReactionRemoveAll.ts @@ -0,0 +1,6 @@ +import type { GatewayMessageReactionRemoveAllDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageReactionRemoveAll(payload: GatewayMessageReactionRemoveAllDispatchData) { + await container.broker.send({ type: RedisMessageType.MessageReactionRemoveAll, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/MessageReactionRemoveEmoji.ts b/projects/gateway/src/lib/actions/MessageReactionRemoveEmoji.ts new file mode 100644 index 00000000000..1f483e81bb1 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageReactionRemoveEmoji.ts @@ -0,0 +1,6 @@ +import type { GatewayMessageReactionRemoveEmojiDispatchData } from 'discord-api-types/v10'; +import { container, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageReactionRemoveEmoji(payload: GatewayMessageReactionRemoveEmojiDispatchData) { + await container.broker.send({ type: RedisMessageType.MessageReactionRemoveEmoji, data: payload }); +} diff --git a/projects/gateway/src/lib/actions/MessageUpdate.ts b/projects/gateway/src/lib/actions/MessageUpdate.ts new file mode 100644 index 00000000000..7b4b8d29324 --- /dev/null +++ b/projects/gateway/src/lib/actions/MessageUpdate.ts @@ -0,0 +1,17 @@ +import { isNullish } from '@sapphire/utilities'; +import type { GatewayMessageUpdateDispatchData } from 'discord-api-types/v10'; +import { container, Message, RedisMessageType } from 'skyra-shared'; + +export async function handleMessageUpdate(payload: GatewayMessageUpdateDispatchData) { + if (!('guild_id' in payload)) return; + if (isNullish(payload.guild_id)) return; + + const old = await container.cache.messages.get(payload.guild_id, payload.id); + if (isNullish(old)) { + await container.cache.messages.set(payload.guild_id, Message.fromAPI(payload as any)); + await container.broker.send({ type: RedisMessageType.MessageUpdate, old: null, data: payload }); + } else { + await container.cache.messages.set(payload.guild_id, old.patch(payload)); + await container.broker.send({ type: RedisMessageType.MessageUpdate, old: old.toJSON(), data: payload }); + } +} diff --git a/projects/gateway/src/lib/augments.d.ts b/projects/gateway/src/lib/augments.d.ts new file mode 100644 index 00000000000..c6c01d7cb80 --- /dev/null +++ b/projects/gateway/src/lib/augments.d.ts @@ -0,0 +1,18 @@ +import type { IntegerString } from '@skyra/env-utilities'; + +declare module '@skyra/env-utilities' { + interface Env { + CLIENT_VERSION: string; + + DISCORD_TOKEN: string; + + REDIS_HOST: string; + REDIS_PORT: IntegerString; + REDIS_DB: IntegerString; + REDIS_PASSWORD: string; + + BROKER_STREAM_NAME: string; + BROKER_BLOCK?: IntegerString; + BROKER_MAX?: IntegerString; + } +} diff --git a/projects/gateway/src/lib/structures/ws-listener.ts b/projects/gateway/src/lib/structures/ws-listener.ts new file mode 100644 index 00000000000..976731ca62e --- /dev/null +++ b/projects/gateway/src/lib/structures/ws-listener.ts @@ -0,0 +1,21 @@ +import type { ManagerShardEventsMap } from '@discordjs/ws'; +import { Listener } from 'skyra-shared'; + +export function makeWebSocketListener>( + event: K, + cb: (...args: ListenerEvents[K]) => unknown +) { + class UserListener extends Listener { + public constructor(context: Listener.Context, options: Listener.Options) { + super(context, { ...options, emitter: 'ws', event }); + } + + public run(...args: ListenerEvents[K]) { + return cb(...args); + } + } + + return UserListener as typeof Listener; +} + +type ListenerEvents = T & { error: [error: Error] }; diff --git a/projects/gateway/src/listeners/ws/dispatch.mts b/projects/gateway/src/listeners/ws/dispatch.mts new file mode 100644 index 00000000000..2b4166db715 --- /dev/null +++ b/projects/gateway/src/listeners/ws/dispatch.mts @@ -0,0 +1,6 @@ +import { makeWebSocketListener } from '#lib/structures/ws-listener'; +import { WebSocketShardEvents } from '@discordjs/ws'; + +export default makeWebSocketListener(WebSocketShardEvents.Dispatch, (payload) => { + console.log(payload.data.t); +}); diff --git a/projects/gateway/src/listeners/ws/error.mts b/projects/gateway/src/listeners/ws/error.mts new file mode 100644 index 00000000000..4d21585fc6c --- /dev/null +++ b/projects/gateway/src/listeners/ws/error.mts @@ -0,0 +1,5 @@ +import { makeWebSocketListener } from '#lib/structures/ws-listener'; + +export default makeWebSocketListener('error', (error) => { + console.error('Received error:', error); +}); diff --git a/projects/gateway/src/listeners/ws/ready.mts b/projects/gateway/src/listeners/ws/ready.mts new file mode 100644 index 00000000000..5c02e15e26c --- /dev/null +++ b/projects/gateway/src/listeners/ws/ready.mts @@ -0,0 +1,6 @@ +import { makeWebSocketListener } from '#lib/structures/ws-listener'; +import { WebSocketShardEvents } from '@discordjs/ws'; + +export default makeWebSocketListener(WebSocketShardEvents.Ready, (payload) => { + console.log(`[WS] ${payload.shardId} is now ready.`); +}); diff --git a/projects/gateway/src/listeners/ws/resumed.mts b/projects/gateway/src/listeners/ws/resumed.mts new file mode 100644 index 00000000000..fb0f62ba67b --- /dev/null +++ b/projects/gateway/src/listeners/ws/resumed.mts @@ -0,0 +1,6 @@ +import { makeWebSocketListener } from '#lib/structures/ws-listener'; +import { WebSocketShardEvents } from '@discordjs/ws'; + +export default makeWebSocketListener(WebSocketShardEvents.Resumed, (payload) => { + console.log(`[WS] ${payload.shardId} has resumed previous session.`); +}); diff --git a/projects/gateway/src/main.ts b/projects/gateway/src/main.ts new file mode 100644 index 00000000000..a1d681184a8 --- /dev/null +++ b/projects/gateway/src/main.ts @@ -0,0 +1,55 @@ +import { createClient, loadAll } from '#lib/Client'; +import { envParseString, setup } from '@skyra/env-utilities'; +import { createBanner } from '@skyra/start-banner'; +import { GatewayIntentBits } from 'discord-api-types/v10'; +import gradient from 'gradient-string'; +import { container } from 'skyra-shared'; + +setup(new URL('../src/.env', import.meta.url)); + +createClient({ + ws: { + intents: + GatewayIntentBits.GuildBans | + GatewayIntentBits.GuildEmojisAndStickers | + GatewayIntentBits.GuildInvites | + GatewayIntentBits.GuildMembers | + GatewayIntentBits.GuildMessageReactions | + GatewayIntentBits.GuildMessages | + GatewayIntentBits.GuildVoiceStates | + GatewayIntentBits.Guilds | + GatewayIntentBits.MessageContent + } +}); + +await loadAll(); + +console.log( + gradient.vice.multiline( + createBanner({ + logo: [ + String.raw` __`, + String.raw` __╱‾‾╲__`, + String.raw` __╱‾‾╲__╱‾‾╲__`, + String.raw`╱‾‾╲__╱ ╲__╱‾‾╲`, + String.raw`╲__╱ ╲__╱ ╲__╱`, + String.raw` ╲__╱ ╲__╱`, + String.raw` ╲__╱`, + '' + ], + name: [ + String.raw` _______ ________ ________ ________ ________ ________ ________ `, + String.raw` ╱╱ ╲╱ ╲╱ ╲╱ ╲╱ ╱ ╱ ╲╱ ╲╱ ╱ ╲ `, + String.raw` ╱╱ __╱ ╱ _╱ ╱ ╱ ╱ ╱ `, + String.raw`╱ ╱ ╱ ╱╱ ╱╱ _╱ ╱ ╱╲__ ╱ `, + String.raw`╲________╱╲___╱____╱ ╲______╱ ╲________╱╲________╱╲___╱____╱ ╲_____╱ ` + ], + extra: [ + ` Skyra ${envParseString('CLIENT_VERSION')} Gateway`, + ` ├ WebSocket: ${container.ws.options.shardCount} shards`, + ` └ Redis : ${container.redis.options.host}:${container.redis.options.port}` + ] + }) + ) +); +console.log('Ready'); diff --git a/projects/gateway/src/tsconfig.json b/projects/gateway/src/tsconfig.json new file mode 100644 index 00000000000..c7306c7c8bb --- /dev/null +++ b/projects/gateway/src/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "../dist", + "rootDir": ".", + "baseUrl": ".", + "paths": { + "#lib/*": ["lib/*"] + }, + "composite": true + }, + "include": ["."] +} diff --git a/projects/gateway/tests/.gitkeep b/projects/gateway/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/projects/gateway/tsconfig.eslint.json b/projects/gateway/tsconfig.eslint.json new file mode 100644 index 00000000000..388bb593b9f --- /dev/null +++ b/projects/gateway/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.eslint.json", + "include": ["src", "tests"] +} diff --git a/projects/shared/package.json b/projects/shared/package.json new file mode 100644 index 00000000000..06b953549d9 --- /dev/null +++ b/projects/shared/package.json @@ -0,0 +1,42 @@ +{ + "name": "skyra-shared", + "version": "7.0.0", + "description": "Shared utilities for Skyra's projects", + "author": "Skyra Project", + "license": "Apache-2.0", + "private": true, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "type": "module", + "imports": { + "#lib/*": "./dist/lib/*.js" + }, + "scripts": { + "build": "tsc -b src", + "dev": "yarn build && yarn start", + "watch": "tsc -b src -w", + "prisma:generate": "yarn prisma generate", + "clean": "node scripts/clean.mjs", + "start": "node --enable-source-maps dist/main.js", + "test": "eslint --ext ts src", + "lint": "eslint --fix --ext ts src", + "format": "prettier --write --loglevel=warn \"src/**/*.{js,ts,mts,json}\"" + }, + "dependencies": { + "@discordjs/collection": "^1.0.1", + "@sapphire/pieces": "^3.3.5", + "@sapphire/result": "^2.1.1", + "@sapphire/utilities": "^3.8.0", + "@vladfrangu/async_event_emitter": "^2.0.1", + "discord-api-types": "^0.37.0", + "ioredis": "^5.2.2", + "ix": "^5.0.0" + }, + "devDependencies": { + "typescript": "^4.7.4" + } +} diff --git a/projects/shared/scripts/clean.mjs b/projects/shared/scripts/clean.mjs new file mode 100644 index 00000000000..1bd25ff105e --- /dev/null +++ b/projects/shared/scripts/clean.mjs @@ -0,0 +1,8 @@ +import { rm } from 'node:fs/promises'; + +const rootFolder = new URL('../', import.meta.url); +const distFolder = new URL('dist/', rootFolder); + +const options = { recursive: true, force: true }; + +await rm(distFolder, options); diff --git a/projects/shared/src/index.ts b/projects/shared/src/index.ts new file mode 100644 index 00000000000..84e8a7a410d --- /dev/null +++ b/projects/shared/src/index.ts @@ -0,0 +1,51 @@ +export { + AliasPiece, + AliasPieceOptions, + AliasStore, + container, + LoaderError, + MissingExportsError, + Piece, + Store, + StoreRegistry, + StoreRegistryEntries +} from '@sapphire/pieces'; +export { default as Redis, type RedisOptions } from 'ioredis'; +export type { HashScopedCache } from './lib/cache/base/HashScopedCache.js'; +export type { ScopedCache } from './lib/cache/base/ScopedCache.js'; +export * from './lib/cache/Cache.js'; +export type { CacheChannels } from './lib/cache/CacheChannels.js'; +export type { CacheEmojis } from './lib/cache/CacheEmojis.js'; +export type { CacheGuilds } from './lib/cache/CacheGuilds.js'; +export type { CacheMembers } from './lib/cache/CacheMembers.js'; +export type { CacheMessages } from './lib/cache/CacheMessages.js'; +export type { CacheRoles } from './lib/cache/CacheRoles.js'; +export type { CacheStickers } from './lib/cache/CacheStickers.js'; +export * from './lib/cache/structures/Channel.js'; +export * from './lib/cache/structures/Emoji.js'; +export * from './lib/cache/structures/Guild.js'; +export * from './lib/cache/structures/interfaces/BufferEncodable.js'; +export * from './lib/cache/structures/interfaces/Identifiable.js'; +export * from './lib/cache/structures/interfaces/IStructure.js'; +export * from './lib/cache/structures/interfaces/JsonEncodable.js'; +export * from './lib/cache/structures/Member.js'; +export * from './lib/cache/structures/Message.js'; +export * from './lib/cache/structures/Role.js'; +export * from './lib/cache/structures/Sticker.js'; +export * from './lib/cache/structures/unions/channel/base/GuildBasedChannel.js'; +export * from './lib/cache/structures/unions/channel/base/GuildTextBasedChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildCategoryChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildForumChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildNewsChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildTextChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildThreadChannel.js'; +export * from './lib/cache/structures/unions/channel/GuildVoiceChannel.js'; +export * from './lib/cache/structures/values/GuildFeatures.js'; +export * from './lib/common/bits.js'; +export * from './lib/common/util.js'; +export * from './lib/data/Reader.js'; +export * from './lib/data/Writer.js'; +export * from './lib/messaging/MessageBroker.js'; +export * from './lib/messaging/RedisMessage.js'; +export * from './lib/structures/Listener.js'; +export * from './lib/structures/ListenerStore.js'; diff --git a/projects/shared/src/lib/cache/Cache.ts b/projects/shared/src/lib/cache/Cache.ts new file mode 100644 index 00000000000..7dbb0b5cfb1 --- /dev/null +++ b/projects/shared/src/lib/cache/Cache.ts @@ -0,0 +1,41 @@ +import { isNullishOrEmpty, type Nullish } from '@sapphire/utilities'; +import type { Redis } from 'ioredis'; +import { CacheChannels } from './CacheChannels.js'; +import { CacheEmojis } from './CacheEmojis.js'; +import { CacheGuilds } from './CacheGuilds.js'; +import { CacheMembers } from './CacheMembers.js'; +import { CacheMessages } from './CacheMessages.js'; +import { CacheRoles } from './CacheRoles.js'; +import { CacheStickers } from './CacheStickers.js'; + +export class Cache { + public readonly client: Redis; + public readonly channels: CacheChannels; + public readonly emojis: CacheEmojis; + public readonly guilds: CacheGuilds; + public readonly members: CacheMembers; + public readonly messages: CacheMessages; + public readonly roles: CacheRoles; + public readonly stickers: CacheStickers; + protected readonly prefix: string; + + public constructor(options: Cache.Options) { + this.client = options.client; + this.prefix = isNullishOrEmpty(options.prefix) ? '' : `${options.prefix}:`; + + this.channels = new CacheChannels(this); + this.emojis = new CacheEmojis(this); + this.guilds = new CacheGuilds(this); + this.members = new CacheMembers(this); + this.messages = new CacheMessages(this); + this.roles = new CacheRoles(this); + this.stickers = new CacheStickers(this); + } +} + +export namespace Cache { + export interface Options { + client: Redis; + prefix?: string | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/CacheChannels.ts b/projects/shared/src/lib/cache/CacheChannels.ts new file mode 100644 index 00000000000..26e647613b7 --- /dev/null +++ b/projects/shared/src/lib/cache/CacheChannels.ts @@ -0,0 +1,7 @@ +import { Channel } from './structures/Channel.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheChannels extends HashScopedCache { + public readonly tail = ':channels'; + public readonly structure = Channel; +} diff --git a/projects/shared/src/lib/cache/CacheEmojis.ts b/projects/shared/src/lib/cache/CacheEmojis.ts new file mode 100644 index 00000000000..47f11470ced --- /dev/null +++ b/projects/shared/src/lib/cache/CacheEmojis.ts @@ -0,0 +1,7 @@ +import { Emoji } from './structures/Emoji.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheEmojis extends HashScopedCache { + public readonly tail = ':emojis'; + public readonly structure = Emoji; +} diff --git a/projects/shared/src/lib/cache/CacheGuilds.ts b/projects/shared/src/lib/cache/CacheGuilds.ts new file mode 100644 index 00000000000..b4fad7ff90c --- /dev/null +++ b/projects/shared/src/lib/cache/CacheGuilds.ts @@ -0,0 +1,72 @@ +import { Collection } from '@discordjs/collection'; +import { isNullish } from '@sapphire/utilities'; +import { count } from 'ix/asynciterable/count.js'; +import { Reader } from '../data/Reader.js'; +import { ScopedCache } from './base/ScopedCache.js'; +import { Guild } from './structures/Guild.js'; + +export class CacheGuilds extends ScopedCache { + public async set(guild: Guild) { + await this.client.set(this.makeId(guild.id), guild.toBuffer()); + } + + public async has(guildId: ScopedCache.Snowflake) { + const data = await this.client.exists(this.makeId(guildId)); + return data === 1; + } + + public async get(guildId: ScopedCache.Snowflake) { + const data = await this.client.getBuffer(this.makeId(guildId)); + return data ? Guild.fromBinary(new Reader(data)) : null; + } + + public async getAll() { + const result = new Collection(); + for await (const guild of this.values()) { + result.set(guild.id, guild); + } + + return result; + } + + public count() { + return count(this.client.scanBufferStream({ match: this.makeId('*'), count: 100 })); + } + + public async remove(guildId: ScopedCache.Snowflake) { + const key = this.makeId(guildId); + const result = await this.client.del(key, `${key}:channels`, `${key}:emojis`, `${key}:members`, `${key}:roles`, `${key}:stickers`); + return result > 0; + } + + public async *keys(): AsyncIterable { + // eslint-disable-next-line @typescript-eslint/dot-notation + const offset = this.parent['prefix'].length; + for await (const id of this.client.scanStream({ match: this.makeId('*'), count: 100 }) as AsyncIterable) { + yield BigInt(id.slice(offset)); + } + } + + public async *values(): AsyncIterable { + const match = this.makeId('*'); + const count = 100; + + let cursor = '0'; + do { + const [next, keys] = await this.client.scanBuffer(cursor, 'MATCH', match, 'COUNT', count); + const buffers = await this.client.mgetBuffer(...keys); + for (const buffer of buffers) { + if (isNullish(buffer)) continue; + yield Guild.fromBinary(new Reader(buffer)); + } + + cursor = next.toString(); + } while (cursor !== '0'); + } + + public async *entries(): AsyncIterable<[id: bigint, value: Guild]> { + for await (const value of this.values()) { + yield [value.id, value]; + } + } +} diff --git a/projects/shared/src/lib/cache/CacheMembers.ts b/projects/shared/src/lib/cache/CacheMembers.ts new file mode 100644 index 00000000000..54325196c89 --- /dev/null +++ b/projects/shared/src/lib/cache/CacheMembers.ts @@ -0,0 +1,7 @@ +import { Member } from './structures/Member.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheMembers extends HashScopedCache { + public readonly tail = ':members'; + public readonly structure = Member; +} diff --git a/projects/shared/src/lib/cache/CacheMessages.ts b/projects/shared/src/lib/cache/CacheMessages.ts new file mode 100644 index 00000000000..667923215f0 --- /dev/null +++ b/projects/shared/src/lib/cache/CacheMessages.ts @@ -0,0 +1,7 @@ +import { Message } from './structures/Message.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheMessages extends HashScopedCache { + public readonly tail = ':messages'; + public readonly structure = Message; +} diff --git a/projects/shared/src/lib/cache/CacheRoles.ts b/projects/shared/src/lib/cache/CacheRoles.ts new file mode 100644 index 00000000000..a55e94e8120 --- /dev/null +++ b/projects/shared/src/lib/cache/CacheRoles.ts @@ -0,0 +1,7 @@ +import { Role } from './structures/Role.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheRoles extends HashScopedCache { + public readonly tail = ':roles'; + public readonly structure = Role; +} diff --git a/projects/shared/src/lib/cache/CacheStickers.ts b/projects/shared/src/lib/cache/CacheStickers.ts new file mode 100644 index 00000000000..82aabae9ec8 --- /dev/null +++ b/projects/shared/src/lib/cache/CacheStickers.ts @@ -0,0 +1,7 @@ +import { Sticker } from './structures/Sticker.js'; +import { HashScopedCache } from './base/HashScopedCache.js'; + +export class CacheStickers extends HashScopedCache { + public readonly tail = ':stickers'; + public readonly structure = Sticker; +} diff --git a/projects/shared/src/lib/cache/base/HashScopedCache.ts b/projects/shared/src/lib/cache/base/HashScopedCache.ts new file mode 100644 index 00000000000..5d3a0c21657 --- /dev/null +++ b/projects/shared/src/lib/cache/base/HashScopedCache.ts @@ -0,0 +1,154 @@ +import { Collection } from '@discordjs/collection'; +import { isNullish } from '@sapphire/utilities'; +import { Reader } from '../../data/Reader.js'; +import type { IStructure, IStructureConstructor } from '../structures/interfaces/IStructure.js'; +import { ScopedCache } from './ScopedCache.js'; + +export abstract class HashScopedCache extends ScopedCache { + public abstract readonly tail: string; + public abstract readonly structure: IStructureConstructor; + + /** + * Sets an entry to the hashmap. + * @param parentId The parent's ID. + * @param entries The entries to set to the cache. Duplicated entries will be replaced. + */ + public set(parentId: ScopedCache.Snowflake, entries: T | readonly T[]) { + return Array.isArray(entries) ? this.setMany(parentId, entries as readonly T[]) : this.setOne(parentId, entries as T); + } + + /** + * Checks whether or not an ID is in the hashmap. + * @param parentId The parent's ID. + * @param entryId The entry's ID to check. + */ + public async has(parentId: ScopedCache.Snowflake, entryId: ScopedCache.Snowflake) { + const data = await this.client.hexists(this.makeId(parentId), entryId.toString()); + return data === 1; + } + + /** + * Gets an entry by its ID from the hashmap. + * @param parentId The parent's ID. + * @param entryId The entry's ID to retrieve. + * @returns The entry, if any. + */ + public async get(parentId: ScopedCache.Snowflake, entryId: ScopedCache.Snowflake): Promise; + /** + * Gets multiple entries by its ID from the hashmap. + * @param parentId The parent's ID. + * @param entries The IDs of the entries to retrieve. + * @returns The entries inside a Collection, keyed by their ID. + * @remark The IDs of entries that do not exist are dropped. + */ + public async get(parentId: ScopedCache.Snowflake, entries: readonly ScopedCache.Snowflake[]): Promise>; + public async get(parentId: ScopedCache.Snowflake, entries: ScopedCache.Snowflake | readonly ScopedCache.Snowflake[]) { + return Array.isArray(entries) + ? this.getMany(parentId, entries as readonly ScopedCache.Snowflake[]) + : this.getOne(parentId, entries as ScopedCache.Snowflake); + } + + /** + * Gets all the keys from the hashmap. + * @param parentId The parent's ID. + */ + public async keys(parentId: ScopedCache.Snowflake) { + return this.client.hkeys(this.makeId(parentId)); + } + + /** + * Gets all the values from the hashmap. + * @param parentId The parent's ID. + */ + public async values(parentId: ScopedCache.Snowflake) { + const buffers = await this.client.hvalsBuffer(this.makeId(parentId)); + return buffers.map((buffer) => this.structure.fromBinary(new Reader(buffer))); + } + + /** + * Gets all the entries from the hashmap. + * @param parentId The parent's ID. + * @returns The entries inside a Collection, keyed by their ID. + */ + public async entries(parentId: ScopedCache.Snowflake) { + const buffers = await this.client.hvalsBuffer(this.makeId(parentId)); + + const result = new Collection(); + for (const buffer of buffers) { + const channel = this.structure.fromBinary(new Reader(buffer)); + result.set(channel.id, channel); + } + + return result; + } + + /** + * Counts the amount of entries in the hashmap. + * @param parentId The parent's ID. + * @returns The amount of entries the hashmap has. + */ + public count(parentId: ScopedCache.Snowflake) { + return this.client.hlen(this.makeId(parentId)); + } + + /** + * Removes one or more entries from the hashmap. + * @param parentId The parent's ID. + * @param entries The IDs of the entries to remove. + * @returns The amount of entries that were removed. + */ + public async remove(parentId: ScopedCache.Snowflake, entries: ScopedCache.Snowflake | readonly ScopedCache.Snowflake[]) { + const result = await (Array.isArray(entries) + ? this.client.hdel(this.makeId(parentId), ...entries.map((entry: ScopedCache.Snowflake) => entry.toString())) + : this.client.hdel(this.makeId(parentId), entries.toString())); + return result; + } + + /** + * Removes the hashmap from the cache, effectively clearing all of its entries. + * @param parentId The parent's ID. + * @returns Whether or not the hashmap has been cleared. + */ + public async clear(parentId: ScopedCache.Snowflake) { + const result = await this.client.del(this.makeId(parentId)); + return result > 0; + } + + protected override makeId(parentId: ScopedCache.Snowflake) { + // eslint-disable-next-line @typescript-eslint/dot-notation + return `${this.parent['prefix']}${parentId}${this.tail}`; + } + + private async getOne(parentId: ScopedCache.Snowflake, entryId: ScopedCache.Snowflake) { + const data = await this.client.hgetBuffer(this.makeId(parentId), entryId.toString()); + return data ? this.structure.fromBinary(new Reader(data)) : null; + } + + private async getMany(parentId: ScopedCache.Snowflake, entries: readonly ScopedCache.Snowflake[]): Promise> { + const buffers = await this.client.hmgetBuffer(this.makeId(parentId), ...entries.map((entry) => entry.toString())); + + const result = new Collection(); + for (const buffer of buffers) { + if (isNullish(buffer)) continue; + + const channel = this.structure.fromBinary(new Reader(buffer)); + result.set(channel.id, channel); + } + + return result; + } + + private async setOne(parentId: ScopedCache.Snowflake, entry: T) { + await this.client.hset(this.makeId(parentId), entry.id.toString(), entry.toBuffer()); + } + + private async setMany(parentId: ScopedCache.Snowflake, entries: readonly T[]) { + if (entries.length === 0) return; + if (entries.length === 1) return this.setOne(parentId, entries[0]); + await this.client.hmset(this.makeId(parentId), ...entries.flatMap((entry) => [entry.id.toString(), entry.toBuffer()])); + } +} + +export namespace HashScopedCache { + export type Snowflake = ScopedCache.Snowflake; +} diff --git a/projects/shared/src/lib/cache/base/ScopedCache.ts b/projects/shared/src/lib/cache/base/ScopedCache.ts new file mode 100644 index 00000000000..427e32b95dd --- /dev/null +++ b/projects/shared/src/lib/cache/base/ScopedCache.ts @@ -0,0 +1,22 @@ +import type { Cache } from '../Cache.js'; + +export abstract class ScopedCache { + public readonly parent: Cache; + + public constructor(parent: Cache) { + this.parent = parent; + } + + protected get client() { + return this.parent.client; + } + + protected makeId(parentId: ScopedCache.Snowflake) { + // eslint-disable-next-line @typescript-eslint/dot-notation + return `${this.parent['prefix']}${parentId}`; + } +} + +export namespace ScopedCache { + export type Snowflake = bigint | string; +} diff --git a/projects/shared/src/lib/cache/structures/Channel.ts b/projects/shared/src/lib/cache/structures/Channel.ts new file mode 100644 index 00000000000..d456f526e54 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Channel.ts @@ -0,0 +1,95 @@ +import { ChannelType, type APIChannel } from 'discord-api-types/v10'; +import type { Reader } from '../../data/Reader.js'; +import { GuildCategoryChannel } from './unions/channel/GuildCategoryChannel.js'; +import { GuildForumChannel } from './unions/channel/GuildForumChannel.js'; +import { GuildNewsChannel } from './unions/channel/GuildNewsChannel.js'; +import { GuildTextChannel } from './unions/channel/GuildTextChannel.js'; +import { GuildThreadChannel } from './unions/channel/GuildThreadChannel.js'; +import { GuildVoiceChannel } from './unions/channel/GuildVoiceChannel.js'; + +export type Channel = + | GuildCategoryChannel // + | GuildForumChannel + | GuildNewsChannel + | GuildTextChannel + | GuildThreadChannel + | GuildVoiceChannel; + +export namespace Channel { + export type Type = + | GuildTextChannel.Type + | GuildVoiceChannel.Type + | GuildCategoryChannel.Type + | GuildNewsChannel.Type + | GuildForumChannel.Type + | GuildThreadChannel.Type; + + export type Json = + | GuildTextChannel.Json + | GuildVoiceChannel.Json + | GuildCategoryChannel.Json + | GuildNewsChannel.Json + | GuildForumChannel.Json + | GuildThreadChannel.Json; + + export type Data = + | GuildTextChannel.Data + | GuildVoiceChannel.Data + | GuildCategoryChannel.Data + | GuildNewsChannel.Data + | GuildForumChannel.Data + | GuildThreadChannel.Data; + + export function fromAPI(data: APIChannel): Channel { + const { type } = data; + switch (type) { + case ChannelType.GuildText: + return GuildTextChannel.fromAPI(data); + case ChannelType.GuildStageVoice: + case ChannelType.GuildVoice: + return GuildVoiceChannel.fromAPI(data); + case ChannelType.GuildCategory: + return GuildCategoryChannel.fromAPI(data); + case ChannelType.GuildNews: + return GuildNewsChannel.fromAPI(data); + case ChannelType.GuildForum: + return GuildForumChannel.fromAPI(data); + case ChannelType.GuildPublicThread: + case ChannelType.GuildPrivateThread: + case ChannelType.GuildNewsThread: + return GuildThreadChannel.fromAPI(data); + default: + throw new RangeError(`Unsupported channel type: ${type}`); + } + } + + export function fromBinary(reader: Reader): Channel { + // Channel data is encoded in the following way: + // + // | 0 | 1...8 | 9 | 10 | ... + // | Null | ID (u64) | Null | Type (u8) | ... + // + // So in order to read which type the channel is, we read the 10th bit, + // which will contain the value for `channel.type`: + const type = reader.data.readUInt8(10) as ChannelType; + switch (type) { + case ChannelType.GuildText: + return GuildTextChannel.fromBinary(reader); + case ChannelType.GuildStageVoice: + case ChannelType.GuildVoice: + return GuildVoiceChannel.fromBinary(reader); + case ChannelType.GuildCategory: + return GuildCategoryChannel.fromBinary(reader); + case ChannelType.GuildNews: + return GuildNewsChannel.fromBinary(reader); + case ChannelType.GuildForum: + return GuildForumChannel.fromBinary(reader); + case ChannelType.GuildPublicThread: + case ChannelType.GuildPrivateThread: + case ChannelType.GuildNewsThread: + return GuildThreadChannel.fromBinary(reader); + default: + throw new RangeError(`Unsupported channel type: ${type}`); + } + } +} diff --git a/projects/shared/src/lib/cache/structures/Emoji.ts b/projects/shared/src/lib/cache/structures/Emoji.ts new file mode 100644 index 00000000000..c79014cb19a --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Emoji.ts @@ -0,0 +1,98 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIEmoji } from 'discord-api-types/v10'; +import { arrayEquals } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; + +export class Emoji implements IStructure { + public readonly id: bigint; + public readonly name: string; + public readonly animated: boolean | null; + public readonly available: boolean | null; + public readonly managed: boolean | null; + public readonly requireColons: boolean | null; + public readonly roles: readonly bigint[]; + + public constructor(data: Emoji.Data) { + this.id = data.id; + this.name = data.name; + this.animated = data.animated ?? null; + this.available = data.available ?? null; + this.managed = data.managed ?? null; + this.requireColons = data.requireColons ?? null; + this.roles = data.roles; + } + + public equals(other: Emoji) { + return ( + this.id === other.id && + this.name === other.name && + this.animated === other.animated && + this.available === other.available && + this.managed === other.managed && + this.requireColons === other.requireColons && + arrayEquals(this.roles, other.roles) + ); + } + + public toBuffer(): Buffer { + return new Writer(100) + .u64(this.id) + .string(this.name) + .bool(this.animated) + .bool(this.available) + .bool(this.managed) + .bool(this.requireColons) + .array(this.roles, (buffer, value) => buffer.u64(value)).trimmed; + } + + public toJSON(): Emoji.Json { + return { + id: this.id.toString(), + name: this.name, + animated: this.animated ?? undefined, + available: this.available ?? undefined, + managed: this.managed ?? undefined, + require_colons: this.requireColons ?? undefined, + roles: this.roles.length === 0 ? undefined : this.roles.map((role) => role.toString()) + }; + } + + public static fromAPI(data: Emoji.Json): Emoji { + return new Emoji({ + id: BigInt(data.id!), + name: data.name!, + animated: data.animated, + available: data.available, + managed: data.managed, + requireColons: data.require_colons, + roles: data.roles?.map((roles) => BigInt(roles)) ?? [] + }); + } + + public static fromBinary(reader: Reader): Emoji { + return new Emoji({ + id: reader.u64()!, + name: reader.string()!, + animated: reader.bool(), + available: reader.bool(), + managed: reader.bool(), + requireColons: reader.bool(), + roles: reader.array((reader) => reader.u64()!) + }); + } +} + +export namespace Emoji { + export type Json = APIEmoji; + export interface Data { + id: bigint; + name: string; + animated?: boolean | Nullish; + available?: boolean | Nullish; + managed?: boolean | Nullish; + requireColons?: boolean | Nullish; + roles: readonly bigint[]; + } +} diff --git a/projects/shared/src/lib/cache/structures/Guild.ts b/projects/shared/src/lib/cache/structures/Guild.ts new file mode 100644 index 00000000000..1b02d9e6a39 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Guild.ts @@ -0,0 +1,266 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { + APIGuild, + GuildDefaultMessageNotifications, + GuildExplicitContentFilter, + GuildHubType, + GuildMFALevel, + GuildNSFWLevel, + GuildPremiumTier, + GuildSystemChannelFlags, + GuildVerificationLevel +} from 'discord-api-types/v10'; +import { normalizeNullable } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; +import { fromFeatures, toFeatures } from './values/GuildFeatures.js'; + +export class Guild implements IStructure { + public readonly id: bigint; + public readonly afkChannelId: bigint | null; + public readonly afkTimeout: number; + public readonly banner: string | null; + public readonly defaultMessageNotifications: GuildDefaultMessageNotifications; + public readonly description: string | null; + public readonly discoverySplash: string | null; + public readonly explicitContentFilter: GuildExplicitContentFilter; + public readonly hubType: GuildHubType | null; + public readonly icon: string | null; + public readonly features: number; + public readonly maxMembers: number | null; + public readonly maxPresences: number | null; + public readonly maxVideoChannelUsers: number | null; + public readonly mfaLevel: GuildMFALevel; + public readonly name: string; + public readonly nsfwLevel: GuildNSFWLevel; + public readonly ownerId: bigint; + public readonly preferredLocale: string; + public readonly premiumProgressBarEnabled: boolean; + public readonly premiumSubscriptionCount: number | null; + public readonly premiumTier: GuildPremiumTier; + public readonly publicUpdatesChannelId: bigint | null; + public readonly rulesChannelId: bigint | null; + public readonly splash: string | null; + public readonly systemChannelFlags: GuildSystemChannelFlags; + public readonly systemChannelId: bigint | null; + public readonly vanityUrlCode: string | null; + public readonly verificationLevel: GuildVerificationLevel; + public readonly widgetChannelId: bigint | null; + public readonly widgetEnabled: boolean | null; + + public constructor(data: Guild.Data) { + this.id = data.id; + this.afkChannelId = data.afkChannelId ?? null; + this.afkTimeout = data.afkTimeout; + this.banner = data.banner ?? null; + this.defaultMessageNotifications = data.defaultMessageNotifications; + this.description = data.description ?? null; + this.discoverySplash = data.discoverySplash ?? null; + this.explicitContentFilter = data.explicitContentFilter; + this.hubType = data.hubType ?? null; + this.icon = data.icon ?? null; + this.features = data.features; + this.maxMembers = data.maxMembers ?? null; + this.maxPresences = data.maxPresences ?? null; + this.maxVideoChannelUsers = data.maxVideoChannelUsers ?? null; + this.mfaLevel = data.mfaLevel; + this.name = data.name; + this.nsfwLevel = data.nsfwLevel; + this.ownerId = data.ownerId; + this.preferredLocale = data.preferredLocale; + this.premiumProgressBarEnabled = data.premiumProgressBarEnabled; + this.premiumSubscriptionCount = data.premiumSubscriptionCount ?? null; + this.premiumTier = data.premiumTier; + this.publicUpdatesChannelId = data.publicUpdatesChannelId ?? null; + this.rulesChannelId = data.rulesChannelId ?? null; + this.splash = data.splash ?? null; + this.systemChannelFlags = data.systemChannelFlags; + this.systemChannelId = data.systemChannelId ?? null; + this.vanityUrlCode = data.vanityUrlCode ?? null; + this.verificationLevel = data.verificationLevel; + this.widgetChannelId = data.widgetChannelId ?? null; + this.widgetEnabled = data.widgetEnabled ?? null; + } + + public toBuffer(): Buffer { + return new Writer(200) + .u64(this.id) + .u64(this.afkChannelId) + .i32(this.afkTimeout) + .string(this.banner) + .u8(this.defaultMessageNotifications) + .string(this.description) + .string(this.discoverySplash) + .u8(this.explicitContentFilter) + .u8(this.hubType) + .string(this.icon) + .u32(this.features) + .u32(this.maxMembers) + .u32(this.maxPresences) + .u32(this.maxVideoChannelUsers) + .u8(this.mfaLevel) + .string(this.name) + .u8(this.nsfwLevel) + .u64(this.ownerId) + .string(this.preferredLocale) + .bool(this.premiumProgressBarEnabled) + .u16(this.premiumSubscriptionCount) + .u8(this.premiumTier) + .u64(this.publicUpdatesChannelId) + .u64(this.rulesChannelId) + .string(this.splash) + .u8(this.systemChannelFlags) + .u64(this.systemChannelId) + .string(this.vanityUrlCode) + .u8(this.verificationLevel) + .u64(this.widgetChannelId) + .bool(this.widgetEnabled).trimmed; + } + + public toJSON(): Guild.Json { + return { + id: this.id.toString(), + afk_channel_id: this.afkChannelId?.toString() ?? null, + afk_timeout: this.afkTimeout, + banner: this.banner, + default_message_notifications: this.defaultMessageNotifications, + description: this.description, + discovery_splash: this.discoverySplash, + explicit_content_filter: this.explicitContentFilter, + hub_type: this.hubType, + icon: this.icon, + features: fromFeatures(this.features), + max_members: this.maxMembers ?? undefined, + max_presences: this.maxPresences ?? undefined, + max_video_channel_users: this.maxVideoChannelUsers ?? undefined, + mfa_level: this.mfaLevel, + name: this.name, + nsfw_level: this.nsfwLevel, + owner_id: this.ownerId.toString(), + preferred_locale: this.preferredLocale, + premium_progress_bar_enabled: this.premiumProgressBarEnabled, + premium_subscription_count: this.premiumSubscriptionCount ?? undefined, + premium_tier: this.premiumTier, + public_updates_channel_id: this.publicUpdatesChannelId?.toString() ?? null, + rules_channel_id: this.rulesChannelId?.toString() ?? null, + splash: this.splash, + system_channel_flags: this.systemChannelFlags, + system_channel_id: this.systemChannelId?.toString() ?? null, + vanity_url_code: this.vanityUrlCode, + verification_level: this.verificationLevel, + widget_channel_id: this.widgetChannelId?.toString(), + widget_enabled: this.widgetEnabled ?? undefined + }; + } + + public static fromAPI(data: Guild.Json): Guild { + return new Guild({ + id: BigInt(data.id), + afkChannelId: normalizeNullable(data.afk_channel_id, BigInt), + afkTimeout: data.afk_timeout, + banner: data.banner, + defaultMessageNotifications: data.default_message_notifications, + description: data.description, + discoverySplash: data.discovery_splash, + explicitContentFilter: data.explicit_content_filter, + hubType: data.hub_type, + icon: data.icon, + features: toFeatures(data.features), + maxMembers: data.max_members, + maxPresences: data.max_presences, + maxVideoChannelUsers: data.max_video_channel_users, + mfaLevel: data.mfa_level, + name: data.name, + nsfwLevel: data.nsfw_level, + ownerId: BigInt(data.owner_id), + preferredLocale: data.preferred_locale, + premiumProgressBarEnabled: data.premium_progress_bar_enabled, + premiumSubscriptionCount: data.premium_subscription_count, + premiumTier: data.premium_tier, + publicUpdatesChannelId: normalizeNullable(data.public_updates_channel_id, BigInt), + rulesChannelId: normalizeNullable(data.rules_channel_id, BigInt), + splash: data.splash, + systemChannelFlags: data.system_channel_flags, + systemChannelId: normalizeNullable(data.system_channel_id, BigInt), + vanityUrlCode: data.vanity_url_code, + verificationLevel: data.verification_level, + widgetChannelId: normalizeNullable(data.widget_channel_id, BigInt), + widgetEnabled: data.widget_enabled + }); + } + + public static fromBinary(reader: Reader): Guild { + return new Guild({ + id: reader.u64()!, + afkChannelId: reader.u64(), + afkTimeout: reader.i32()!, + banner: reader.string(), + defaultMessageNotifications: reader.u8()!, + description: reader.string(), + discoverySplash: reader.string(), + explicitContentFilter: reader.u8()!, + hubType: reader.u8(), + icon: reader.string(), + features: reader.u32()!, + maxMembers: reader.u32(), + maxPresences: reader.u32(), + maxVideoChannelUsers: reader.u32(), + mfaLevel: reader.u8()!, + name: reader.string()!, + nsfwLevel: reader.u8()!, + ownerId: reader.u64()!, + preferredLocale: reader.string()!, + premiumProgressBarEnabled: reader.bool()!, + premiumSubscriptionCount: reader.u16(), + premiumTier: reader.u8()!, + publicUpdatesChannelId: reader.u64(), + rulesChannelId: reader.u64(), + splash: reader.string(), + systemChannelFlags: reader.u8()!, + systemChannelId: reader.u64(), + vanityUrlCode: reader.string(), + verificationLevel: reader.u8()!, + widgetChannelId: reader.u64(), + widgetEnabled: reader.bool() + }); + } +} + +export namespace Guild { + export type Json = Omit; + + export interface Data { + id: bigint; + afkChannelId?: bigint | Nullish; + afkTimeout: number; + banner?: string | Nullish; + defaultMessageNotifications: GuildDefaultMessageNotifications; + description?: string | Nullish; + discoverySplash?: string | Nullish; + explicitContentFilter: GuildExplicitContentFilter; + hubType?: GuildHubType | Nullish; + icon?: string | Nullish; + features: number; + maxMembers?: number | Nullish; + maxPresences?: number | Nullish; + maxVideoChannelUsers?: number | Nullish; + mfaLevel: GuildMFALevel; + name: string; + nsfwLevel: GuildNSFWLevel; + ownerId: bigint; + preferredLocale: string; + premiumProgressBarEnabled: boolean; + premiumSubscriptionCount?: number | Nullish; + premiumTier: GuildPremiumTier; + publicUpdatesChannelId?: bigint | Nullish; + rulesChannelId?: bigint | Nullish; + splash?: string | Nullish; + systemChannelFlags: GuildSystemChannelFlags; + systemChannelId?: bigint | Nullish; + vanityUrlCode?: string | Nullish; + verificationLevel: GuildVerificationLevel; + widgetChannelId?: bigint | Nullish; + widgetEnabled?: boolean | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/Member.ts b/projects/shared/src/lib/cache/structures/Member.ts new file mode 100644 index 00000000000..482fad13c76 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Member.ts @@ -0,0 +1,171 @@ +import { isNullish, type Nullish } from '@sapphire/utilities'; +import type { Nullable } from 'discord-api-types/utils/internals.js'; +import type { APIGuildMember, APIUser } from 'discord-api-types/v10'; +import { defaultOptional, fromTimestamp, toTimestamp } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; + +export class Member implements IStructure { + public readonly id: bigint; + public readonly username: string; + public readonly discriminator: number; + public readonly bot: boolean | null; + public readonly avatar: string | null; + public readonly flags: number | null; + public readonly nickname: string | null; + public readonly guildAvatar: string | null; + public readonly roles: readonly bigint[]; + public readonly joinedAt: number | null; + public readonly premiumSince: number | null; + public readonly deaf: boolean | null; + public readonly mute: boolean | null; + public readonly pending: boolean | null; + public readonly communicationDisabledUntil: number | null; + + public constructor(data: Member.Data) { + this.id = data.id; + this.username = data.username; + this.discriminator = data.discriminator; + this.bot = data.bot ?? null; + this.avatar = data.avatar ?? null; + this.flags = data.flags ?? null; + this.nickname = data.nickname ?? null; + this.guildAvatar = data.guildAvatar ?? null; + this.roles = data.roles; + this.joinedAt = data.joinedAt ?? null; + this.premiumSince = data.premiumSince ?? null; + this.deaf = data.deaf ?? null; + this.mute = data.mute ?? null; + this.pending = data.pending ?? null; + this.communicationDisabledUntil = data.communicationDisabledUntil ?? null; + } + + public patch(data: Partial) { + return new Member({ + id: this.id, + username: defaultOptional(data.user?.username, this.username), + discriminator: defaultOptional(data.user?.discriminator, this.discriminator, Number), + bot: defaultOptional(data.user?.bot, this.bot), + avatar: defaultOptional(data.user?.avatar, this.avatar), + flags: defaultOptional(data.user?.public_flags, this.flags), + nickname: defaultOptional(data.nick, this.nickname), + guildAvatar: defaultOptional(data.avatar, this.guildAvatar), + roles: defaultOptional(data.roles, this.roles, (values) => values.map((role) => BigInt(role))), + joinedAt: defaultOptional(data.joined_at, this.joinedAt, toTimestamp)!, + premiumSince: defaultOptional(data.premium_since, this.premiumSince, toTimestamp), + deaf: defaultOptional(data.deaf, this.deaf), + mute: defaultOptional(data.mute, this.mute), + pending: defaultOptional(data.pending, this.pending), + communicationDisabledUntil: defaultOptional(data.communication_disabled_until, this.communicationDisabledUntil, toTimestamp) + }); + } + + public toBuffer(): Buffer { + return new Writer(100) + .u64(this.id) + .string(this.username) + .u16(this.discriminator) + .bool(this.bot) + .string(this.avatar) + .u32(this.flags) + .string(this.nickname) + .string(this.guildAvatar) + .array(this.roles, (buffer, value) => buffer.u64(value)) + .date(this.joinedAt) + .date(this.premiumSince) + .bool(this.deaf) + .bool(this.mute) + .bool(this.pending) + .date(this.communicationDisabledUntil).trimmed; + } + + public toJSON(): Member.Json { + return { + user: { + id: this.id.toString(), + username: this.username, + discriminator: this.discriminator.toString().padStart(4, '0'), + bot: this.bot ?? undefined, + avatar: this.avatar, + public_flags: this.flags ?? undefined + }, + nick: this.nickname, + avatar: this.guildAvatar, + roles: this.roles.map((role) => role.toString()), + joined_at: fromTimestamp(this.joinedAt), + premium_since: fromTimestamp(this.premiumSince), + deaf: this.deaf ?? undefined, + mute: this.mute ?? undefined, + pending: this.pending ?? undefined, + communication_disabled_until: fromTimestamp(this.communicationDisabledUntil) + }; + } + + public static fromAPI(data: Member.Json, user?: APIUser): Member { + user ??= data.user; + if (isNullish(user)) throw new TypeError('Expected user to be defined'); + + return new Member({ + id: BigInt(user.id), + username: user.username, + discriminator: Number(user.discriminator), + bot: user.bot, + avatar: user.avatar, + flags: user.public_flags, + nickname: data.nick, + guildAvatar: data.avatar, + roles: data.roles.map((role) => BigInt(role)), + joinedAt: toTimestamp(data.joined_at), + premiumSince: toTimestamp(data.premium_since), + deaf: data.deaf, + mute: data.mute, + pending: data.pending, + communicationDisabledUntil: toTimestamp(data.communication_disabled_until) + }); + } + + public static fromBinary(reader: Reader): Member { + return new Member({ + id: reader.u64()!, + username: reader.string()!, + discriminator: reader.u16()!, + bot: reader.bool(), + avatar: reader.string(), + flags: reader.u32(), + nickname: reader.string(), + guildAvatar: reader.string(), + roles: reader.array((reader) => reader.u64()!), + joinedAt: reader.date()!, + premiumSince: reader.date(), + deaf: reader.bool()!, + mute: reader.bool()!, + pending: reader.bool(), + communicationDisabledUntil: reader.date() + }); + } +} + +export namespace Member { + export type Json = Omit & + Partial> & + Nullable>; + + export interface Data { + id: bigint; + username: string; + discriminator: number; + bot?: boolean | Nullish; + avatar?: string | Nullish; + flags?: number | Nullish; + nickname?: string | Nullish; + guildAvatar?: string | Nullish; + roles: readonly bigint[]; + joinedAt?: number | Nullish; + premiumSince?: number | Nullish; + deaf?: boolean | Nullish; + mute?: boolean | Nullish; + pending?: boolean | Nullish; + communicationDisabledUntil?: number | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/Message.ts b/projects/shared/src/lib/cache/structures/Message.ts new file mode 100644 index 00000000000..52b28dca2d9 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Message.ts @@ -0,0 +1,242 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIAttachment, APIEmbed, APIEmbedAuthor, APIMessage, APIUser } from 'discord-api-types/v10'; +import { defaultOptional, fromTimestamp, normalizeArray, normalizeNullable, normalizeOptional, toTimestamp } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; + +export class Message implements IStructure { + public readonly id: bigint; + public readonly channelId: bigint; + public readonly author: Message.DataUser; + public readonly content: string; + public readonly attachments: Message.DataAttachment[]; + public readonly embeds: Message.DataEmbed[]; + + public constructor(data: Message.Data) { + this.id = data.id; + this.channelId = data.channelId; + this.author = data.author; + this.content = data.content; + this.attachments = data.attachments ?? []; + this.embeds = data.embeds ?? []; + } + + public patch(data: Partial) { + return new Message({ + id: this.id, + channelId: this.channelId, + author: defaultOptional(data.author, this.author, (author) => Message.mapAuthor(author)), + content: defaultOptional(data.content, this.content), + attachments: defaultOptional(data.attachments, this.attachments, (attachments) => Message.mapAttachments(attachments)), + embeds: defaultOptional(data.embeds, this.embeds, (embeds) => Message.mapEmbeds(embeds)) + }); + } + + public toBuffer(): Buffer { + return new Writer(400) + .u64(this.id) + .u64(this.channelId) + .object(this.author, (buffer, value) => buffer.u64(value.id).string(value.username).u16(value.discriminator).string(value.avatar)) + .string(this.content) + .array(this.attachments, (buffer, value) => buffer.u64(value.id).string(value.name).string(value.url)) + .array(this.embeds, (buffer, value) => + buffer + .object(value.author, (buffer, author) => buffer.string(author.name).string(author.icon).string(author.url)) + .string(value.description) + .array(value.fields, (buffer, value) => buffer.string(value.name).string(value.value)) + .object(value.footer, (buffer, value) => buffer.string(value.text).string(value.icon)) + .object(value.image, (buffer, value) => buffer.string(value.url)) + .object(value.thumbnail, (buffer, value) => buffer.string(value.url)) + .date(value.timestamp) + .string(value.title) + .string(value.url) + ).trimmed; + } + + public toJSON(): Message.Json { + return { + id: this.id.toString(), + channel_id: this.channelId.toString(), + author: { + id: this.author.id.toString(), + username: this.author.username, + discriminator: this.author.discriminator.toString().padStart(4, '0'), + avatar: this.author.avatar ?? null + }, + content: this.content, + attachments: this.attachments.map((entry) => ({ + id: entry.id.toString(), + filename: entry.name, + url: entry.url + })), + embeds: this.embeds.map( + (entry): APIEmbed => ({ + author: normalizeOptional( + entry.author, + (entry): APIEmbedAuthor => ({ + name: entry.name, + icon_url: entry.icon ?? undefined, + url: entry.url ?? undefined + }) + ), + description: entry.description ?? undefined, + fields: entry.fields ?? undefined, + footer: entry.footer ?? undefined, + image: entry.image ?? undefined, + thumbnail: entry.thumbnail ?? undefined, + timestamp: fromTimestamp(entry.timestamp) ?? undefined, + title: entry.title ?? undefined, + url: entry.url ?? undefined + }) + ) + }; + } + + public static fromAPI(data: Message.Json): Message { + return new Message({ + id: BigInt(data.id!), + channelId: BigInt(data.channel_id), + author: Message.mapAuthor(data.author), + content: data.content, + attachments: Message.mapAttachments(data.attachments ?? []), + embeds: Message.mapEmbeds(data.embeds) + }); + } + + public static fromBinary(reader: Reader): Message { + return new Message({ + id: reader.u64()!, + channelId: reader.u64()!, + author: reader.object((reader) => ({ + id: reader.u64()!, + username: reader.string()!, + discriminator: reader.u16()!, + avatar: reader.string() + }))!, + content: reader.string()!, + attachments: reader.array((reader) => ({ + id: reader.u64()!, + name: reader.string()!, + url: reader.string()! + }))!, + embeds: reader.array( + (reader): Message.DataEmbed => ({ + author: reader.object( + (reader): Message.DataEmbedAuthor => ({ name: reader.string()!, icon: reader.string(), url: reader.string() }) + ), + description: reader.string(), + fields: reader.array((reader): Message.DataEmbedField => ({ name: reader.string()!, value: reader.string()! })), + footer: reader.object((reader): Message.DataEmbedFooter => ({ text: reader.string()!, icon: reader.string() })), + image: reader.object((reader): Message.DataEmbedImage => ({ url: reader.string()! })), + thumbnail: reader.object((reader): Message.DataEmbedThumbnail => ({ url: reader.string()! })), + timestamp: reader.date(), + title: reader.string(), + url: reader.string() + }) + ) + }); + } + + private static mapAuthor(author: APIUser) { + return { + id: BigInt(author.id), + username: author.username, + discriminator: Number(author.discriminator), + avatar: author.avatar + }; + } + + private static mapAttachments(attachments: Message.JsonAttachment[]) { + return attachments.map((attachment) => ({ + id: BigInt(attachment.id), + name: attachment.filename, + url: attachment.url + })); + } + + private static mapEmbeds(embeds: APIEmbed[]) { + return embeds.map( + (embed): Message.DataEmbed => ({ + author: normalizeNullable( + embed.author, + (author): Message.DataEmbedAuthor => ({ name: author.name, icon: author.icon_url, url: author.url }) + ), + description: embed.description, + fields: normalizeArray(embed.fields, (field): Message.DataEmbedField => ({ name: field.name, value: field.value })), + footer: normalizeNullable(embed.footer, (footer): Message.DataEmbedFooter => ({ text: footer.text, icon: footer.icon_url })), + image: normalizeNullable(embed.image, (image): Message.DataEmbedImage => ({ url: image.url })), + thumbnail: normalizeNullable(embed.thumbnail, (thumbnail): Message.DataEmbedThumbnail => ({ url: thumbnail.url })), + timestamp: toTimestamp(embed.timestamp), + title: embed.title, + url: embed.url + }) + ); + } +} + +export namespace Message { + export interface Json extends Pick { + attachments?: JsonAttachment[]; + } + + export type JsonAttachment = Pick; + + export interface Data { + id: bigint; + channelId: bigint; + author: DataUser; + content: string; + attachments?: DataAttachment[] | Nullish; + embeds?: DataEmbed[] | Nullish; + } + + export interface DataUser { + id: bigint; + username: string; + discriminator: number; + avatar?: string | Nullish; + } + + export interface DataAttachment { + id: bigint; + name: string; + url: string; + } + + export interface DataEmbed { + author?: DataEmbedAuthor | Nullish; + description?: string | Nullish; + fields?: DataEmbedField[] | Nullish; + footer?: DataEmbedFooter | Nullish; + image?: DataEmbedImage | Nullish; + thumbnail?: DataEmbedThumbnail | Nullish; + timestamp?: number | Nullish; + title?: string | Nullish; + url?: string | Nullish; + } + + export interface DataEmbedFooter { + text: string; + icon?: string | Nullish; + } + + export interface DataEmbedImage { + url: string; + } + + export interface DataEmbedThumbnail { + url: string; + } + + export interface DataEmbedAuthor { + name: string; + url?: string | Nullish; + icon?: string | Nullish; + } + + export interface DataEmbedField { + name: string; + value: string; + } +} diff --git a/projects/shared/src/lib/cache/structures/Role.ts b/projects/shared/src/lib/cache/structures/Role.ts new file mode 100644 index 00000000000..65e01428f84 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Role.ts @@ -0,0 +1,138 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIRole } from 'discord-api-types/v10'; +import { normalizeNullable } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; + +export class Role implements IStructure { + public readonly id: bigint; + public readonly name: string; + public readonly color: number; + public readonly hoist: boolean; + public readonly icon: string | null; + public readonly managed: boolean; + public readonly mentionable: boolean; + public readonly permissions: bigint; + public readonly position: number; + public readonly tags: Role.DataTags | null; + public readonly unicodeEmoji: string | null; + + public constructor(data: Role.Data) { + this.id = data.id; + this.name = data.name; + this.color = data.color; + this.hoist = data.hoist; + this.icon = data.icon ?? null; + this.managed = data.managed; + this.mentionable = data.mentionable; + this.permissions = data.permissions; + this.position = data.position; + this.tags = data.tags ?? null; + this.unicodeEmoji = data.unicodeEmoji ?? null; + } + + public toBuffer(): Buffer { + return new Writer(100) + .u64(this.id) + .string(this.name) + .u32(this.color) + .bool(this.hoist) + .string(this.icon) + .bool(this.managed) + .bool(this.mentionable) + .u64(this.permissions) + .u16(this.position) + .object(this.tags, (buffer, value) => + buffer + .u64(value.botId) + .bool(value.premiumSubscriber === null) + .u64(value.integrationId) + ) + .string(this.unicodeEmoji).trimmed; + } + + public toJSON(): Role.Json { + return { + id: this.id.toString(), + name: this.name, + color: this.color, + hoist: this.hoist, + icon: this.icon, + managed: this.managed, + mentionable: this.mentionable, + permissions: this.permissions.toString(), + position: this.position, + tags: + normalizeNullable(this.tags, (value) => ({ + bot_id: value.botId?.toString() ?? undefined, + premium_subscriber: value.premiumSubscriber ? null : undefined, + integration_id: value.integrationId?.toString() ?? undefined + })) ?? undefined, + unicode_emoji: this.unicodeEmoji + }; + } + + public static fromAPI(data: Role.Json): Role { + return new Role({ + id: BigInt(data.id), + name: data.name, + color: data.color, + hoist: data.hoist, + icon: data.icon, + managed: data.managed, + mentionable: data.mentionable, + permissions: BigInt(data.permissions), + position: data.position, + tags: normalizeNullable(data.tags, (value) => ({ + botId: normalizeNullable(value.bot_id, BigInt), + premiumSubscriber: value.premium_subscriber, + integrationId: normalizeNullable(value.integration_id, BigInt) + })), + unicodeEmoji: data.unicode_emoji + }); + } + + public static fromBinary(reader: Reader): Role { + return new Role({ + id: reader.u64()!, + name: reader.string()!, + color: reader.u32()!, + hoist: reader.bool()!, + icon: reader.string(), + managed: reader.bool()!, + mentionable: reader.bool()!, + permissions: reader.u64()!, + position: reader.u16()!, + tags: reader.object((reader) => ({ + botId: reader.u64(), + premiumSubscriber: reader.bool(), + integrationId: reader.u64() + })), + unicodeEmoji: reader.string() + }); + } +} + +export namespace Role { + export type Json = APIRole; + export interface Data { + id: bigint; + name: string; + color: number; + hoist: boolean; + icon?: string | Nullish; + managed: boolean; + mentionable: boolean; + permissions: bigint; + position: number; + tags?: DataTags | Nullish; + unicodeEmoji?: string | Nullish; + } + + export interface DataTags { + botId?: bigint | Nullish; + premiumSubscriber?: boolean | Nullish; + integrationId?: bigint | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/Sticker.ts b/projects/shared/src/lib/cache/structures/Sticker.ts new file mode 100644 index 00000000000..4eb19a7e50b --- /dev/null +++ b/projects/shared/src/lib/cache/structures/Sticker.ts @@ -0,0 +1,106 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APISticker, StickerFormatType, StickerType } from 'discord-api-types/v10'; +import { normalizeNullable } from '../../common/util.js'; +import type { Reader } from '../../data/Reader.js'; +import { Writer } from '../../data/Writer.js'; +import type { IStructure } from './interfaces/IStructure.js'; + +export class Sticker implements IStructure { + public readonly id: bigint; + public readonly packId: bigint | null; + public readonly name: string; + public readonly description: string | null; + public readonly tags: string; + public readonly type: StickerType; + public readonly formatType: StickerFormatType; + public readonly available: boolean | null; + + public constructor(data: Sticker.Data) { + this.id = data.id; + this.packId = data.packId ?? null; + this.name = data.name; + this.description = data.description ?? null; + this.tags = data.tags; + this.type = data.type; + this.formatType = data.formatType; + this.available = data.available ?? null; + } + + public equals(other: Sticker) { + return ( + this.id === other.id && + this.packId === other.packId && + this.name === other.name && + this.description === other.description && + this.tags === other.tags && + this.type === other.type && + this.formatType === other.formatType && + this.available === other.available + ); + } + + public toBuffer(): Buffer { + return new Writer(100) + .u64(this.id) + .u64(this.packId) + .string(this.name) + .string(this.description) + .string(this.tags) + .u8(this.type) + .u8(this.formatType) + .bool(this.available).trimmed; + } + + public toJSON(): Sticker.Json { + return { + id: this.id.toString(), + pack_id: this.packId?.toString() ?? undefined, + name: this.name, + description: this.description, + tags: this.tags, + type: this.type, + format_type: this.formatType, + available: this.available ?? undefined + }; + } + + public static fromAPI(data: Sticker.Json): Sticker { + return new Sticker({ + id: BigInt(data.id), + packId: normalizeNullable(data.pack_id, BigInt), + name: data.name, + description: data.description, + tags: data.tags, + type: data.type, + formatType: data.format_type, + available: data.available + }); + } + + public static fromBinary(reader: Reader): Sticker { + return new Sticker({ + id: reader.u64()!, + packId: reader.u64(), + name: reader.string()!, + description: reader.string(), + tags: reader.string()!, + type: reader.u8()!, + formatType: reader.u8()!, + available: reader.bool() + }); + } +} + +export namespace Sticker { + export type Json = APISticker; + export interface Data { + id: bigint; + packId?: bigint | Nullish; + name: string; + description?: string | Nullish; + tags: string; + type: StickerType; + formatType: StickerFormatType; + available?: boolean | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/interfaces/BufferEncodable.ts b/projects/shared/src/lib/cache/structures/interfaces/BufferEncodable.ts new file mode 100644 index 00000000000..bdf23c4f892 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/interfaces/BufferEncodable.ts @@ -0,0 +1,3 @@ +export interface BufferEncodable { + toBuffer(): Buffer; +} diff --git a/projects/shared/src/lib/cache/structures/interfaces/IStructure.ts b/projects/shared/src/lib/cache/structures/interfaces/IStructure.ts new file mode 100644 index 00000000000..5f71379853a --- /dev/null +++ b/projects/shared/src/lib/cache/structures/interfaces/IStructure.ts @@ -0,0 +1,12 @@ +import type { NonNullObject } from '@sapphire/utilities'; +import type { Reader } from '../../../data/Reader.js'; +import type { BufferEncodable } from './BufferEncodable.js'; +import type { Identifiable } from './Identifiable.js'; +import type { JsonEncodable } from './JsonEncodable.js'; + +export interface IStructure extends BufferEncodable, JsonEncodable, Identifiable {} + +export interface IStructureConstructor { + fromAPI(data: NonNullObject): T; + fromBinary(reader: Reader): T; +} diff --git a/projects/shared/src/lib/cache/structures/interfaces/Identifiable.ts b/projects/shared/src/lib/cache/structures/interfaces/Identifiable.ts new file mode 100644 index 00000000000..55d2307ceb3 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/interfaces/Identifiable.ts @@ -0,0 +1,3 @@ +export interface Identifiable { + readonly id: bigint; +} diff --git a/projects/shared/src/lib/cache/structures/interfaces/JsonEncodable.ts b/projects/shared/src/lib/cache/structures/interfaces/JsonEncodable.ts new file mode 100644 index 00000000000..a163bcc3788 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/interfaces/JsonEncodable.ts @@ -0,0 +1,5 @@ +import type { NonNullObject } from '@sapphire/utilities'; + +export interface JsonEncodable { + toJSON(): NonNullObject; +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildCategoryChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildCategoryChannel.ts new file mode 100644 index 00000000000..604a9c8ba11 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildCategoryChannel.ts @@ -0,0 +1,19 @@ +import type { APIGuildCategoryChannel, ChannelType } from 'discord-api-types/v10'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildBasedChannel, guildBasedFromAPIShared, guildBasedFromBinaryShared } from './base/GuildBasedChannel.js'; + +export class GuildCategoryChannel extends GuildBasedChannel { + public static fromAPI(data: GuildCategoryChannel.Json): GuildCategoryChannel { + return new GuildCategoryChannel(guildBasedFromAPIShared(data)); + } + + public static fromBinary(reader: Reader): GuildCategoryChannel { + return new GuildCategoryChannel(guildBasedFromBinaryShared(reader)); + } +} + +export namespace GuildCategoryChannel { + export type Type = ChannelType.GuildCategory; + export type Json = Omit; + export interface Data extends GuildBasedChannel.Data {} +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildForumChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildForumChannel.ts new file mode 100644 index 00000000000..bdf4f033fe6 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildForumChannel.ts @@ -0,0 +1,19 @@ +import type { APIGuildForumChannel, ChannelType } from 'discord-api-types/v10'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildBasedChannel, guildBasedFromAPIShared, guildBasedFromBinaryShared } from './base/GuildBasedChannel.js'; + +export class GuildForumChannel extends GuildBasedChannel { + public static fromAPI(data: GuildForumChannel.Json): GuildForumChannel { + return new GuildForumChannel(guildBasedFromAPIShared(data)); + } + + public static fromBinary(reader: Reader): GuildForumChannel { + return new GuildForumChannel(guildBasedFromBinaryShared(reader)); + } +} + +export namespace GuildForumChannel { + export type Type = ChannelType.GuildForum; + export type Json = Omit; + export interface Data extends GuildBasedChannel.Data {} +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildNewsChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildNewsChannel.ts new file mode 100644 index 00000000000..c2918c1f88e --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildNewsChannel.ts @@ -0,0 +1,19 @@ +import type { APINewsChannel, ChannelType } from 'discord-api-types/v10'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildTextBasedChannel, guildTextBasedFromAPIShared, guildTextBasedFromBinaryShared } from './base/GuildTextBasedChannel.js'; + +export class GuildNewsChannel extends GuildTextBasedChannel { + public static fromAPI(data: GuildNewsChannel.Json): GuildNewsChannel { + return new GuildNewsChannel(guildTextBasedFromAPIShared(data)); + } + + public static fromBinary(reader: Reader): GuildNewsChannel { + return new GuildNewsChannel(guildTextBasedFromBinaryShared(reader)); + } +} + +export namespace GuildNewsChannel { + export type Type = ChannelType.GuildNews; + export type Json = Omit; + export interface Data extends GuildTextBasedChannel.Data {} +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildTextChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildTextChannel.ts new file mode 100644 index 00000000000..4dda9194d4f --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildTextChannel.ts @@ -0,0 +1,46 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APITextChannel, ChannelType } from 'discord-api-types/v10'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildTextBasedChannel, guildTextBasedFromAPIShared, guildTextBasedFromBinaryShared } from './base/GuildTextBasedChannel.js'; + +export class GuildTextChannel extends GuildTextBasedChannel { + public readonly rateLimitPerUser: number | null; + + public constructor(data: GuildTextChannel.Data) { + super(data); + this.rateLimitPerUser = data.rateLimitPerUser ?? null; + } + + public override toBuffer(): Buffer { + return this.toBufferShared().u16(this.rateLimitPerUser).trimmed; + } + + public override toJSON(): GuildTextChannel.Json { + return { + ...super.toJSON(), + rate_limit_per_user: this.rateLimitPerUser ?? undefined + }; + } + + public static fromAPI(data: GuildTextChannel.Json): GuildTextChannel { + return new GuildTextChannel({ + ...guildTextBasedFromAPIShared(data), + rateLimitPerUser: data.rate_limit_per_user + }); + } + + public static fromBinary(reader: Reader): GuildTextChannel { + return new GuildTextChannel({ + ...guildTextBasedFromBinaryShared(reader), + rateLimitPerUser: reader.u16() + }); + } +} + +export namespace GuildTextChannel { + export type Type = ChannelType.GuildText; + export type Json = Omit; + export interface Data extends GuildTextBasedChannel.Data { + rateLimitPerUser?: number | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildThreadChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildThreadChannel.ts new file mode 100644 index 00000000000..c5ead1572c9 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildThreadChannel.ts @@ -0,0 +1,99 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIThreadChannel, ChannelType, ThreadAutoArchiveDuration } from 'discord-api-types/v10'; +import { fromTimestamp, normalizeNullable, toTimestamp } from '../../../../common/util.js'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildBasedChannel, guildBasedFromAPIShared, guildBasedFromBinaryShared } from './base/GuildBasedChannel.js'; + +export class GuildThreadChannel extends GuildBasedChannel { + public readonly ownerId: bigint | null; + public readonly rateLimitPerUser: number | null; + public readonly archived: boolean; + public readonly autoArchiveDuration: ThreadAutoArchiveDuration; + public readonly archiveAt: number; + public readonly locked: boolean | null; + public readonly invitable: boolean | null; + public readonly createdAt: number | null; + + public constructor(data: GuildThreadChannel.Data) { + super(data); + this.ownerId = data.ownerId ?? null; + this.rateLimitPerUser = data.rateLimitPerUser ?? null; + this.archived = data.archived; + this.autoArchiveDuration = data.autoArchiveDuration; + this.archiveAt = data.archiveAt; + this.locked = data.locked ?? null; + this.invitable = data.invitable ?? null; + this.createdAt = data.createdAt ?? null; + } + + public override toBuffer(): Buffer { + return this.toBufferShared() + .u64(this.ownerId) + .u16(this.rateLimitPerUser) + .bool(this.archived) + .u16(this.autoArchiveDuration) + .date(this.archiveAt) + .bool(this.locked) + .bool(this.invitable) + .date(this.createdAt).trimmed; + } + + public override toJSON(): GuildThreadChannel.Json { + return { + ...super.toJSON(), + owner_id: this.ownerId?.toString(), + rate_limit_per_user: this.rateLimitPerUser ?? undefined, + thread_metadata: { + archived: this.archived, + auto_archive_duration: this.autoArchiveDuration, + archive_timestamp: fromTimestamp(this.archiveAt), + locked: this.locked ?? undefined, + invitable: this.invitable ?? undefined, + create_timestamp: fromTimestamp(this.createdAt) ?? undefined + } + }; + } + + public static fromAPI(data: GuildThreadChannel.Json): GuildThreadChannel { + return new GuildThreadChannel({ + ...guildBasedFromAPIShared(data), + ownerId: normalizeNullable(data.owner_id, BigInt), + rateLimitPerUser: data.rate_limit_per_user, + archived: data.thread_metadata!.archived, + autoArchiveDuration: data.thread_metadata!.auto_archive_duration, + archiveAt: toTimestamp(data.thread_metadata!.archive_timestamp), + locked: data.thread_metadata!.locked, + invitable: data.thread_metadata!.invitable, + createdAt: toTimestamp(data.thread_metadata!.create_timestamp) + }); + } + + public static fromBinary(reader: Reader): GuildThreadChannel { + return new GuildThreadChannel({ + ...guildBasedFromBinaryShared(reader), + ownerId: reader.u64(), + rateLimitPerUser: reader.u16(), + archived: reader.bool()!, + autoArchiveDuration: reader.u16()!, + archiveAt: reader.date()!, + locked: reader.bool(), + invitable: reader.bool(), + createdAt: reader.date() + }); + } +} + +export namespace GuildThreadChannel { + export type Type = ChannelType.GuildPublicThread | ChannelType.GuildPrivateThread | ChannelType.GuildNewsThread; + export type Json = Omit; + export interface Data extends GuildBasedChannel.Data { + ownerId?: bigint | Nullish; + rateLimitPerUser?: number | Nullish; + archived: boolean; + autoArchiveDuration: ThreadAutoArchiveDuration; + archiveAt: number; + locked?: boolean | Nullish; + invitable?: boolean | Nullish; + createdAt?: number | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/GuildVoiceChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/GuildVoiceChannel.ts new file mode 100644 index 00000000000..f4cda89fff9 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/GuildVoiceChannel.ts @@ -0,0 +1,64 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIVoiceChannel, ChannelType, VideoQualityMode } from 'discord-api-types/v10'; +import type { Reader } from '../../../../data/Reader.js'; +import { GuildBasedChannel, guildBasedFromAPIShared, guildBasedFromBinaryShared } from './base/GuildBasedChannel.js'; + +export class GuildVoiceChannel extends GuildBasedChannel { + public readonly bitrate: number | null; + public readonly userLimit: number | null; + public readonly rtcRegion: string | null; + public readonly videoQualityMode: VideoQualityMode | null; + + public constructor(data: GuildVoiceChannel.Data) { + super(data); + this.bitrate = data.bitrate ?? null; + this.userLimit = data.userLimit ?? null; + this.rtcRegion = data.rtcRegion ?? null; + this.videoQualityMode = data.videoQualityMode ?? null; + } + + public override toBuffer(): Buffer { + return this.toBufferShared().u32(this.bitrate).u32(this.userLimit).string(this.rtcRegion).u8(this.videoQualityMode).trimmed; + } + + public override toJSON(): GuildVoiceChannel.Json { + return { + ...super.toJSON(), + bitrate: this.bitrate ?? undefined, + user_limit: this.userLimit ?? undefined, + rtc_region: this.rtcRegion, + video_quality_mode: this.videoQualityMode ?? undefined + }; + } + + public static fromAPI(data: GuildVoiceChannel.Json): GuildVoiceChannel { + return new GuildVoiceChannel({ + ...guildBasedFromAPIShared(data), + bitrate: data.bitrate, + userLimit: data.user_limit, + rtcRegion: data.rtc_region, + videoQualityMode: data.video_quality_mode + }); + } + + public static fromBinary(reader: Reader): GuildVoiceChannel { + return new GuildVoiceChannel({ + ...guildBasedFromBinaryShared(reader), + bitrate: reader.u32(), + userLimit: reader.u32(), + rtcRegion: reader.string(), + videoQualityMode: reader.u8() + }); + } +} + +export namespace GuildVoiceChannel { + export type Type = ChannelType.GuildStageVoice | ChannelType.GuildVoice; + export type Json = Omit; + export interface Data extends GuildBasedChannel.Data { + bitrate?: number | Nullish; + userLimit?: number | Nullish; + rtcRegion?: string | Nullish; + videoQualityMode?: VideoQualityMode | Nullish; + } +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/base/GuildBasedChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/base/GuildBasedChannel.ts new file mode 100644 index 00000000000..a2328360bbb --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/base/GuildBasedChannel.ts @@ -0,0 +1,126 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIGuildChannel, APIOverwrite, ChannelFlags, ChannelType, OverwriteType } from 'discord-api-types/v10'; +import { normalizeNullable } from '../../../../../common/util.js'; +import type { Reader } from '../../../../../data/Reader.js'; +import { Writer } from '../../../../../data/Writer.js'; +import type { IStructure } from '../../../interfaces/IStructure.js'; + +export abstract class GuildBasedChannel implements IStructure { + public readonly id: bigint; + public readonly type: T; + public readonly name: string; + public readonly flags: ChannelFlags | null; + public readonly nsfw: boolean | null; + public readonly parentId: bigint | null; + public readonly permissionOverwrites: readonly GuildBasedChannel.DataPermissionOverwrite[]; + public readonly position: number | null; + + public constructor(data: GuildBasedChannel.Data) { + this.id = data.id; + this.type = data.type; + this.name = data.name; + this.flags = data.flags ?? null; + this.nsfw = data.nsfw ?? null; + this.parentId = data.parentId ?? null; + this.permissionOverwrites = data.permissionOverwrites ?? []; + this.position = data.position ?? null; + } + + public toBuffer(): Buffer { + return this.toBufferShared().trimmed; + } + + public toJSON(): GuildBasedChannel.Json { + return { + id: this.id.toString(), + type: this.type, + name: this.name, + flags: this.flags ?? undefined, + nsfw: this.nsfw ?? undefined, + parent_id: this.parentId?.toString(), + permission_overwrites: this.permissionOverwrites.map( + (entry): APIOverwrite => ({ + id: entry.id.toString(), + type: entry.type, + allow: entry.allow.toString(), + deny: entry.deny.toString() + }) + ), + position: this.position ?? undefined + }; + } + + protected toBufferShared(): Writer { + return new Writer(100) + .u64(this.id) + .u8(this.type) + .string(this.name) + .u8(this.flags) + .bool(this.nsfw) + .u64(this.parentId) + .array(this.permissionOverwrites, (buffer, value) => buffer.u64(value.id).u8(value.type).u64(value.allow).u64(value.deny)) + .u16(this.position); + } +} + +export namespace GuildBasedChannel { + export type Json = Omit, 'guild_id'>; + + export interface Data { + id: bigint; + name: string; + type: T; + flags?: ChannelFlags | Nullish; + nsfw?: boolean | Nullish; + parentId?: bigint | Nullish; + permissionOverwrites?: readonly DataPermissionOverwrite[] | Nullish; + position?: number | Nullish; + } + + export interface DataPermissionOverwrite { + id: bigint; + type: OverwriteType; + allow: bigint; + deny: bigint; + } +} + +export function guildBasedFromAPIShared(data: GuildBasedChannel.Json): GuildBasedChannel.Data { + return { + id: BigInt(data.id), + type: data.type, + name: data.name!, + flags: data.flags, + nsfw: data.nsfw, + parentId: normalizeNullable(data.parent_id, BigInt), + permissionOverwrites: data.permission_overwrites?.map( + (value): GuildBasedChannel.DataPermissionOverwrite => ({ + id: BigInt(value.id), + type: value.type, + allow: BigInt(value.allow), + deny: BigInt(value.deny) + }) + ), + position: data.position + }; +} + +export function guildBasedFromBinaryShared(reader: Reader): GuildBasedChannel.Data { + return { + id: reader.u64()!, + type: reader.u8()! as T, + name: reader.string()!, + flags: reader.u8(), + nsfw: reader.bool(), + parentId: reader.u64(), + permissionOverwrites: reader.array( + (reader): GuildBasedChannel.DataPermissionOverwrite => ({ + id: reader.u64()!, + type: reader.u8()!, + allow: reader.u64()!, + deny: reader.u64()! + }) + ), + position: reader.u16() + }; +} diff --git a/projects/shared/src/lib/cache/structures/unions/channel/base/GuildTextBasedChannel.ts b/projects/shared/src/lib/cache/structures/unions/channel/base/GuildTextBasedChannel.ts new file mode 100644 index 00000000000..a72e4b57371 --- /dev/null +++ b/projects/shared/src/lib/cache/structures/unions/channel/base/GuildTextBasedChannel.ts @@ -0,0 +1,55 @@ +import type { Nullish } from '@sapphire/utilities'; +import type { APIGuildTextChannel, GuildTextChannelType, ThreadAutoArchiveDuration } from 'discord-api-types/v10'; +import type { Reader } from '../../../../../data/Reader.js'; +import type { Writer } from '../../../../../data/Writer.js'; +import { GuildBasedChannel, guildBasedFromAPIShared } from './GuildBasedChannel.js'; + +export abstract class GuildTextBasedChannel extends GuildBasedChannel { + public readonly defaultAutoArchiveDuration: ThreadAutoArchiveDuration | null; + public readonly topic: string | null; + + public constructor(data: GuildTextBasedChannel.Data) { + super(data); + this.defaultAutoArchiveDuration = data.defaultAutoArchiveDuration ?? null; + this.topic = data.topic ?? null; + } + + public override toJSON(): GuildTextBasedChannel.Json { + return { + ...super.toJSON(), + default_auto_archive_duration: this.defaultAutoArchiveDuration ?? undefined, + topic: this.topic + }; + } + + protected override toBufferShared(): Writer { + return super.toBufferShared().u32(this.defaultAutoArchiveDuration).string(this.topic); + } +} + +export namespace GuildTextBasedChannel { + export type Json = Omit, 'guild_id' | 'last_message_id'>; + + export interface Data extends GuildBasedChannel.Data { + defaultAutoArchiveDuration?: ThreadAutoArchiveDuration | Nullish; + topic?: string | Nullish; + } + + export type DataPermissionOverwrite = GuildBasedChannel.DataPermissionOverwrite; +} + +export function guildTextBasedFromAPIShared(data: GuildTextBasedChannel.Json): GuildTextBasedChannel.Data { + return { + ...guildBasedFromAPIShared(data), + defaultAutoArchiveDuration: data.default_auto_archive_duration, + topic: data.topic + }; +} + +export function guildTextBasedFromBinaryShared(reader: Reader): GuildTextBasedChannel.Data { + return { + ...guildTextBasedFromBinaryShared(reader), + defaultAutoArchiveDuration: reader.u32(), + topic: reader.string() + }; +} diff --git a/projects/shared/src/lib/cache/structures/values/GuildFeatures.ts b/projects/shared/src/lib/cache/structures/values/GuildFeatures.ts new file mode 100644 index 00000000000..61766d51e0f --- /dev/null +++ b/projects/shared/src/lib/cache/structures/values/GuildFeatures.ts @@ -0,0 +1,47 @@ +import { isNullishOrZero } from '@sapphire/utilities'; +import type { GuildFeature } from 'discord-api-types/v10'; +import { bitHas } from '../../../common/bits.js'; + +export const GuildFeatureBits = { + ANIMATED_BANNER: 1 << 0, + ANIMATED_ICON: 1 << 1, + BANNER: 1 << 2, + COMMUNITY: 1 << 3, + DISCOVERABLE: 1 << 4, + FEATURABLE: 1 << 5, + HAS_DIRECTORY_ENTRY: 1 << 6, + HUB: 1 << 7, + INVITE_SPLASH: 1 << 8, + LINKED_TO_HUB: 1 << 9, + MEMBER_VERIFICATION_GATE_ENABLED: 1 << 10, + MONETIZATION_ENABLED: 1 << 11, + MORE_STICKERS: 1 << 12, + NEWS: 1 << 13, + PARTNERED: 1 << 14, + PREVIEW_ENABLED: 1 << 15, + PRIVATE_THREADS: 1 << 16, + RELAY_ENABLED: 1 << 17, + ROLE_ICONS: 1 << 18, + TICKETED_EVENTS_ENABLED: 1 << 19, + VANITY_URL: 1 << 20, + VERIFIED: 1 << 21, + VIP_REGIONS: 1 << 22, + WELCOME_SCREEN_ENABLED: 1 << 23 +} as const; + +export const GuildFeatureEntries = Object.entries(GuildFeatureBits) as [feature: GuildFeature, bit: number][]; + +export function toFeatures(features: readonly GuildFeature[]) { + return features.reduce((bits, feature) => bits | (GuildFeatureBits[feature] ?? 0), 0); +} + +export function fromFeatures(value: number): GuildFeature[] { + if (isNullishOrZero(value)) return []; + + const features: GuildFeature[] = []; + for (const [feature, bit] of GuildFeatureEntries) { + if (bitHas(value, bit)) features.push(feature); + } + + return features; +} diff --git a/projects/shared/src/lib/common/bits.ts b/projects/shared/src/lib/common/bits.ts new file mode 100644 index 00000000000..e43f97627aa --- /dev/null +++ b/projects/shared/src/lib/common/bits.ts @@ -0,0 +1,3 @@ +export function bitHas(value: T, bit: T) { + return (value & bit) === bit; +} diff --git a/projects/shared/src/lib/common/util.ts b/projects/shared/src/lib/common/util.ts new file mode 100644 index 00000000000..8405dbaddbd --- /dev/null +++ b/projects/shared/src/lib/common/util.ts @@ -0,0 +1,48 @@ +import { isNullish, type Nullish } from '@sapphire/utilities'; + +export function arrayEquals(a: readonly T[], b: readonly T[]): boolean { + return a.length === b.length && a.every((value, index) => b[index] === value); +} + +export function isDefined(value: Value): value is Exclude { + return value !== undefined; +} + +export function defaultOptional(value: Value | undefined, fallback: Value): Value; +export function defaultOptional(value: Value | undefined, fallback: Return, cb: (value: Value) => Return): Return; +export function defaultOptional(value: Value | undefined, fallback: Return, cb?: (value: Value) => Return): Value | Return { + return value === undefined ? fallback : typeof cb === 'function' ? cb(value) : value; +} + +export function normalizeNullable(value: Value | Nullish, cb: (value: Value) => Return): Return | null { + return isNullish(value) ? null : cb(value); +} + +export function normalizeOptional(value: Value | Nullish, cb: (value: Value) => Return): Return | undefined { + return isNullish(value) ? undefined : cb(value); +} + +export function normalizeArray(values: readonly Value[] | Nullish, cb: (value: Value) => Return): Return[] | null { + return isNullish(values) ? null : values.map((value) => cb(value)); +} + +export function toTimestamp(value: string | number): number; +export function toTimestamp(value: string | number | Nullish): number | null; +export function toTimestamp(value: string | number | Nullish): number | null { + switch (typeof value) { + case 'number': + return value; + case 'string': + return Date.parse(value); + case 'bigint': + return Number(value); + default: + return null; + } +} + +export function fromTimestamp(value: number): string; +export function fromTimestamp(value: number | Nullish): string | null; +export function fromTimestamp(value: number | Nullish): string | null { + return typeof value === 'number' ? new Date(value).toISOString() : null; +} diff --git a/projects/shared/src/lib/data/Reader.ts b/projects/shared/src/lib/data/Reader.ts new file mode 100644 index 00000000000..03e075836fc --- /dev/null +++ b/projects/shared/src/lib/data/Reader.ts @@ -0,0 +1,97 @@ +import type { NonNullObject } from '@sapphire/utilities'; + +const decoder = new TextDecoder(); + +export class Reader { + public readonly data: Buffer; + private offset = 0; + + public constructor(data: Buffer) { + this.data = data; + } + + public bool(): boolean | null { + if (this.readNull()) return null; + return this.data.readUInt8(this.offset++) === 1; + } + + public i8(): number | null { + if (this.readNull()) return null; + return this.data.readInt8(this.offset++); + } + + public u8(): number | null { + if (this.readNull()) return null; + return this.data.readUInt8(this.offset++); + } + + public u16(): number | null { + if (this.readNull()) return null; + const value = this.data.readUInt16LE(this.offset); + this.offset += 2; + return value; + } + + public i32(): number | null { + if (this.readNull()) return null; + const value = this.data.readInt32LE(this.offset); + this.offset += 4; + return value; + } + + public u32(): number | null { + if (this.readNull()) return null; + const value = this.data.readUInt32LE(this.offset); + this.offset += 4; + return value; + } + + public u64(): bigint | null { + if (this.readNull()) return null; + const value = this.data.readBigUInt64LE(this.offset); + this.offset += 8; + return value; + } + + public string(): string | null { + if (this.readNull()) return null; + + const length = this.data.readUInt32LE(this.offset); + this.offset += 4; + + const string = decoder.decode(this.data.subarray(this.offset, this.offset + length)); + this.offset += length; + return string; + } + + public date(): number | null { + if (this.readNull()) return null; + const value = this.data.readBigUInt64LE(this.offset); + this.offset += 8; + return Number(value); + } + + public array(cb: (buffer: this) => T): T[] { + if (this.readNull()) return []; + + const length = this.data.readUInt32LE(this.offset); + this.offset += 4; + + const values: T[] = []; + for (let i = 0; i < length; i++) { + values.push(cb(this)); + } + + return values; + } + + public object(cb: (buffer: this) => T): T | null { + if (this.readNull()) return null; + + return cb(this); + } + + private readNull() { + return this.data.readUInt8(this.offset++); + } +} diff --git a/projects/shared/src/lib/data/Writer.ts b/projects/shared/src/lib/data/Writer.ts new file mode 100644 index 00000000000..e75ca98d54e --- /dev/null +++ b/projects/shared/src/lib/data/Writer.ts @@ -0,0 +1,147 @@ +import { isNullish, isNullishOrEmpty, type NonNullObject, type Nullish } from '@sapphire/utilities'; + +const encoder = new TextEncoder(); + +export class Writer { + private data: Buffer; + private offset = 0; + + public constructor(size: number) { + this.data = Buffer.alloc(size); + } + + public get raw() { + return this.data; + } + + public get trimmed() { + return this.data.subarray(0, this.offset); + } + + public bool(value: boolean | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(2); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeUInt8(value ? 1 : 0, this.offset); + + return this; + } + + public i8(value: number | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(2); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeInt8(value, this.offset); + + return this; + } + + public u8(value: number | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(2); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeUInt8(value, this.offset); + + return this; + } + + public u16(value: number | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(5); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeUInt16LE(value, this.offset); + + return this; + } + + public i32(value: number | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(5); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeInt32LE(value, this.offset); + + return this; + } + + public u32(value: number | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(5); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeUInt32LE(value, this.offset); + + return this; + } + + public u64(value: string | number | bigint | Nullish) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(9); + this.offset += this.data.writeUInt8(1, this.offset); + this.offset += this.data.writeBigUInt64LE(BigInt(value), this.offset); + + return this; + } + + public string(value: string | Nullish) { + if (isNullishOrEmpty(value)) return this.writeNull(); + + const data = encoder.encode(value); + + // Ensure length + characters + this.ensure(4 + data.byteLength); + this.offset += this.data.writeUInt32LE(data.byteLength, this.offset); + this.data.set(data, this.offset); + this.offset += data.byteLength; + + return this; + } + + public date(value: string | number | Nullish) { + if (typeof value === 'string') value = Date.parse(value); + return this.u64(value); + } + + public array(values: readonly T[] | Nullish, cb: (buffer: this, value: T) => void) { + if (isNullishOrEmpty(values)) return this.writeNull(); + + this.ensure(4); + this.offset += this.data.writeUInt32LE(values.length, this.offset); + for (const value of values) { + cb(this, value); + } + + return this; + } + + public object(value: T | Nullish, cb: (buffer: this, value: T) => void) { + if (isNullish(value)) return this.writeNull(); + + this.ensure(1); + this.offset += this.data.writeUInt8(1, this.offset); + cb(this, value); + + return this; + } + + private writeNull() { + this.ensure(1); + this.offset += this.data.writeUInt8(0, this.offset); + + return this; + } + + private ensure(bytes: number) { + const nextOffset = this.offset + bytes; + if (nextOffset < this.data.byteLength) return; + + const data = Buffer.alloc(Math.max(nextOffset, this.data.byteLength * 2)); + data.set(this.data, 0); + this.data = data; + } +} diff --git a/projects/shared/src/lib/messaging/MessageBroker.ts b/projects/shared/src/lib/messaging/MessageBroker.ts new file mode 100644 index 00000000000..f0db0a4769f --- /dev/null +++ b/projects/shared/src/lib/messaging/MessageBroker.ts @@ -0,0 +1,116 @@ +import { Result } from '@sapphire/result'; +import { isNullishOrEmpty, type Nullish } from '@sapphire/utilities'; +import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter'; +import type { Redis } from 'ioredis'; +import { deserialize, serialize } from 'node:v8'; +import { RedisMessage } from './RedisMessage.js'; + +export class MessageBroker extends AsyncEventEmitter<{ + message: [message: RedisMessage]; +}> { + public readonly redis: Redis; + public readonly stream: string; + private readonly block: string; + private readonly max: string; + private readonly serialize: Serializer; + private readonly deserialize: Deserializer; + private redisReader: Redis | null = null; + private listening = false; + private lastId = '$'; + + public constructor(options: MessageBroker.Options) { + super(); + + this.redis = options.redis; + this.stream = options.stream; + this.block = String(options.block ?? 5000); + this.max = String(options.max ?? 10); + this.serialize = options.serialize ?? serialize; + this.deserialize = options.deserialize ?? deserialize; + } + + public send(value: RedisMessage.Data) { + return this.redis.xadd(this.stream, '*', MessageBroker.STREAM_DATA_FIELD, this.serialize(value)); + } + + public listen() { + if (this.listening) return false; + + void this.handleListen(); + return true; + } + + public disconnect() { + this.listening = false; + this.redisReader?.disconnect(false); + } + + private async handleListen() { + if (this.redisReader) throw new Error('The reader is already active'); + this.redisReader = this.redis.duplicate(); + this.listening = true; + + while (this.listening) { + const result = await Result.fromAsync( + this.redisReader.xreadBuffer('COUNT', this.max, 'BLOCK', this.block, 'STREAMS', this.stream, this.lastId) + ); + + result.match({ + ok: (data) => this.handleBulk(data), + err: (error) => this.handleError(error) + }); + } + + this.lastId = '$'; + this.redisReader = null; + } + + private handleBulk(data: [key: Buffer, items: [id: Buffer, fields: Buffer[]][]][] | null) { + if (isNullishOrEmpty(data)) return; + + for (const [streamIdBuffer, items] of data) { + const streamId = streamIdBuffer.toString('utf8'); + + // Verify that the stream is the one the application is listening for. + if (streamId !== this.stream) continue; + + for (const [entryIdBuffer, fields] of items) { + const entryId = entryIdBuffer.toString('utf8'); + this.lastId = entryId; + + // The broker sends 1 pair of fields, so anything different is invalid. + if (fields.length !== 2) continue; + + // Verify that the key of the pair of fields is the data the broker sends. + if (fields[0].toString('utf8') !== MessageBroker.STREAM_DATA_FIELD) continue; + + this.emit('message', new RedisMessage(this, streamId, entryId, this.deserialize(fields[1]))); + } + } + } + + private handleError(error: unknown) { + this.emit('error', error); + } + + private static readonly STREAM_DATA_FIELD = 'data'; +} + +export namespace MessageBroker { + export interface Options { + redis: Redis; + stream: string; + block?: number | Nullish; + max?: number | Nullish; + serialize?: Serializer; + deserialize?: Deserializer; + } +} + +export interface Serializer { + (value: RedisMessage.Data): Buffer; +} + +export interface Deserializer { + (value: Buffer): RedisMessage.Data; +} diff --git a/projects/shared/src/lib/messaging/RedisMessage.ts b/projects/shared/src/lib/messaging/RedisMessage.ts new file mode 100644 index 00000000000..7b4cb596e36 --- /dev/null +++ b/projects/shared/src/lib/messaging/RedisMessage.ts @@ -0,0 +1,225 @@ +import type { + APIChannel, + APIUser, + GatewayGuildBanAddDispatchData, + GatewayGuildBanRemoveDispatchData, + GatewayMessageCreateDispatchData, + GatewayMessageReactionAddDispatchData, + GatewayMessageReactionRemoveAllDispatchData, + GatewayMessageReactionRemoveDispatchData, + GatewayMessageReactionRemoveEmojiDispatchData, + GatewayMessageUpdateDispatchData +} from 'discord-api-types/v10'; +import type { Channel } from '../cache/structures/Channel.js'; +import type { Emoji } from '../cache/structures/Emoji.js'; +import type { Guild } from '../cache/structures/Guild.js'; +import type { Member } from '../cache/structures/Member.js'; +import type { Message } from '../cache/structures/Message.js'; +import type { Role } from '../cache/structures/Role.js'; +import type { Sticker } from '../cache/structures/Sticker.js'; +import type { MessageBroker } from './MessageBroker.js'; + +export class RedisMessage { + public readonly streamId: string; + public readonly entryId: string; + public readonly data: RedisMessage.Data; + private readonly broker: MessageBroker; + + public constructor(broker: MessageBroker, streamId: string, entryId: string, data: RedisMessage.Data) { + this.broker = broker; + this.streamId = streamId; + this.entryId = entryId; + this.data = data; + } + + public async ack() { + const value = await this.broker.redis.xack(this.streamId, this.broker.stream, this.entryId); + return value > 0; + } +} + +export namespace RedisMessage { + export type Data = + | ChannelCreateRedisPayload + | ChannelDeleteRedisPayload + | ChannelUpdateRedisPayload + | EmojiCreateRedisPayload + | EmojiDeleteRedisPayload + | EmojiUpdateRedisPayload + | GuildBanAddRedisPayload + | GuildBanRemoveRedisPayload + | GuildUpdateRedisPayload + | MemberAddRedisPayload + | MemberRemoveRedisPayload + | MemberUpdateRedisPayload + | MessageCreateRedisPayload + | MessageDeleteBulkRedisPayload + | MessageDeleteRedisPayload + | MessageReactionAddRedisPayload + | MessageReactionRemoveAllRedisPayload + | MessageReactionRemoveEmojiRedisPayload + | MessageReactionRemoveRedisPayload + | MessageUpdateRedisPayload + | RoleCreateRedisPayload + | RoleDeleteRedisPayload + | RoleUpdateRedisPayload + | StickerCreateRedisPayload + | StickerDeleteRedisPayload + | StickerUpdateRedisPayload; +} + +export enum RedisMessageType { + ChannelCreate, + ChannelDelete, + ChannelUpdate, + EmojiCreate, + EmojiDelete, + EmojiUpdate, + GuildBanAdd, + GuildBanRemove, + GuildUpdate, + MemberAdd, + MemberRemove, + MemberUpdate, + MessageCreate, + MessageDelete, + MessageDeleteBulk, + MessageReactionAdd, + MessageReactionRemove, + MessageReactionRemoveAll, + MessageReactionRemoveEmoji, + MessageUpdate, + RoleCreate, + RoleDelete, + RoleUpdate, + StickerCreate, + StickerDelete, + StickerUpdate +} + +export interface IDataRedisPayload { + data: T; +} + +export interface IOldRedisPayload { + old: T | null; +} + +export interface IUpdateRedisPayload extends IDataRedisPayload, IOldRedisPayload {} + +export interface GuildUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.GuildUpdate; +} + +export interface MessageCreateRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MessageCreate; +} + +export interface MessageUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.MessageUpdate; +} + +export interface MessageDeleteRedisPayload extends IOldRedisPayload { + type: RedisMessageType.MessageDelete; +} + +export interface MessageDeleteBulkRedisPayload extends IOldRedisPayload<(Message.Json | { id: string })[]> { + type: RedisMessageType.MessageDeleteBulk; + channel_id: string; + guild_id: string; +} + +export interface GuildBanAddRedisPayload extends IDataRedisPayload { + type: RedisMessageType.GuildBanAdd; +} + +export interface GuildBanRemoveRedisPayload extends IDataRedisPayload { + type: RedisMessageType.GuildBanRemove; +} + +export interface ChannelCreateRedisPayload extends IDataRedisPayload { + type: RedisMessageType.ChannelCreate; +} + +export interface ChannelUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.ChannelUpdate; +} + +export interface ChannelDeleteRedisPayload extends IOldRedisPayload { + type: RedisMessageType.ChannelDelete; +} + +export interface EmojiCreateRedisPayload extends IDataRedisPayload { + type: RedisMessageType.EmojiCreate; + guild_id: string; +} + +export interface EmojiUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.EmojiUpdate; + guild_id: string; +} + +export interface EmojiDeleteRedisPayload extends IOldRedisPayload { + type: RedisMessageType.EmojiDelete; + guild_id: string; +} + +export interface MemberAddRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MemberAdd; +} + +export interface MemberUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.MemberUpdate; +} + +export interface MemberRemoveRedisPayload extends IOldRedisPayload { + type: RedisMessageType.MemberRemove; + user: APIUser; + guild_id: string; +} + +export interface RoleCreateRedisPayload extends IDataRedisPayload { + type: RedisMessageType.RoleCreate; + guild_id: string; +} + +export interface RoleUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.RoleUpdate; + guild_id: string; +} + +export interface RoleDeleteRedisPayload extends IOldRedisPayload { + type: RedisMessageType.RoleDelete; + guild_id: string; +} + +export interface MessageReactionAddRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MessageReactionAdd; +} + +export interface MessageReactionRemoveRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MessageReactionRemove; +} + +export interface MessageReactionRemoveAllRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MessageReactionRemoveAll; +} + +export interface MessageReactionRemoveEmojiRedisPayload extends IDataRedisPayload { + type: RedisMessageType.MessageReactionRemoveEmoji; +} + +export interface StickerCreateRedisPayload extends IDataRedisPayload { + type: RedisMessageType.StickerCreate; + guild_id: string; +} + +export interface StickerUpdateRedisPayload extends IUpdateRedisPayload { + type: RedisMessageType.StickerUpdate; + guild_id: string; +} + +export interface StickerDeleteRedisPayload extends IOldRedisPayload { + type: RedisMessageType.StickerDelete; + guild_id: string; +} diff --git a/projects/shared/src/lib/structures/Listener.ts b/projects/shared/src/lib/structures/Listener.ts new file mode 100644 index 00000000000..9be700076c1 --- /dev/null +++ b/projects/shared/src/lib/structures/Listener.ts @@ -0,0 +1,50 @@ +import { Piece, type Container } from '@sapphire/pieces'; + +export abstract class Listener extends Piece { + public emitter: Listener.Emitter; + public event: string; + private _listener: (...args: readonly any[]) => unknown; + + public constructor(context: Listener.Context, options: Listener.Options) { + super(context, options); + + this.emitter = typeof options.emitter === 'string' ? this.container[options.emitter] : options.emitter; + this.event = options.event ?? this.name; + this._listener = this.run.bind(this); + } + + public abstract run(...args: readonly any[]): unknown; + + public override onLoad() { + const count = this.emitter.getMaxListeners(); + if (count !== 0) this.emitter.setMaxListeners(count + 1); + + this.emitter.on(this.event, this._listener); + return super.onLoad(); + } + + public override onUnload() { + const count = this.emitter.getMaxListeners(); + if (count !== 0) this.emitter.setMaxListeners(count - 1); + + this.emitter.off(this.event, this._listener); + return super.onUnload(); + } +} + +export namespace Listener { + export interface Options extends Piece.Options { + emitter: Emitter | { [K in keyof Container]: Container[K] extends Emitter ? K : never }[keyof Container]; + event?: string; + } + export type Context = Piece.Context; + + export interface Emitter { + on(eventName: string, listener: (...args: any[]) => void): this; + once(eventName: string, listener: (...args: any[]) => void): this; + off(eventName: string, listener: (...args: any[]) => void): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + emit(eventName: string, ...args: any[]): boolean; + } +} diff --git a/projects/shared/src/lib/structures/ListenerStore.ts b/projects/shared/src/lib/structures/ListenerStore.ts new file mode 100644 index 00000000000..860dee0b096 --- /dev/null +++ b/projects/shared/src/lib/structures/ListenerStore.ts @@ -0,0 +1,9 @@ +import { Store } from '@sapphire/pieces'; +import { Listener } from './Listener.js'; + +export class ListenerStore extends Store { + public constructor() { + // TODO: https://github.com/sapphiredev/pieces/pull/230 + super(Listener as any, { name: 'listeners' }); + } +} diff --git a/projects/shared/src/tsconfig.json b/projects/shared/src/tsconfig.json new file mode 100644 index 00000000000..e136cefbe90 --- /dev/null +++ b/projects/shared/src/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./", + "outDir": "../dist", + "composite": true, + "tsBuildInfoFile": "../dist/.tsbuildinfo" + }, + "include": ["."] +} diff --git a/projects/shared/tests/.gitkeep b/projects/shared/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/projects/shared/tsconfig.eslint.json b/projects/shared/tsconfig.eslint.json new file mode 100644 index 00000000000..388bb593b9f --- /dev/null +++ b/projects/shared/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.eslint.json", + "include": ["src", "tests"] +} diff --git a/scripts/SetFakeRoles.sql b/scripts/SetFakeRoles.sql deleted file mode 100644 index a61f8d1962c..00000000000 --- a/scripts/SetFakeRoles.sql +++ /dev/null @@ -1,13 +0,0 @@ -create user archid - superuser - createdb - createrole - replication - bypassrls; - -create user skyra - superuser - createdb - createrole - replication - bypassrls; \ No newline at end of file diff --git a/scripts/SetMigrations.sql b/scripts/SetMigrations.sql deleted file mode 100644 index 59e9bfa79d5..00000000000 --- a/scripts/SetMigrations.sql +++ /dev/null @@ -1,97 +0,0 @@ -BEGIN TRANSACTION; - -DROP TABLE IF EXISTS public.migrations CASCADE; - -CREATE TABLE public.migrations ( - id integer NOT NULL, - "timestamp" bigint NOT NULL, - name VARCHAR NOT NULL -); - -ALTER TABLE ONLY public.migrations - ADD CONSTRAINT "PK_Migrations" PRIMARY KEY (id); - -CREATE SEQUENCE public.migrations_id_seq - AS integer - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - -ALTER SEQUENCE public.migrations_id_seq OWNED BY public.migrations.id; -ALTER TABLE ONLY public.migrations ALTER COLUMN id SET DEFAULT nextval('public.migrations_id_seq'::regclass); - -INSERT INTO public.migrations ("timestamp", name) -VALUES - (1594413973851, 'V01MigrateClientStorage1594413973851'), - (1594582514749, 'V02MigrateDashboardUsers1594582514749'), - (1594582821724, 'V03MigrateBanners1594582821724'), - (1594582905434, 'V04MigrateGiveaways1594582905434'), - (1594583103788, 'V05MigrateGuilds1594583103788'), - (1594583243068, 'V06MigrateMembers1594583243068'), - (1594583300041, 'V07MigrateModeration1594583300041'), - (1594625931497, 'V08MigrateUsers1594625931497'), - (1594628900945, 'V09MigrateSuggestion1594628900945'), - (1594629639526, 'V10MigrateTwitchSubscription1594629639526'), - (1594649287397, 'V11MigrateRpg1594649287397'), - (1594669268323, 'V12ClearOldTables1594669268323'), - (1594757329224, 'V13MigrateAnalytics1594757329224'), - (1594843508131, 'V14FixRpgGuildRankEntity1594843508131'), - (1594843508131, 'V15ClearDashboardUsers1594922379627'), - (1595064247769, 'V16CreateSpousesTable1595064247769'), - (1596269328762, 'V17MigrateModeratorNonNull1596269328762'), - (1596289368633, 'V18CreateIgnoreLogs1596289368633'), - (1596299849081, 'V19MigrateReactionRoles1596299849081'), - (1597088981807, 'V20UpdateGuildEntityChecks1597088981807'), - (1597266996401, 'V21AddMissingChecks1597266996401'), - (1598010877863, 'V22AddSelfStarCapabilities1598010877863'), - (1598083459734, 'V23AddGIData1598083459734'), - (1599692515073, 'V24RemoveCleanUpTask1599692515073'), - (1604530387718, 'V25SettingsGatewayRemoval1604530387718'), - (1605027257347, 'V26RemoveCommandUseCounter1605027257347'), - (1605297776910, 'V27TextToJsonb1605297776910'), - (1605460185741, 'V28SuggestionIdRemoveFromGuild1605460185741'), - (1606138444111, 'V29AttachmentMode1606138444111'), - (1606138444111, 'V30AttachmentModeChecks1606411800922'), - (1606650850324, 'V31MultiRole1606650850324'), - (1606948188150, 'V32SeparatedMemberNameUpdateLogs1606948188150'), - (1610450637243, 'V33LimitLessLanguageCodes1610450637243'), - (1610659806881, 'V34IncreasedModerationDurations1610659806881'), - (1612574048431, 'V35RemoveRaidColumns1612574048431'), - (1614640993140, 'V36RemoveEveryonePermissionNodes1614640993140'), - (1615269810077, 'V37BirthdayIntegration1615269810077'), - (1616108184492, 'V38UpdateBirthdayIntegration1616108184492'), - (1616168146993, 'V39RenamePropertiesToKebabCase1616168146993'), - (1616188199786, 'V40AddSocialIgnoredRoles1616188199786'), - (1616191193015, 'V41AddMusicAllowedVoiceChannelsAndRoles1616191193015'), - (1616201639503, 'V42AddAllowedRolesIntoGiveaways1616201639503'), - (1616786337398, 'V43RemovedReferencesToUndesiredWords1616786337398'), - (1617272351741, 'V44AddAutoDeleteIgnoreOptions1617272351741'), - (1617297815771, 'V45AddAliasesArrayToTags1617297815771'), - (1617314282232, 'V46AddStarboardMaximumAge1617314282232'), - (1617645345960, 'V47AddNewLogsChannels1617645345960'), - (1617890802896, 'V48AddSeparateInitialRoles1617890802896'), - (1618562933625, 'V49StripConfusablesFromWordFilter1618562933625'), - (1618951687674, 'V50RemoveDatabaseChecks1618951687674'), - (1619089555427, 'V51NewSocialFeaturesAndValueRename1619089555427'), - (1619969827210, 'V52JoinAndLeaveMessageAutoDelete1619969827210'), - (1620050724729, 'V53AfkSettings1620050724729'), - (1626169505546, 'V54EventsModernization1626169505546'), - (1627318321333, 'V55MediaOnlyChannels1627318321333'), - (1629315603851, 'V56MigrateTwitchToEventSub1629315603851'), - (1633184279614, 'V57MigrateReactionRolesAndTriggers1633184279614'), - (1633201003755, 'V58GiveawayAuthor1633201003755'), - (1633266112042, 'V59MigrateSelfmodEmojis1633266112042'), - (1633267799333, 'V60MigrateStarboardAndSuggestionEmojis1633267799333'), - (1634379789387, 'V61AddMusicAutoLeave1634379789387'), - (1646161749171, 'V62VersionSevenRemoveGuildSettings1646161749171'), - (1646162907066, 'V63VersionSevenRemoveStarboard1646162907066'), - (1646163533583, 'V64VersionSevenRemoveSpouses1646163533583'), - (1646178098086, 'V65VersionSevenRemoveStaleSchedules1646178098086'), - (1647241680539, 'V66ExpandGuildSubscriptionMessage1647241680539'), - (1648974657502, 'V67RemoveAudioSettings1648974657502'), - (1654278189464, 'V68PartialRemoveSuggestionSettings1654278189464'), - (1654346108374, 'V69RemoveTriggers1654346108374'); - -COMMIT; diff --git a/scripts/dependencycache.ps1 b/scripts/dependencycache.ps1 deleted file mode 100644 index 4be0bf9c56f..00000000000 --- a/scripts/dependencycache.ps1 +++ /dev/null @@ -1,26 +0,0 @@ -Function Step-Main { - Param ( - [string]$Command = "default", - [string]$Manager = "yarn" - ) - - Process { - switch ( $Command ) { - clear { - Remove-Item -Recurse -Force -ErrorAction Ignore dist - Remove-Item -Recurse -Force -ErrorAction Ignore node_modules - switch ($Manager) { - yarn { - Remove-Item -Recurse -Force -ErrorAction Ignore $(yarn cache dir) - } - npm { - npm cache rm --force - } - } - } - default { Write-Host "Unrecognized command, please try again" -ForegroundColor Red } - } - } -} - -Step-Main @args diff --git a/scripts/migrations.mjs b/scripts/migrations.mjs deleted file mode 100644 index 3b591ce49f1..00000000000 --- a/scripts/migrations.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import { readFile } from 'node:fs/promises'; -import typeorm from 'typeorm'; -import dbConfig from '../dist/lib/database/database.config.js'; - -const { config } = dbConfig; - -const [sqlScript, connection] = await Promise.all([ - readFile(new URL('SetMigrations.sql', import.meta.url), { encoding: 'utf-8' }), - typeorm.createConnection({ ...config, logging: true }) -]); - -await connection.query(sqlScript); diff --git a/scripts/tlds.mjs b/scripts/tlds.mjs index 25785d3a739..9f1a59e5180 100644 --- a/scripts/tlds.mjs +++ b/scripts/tlds.mjs @@ -21,6 +21,6 @@ const content = source }) .join('\n'); -const outputFile = new URL('../src/lib/util/Links/TLDs.ts', import.meta.url); +const outputFile = new URL('../projects/bot/src/lib/util/Links/TLDs.ts', import.meta.url); void writeFile(outputFile, header + content + footer); diff --git a/src/.env.development b/src/.env.development deleted file mode 100644 index 032f361e71b..00000000000 --- a/src/.env.development +++ /dev/null @@ -1,77 +0,0 @@ -CLIENT_NAME='Skyra' -CLIENT_VERSION='6.1.0-dev [Sapphire Edition]' -CLIENT_PREFIX='sd!' -CLIENT_REGEX_PREFIX='' -CLIENT_OWNERS='' -CLIENT_ID='' -SHARDS='"auto"' - -CLIENT_PRESENCE_NAME='sd!help' -CLIENT_PRESENCE_TYPE='LISTENING' - -SISTER_CLIENTS='338249781594030090 419828209966776330 444081201297227776' - -API_ENABLED=true -API_ORIGIN='http://127.0.0.1:3000' -API_PREFIX='/' -API_PORT=8282 - -OAUTH_COOKIE='SKYRA_AUTH' -OAUTH_DOMAIN_OVERWRITE='127.0.0.1' -OAUTH_REDIRECT_URI='http://127.0.0.1:3000/oauth/callback' -OAUTH_SCOPE='identify guilds' -OAUTH_SECRET='' - -TWITCH_CALLBACK='http://localhost/twitch/event_sub_verify/' - -PGSQL_DATABASE_NAME='skyra' -PGSQL_DATABASE_PASSWORD='postgres' -PGSQL_DATABASE_USER='postgres' -PGSQL_DATABASE_PORT=5432 -PGSQL_DATABASE_HOST='localhost' -TYPEORM_DEBUG_LOGS=false - -REDIS_ENABLED=true -REDIS_HOST='localhost' -REDIS_PORT=8287 -REDIS_DB=1 -REDIS_PASSWORD='redis' - -INFLUX_ENABLED=true -INFLUX_URL='http://localhost:8285' -INFLUX_TOKEN='' -INFLUX_ORG='Skyra-Project' -INFLUX_ORG_ANALYTICS_BUCKET='analytics' - -SAELEM_ENABLED=false -SAELEM_URL='http://localhost:8284' - -GRAPHQL_STARWARS_URL='https://swapi.skyra.pw' -HASTEBIN_POST_URL='https://hastebin.skyra.pw' -HASTEBIN_GET_URL='https://hastebin.skyra.pw' - -WEBHOOK_ERROR_ID='648663047615021058' -WEBHOOK_ERROR_TOKEN='' - -WORKER_COUNT=2 - -# Tokens -DISCORD_TOKEN='' -BOTLIST_SPACE_TOKEN='' -BOTS_FOR_DISCORD_TOKEN='' -BOTS_ON_DISCORD_TOKEN='' -CRYPTOCOMPARE_TOKEN='' -DISCORD_BOT_LIST_TOKEN='' -DISCORD_BOTS_TOKEN='' -GOOGLE_API_TOKEN='' -KITSU_ID='AWQO5J657S' -KITSU_TOKEN='NzYxODA5NmY0ODRjYTRmMzQ2YjMzNzNmZmFhNjY5ZGRmYjZlMzViN2VkZDIzMGUwYjM5ZjQ5NjAwZGI4ZTc5MHJlc3RyaWN0SW5kaWNlcz1wcm9kdWN0aW9uX21lZGlhJmZpbHRlcnM9Tk9UK2FnZVJhdGluZyUzQVIxOA==' -NINTENDO_ID='U3B6GR4UA3' -NINTENDO_TOKEN='6efbfb0f8f80defc44895018caf77504' -OWLBOT_TOKEN='' -SENTRY_URL='' -THEMOVIEDATABASE_TOKEN='' -TOP_GG_TOKEN='' -TWITCH_CLIENT_ID='' -TWITCH_EVENTSUB_SECRET='' -TWITCH_TOKEN='' diff --git a/src/Skyra.ts b/src/Skyra.ts deleted file mode 100644 index 5e8172f6efa..00000000000 --- a/src/Skyra.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { DbSet } from '#lib/database'; -import '#lib/setup'; - -import { SkyraClient } from '#lib/SkyraClient'; -import { helpUsagePostProcessor, rootFolder } from '#utils/constants'; -import { container } from '@sapphire/framework'; -import { RewriteFrames } from '@sentry/integrations'; -import * as Sentry from '@sentry/node'; -import i18next from 'i18next'; - -const client = new SkyraClient(); - -async function main() { - // Load in i18next post processor - i18next.use(helpUsagePostProcessor); - - // Load in Sentry for error logging - if (process.env.SENTRY_URL) { - Sentry.init({ - dsn: process.env.SENTRY_URL, - integrations: [ - new Sentry.Integrations.Modules(), - new Sentry.Integrations.FunctionToString(), - new Sentry.Integrations.LinkedErrors(), - new Sentry.Integrations.Console(), - new Sentry.Integrations.Http({ breadcrumbs: true, tracing: true }), - new RewriteFrames({ root: rootFolder }) - ] - }); - } - - try { - // Connect to the Database - container.db = await DbSet.connect(); - - // Login to the Discord gateway - await client.login(); - } catch (error) { - container.logger.error(error); - client.destroy(); - process.exit(1); - } -} - -main().catch(container.logger.error.bind(container.logger)); diff --git a/src/arguments/boolean.ts b/src/arguments/boolean.ts deleted file mode 100644 index 89684c8e7d4..00000000000 --- a/src/arguments/boolean.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext, AsyncArgumentResult, Identifiers } from '@sapphire/framework'; -import type { PieceContext } from '@sapphire/pieces'; - -export class CoreArgument extends Argument { - public constructor(context: PieceContext) { - super(context, { name: 'boolean' }); - } - - public async run(parameter: string, context: ArgumentContext): AsyncArgumentResult { - const boolean = parameter.toLowerCase(); - - let truths = context.args.t(LanguageKeys.Arguments.BooleanTrueOptions).filter(Boolean); - let falses = context.args.t(LanguageKeys.Arguments.BooleanFalseOptions).filter(Boolean); - - if (!truths.length) truths = context.args.t(LanguageKeys.Arguments.BooleanTrueOptions, { lng: 'en-US' }).filter(Boolean); - if (!falses.length) falses = context.args.t(LanguageKeys.Arguments.BooleanFalseOptions, { lng: 'en-US' }).filter(Boolean); - - if (truths.includes(boolean)) return this.ok(true); - if (falses.includes(boolean)) return this.ok(false); - - const possibles = truths.concat(falses); - return this.error({ parameter, identifier: Identifiers.ArgumentBooleanError, context: { ...context, possibles, count: possibles.length } }); - } -} diff --git a/src/arguments/case.ts b/src/arguments/case.ts deleted file mode 100644 index 1377192c668..00000000000 --- a/src/arguments/case.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { getModeration } from '#utils/functions'; -import { Argument, ArgumentContext, Identifiers } from '@sapphire/framework'; - -const minimum = 0; -const maximum = 2_147_483_647; // Maximum value for int32 - -export class UserArgument extends Argument { - public async run(parameter: string, context: ArgumentContext) { - const latest = context.args.t(LanguageKeys.Arguments.CaseLatestOptions); - if (latest.includes(parameter)) return this.ok(await getModeration(context.message.guild!).getCurrentId()); - - const parsed = Number(parameter); - if (!Number.isInteger(parsed)) { - return this.error({ parameter, identifier: Identifiers.ArgumentIntegerError, context: { ...context, minimum, maximum } }); - } - - if (parsed < minimum) { - return this.error({ parameter, identifier: Identifiers.ArgumentIntegerTooSmall, context: { ...context, minimum, maximum } }); - } - - if (parsed > maximum) { - return this.error({ parameter, identifier: Identifiers.ArgumentIntegerTooLarge, context: { ...context, minimum, maximum } }); - } - - return this.ok(parsed); - } -} diff --git a/src/arguments/channelName.ts b/src/arguments/channelName.ts deleted file mode 100644 index 175dc8659dc..00000000000 --- a/src/arguments/channelName.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { isGuildMessage } from '#utils/common'; -import { FuzzySearch } from '#utils/Parsers/FuzzySearch'; -import { validateChannelAccess } from '#utils/util'; -import { ChannelMentionRegex, SnowflakeRegex } from '@sapphire/discord.js-utilities'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import type { Guild, GuildChannel, ThreadChannel, User } from 'discord.js'; - -export class UserArgument extends Argument { - public resolveChannel(query: string, guild: Guild) { - const channelId = ChannelMentionRegex.exec(query) ?? SnowflakeRegex.exec(query); - return (channelId !== null && guild.channels.cache.get(channelId[1])) ?? null; - } - - public async run(parameter: string, { message, minimum, context, filter }: ChannelArgumentContext) { - if (!isGuildMessage(message)) return this.error({ parameter, identifier: LanguageKeys.Arguments.GuildChannelMissingGuildError, context }); - filter = this.getFilter(message.author, filter); - - const resChannel = this.resolveChannel(parameter, message.guild); - if (resChannel && filter(resChannel)) return this.ok(resChannel); - - const result = await new FuzzySearch(message.guild.channels.cache, (entry) => entry.name, filter).run(message, parameter, minimum); - if (result) return this.ok(result[1]); - return this.error({ parameter, identifier: LanguageKeys.Arguments.GuildChannelError, context }); - } - - private getFilter(author: User, filter?: (entry: GuildChannel | ThreadChannel) => boolean) { - const clientUser = author.client.user!; - return typeof filter === 'undefined' - ? (entry: GuildChannel | ThreadChannel) => validateChannelAccess(entry, author) && validateChannelAccess(entry, clientUser) - : (entry: GuildChannel | ThreadChannel) => - filter(entry) && validateChannelAccess(entry, author) && validateChannelAccess(entry, clientUser); - } -} - -interface ChannelArgumentContext extends ArgumentContext { - filter?: (entry: GuildChannel | ThreadChannel) => boolean; -} diff --git a/src/arguments/cleanString.ts b/src/arguments/cleanString.ts deleted file mode 100644 index fc4d8c13a13..00000000000 --- a/src/arguments/cleanString.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { cleanMentions } from '#utils/util'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, { message }: ArgumentContext) { - const clean = message.guild ? cleanMentions(message.guild, parameter) : parameter; - return this.ok(clean); - } -} diff --git a/src/arguments/color.ts b/src/arguments/color.ts deleted file mode 100644 index 4bf9d2f1bda..00000000000 --- a/src/arguments/color.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { ColorHandler } from '#lib/structures'; -import { parse } from '#utils/Color'; -import { Argument, ArgumentContext, AsyncArgumentResult } from '@sapphire/framework'; - -export class CoreArgument extends Argument { - public async run(parameter: string, context: ArgumentContext): AsyncArgumentResult { - const color = parse(parameter); - return color === null ? this.error({ parameter, identifier: LanguageKeys.Arguments.Color, context }) : this.ok(color); - } -} diff --git a/src/arguments/command.ts b/src/arguments/command.ts deleted file mode 100644 index 286fa3d5025..00000000000 --- a/src/arguments/command.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import { OWNERS } from '#root/config'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: CommandArgumentContext) { - const resolved = this.container.stores.get('commands').get(parameter.toLowerCase()) as SkyraCommand | undefined; - if (resolved !== undefined && this.isAllowed(resolved, context)) return this.ok(resolved); - return this.error({ parameter, identifier: LanguageKeys.Arguments.Command, context }); - } - - private isAllowed(command: SkyraCommand, context: CommandArgumentContext): boolean { - if (command.permissionLevel !== PermissionLevels.BotOwner) return true; - return context.owners ?? OWNERS.includes(context.message.author.id); - } -} - -interface CommandArgumentContext extends ArgumentContext { - owners?: boolean; -} diff --git a/src/arguments/commandMatch.ts b/src/arguments/commandMatch.ts deleted file mode 100644 index b131128b8f1..00000000000 --- a/src/arguments/commandMatch.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { CommandMatcher } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import { OWNERS } from '#root/config'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: CommandArgumentContext) { - const resolved = CommandMatcher.resolve(parameter); - if (resolved !== null && this.isAllowed(resolved, context)) return this.ok(resolved); - return this.error({ parameter, identifier: LanguageKeys.Arguments.CommandMatch, context }); - } - - private isAllowed(resolved: string, context: CommandArgumentContext): boolean { - const command = this.container.stores.get('commands').get(resolved) as SkyraCommand | undefined; - if (command === undefined) return true; - - if (command.permissionLevel !== PermissionLevels.BotOwner) return true; - return context.owners ?? OWNERS.includes(context.message.author.id); - } -} - -interface CommandArgumentContext extends ArgumentContext { - owners?: boolean; -} diff --git a/src/arguments/commandName.ts b/src/arguments/commandName.ts deleted file mode 100644 index 238fac958cf..00000000000 --- a/src/arguments/commandName.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import { OWNERS } from '#root/config'; -import { FuzzySearch } from '#utils/Parsers/FuzzySearch'; -import { Argument, ArgumentContext, Command } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: CommandArgumentContext) { - const commands = this.container.stores.get('commands'); - const found = commands.get(parameter.toLowerCase()) as SkyraCommand | undefined; - if (found) { - return this.isAllowed(found, context) ? this.ok(found) : this.error({ parameter, identifier: LanguageKeys.Arguments.Command, context }); - } - - const command = await new FuzzySearch(commands, (command) => command.name, context.filter).run(context.message, parameter, context.minimum); - if (command) return this.ok(command[1]); - - return this.error({ parameter, identifier: LanguageKeys.Arguments.Command, context }); - } - - private isAllowed(command: SkyraCommand, context: CommandArgumentContext): boolean { - if (command.permissionLevel !== PermissionLevels.BotOwner) return true; - return context.owners ?? OWNERS.includes(context.message.author.id); - } -} - -interface CommandArgumentContext extends ArgumentContext { - filter?: (entry: Command) => boolean; - owners?: boolean; -} diff --git a/src/arguments/duration.ts b/src/arguments/duration.ts deleted file mode 100644 index d536042969a..00000000000 --- a/src/arguments/duration.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import { Duration } from '@sapphire/time-utilities'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: ArgumentContext) { - const date = new Duration(parameter).fromNow; - if (!isNaN(date.getTime()) && date.getTime() > Date.now()) return this.ok(date); - return this.error({ parameter, identifier: LanguageKeys.Arguments.Duration, context }); - } -} diff --git a/src/arguments/emoji.ts b/src/arguments/emoji.ts deleted file mode 100644 index 7f37748425c..00000000000 --- a/src/arguments/emoji.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { EmojiObject, getEmojiObject } from '#utils/functions'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public run(parameter: string, context: ArgumentContext) { - const resolved = getEmojiObject(parameter); - if (resolved === null) return this.error({ parameter, identifier: LanguageKeys.Arguments.Emoji, context }); - return this.ok(resolved); - } -} diff --git a/src/arguments/image.ts b/src/arguments/image.ts deleted file mode 100644 index 928bf11788f..00000000000 --- a/src/arguments/image.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { fetchAvatar } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { ExtendedArgument, ExtendedArgumentContext, ExtendedArgumentOptions } from '@sapphire/framework'; -import type { Image } from 'canvas-constructor/napi-rs'; -import type { User } from 'discord.js'; - -@ApplyOptions>({ baseArgument: 'userName' }) -export class UserExtendedArgument extends ExtendedArgument<'userName', Image> { - public async handle(user: User, context: ExtendedArgumentContext) { - try { - return this.ok(await fetchAvatar(user)); - } catch { - return this.error({ parameter: context.parameter, identifier: LanguageKeys.Arguments.ImageNotFound, context }); - } - } -} diff --git a/src/arguments/invite.ts b/src/arguments/invite.ts deleted file mode 100644 index 3ff0ee49b57..00000000000 --- a/src/arguments/invite.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { DiscordInviteLinkRegex } from '@sapphire/discord-utilities'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: ArgumentContext) { - const parsed = DiscordInviteLinkRegex.exec(parameter); - if (parsed === null) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.Invite, context }); - } - - const { code } = parsed.groups!; - const invite = await this.container.client.invites.fetch(code); - if (invite === null || !Reflect.has(invite, 'guildId')) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.Invite, context }); - } - - return this.ok(code); - } -} diff --git a/src/arguments/language.ts b/src/arguments/language.ts deleted file mode 100644 index 793d2479256..00000000000 --- a/src/arguments/language.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: ArgumentContext) { - const { languages } = this.container.i18n; - if (languages.has(parameter)) return this.ok(parameter); - return this.error({ parameter, identifier: LanguageKeys.Arguments.Language, context: { ...context, possibles: [...languages.keys()] } }); - } -} diff --git a/src/arguments/piece.ts b/src/arguments/piece.ts deleted file mode 100644 index 176dfff4289..00000000000 --- a/src/arguments/piece.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext, Piece } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public async run(parameter: string, context: ArgumentContext) { - for (const store of this.container.stores.values()) { - const piece = store.get(parameter); - if (piece) return this.ok(piece); - } - return this.error({ parameter, identifier: LanguageKeys.Arguments.Piece, context }); - } -} diff --git a/src/arguments/range.ts b/src/arguments/range.ts deleted file mode 100644 index 1248eda71a4..00000000000 --- a/src/arguments/range.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { parseRange } from '#utils/util'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public run(parameter: string, context: ArgumentContext) { - const number = Number(parameter); - if (Number.isSafeInteger(number)) return this.ok([number]); - - const range = parseRange(parameter); - if (range.length === 0) return this.error({ parameter, identifier: LanguageKeys.Arguments.RangeInvalid, context }); - if (typeof context.maximum === 'number' && range.length > context.maximum) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.RangeMax, context: { ...context, count: context.maximum } }); - } - - return this.ok(range); - } -} diff --git a/src/arguments/reset.ts b/src/arguments/reset.ts deleted file mode 100644 index 00e2cf5a5b2..00000000000 --- a/src/arguments/reset.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public run(parameter: string, context: ArgumentContext) { - const lowerCasedParameter = parameter.toLowerCase(); - if (context.args.t(LanguageKeys.Arguments.ResetPossibles).includes(lowerCasedParameter)) return this.ok(true); - return this.error({ parameter, context }); - } -} diff --git a/src/arguments/roleName.ts b/src/arguments/roleName.ts deleted file mode 100644 index fb6e97835e3..00000000000 --- a/src/arguments/roleName.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { isGuildMessage } from '#utils/common'; -import { FuzzySearch } from '#utils/Parsers/FuzzySearch'; -import { RoleMentionRegex, SnowflakeRegex } from '@sapphire/discord.js-utilities'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import type { Guild, Role } from 'discord.js'; - -export class UserArgument extends Argument { - public get role() { - return this.store.get('role') as Argument; - } - - public async run(parameter: string, context: RoleArgumentContext) { - const { message } = context; - if (!isGuildMessage(message)) return this.role.run(parameter, context); - - const resolvedRole = this.resolveRole(parameter, message.guild); - if (resolvedRole) return this.ok(resolvedRole); - - const result = await new FuzzySearch(message.guild.roles.cache, (entry) => entry.name, context.filter).run( - message, - parameter, - context.minimum - ); - if (result) return this.ok(result[1]); - return this.error({ parameter, identifier: LanguageKeys.Arguments.RoleError, context }); - } - - public resolveRole(query: string, guild: Guild) { - const role = RoleMentionRegex.exec(query) ?? SnowflakeRegex.exec(query); - return role ? guild.roles.cache.get(role[1]) ?? null : null; - } -} - -interface RoleArgumentContext extends ArgumentContext { - filter?: (entry: Role) => boolean; -} diff --git a/src/arguments/scope.ts b/src/arguments/scope.ts deleted file mode 100644 index 9d435715e6c..00000000000 --- a/src/arguments/scope.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Scope } from '#lib/types'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - public run(parameter: string, context: ArgumentContext) { - const lowerCasedParameter = parameter.toLowerCase(); - if (lowerCasedParameter === context.args.t(LanguageKeys.Arguments.ScopeLocal)) return this.ok(Scope.Local); - if (lowerCasedParameter === context.args.t(LanguageKeys.Arguments.ScopeGlobal)) return this.ok(Scope.Global); - return this.error({ parameter, context }); - } -} diff --git a/src/arguments/shinyWager.ts b/src/arguments/shinyWager.ts deleted file mode 100644 index 639f5e7366f..00000000000 --- a/src/arguments/shinyWager.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ApplyOptions } from '@sapphire/decorators'; -import { ExtendedArgument, ExtendedArgumentContext, ExtendedArgumentOptions } from '@sapphire/framework'; - -@ApplyOptions>({ aliases: ['wager'], baseArgument: 'integer' }) -export class UserExtendedArgument extends ExtendedArgument<'integer', number> { - public handle(value: number, context: ExtendedArgumentContext) { - if (UserExtendedArgument.kValidAmounts.includes(value)) return this.ok(value); - return this.error({ - parameter: context.parameter, - identifier: LanguageKeys.Arguments.Wager, - context: { - ...context, - possibles: UserExtendedArgument.kValidAmounts.map((a) => a.toString()) - } - }); - } - - public static readonly kValidAmounts = [50, 100, 200, 500, 1000, 2000, 5000, 10_000, 20_000, 25_000, 50_000, 100_000, 500_000]; -} diff --git a/src/arguments/snowflake.ts b/src/arguments/snowflake.ts deleted file mode 100644 index 9385d44ea46..00000000000 --- a/src/arguments/snowflake.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import { DiscordSnowflake } from '@sapphire/snowflake'; -import type { Snowflake } from 'discord.js'; - -export class UserArgument extends Argument { - /** - * The validator, requiring all numbers and 17 to 19 digits (future-proof). - */ - private readonly kRegExp = /^\d{17,19}$/; - - /** - * Stanislav's join day, known as the oldest user in Discord, and practically - * the lowest snowflake we can get (as they're bound by the creation date). - */ - private readonly kMinimum = new Date(2015, 1, 28).getTime(); - - public run(parameter: string, context: ArgumentContext) { - if (this.kRegExp.test(parameter)) { - const snowflake = DiscordSnowflake.deconstruct(parameter); - const timestamp = Number(snowflake.timestamp); - if (timestamp >= this.kMinimum && timestamp < Date.now()) return this.ok(parameter); - } - return this.error({ parameter, identifier: LanguageKeys.Arguments.Snowflake, context }); - } -} diff --git a/src/arguments/store.ts b/src/arguments/store.ts deleted file mode 100644 index 43525ed9275..00000000000 --- a/src/arguments/store.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext, Piece, Store } from '@sapphire/framework'; - -export class UserArgument extends Argument> { - public possibles: readonly string[] = []; - public async run(parameter: string, context: ArgumentContext) { - for (const store of this.container.stores.values()) { - if (store.name === parameter) return this.ok(store); - } - return this.error({ parameter, identifier: LanguageKeys.Arguments.Store, context: { ...context, possibles: this.possibles } }); - } - - public onLoad() { - this.possibles = this.container.stores.map((store) => `\`${store.name}\``); - return super.onLoad(); - } -} diff --git a/src/arguments/textChannelName.ts b/src/arguments/textChannelName.ts deleted file mode 100644 index bc14708ff8c..00000000000 --- a/src/arguments/textChannelName.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { isTextChannel } from '@sapphire/discord.js-utilities'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import type { TextChannel } from 'discord.js'; - -export class UserArgument extends Argument { - public get channelName(): Argument { - return this.store.get('channelName') as Argument; - } - - public run(argument: string, context: ArgumentContext) { - return this.channelName.run(argument, { ...context, filter: isTextChannel }); - } -} diff --git a/src/arguments/textOrNewsChannelName.ts b/src/arguments/textOrNewsChannelName.ts deleted file mode 100644 index 8def796c674..00000000000 --- a/src/arguments/textOrNewsChannelName.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { orMix } from '#utils/common'; -import { isNewsChannel, isTextChannel } from '@sapphire/discord.js-utilities'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import type { NewsChannel, TextChannel } from 'discord.js'; - -export class UserArgument extends Argument { - private readonly filter = orMix(isTextChannel, isNewsChannel); - - public get channelName(): Argument { - return this.store.get('channelName') as Argument; - } - - public run(argument: string, context: ArgumentContext) { - return this.channelName.run(argument, { ...context, filter: this.filter }); - } -} diff --git a/src/arguments/time.ts b/src/arguments/time.ts deleted file mode 100644 index 082ef50a8e8..00000000000 --- a/src/arguments/time.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Argument, ArgumentContext } from '@sapphire/framework'; - -export class UserArgument extends Argument { - private get date() { - return this.container.stores.get('arguments').get('date') as Argument; - } - - private get duration() { - return this.container.stores.get('arguments').get('duration') as Argument; - } - - public async run(parameter: string, context: ArgumentContext) { - const date = await Promise.resolve() - .then(() => this.date.run(parameter, context)) - .then((date) => (date.success ? date : this.duration.run(parameter, context))); - - if (date.success && date.value.getTime() > Date.now()) return this.ok(date.value); - return this.error({ parameter, identifier: LanguageKeys.Arguments.Time, context }); - } -} diff --git a/src/arguments/timespan.ts b/src/arguments/timespan.ts deleted file mode 100644 index bb4e315ed2a..00000000000 --- a/src/arguments/timespan.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { seconds } from '#utils/common'; -import { Argument, ArgumentContext } from '@sapphire/framework'; -import { Duration } from '@sapphire/time-utilities'; - -export class UserArgument extends Argument { - public run(parameter: string, context: ArgumentContext) { - const duration = this.parseParameter(parameter); - - if (!Number.isSafeInteger(duration)) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.TimeSpan, context }); - } - - if (typeof context.minimum === 'number' && duration < context.minimum) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.TimeSpanTooSmall, context }); - } - - if (typeof context.maximum === 'number' && duration > context.maximum) { - return this.error({ parameter, identifier: LanguageKeys.Arguments.TimeSpanTooBig, context }); - } - - return this.ok(duration); - } - - private parseParameter(parameter: string): number { - const number = Number(parameter); - if (!Number.isNaN(number)) return seconds(number); - - const duration = new Duration(parameter).offset; - if (!Number.isNaN(duration)) return duration; - - const date = Date.parse(parameter); - if (!Number.isNaN(date)) return date - Date.now(); - - return NaN; - } -} diff --git a/src/arguments/userName.ts b/src/arguments/userName.ts deleted file mode 100644 index 4bb99f13dc7..00000000000 --- a/src/arguments/userName.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildMessage } from '#lib/types'; -import { isGuildMessage } from '#utils/common'; -import { SnowflakeRegex, UserOrMemberMentionRegex } from '@sapphire/discord.js-utilities'; -import { Argument, ArgumentContext, Identifiers } from '@sapphire/framework'; -import type { User } from 'discord.js'; - -export class UserArgument extends Argument { - private get user(): Argument { - return this.store.get('user') as Argument; - } - - public async run(parameter: string, context: ArgumentContext) { - const message = context.message as GuildMessage; - if (!isGuildMessage(message)) return this.user.run(parameter, context); - - const user = await this.resolveUser(message, parameter); - if (user) return this.ok(user); - if (user === null) return this.error({ parameter, identifier: Identifiers.ArgumentUserError, context }); - - const result = await this.fetchMember(message, parameter); - if (result) return this.ok(result.user); - return this.error({ parameter, identifier: LanguageKeys.Arguments.UserError, context }); - } - - private async resolveUser(message: GuildMessage, argument: string) { - const result = UserOrMemberMentionRegex.exec(argument) ?? SnowflakeRegex.exec(argument); - if (result === null) return undefined; - - try { - return await message.client.users.fetch(result[1]); - } catch { - return null; - } - } - - private async fetchMember(message: GuildMessage, query: string) { - try { - const results = await message.guild.members.fetch({ query }); - return results.first() ?? null; - } catch { - return null; - } - } -} diff --git a/src/commands/Admin/conf.ts b/src/commands/Admin/conf.ts deleted file mode 100644 index 1fd0bd54012..00000000000 --- a/src/commands/Admin/conf.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { configurableGroups, isSchemaGroup, isSchemaKey, readSettings, remove, reset, SchemaKey, set, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SettingsMenu, SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { isValidCustomEmoji, isValidSerializedTwemoji, isValidTwemoji } from '#lib/util/functions/emojis'; -import { filter, map } from '#utils/common'; -import { inlineCode } from '@discordjs/builders'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { toTitleCase } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['settings', 'config', 'configs', 'configuration'], - description: LanguageKeys.Commands.Admin.ConfDescription, - detailedDescription: LanguageKeys.Commands.Admin.ConfExtended, - guarded: true, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['set', { input: 'add', output: 'set' }, 'show', 'remove', 'reset', { input: 'menu', default: true }] -}) -export class UserCommand extends SkyraCommand { - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public menu(message: GuildMessage, args: SkyraCommand.Args, context: SkyraCommand.Context) { - return new SettingsMenu(message, args.t).init(context); - } - - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const key = args.finished ? '' : await args.pick('string'); - const schemaValue = configurableGroups.getPathString(key.toLowerCase()); - if (schemaValue === null) this.error(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); - - const output = await readSettings(message.guild, (settings) => { - return schemaValue.display(settings, args.t); - }); - - if (isSchemaKey(schemaValue)) { - return send(message, { - content: args.t(LanguageKeys.Commands.Admin.ConfGet, { key: schemaValue.name, value: output }), - allowedMentions: { users: [], roles: [] } - }); - } - - const title = key - ? `: ${key - .split('.') - .map((key) => toTitleCase(key)) - .join('/')}` - : ''; - return send(message, { - content: args.t(LanguageKeys.Commands.Admin.Conf, { key: title, list: output }), - allowedMentions: { users: [], roles: [] } - }); - } - - public async set(message: GuildMessage, args: SkyraCommand.Args) { - const [key, schemaKey] = await this.fetchKey(args); - const response = await writeSettings(message.guild, async (settings) => { - await set(settings, schemaKey, args); - return schemaKey.display(settings, args.t); - }); - - return send(message, { - content: args.t(LanguageKeys.Commands.Admin.ConfUpdated, { key, response: this.getTextResponse(response) }), - allowedMentions: { users: [], roles: [] } - }); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const [key, schemaKey] = await this.fetchKey(args); - const response = await writeSettings(message.guild, async (settings) => { - await remove(settings, schemaKey, args); - return schemaKey.display(settings, args.t); - }); - - return send(message, { - content: args.t(LanguageKeys.Commands.Admin.ConfUpdated, { key, response: this.getTextResponse(response) }), - allowedMentions: { users: [], roles: [] } - }); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - const [key, schemaKey] = await this.fetchKey(args); - const response = await writeSettings(message.guild, async (settings) => { - reset(settings, schemaKey); - return schemaKey.display(settings, args.t); - }); - - return send(message, { - content: args.t(LanguageKeys.Commands.Admin.ConfReset, { key, value: response }), - allowedMentions: { users: [], roles: [] } - }); - } - - private getTextResponse(response: string) { - return isValidCustomEmoji(response) || isValidSerializedTwemoji(response) || isValidTwemoji(response) ? response : inlineCode(response); - } - - private async fetchKey(args: SkyraCommand.Args) { - const key = await args.pick('string'); - const value = configurableGroups.getPathString(key.toLowerCase()); - if (value === null) this.error(LanguageKeys.Commands.Admin.ConfGetNoExt, { key }); - if (value.dashboardOnly) this.error(LanguageKeys.Commands.Admin.ConfDashboardOnlyKey, { key }); - if (isSchemaGroup(value)) { - this.error(LanguageKeys.Settings.Gateway.ChooseKey, { - keys: [ - ...map( - filter(value.childValues(), (value) => !value.dashboardOnly), - (value) => `\`${value.name}\`` - ) - ] - }); - } - - return [value.name, value as SchemaKey] as const; - } -} diff --git a/src/commands/Admin/roleset.ts b/src/commands/Admin/roleset.ts deleted file mode 100644 index e2c91b20309..00000000000 --- a/src/commands/Admin/roleset.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { GuildEntity, GuildSettings, readSettings, UniqueRoleSet, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - aliases: ['rs'], - description: LanguageKeys.Commands.Admin.RoleSetDescription, - detailedDescription: LanguageKeys.Commands.Admin.RoleSetExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'reset', 'list', { input: 'auto', default: true }] -}) -export class UserCommand 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, args: SkyraCommand.Args) { - return this.handleAdd(message, await args.pick('string'), args); - } - - // This subcommand will always remove roles from a provided role set. - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const name = await args.pick('string'); - const roles = await args.repeat('roleName'); - - // Get all rolesets from settings and check if there is an existing set with the name provided by the user - await writeSettings(message.guild, (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) => - set.name === name ? { name, roles: set.roles.filter((id: string) => !roles.find((role) => role.id === id)) } : set - ); - }); - - return send(message, args.t(LanguageKeys.Commands.Admin.RoleSetRemoved, { name, roles: roles.map((role) => role.name) })); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - const [name, sets] = await Promise.all([ - args.pick('string').catch(() => null), - // Get all rolesets from settings and check if there is an existing set with the name provided by the user - readSettings(message.guild, GuildSettings.Roles.UniqueRoleSets) - ]); - if (sets.length === 0) this.error(LanguageKeys.Commands.Admin.RoleSetResetEmpty); - - if (!name) { - await writeSettings(message.guild, [[GuildSettings.Roles.UniqueRoleSets, []]]); - return send(message, args.t(LanguageKeys.Commands.Admin.RoleSetResetAll)); - } - - const arrayIndex = sets.findIndex((set) => set.name === name); - if (arrayIndex === -1) this.error(LanguageKeys.Commands.Admin.RoleSetResetNotExists, { name }); - - await writeSettings(message.guild, (settings) => { - settings[GuildSettings.Roles.UniqueRoleSets].splice(arrayIndex, 1); - }); - - return send(message, args.t(LanguageKeys.Commands.Admin.RoleSetResetGroup, { name })); - } - - // This subcommand will run if a user doesn't type add or remove. The bot will then add AND remove based on whether that role is in the set already. - public async auto(message: GuildMessage, args: SkyraCommand.Args) { - const name = await args.pick('string'); - - // Get all role sets from settings and check if there is an existing set with the name provided by the user - const sets = await readSettings(message.guild, GuildSettings.Roles.UniqueRoleSets); - const set = sets.find((set) => set.name === name); - - // If this role set does not exist we have to create it - if (!set) return this.handleAdd(message, name, args); - - // The role set exists - const roles = await args.repeat('roleName'); - const newSets = sets.map((set) => { - if (set.name !== name) return set; - // Add any role that wasn't in the set that the user provided - // This will also remove any of the roles that user provided and were already in the set - const newRoles = set.roles // - .map((id) => (roles.some((role) => role.id === id) ? null : id)) - .filter((id) => id) as string[]; - - for (const role of roles) if (!set.roles.includes(role.id)) newRoles.push(role.id); - - return { name, roles: newRoles }; - }); - - await writeSettings(message.guild, [[GuildSettings.Roles.UniqueRoleSets, newSets]]); - return send(message, args.t(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, args: SkyraCommand.Args) { - // Get all rolesets from settings - const sets = await readSettings(message.guild, GuildSettings.Roles.UniqueRoleSets); - if (sets.length === 0) this.error(LanguageKeys.Commands.Admin.RoleSetNoRoleSets); - - const list = await this.handleList(message, args, sets); - return send(message, list.join('\n')); - } - - private async handleList(message: GuildMessage, args: SkyraCommand.Args, sets: UniqueRoleSet[]) { - let changed = false; - - const list: string[] = []; - const guildRoles = message.guild.roles.cache; - for (const set of sets) { - const roles: string[] = []; - for (const id of set.roles) { - const role = guildRoles.get(id); - if (role === undefined) { - changed = true; - continue; - } - - roles.push(role.name); - } - - if (roles.length === 0) { - changed = true; - continue; - } - - list.push(`💠 **${set.name}**: ${args.t(LanguageKeys.Globals.AndListValue, { value: roles })}`); - } - - // If there were changes, scan a second time to clean up the data: - if (changed) { - // If after cleaning up, all sets end up empty, reset and return error: - if (list.length === 0) { - await writeSettings(message.guild, [[GuildSettings.Roles.UniqueRoleSets, []]]); - this.error(LanguageKeys.Commands.Admin.RoleSetNoRoleSets); - } - - // Else, clean up: - await writeSettings(message.guild, (settings) => this.cleanRoleSets(message, settings)); - } - - return list; - } - - private cleanRoleSets(message: GuildMessage, settings: GuildEntity) { - const guildRoles = message.guild.roles.cache; - - settings[GuildSettings.Roles.UniqueRoleSets] = settings[GuildSettings.Roles.UniqueRoleSets] - .map((set) => ({ name: set.name, roles: set.roles.filter((role) => guildRoles.has(role)) })) - .filter((set) => set.roles.length > 0); - } - - private async handleAdd(message: GuildMessage, name: string, args: SkyraCommand.Args) { - const roles = await args.repeat('roleName'); - - // Get all rolesets from settings and check if there is an existing set with the name provided by the user - const created = await writeSettings(message.guild, (settings) => { - const allRoleSets = settings[GuildSettings.Roles.UniqueRoleSets]; - const roleSet = allRoleSets.some((set) => set.name === name); - - // If it does not exist we need to create a brand new set - if (!roleSet) { - allRoleSets.push({ name, roles: roles.map((role) => role.id) }); - return true; - } - - // The set does exist so we want to only ADD new roles in - // Create a new array that we can use to overwrite the existing one in settings - const sets = allRoleSets.map((set) => { - if (set.name !== name) return set; - const finalRoles = [...set.roles]; - for (const role of roles) if (!finalRoles.includes(role.id)) finalRoles.push(role.id); - - return { name, roles: finalRoles }; - }); - settings[GuildSettings.Roles.UniqueRoleSets] = sets; - - return false; - }); - - return send( - message, - args.t(created ? LanguageKeys.Commands.Admin.RoleSetCreated : LanguageKeys.Commands.Admin.RoleSetAdded, { - name, - roles: roles.map((role) => role.name) - }) - ); - } -} diff --git a/src/commands/Animal/bunny.ts b/src/commands/Animal/bunny.ts deleted file mode 100644 index cef6b5f8075..00000000000 --- a/src/commands/Animal/bunny.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { isNullishOrEmpty } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import { URL } from 'node:url'; - -const url = new URL('https://api.bunnies.io/v2/loop/random/?media=gif,png'); - -@ApplyOptions({ - aliases: ['bunbun', 'rabbit'], - description: LanguageKeys.Commands.Animal.BunnyDescription, - detailedDescription: LanguageKeys.Commands.Animal.BunnyExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { - media: { gif }, - source: bunnySource - } = await fetch(url, FetchResultTypes.JSON); - - const imageUrl = getImageUrl(gif) ?? 'https://i.imgur.com/FnAPcxj.jpg'; - const translations = args.t(LanguageKeys.Commands.Animal.BunnyEmbedData); - const source = this.getSource(bunnySource); - - const embed = new MessageEmbed() - .setURL(imageUrl) - .setTitle(translations.title) - .setColor(await this.container.db.fetchColor(message)) - .setImage(imageUrl) - .setTimestamp(); - - if (source) { - embed.setDescription(`[${translations.source}](${source})`); - } - - return send(message, { embeds: [embed] }); - } - - private getSource(bunnySource: string): string | null { - if (isNullishOrEmpty(bunnySource) || bunnySource.toLowerCase() === 'unknown') return null; - return bunnySource; - } -} - -interface BunnyResultOk { - id: string; - media: { - gif: string; - poster: string; - }; - source: string; - thisServed: number; - totalServed: number; -} diff --git a/src/commands/Animal/catfact.ts b/src/commands/Animal/catfact.ts deleted file mode 100644 index cd8fa5267fc..00000000000 --- a/src/commands/Animal/catfact.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['kittenfact'], - description: LanguageKeys.Commands.Animal.CatfactDescription, - detailedDescription: LanguageKeys.Commands.Animal.CatfactExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - private facts: readonly string[] = []; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const fact = this.facts[Math.floor(Math.random() * this.facts.length)]; - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setTitle(args.t(LanguageKeys.Commands.Animal.CatfactTitle)) - .setDescription(fact); - return send(message, { embeds: [embed] }); - } - - public async onLoad() { - const text = await readFile(join(assetsFolder, 'data', 'catfacts.json'), 'utf-8'); - this.facts = JSON.parse(text); - } -} diff --git a/src/commands/Animal/dog.ts b/src/commands/Animal/dog.ts deleted file mode 100644 index f630d3240c9..00000000000 --- a/src/commands/Animal/dog.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['doggo', 'puppy'], - description: LanguageKeys.Commands.Animal.DogDescription, - detailedDescription: LanguageKeys.Commands.Animal.DogExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message) { - const [color, image] = await Promise.all([this.container.db.fetchColor(message), this.fetchImage()]); - - const embed = new MessageEmbed().setColor(color).setImage(image!).setTimestamp(); - return send(message, { embeds: [embed] }); - } - - private async fetchImage() { - const randomDogData = await fetch('https://dog.ceo/api/breeds/image/random', FetchResultTypes.JSON).catch(() => null); - return randomDogData?.status === 'success' ? getImageUrl(randomDogData.message) : 'https://i.imgur.com/cF0XUF5.jpg'; - } -} - -export interface DogResultOk { - message: string; - status: string; -} diff --git a/src/commands/Animal/fox.ts b/src/commands/Animal/fox.ts deleted file mode 100644 index a9546167011..00000000000 --- a/src/commands/Animal/fox.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import { URL } from 'node:url'; - -const url = new URL('https://randomfox.ca/floof'); - -@ApplyOptions({ - description: LanguageKeys.Commands.Animal.FoxDescription, - detailedDescription: LanguageKeys.Commands.Animal.FoxExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message) { - const { image } = await fetch(url, FetchResultTypes.JSON); - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setImage(getImageUrl(image) ?? 'https://i.imgur.com/JCtnTv8.png') - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} - -export interface FoxResultOk { - image: string; - link: string; -} diff --git a/src/commands/Animal/kitty.ts b/src/commands/Animal/kitty.ts deleted file mode 100644 index 81db0f49a7e..00000000000 --- a/src/commands/Animal/kitty.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { fromAsync } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['kitten', 'cat'], - description: LanguageKeys.Commands.Animal.KittyDescription, - detailedDescription: LanguageKeys.Commands.Animal.KittyExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles, PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message) { - const result = await fromAsync(fetch('https://aws.random.cat/meow', FetchResultTypes.JSON)); - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setImage((result.success && getImageUrl(result.value.file)) || 'https://wallpapercave.com/wp/wp3021105.jpg') - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} - -interface AwsRandomCatResult { - file: string; -} diff --git a/src/commands/Animal/shibe.ts b/src/commands/Animal/shibe.ts deleted file mode 100644 index 3775b17f655..00000000000 --- a/src/commands/Animal/shibe.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Animal.ShibeDescription, - detailedDescription: LanguageKeys.Commands.Animal.ShibeExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message) { - const urls = await fetch<[string]>('https://shibe.online/api/shibes?count=1', FetchResultTypes.JSON); - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setImage(getImageUrl(urls[0]) ?? 'https://i.imgur.com/JJL4ErN.jpg') - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Animation/anime.ts b/src/commands/Animation/anime.ts deleted file mode 100644 index 419afb7283a..00000000000 --- a/src/commands/Animation/anime.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchAniList, getAnime, parseDescription } from '#utils/APIs/AniList'; -import { minutes } from '#utils/common'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { isNsfwChannel } from '@sapphire/discord.js-utilities'; -import { filterNullish, isNullish } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['ani-list'], - description: LanguageKeys.Commands.Animation.AniListAnimeDescription, - detailedDescription: LanguageKeys.Commands.Animation.AniListAnimeExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const search = await args.rest('string'); - - // Get all results - const results = await this.fetchAPI(search); - - // Ensure any results were returned - if (!results.pageInfo?.total || !results.media?.length) { - this.error(LanguageKeys.Commands.Animation.AniListAnimeQueryFail, { search }); - } - - // Check if the current context allows NSFW - const nsfwEnabled = isNsfwChannel(message.channel); - - // If the current context does not allow NSFW then filter out adult only content - const adultFilteredResults = nsfwEnabled ? results.media : results.media.filter((media) => !media?.isAdult); - - // If we are left with no results then the there were only NSFW results so return an error - - if (!adultFilteredResults?.length) { - this.error(LanguageKeys.Commands.Animation.AniListQueryOnlyNsfw, { search }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.AnilistLogo) - }); - - const anilistTitles = t(LanguageKeys.Commands.Animation.AniListEmbedTitles); - - for (const result of adultFilteredResults) { - if (result) { - display.addPageEmbed((embed) => { - const [englishName, nativeName, romajiName] = [ - result.title?.english, // - result.title?.native, - result.title?.romaji - ].map((title) => title || t(LanguageKeys.Globals.None)); - - const description = [ - `**${anilistTitles.romajiName}**: ${romajiName}`, - `**${anilistTitles.englishName}**: ${englishName}`, - `**${anilistTitles.nativeName}**: ${nativeName}` - ]; - - if (result.countryOfOrigin) { - description.push(`**${anilistTitles.countryOfOrigin}**: ${result.countryOfOrigin}`); - } - - if (result.episodes) { - description.push(`**${anilistTitles.episodes}**: ${formatNumber(t, result.episodes)}`); - } - - if (result.duration) { - description.push( - `**${anilistTitles.episodeLength}**: ${t(LanguageKeys.Globals.DurationValue, { - value: minutes(result.duration), - precision: 1 - })}` - ); - } - - if (!isNullish(result.isAdult)) { - description.push( - `**${anilistTitles.adultContent}**: ${result.isAdult ? t(LanguageKeys.Globals.Yes) : t(LanguageKeys.Globals.No)}` - ); - } - - if (!isNullish(result.externalLinks)) { - const externalLinks = result.externalLinks - .map((link) => { - if (link?.url && link.site) { - return `[${link.site}](${link.url})`; - } - - return undefined; - }) - .filter(filterNullish); - - description.push(`**${anilistTitles.externalLinks}**: ${t(LanguageKeys.Globals.AndListValue, { value: externalLinks })}`); - } - - if (result.description) { - description.push('', parseDescription(result.description)); - } - - if (result.siteUrl) { - embed.setURL(result.siteUrl); - } - - return embed - .setTitle(result.title?.english ?? result.title?.romaji ?? result.title?.native ?? '') // - .setDescription(description.join('\n')) - .setImage(`https://img.anili.st/media/${result.id}`); - }); - } - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(search: string) { - try { - const { - data: { Page } - } = await fetchAniList(getAnime, { search }); - - return Page; - } catch (error) { - this.error(LanguageKeys.Commands.Animation.AniListAnimeQueryFail, { search }); - } - } -} diff --git a/src/commands/Animation/kitsu-anime.ts b/src/commands/Animation/kitsu-anime.ts deleted file mode 100644 index f23bed58887..00000000000 --- a/src/commands/Animation/kitsu-anime.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { Kitsu } from '#lib/types/definitions/Kitsu'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { stringify } from 'node:querystring'; - -const API_URL = `https://${process.env.KITSU_ID}-dsn.algolia.net/1/indexes/production_media/query`; - -@ApplyOptions({ - enabled: envIsDefined('KITSU_ID', 'KITSU_TOKEN'), - description: LanguageKeys.Commands.Animation.KitsuAnimeDescription, - detailedDescription: LanguageKeys.Commands.Animation.KitsuAnimeExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const animeName = await args.rest('string'); - const response = await sendLoadingMessage(message, args.t); - - const { hits: entries } = await this.fetchAPI(animeName); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(entries, args.t, message); - - await display.run(response, message.author); - return response; - } - - private async fetchAPI(animeName: string) { - try { - return fetch( - API_URL, - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson, - 'X-Algolia-API-Key': process.env.KITSU_TOKEN, - 'X-Algolia-Application-Id': process.env.KITSU_ID - }, - body: JSON.stringify({ - params: stringify({ - query: animeName, - facetFilters: ['kind:anime'], - hitsPerPage: 10 - }) - }) - }, - FetchResultTypes.JSON - ); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(entries: Kitsu.KitsuHit[], t: TFunction, message: Message) { - const embedData = t(LanguageKeys.Commands.Animation.KitsuAnimeEmbedData); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setFooter({ text: '© kitsu.io' }) - }); - - for (const entry of entries) { - const description = - // Prefer the synopsis - entry.synopsis || - // Then prefer the English description - entry.description?.en || - // Then prefer the English-us description - entry.description?.en_us || - // Then prefer the latinized Japanese description - entry.description?.en_jp || - // Then the description in kanji / hiragana / katakana - entry.description?.ja_jp || - // If all fails just get the first key of the description - entry.description?.[Object.keys(entry.description!)[0]]; - const synopsis = description ? cutText(description.replace(/(.+)[\r\n\t](.+)/gim, '$1 $2').split('\r\n')[0], 750) : null; - const score = `${entry.averageRating}%`; - const animeURL = `https://kitsu.io/anime/${entry.id}`; - const type = entry.subtype; - const title = entry.titles.en || entry.titles.en_jp || entry.canonicalTitle || '--'; - - const [englishTitle, japaneseTitle, canonicalTitle] = [ - entry.titles.en || entry.titles.en_us, - entry.titles.ja_jp, - entry.canonicalTitle - ].map((title) => title || t(LanguageKeys.Globals.None)); - - display.addPageEmbed((embed) => - embed - .setTitle(title) - .setURL(animeURL) - .setDescription( - t(LanguageKeys.Commands.Animation.KitsuAnimeOutputDescription, { - englishTitle, - japaneseTitle, - canonicalTitle, - synopsis: synopsis ?? t(LanguageKeys.Commands.Animation.KitsuAnimeNoSynopsis) - }) - ) - .setThumbnail(entry.posterImage?.original ?? '') - .addField(embedData.type, t(LanguageKeys.Commands.Animation.KitsuAnimeTypes)[type.toUpperCase()] || type, true) - .addField(embedData.score, score, true) - .addField(embedData.episodes, entry.episodeCount ? formatNumber(t, entry.episodeCount) : embedData.stillAiring, true) - .addField(embedData.episodeLength, t(LanguageKeys.Globals.DurationValue, { value: entry.episodeLength * 60 * 1000 }), true) - .addField(embedData.ageRating, entry.ageRating, true) - .addField(embedData.firstAirDate, time(entry.startDate, TimestampStyles.ShortDate), true) - .addField(embedData.watchIt, `**[${title}](${animeURL})**`) - ); - } - - return display; - } -} diff --git a/src/commands/Animation/kitsu-manga.ts b/src/commands/Animation/kitsu-manga.ts deleted file mode 100644 index f126c2559f4..00000000000 --- a/src/commands/Animation/kitsu-manga.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { Kitsu } from '#lib/types/definitions/Kitsu'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { stringify } from 'node:querystring'; - -const API_URL = `https://${process.env.KITSU_ID}-dsn.algolia.net/1/indexes/production_media/query`; - -@ApplyOptions({ - enabled: envIsDefined('KITSU_ID', 'KITSU_TOKEN'), - description: LanguageKeys.Commands.Animation.KitsuMangaDescription, - detailedDescription: LanguageKeys.Commands.Animation.KitsuMangaExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const mangaName = await args.rest('string'); - const response = await sendLoadingMessage(message, args.t); - - const { hits: entries } = await this.fetchAPI(mangaName); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(entries, args.t, message); - - await display.run(response, message.author); - return response; - } - - private async fetchAPI(mangaName: string) { - try { - return fetch( - API_URL, - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson, - 'X-Algolia-API-Key': process.env.KITSU_TOKEN, - 'X-Algolia-Application-Id': process.env.KITSU_ID - }, - body: JSON.stringify({ - params: stringify({ - query: mangaName, - facetFilters: ['kind:manga'], - hitsPerPage: 10 - }) - }) - }, - FetchResultTypes.JSON - ); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(entries: Kitsu.KitsuHit[], t: TFunction, message: Message) { - const embedData = t(LanguageKeys.Commands.Animation.KitsuMangaEmbedData); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)).setFooter({ text: '© kitsu.io' }) - }); - - for (const entry of entries) { - const description = - // Prefer the synopsis - entry.synopsis || - // Then prefer the English description - entry.description?.en || - // Then prefer the English-us description - entry.description?.en_us || - // Then prefer the latinized Japanese description - entry.description?.en_jp || - // Then the description in kanji / hiragana / katakana - entry.description?.ja_jp || - // If all fails just get the first key of the description - entry.description?.[Object.keys(entry.description!)[0]]; - const synopsis = description ? cutText(description.replace(/(.+)[\r\n\t](.+)/gim, '$1 $2').split('\r\n')[0], 750) : null; - const score = `${entry.averageRating}%`; - const mangaURL = `https://kitsu.io/manga/${entry.id}`; - const type = entry.subtype; - const title = entry.titles.en || entry.titles.en_jp || entry.canonicalTitle || '--'; - - const [englishTitle, japaneseTitle, canonicalTitle] = [ - entry.titles.en || entry.titles.en_us, - entry.titles.ja_jp, - entry.canonicalTitle - ].map((title) => title || t(LanguageKeys.Globals.None)); - - display.addPageEmbed((embed) => - embed - .setTitle(title) - .setURL(mangaURL) - .setDescription( - t(LanguageKeys.Commands.Animation.KitsuMangaOutputDescription, { - englishTitle, - japaneseTitle, - canonicalTitle, - synopsis: synopsis ?? t(LanguageKeys.Commands.Animation.KitsuAnimeNoSynopsis) - }) - ) - .setThumbnail(entry.posterImage?.original || '') - .addField(embedData.type, t(LanguageKeys.Commands.Animation.KitsuMangaTypes)[type.toUpperCase()] || type, true) - .addField(embedData.score, score, true) - .addField(embedData.ageRating, entry.ageRating ? entry.ageRating : embedData.none, true) - .addField(embedData.firstPublishDate, time(entry.startDate, TimestampStyles.ShortDate), true) - .addField(embedData.readIt, `**[${title}](${mangaURL})**`) - ); - } - - return display; - } -} diff --git a/src/commands/Animation/manga.ts b/src/commands/Animation/manga.ts deleted file mode 100644 index b0fe753eaf8..00000000000 --- a/src/commands/Animation/manga.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchAniList, getManga, parseDescription } from '#utils/APIs/AniList'; -import { minutes } from '#utils/common'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { isNsfwChannel } from '@sapphire/discord.js-utilities'; -import { filterNullish, isNullish } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['manga-list'], - description: LanguageKeys.Commands.Animation.AniListMangaDescription, - detailedDescription: LanguageKeys.Commands.Animation.AniListMangaExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const search = await args.rest('string'); - - // Get all results - const results = await this.fetchAPI(search); - - // Ensure any results were returned - if (!results.pageInfo?.total || !results.media?.length) { - this.error(LanguageKeys.Commands.Animation.AniListMangaQueryFail, { search }); - } - - // Check if the current context allows NSFW - const nsfwEnabled = isNsfwChannel(message.channel); - - // If the current context does not allow NSFW then filter out adult only content - const adultFilteredResults = nsfwEnabled ? results.media : results.media.filter((media) => !media?.isAdult); - - // If we are left with no results then the there were only NSFW results so return an error - - if (!adultFilteredResults?.length) { - this.error(LanguageKeys.Commands.Animation.AniListQueryOnlyNsfw, { search }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.AnilistLogo) - }); - - const anilistTitles = t(LanguageKeys.Commands.Animation.AniListEmbedTitles); - - for (const result of adultFilteredResults) { - if (result) { - display.addPageEmbed((embed) => { - const [englishName, nativeName, romajiName] = [ - result.title?.english, // - result.title?.native, - result.title?.romaji - ].map((title) => title || t(LanguageKeys.Globals.None)); - - const description = [ - `**${anilistTitles.romajiName}**: ${romajiName}`, - `**${anilistTitles.englishName}**: ${englishName}`, - `**${anilistTitles.nativeName}**: ${nativeName}` - ]; - - if (result.countryOfOrigin) { - description.push(`**${anilistTitles.countryOfOrigin}**: ${result.countryOfOrigin}`); - } - - if (result.chapters) { - description.push(`**${anilistTitles.chapters}**: ${formatNumber(t, result.chapters)}`); - } - - if (result.volumes) { - description.push(`**${anilistTitles.volumes}**: ${formatNumber(t, result.volumes)}`); - } - - if (result.duration) { - description.push( - `**${anilistTitles.episodeLength}**: ${t(LanguageKeys.Globals.DurationValue, { - value: minutes(result.duration), - precision: 1 - })}` - ); - } - - if (!isNullish(result.isAdult)) { - description.push( - `**${anilistTitles.adultContent}**: ${result.isAdult ? t(LanguageKeys.Globals.Yes) : t(LanguageKeys.Globals.No)}` - ); - } - - if (result.externalLinks?.length) { - const externalLinks = result.externalLinks - .map((link) => { - if (link?.url && link.site) { - return `[${link.site}](${link.url})`; - } - - return undefined; - }) - .filter(filterNullish); - - description.push(`**${anilistTitles.externalLinks}**: ${t(LanguageKeys.Globals.AndListValue, { value: externalLinks })}`); - } - - if (result.description) { - description.push('', parseDescription(result.description)); - } - - if (result.siteUrl) { - embed.setURL(result.siteUrl); - } - - return embed - .setTitle(result.title?.english ?? result.title?.romaji ?? result.title?.native ?? '') // - .setDescription(description.join('\n')) - .setImage(`https://img.anili.st/media/${result.id}`); - }); - } - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(search: string) { - try { - const { - data: { Page } - } = await fetchAniList(getManga, { search }); - - return Page; - } catch (error) { - this.error(LanguageKeys.Commands.Animation.AniListMangaQueryFail, { search }); - } - } -} diff --git a/src/commands/Animation/waifu.ts b/src/commands/Animation/waifu.ts deleted file mode 100644 index 8fd6cad09ef..00000000000 --- a/src/commands/Animation/waifu.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -/** - * Faces were generated with - * - 𝜓=0.8 for images #0–50,000 (medium quality/medium diversity). - * - 𝜓=0.6 for #50,001–75,000 (high quality, low diversity). - * - 𝜓=1.1 for #75,001–100,000 (low quality, high diversity) for a mix of good & interesting faces. - */ -const kMaximum = 100000; - -@ApplyOptions({ - description: LanguageKeys.Commands.Animation.WaifuDescription, - detailedDescription: LanguageKeys.Commands.Animation.WaifuExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const url = `https://thiswaifudoesnotexist.net/example-${Math.floor(Math.random() * kMaximum)}.jpg`; - const embed = new MessageEmbed() - .setTitle('→') - .setURL(url) - .setColor(await this.container.db.fetchColor(message)) - .setImage(getImageUrl(url) ?? 'https://i.imgur.com/vKUeMoH.png') - .setFooter({ text: args.t(LanguageKeys.Commands.Animation.WaifuFooter) }) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Currency/balance.ts b/src/commands/Currency/balance.ts deleted file mode 100644 index 0c5a31b231b..00000000000 --- a/src/commands/Currency/balance.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['bal', 'credits'], - description: LanguageKeys.Commands.Social.BalanceDescription, - detailedDescription: LanguageKeys.Commands.Social.BalanceExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = args.finished ? message.author : await args.pick('userName'); - if (user.bot) this.error(LanguageKeys.Commands.Social.BalanceBots); - - const { users } = this.container.db; - const money = (await users.findOne(user.id))?.money ?? 0; - const content = - message.author === user - ? args.t(LanguageKeys.Commands.Social.BalanceSelf, { amount: money }) - : args.t(LanguageKeys.Commands.Social.Balance, { user: user.username, amount: money }); - - return send(message, content); - } -} diff --git a/src/commands/Currency/coinflip.ts b/src/commands/Currency/coinflip.ts deleted file mode 100644 index 2f3eeb93f24..00000000000 --- a/src/commands/Currency/coinflip.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { CdnUrls } from '#utils/constants'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args, IArgument } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const enum CoinType { - Heads, - Tails -} - -@ApplyOptions({ - aliases: ['cf'], - description: LanguageKeys.Commands.Games.CoinFlipDescription, - detailedDescription: LanguageKeys.Commands.Games.CoinFlipExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const guess = args.finished ? null : await args.pick(UserCommand.coinTypeResolver); - const wager = args.finished ? 'cashless' : await args.pick('shinyWager'); - - if (guess === null) return this.noGuess(message, args.t); - if (wager === 'cashless') return this.cashless(message, args.t, guess); - - const { users } = this.container.db; - const settings = await users.ensure(message.author.id); - const balance = settings.money; - - if (balance < wager) { - this.error(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); - } - - const result = this.flipCoin(); - const won = result === guess; - settings.money += won ? wager : -wager; - await settings.save(); - - const [titleKey, descriptionKey] = won - ? ([LanguageKeys.Commands.Games.CoinFlipWinTitle, LanguageKeys.Commands.Games.CoinFlipWinDescriptionWithWager] as const) - : ([LanguageKeys.Commands.Games.CoinFlipLoseTitle, LanguageKeys.Commands.Games.CoinFlipLoseDescriptionWithWager] as const); - const title = args.t(titleKey); - const description = args.t(descriptionKey, { result: args.t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result], wager }); - - const embed = await this.buildEmbed(message, result, title, description); - return send(message, { embeds: [embed] }); - } - - private async cashless(message: Message, t: TFunction, guess: CoinType) { - const result = this.flipCoin(); - const won = result === guess; - - const title = t(won ? LanguageKeys.Commands.Games.CoinFlipWinTitle : LanguageKeys.Commands.Games.CoinFlipLoseTitle); - const description = t(won ? LanguageKeys.Commands.Games.CoinFlipWinDescription : LanguageKeys.Commands.Games.CoinFlipLoseDescription, { - result: t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] - }); - - const embed = await this.buildEmbed(message, result, title, description); - return send(message, { embeds: [embed] }); - } - - private async noGuess(message: Message, t: TFunction) { - const result = this.flipCoin(); - - const title = t(LanguageKeys.Commands.Games.CoinFlipNoGuessTitle); - const description = t(LanguageKeys.Commands.Games.CoinFlipNoGuessDescription, { - result: t(LanguageKeys.Commands.Games.CoinFlipCoinNames)[result] - }); - - const embed = await this.buildEmbed(message, result, title, description); - return send(message, { embeds: [embed] }); - } - - private flipCoin() { - return Math.random() > 0.5 ? CoinType.Heads : CoinType.Tails; - } - - private async buildEmbed(message: Message, result: CoinType, title: string, description: string) { - return new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(result === CoinType.Heads ? CdnUrls.CoinHeads : CdnUrls.CoinTails) - .setTitle(title) - .setDescription(description); - } - - private static coinTypeResolver: IArgument = Args.make((parameter, { argument, args }) => { - const lowerCaseParameter = parameter.toLowerCase(); - if (args.t(LanguageKeys.Commands.Games.CoinFlipHeadNames).includes(lowerCaseParameter)) return Args.ok(CoinType.Heads); - if (args.t(LanguageKeys.Commands.Games.CoinFlipTailNames).includes(lowerCaseParameter)) return Args.ok(CoinType.Tails); - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Games.CoinFlipInvalidCoinName }); - }); -} diff --git a/src/commands/Currency/daily.ts b/src/commands/Currency/daily.ts deleted file mode 100644 index f78690ecefa..00000000000 --- a/src/commands/Currency/daily.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { ClientEntity, DbSet, UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { Schedules } from '#lib/types/Enums'; -import { hours, seconds } from '#utils/common'; -import { promptConfirmation } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const GRACE_PERIOD = hours(1); -const DAILY_PERIOD = hours(12); - -const REMINDER_FLAGS = ['remind', 'reminder', 'remindme']; - -@ApplyOptions({ - aliases: ['dailies'], - cooldownDelay: seconds(30), - description: LanguageKeys.Commands.Social.DailyDescription, - detailedDescription: LanguageKeys.Commands.Social.DailyExtended, - flags: REMINDER_FLAGS -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const toRemind = args.getFlags(...REMINDER_FLAGS); - const now = Date.now(); - - const connection = this.container.db; - return connection.users.lock([message.author.id], async (id) => { - const settings = await connection.users.ensureCooldowns(id); - - // It's been 12 hours, grant dailies - if (!settings.cooldowns.daily || settings.cooldowns.daily.getTime() <= now) { - const content = args.t(LanguageKeys.Commands.Social.DailyTimeSuccess, { - amount: await this.claimDaily(message, args.t, connection, settings, now + DAILY_PERIOD, toRemind) - }); - return send(message, content); - } - - 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) { - const content = args.t(LanguageKeys.Commands.Social.DailyTime, { time: remaining }); - return send(message, content); - } - - // It's been 11-12 hours, ask for the user if they want to claim the grace period - const accepted = await promptConfirmation(message, args.t(LanguageKeys.Commands.Social.DailyGrace, { remaining })); - if (!accepted) { - const content = args.t(LanguageKeys.Commands.Social.DailyGraceDenied); - return send(message, content); - } - - // The user accepted the grace period - const content = args.t(LanguageKeys.Commands.Social.DailyGraceAccepted, { - amount: await this.claimDaily(message, args.t, connection, settings, now + remaining + DAILY_PERIOD, toRemind), - remaining: remaining + DAILY_PERIOD - }); - return send(message, content); - }); - } - - private async claimDaily(message: Message, t: TFunction, connection: DbSet, settings: UserEntity, nextTime: number, remind: boolean) { - const money = this.calculateDailies(message, await connection.clients.ensure(), settings); - - settings.money += money; - settings.cooldowns!.daily = new Date(nextTime); - await settings.save(); - - if (remind) { - await this.container.schedule.add(Schedules.Reminder, nextTime, { - data: { - content: t(LanguageKeys.Commands.Social.DailyCollect), - user: message.author.id - } - }); - } - - return money; - } - - private calculateDailies(message: Message, client: ClientEntity, user: UserEntity) { - let money = 200; - if (client.userBoost.includes(user.id)) money *= 1.5; - if (message.guild && client.guildBoost.includes(message.guild.id)) money *= 1.5; - return money; - } -} diff --git a/src/commands/Currency/higherLower.ts b/src/commands/Currency/higherLower.ts deleted file mode 100644 index a83941f9b63..00000000000 --- a/src/commands/Currency/higherLower.ts +++ /dev/null @@ -1,336 +0,0 @@ -import type { UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { minutes } from '#utils/common'; -import { getEmojiReactionFormat, getEmojiString, SerializedEmoji } from '#utils/functions'; -import { LLRCData, LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const enum HigherLowerReactions { - Higher = 'a658450971655012363', - Lower = 'a658452292558913536', - Cancel = 's637706251257511973', - Ok = 's637706251253317669', - Cashout = '%F0%9F%92%B0' // 💰 -} - -@ApplyOptions({ - aliases: ['hilo', 'higherlower', 'hl'], - description: LanguageKeys.Commands.Games.HigherLowerDescription, - detailedDescription: LanguageKeys.Commands.Games.HigherLowerExtended, - requiredClientPermissions: [ - PermissionFlagsBits.AddReactions, - PermissionFlagsBits.EmbedLinks, - PermissionFlagsBits.ManageMessages, - PermissionFlagsBits.UseExternalEmojis - ], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - private readonly firstReactionArray = [HigherLowerReactions.Higher, HigherLowerReactions.Lower, HigherLowerReactions.Cancel] as const; - private readonly reactionArray = [HigherLowerReactions.Higher, HigherLowerReactions.Lower, HigherLowerReactions.Cashout] as const; - private readonly winReactionArray = [HigherLowerReactions.Ok, HigherLowerReactions.Cancel] as const; - private readonly runTime = minutes(3); - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const { t } = args; - const wager = await args.pick('shinyWager'); - - const { users } = this.container.db; - const settings = await users.ensure(message.author.id); - const balance = settings.money; - if (balance < wager) { - this.error(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); - } - - settings.money -= wager; - await settings.save(); - - const response = (await send(message, t(LanguageKeys.Commands.Games.HigherLowerLoading))) as GuildMessage; - const game: HigherLowerGameData = { - /** The game's reaction collector */ - llrc: new LongLivingReactionCollector( - (reaction) => { - if (game.callback === null) return; - - const emoji = this.resolveCollectedEmoji(message, game, reaction); - if (emoji === null) return; - - game.callback(emoji); - game.callback = null; - }, - async () => { - if (game.callback !== null) { - game.callback(null); - game.callback = null; - } - try { - await this.end(game, message, settings); - } catch (error) { - this.container.logger.fatal(error); - } - } - ), - response, - t, - running: true, - turn: 1, - number: this.random(50), - wager, - emojis: this.firstReactionArray, - callback: null, - color: await this.container.db.fetchColor(message), - canceledByChoice: false - }; - - while (game.running) { - // Send the embed - const fields = game.t(LanguageKeys.Commands.Games.HigherLowerEmbed, { - turn: game.turn, - number: game.number - }); - - const embed = new MessageEmbed() // - .setColor(game.color) - .setTitle(fields.title) - .setDescription(fields.description) - .setFooter({ text: fields.footer }); - await game.response.edit({ embeds: [embed] }); - - // Add the options - const emojis = game.turn > 1 ? this.reactionArray : this.firstReactionArray; - const emoji = await this.listenForReaction(game, emojis); - if (emoji === null) break; - - // Main game logic (at last) - const oldNum = game.number; - game.number = this.random(oldNum); - - switch (emoji) { - case HigherLowerReactions.Higher: { - game.running = await (game.number > oldNum ? this.win(game, message, settings) : this.loss(game, settings)); - break; - } - case HigherLowerReactions.Lower: { - game.running = await (game.number < oldNum ? this.win(game, message, settings) : this.loss(game, settings)); - break; - } - case HigherLowerReactions.Cancel: - case HigherLowerReactions.Cashout: { - game.canceledByChoice = true; - await this.end(game, message, settings, emoji === HigherLowerReactions.Cashout); - game.running = false; - break; - } - case HigherLowerReactions.Ok: - break; - } - - if (game.running) game.turn++; - } - - if (game.response.reactions.cache.size > 0) await game.response.reactions.removeAll(); - return game.response; - } - - private async listenForReaction(game: HigherLowerGameData, emojis: readonly HigherLowerReactions[]) { - if (game.response.reactions.cache.size > 0) await game.response.reactions.removeAll(); - - game.emojis = emojis; - for (const emoji of game.emojis) { - await game.response.react(getEmojiReactionFormat(emoji as SerializedEmoji)); - } - - return new Promise((res) => { - game.llrc.setTime(this.runTime); - game.callback = res; - }); - } - - private async win(game: HigherLowerGameData, message: GuildMessage, settings: UserEntity) { - const fields = game.t(LanguageKeys.Commands.Games.HigherLowerWin, { - potentials: this.calculateWinnings(game.wager, game.turn), - number: game.number - }); - const embed = new MessageEmbed() // - .setColor(game.color) - .setTitle(fields.title) - .setDescription(fields.description) - .setFooter({ text: fields.footer }); - await game.response.edit({ embeds: [embed] }); - - // Ask the user whether they want to continue or cashout - const emoji = await this.listenForReaction(game, this.winReactionArray); - - // Decide whether we timeout, stop, or continue - switch (emoji) { - case null: { - game.llrc.end(); - await this.cashout(message, game, settings); - break; - } - case HigherLowerReactions.Ok: { - const content = game.t(LanguageKeys.Commands.Games.HigherLowerNewRound); - await game.response.edit({ content, embeds: [] }); - break; - } - case HigherLowerReactions.Cancel: { - await this.end(game, message, settings, true); - break; - } - default: { - throw new Error('Unreachable.'); - } - } - - return emoji === HigherLowerReactions.Ok; - } - - private async loss(game: HigherLowerGameData, settings: UserEntity) { - let losses = game.wager; - - // There's a 0.001% chance that a user would lose not only the wager, but also what they would've won in one round less. - if (Math.random() < 0.0001) { - losses += this.calculateWinnings(game.wager, game.turn - 1); - settings.money -= losses; - await settings.save(); - } - - const fields = game.t(LanguageKeys.Commands.Games.HigherLowerLose, { - number: game.number, - losses - }); - const embed = new MessageEmbed() // - .setColor(game.color) - .setTitle(fields.title) - .setDescription(fields.description) - .setFooter({ text: fields.footer }); - await game.response.edit({ embeds: [embed] }); - - game.llrc.end(); - return false; - } - - private async end(game: HigherLowerGameData, message: GuildMessage, settings: UserEntity, cashout = false) { - // End the LLRC - game.llrc.end(); - - // Should we need to cash out, proceed to doing that - if (cashout) return this.cashout(message, game, settings); - - if (game.canceledByChoice && game.turn === 1) { - // Say bye! - const fields = game.t(LanguageKeys.Commands.Games.HigherLowerCancel, { - username: message.author.username - }); - - const embed = new MessageEmbed() // - .setColor(game.color) - .setTitle(fields.title) - .setDescription(fields.description); - await game.response.edit({ embeds: [embed] }); - } - } - - private async cashout(message: GuildMessage, game: HigherLowerGameData, settings: UserEntity) { - const { turn, wager } = game; - - // Calculate and deposit winnings for that game - const winnings = this.calculateWinnings(wager, turn - 1); - settings.money += winnings; - await settings.save(); - - // Let the user know we're done! - const fields = { - title: game.t(LanguageKeys.Commands.Games.HigherLowerWin, { potentials: 0, number: 0 }).title, - footer: game.t(LanguageKeys.Commands.Games.HigherLowerCancel, { username: message.author.username }).description - }; - - const embed = new MessageEmbed() - .setColor(game.color) - .setTitle(fields.title) - .setDescription(game.t(LanguageKeys.Commands.Games.HigherLowerCashout, { amount: winnings })) - .setFooter({ text: fields.footer }); - await game.response.edit({ embeds: [embed] }); - } - - private resolveCollectedEmoji(message: GuildMessage, game: HigherLowerGameData, reaction: LLRCData) { - // If the message reacted is not the game's, inhibit - if (reaction.messageId !== game.response.id) return null; - - // If the user who reacted was not the author, inhibit - if (reaction.userId !== message.author.id) return null; - - // If the emoji reacted is not valid, inhibit - const emoji = getEmojiString(reaction.emoji); - return emoji !== null && game.emojis.includes(emoji as HigherLowerReactions) ? (emoji as HigherLowerReactions) : null; - } - - /** - * @description Generates a random number between 0 and 100 - * @param previous The number we shouldn't get (usually the number we're comparing against - */ - private random(previous: number) { - // Check if we're closer to 100 or 0 - const upperLimitIsClosest = previous > 50; - - // The proximity to the given edge - const proximityToEdge = upperLimitIsClosest ? 99 - previous : previous - 1; - const range = Math.min(30, proximityToEdge); - - const lower = - proximityToEdge < 5 - ? // If the proximity is less than 5 - upperLimitIsClosest - ? // And we're closer to 100 then return a number in range [previous - 5..99] - this.randomInRange(previous - 5, 99) - : // Otherwise return a number in range [1..previous + 5] - this.randomInRange(1, previous + 5) - : // Else get the smaller number between 30 and the proximity to the edge - // And return a random number in the range of [previous - range..previous + range] - this.randomInRange(previous - range, previous + range); - - const higher = lower + 1; - - return previous === lower ? higher : lower; - } - - /** - * Returns a random integer between minimum (inclusive) and maximum (inclusive). - * The value is no lower than min (or the next integer greater than min - * if min isn't an integer) and no greater than max (or the next integer - * lower than max if max isn't an integer). - * @param minimum The minimum boundary for the randomization - * @param maximum The maximum boundary for the randomization - */ - private randomInRange(minimum: number, maximum: number) { - minimum = Math.ceil(minimum); - maximum = Math.floor(maximum); - return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum; - } - - private calculateWinnings(bet: number, attempts: number) { - if (attempts < 0) attempts = 1; - return Math.round(bet * (attempts <= 4 ? Math.exp(attempts) / 6 : attempts * 5 - 10)); - } -} - -interface HigherLowerGameData { - llrc: LongLivingReactionCollector; - response: GuildMessage; - t: TFunction; - running: boolean; - number: number; - turn: number; - wager: number; - emojis: readonly HigherLowerReactions[]; - callback: ((value: HigherLowerReactions | null) => void) | null; - canceledByChoice: boolean; - color: number; -} diff --git a/src/commands/Currency/pay.ts b/src/commands/Currency/pay.ts deleted file mode 100644 index 1760fc9de28..00000000000 --- a/src/commands/Currency/pay.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { Events } from '#lib/types/Enums'; -import { promptConfirmation } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { User } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Social.PayDescription, - detailedDescription: LanguageKeys.Commands.Social.PayExtended, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const { money, user } = await this.resolveArguments(args); - - if (message.author === user) this.error(LanguageKeys.Commands.Social.PaySelf); - if (user.bot) return send(message, args.t(LanguageKeys.Commands.Social.SocialPayBot)); - - const { users } = this.container.db; - 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) { - this.error(LanguageKeys.Commands.Social.PayMissingMoney, { needed: money, has: currencyBeforePrompt }); - } - - const accepted = await promptConfirmation( - message, - args.t(LanguageKeys.Commands.Social.PayPrompt, { user: user.username, amount: money }) - ); - if (!accepted) return this.denyPayment(args.t); - - await users.manager.transaction(async (em) => { - settings.money -= money; - await em.save(settings); - - const previousEntry = await em.findOne(UserEntity, targetId); - if (previousEntry) { - previousEntry.money += money; - await em.save(previousEntry); - } else { - await em.insert(UserEntity, { - id: targetId, - money - }); - this.container.client.emit(Events.MoneyTransaction, user, money, 0); - } - }); - - return this.acceptPayment(message, args.t, user, money); - }); - - return send(message, response); - } - - private async resolveArguments(args: SkyraCommand.Args) { - const user = await args.pickResult('userName'); - if (user.success) { - return { money: await args.pick('integer', { minimum: 1 }), user: user.value } as const; - } - - return { money: await args.pick('integer', { minimum: 1 }), user: await args.pick('userName') } as const; - } - - private acceptPayment(message: GuildMessage, t: TFunction, user: User, money: number) { - this.container.client.emit(Events.MoneyPayment, message, message.author, user, money); - return t(LanguageKeys.Commands.Social.PayPromptAccept, { user: user.username, amount: money }); - } - - private denyPayment(t: TFunction) { - return t(LanguageKeys.Commands.Social.PayPromptDeny); - } -} diff --git a/src/commands/Currency/slotmachine.ts b/src/commands/Currency/slotmachine.ts deleted file mode 100644 index 5e396b3e323..00000000000 --- a/src/commands/Currency/slotmachine.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Slotmachine } from '#lib/games/Slotmachine'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['slot', 'slots', 'slotmachines'], - description: LanguageKeys.Commands.Games.SlotMachineDescription, - detailedDescription: LanguageKeys.Commands.Games.SlotMachineExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { users } = this.container.db; - const wager = await args.pick('shinyWager'); - const settings = await users.ensureProfile(message.author.id); - const balance = settings.money; - if (balance < wager) { - this.error(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); - } - - const [attachment, amount] = await new Slotmachine(message, wager, settings).run(); - const content = args.t(LanguageKeys.Commands.Games.BalanceDifference, { previous: balance, next: amount }); - return send(message, { content, files: [{ attachment, name: 'slots.png' }] }); - } -} diff --git a/src/commands/Currency/vault.ts b/src/commands/Currency/vault.ts deleted file mode 100644 index 54870c92e40..00000000000 --- a/src/commands/Currency/vault.ts +++ /dev/null @@ -1,110 +0,0 @@ -import type { UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { formatNumber } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -type All = 'all' | 'max' | 'maximum'; -const kAll: readonly All[] = ['all', 'max', 'maximum']; - -@ApplyOptions({ - aliases: ['bank'], - description: LanguageKeys.Commands.Social.VaultDescription, - detailedDescription: LanguageKeys.Commands.Social.VaultExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks], - subCommands: ['deposit', { input: 'dep', output: 'deposit' }, 'withdraw', { input: 'with', output: 'withdraw' }, { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async deposit(message: Message, args: SkyraCommand.Args) { - const all = await args.pick(UserCommand.all).catch(() => null); - let coins = all === null ? await args.pick('integer', { minimum: 1 }) : null; - - const { users } = this.container.db; - const { money, vault } = await users.lock([message.author.id], async (id) => { - const settings = await users.ensureProfile(id); - - const { money } = settings; - const { vault } = settings.profile; - - coins ??= money; - if (money < coins) { - this.error(LanguageKeys.Commands.Social.VaultNotEnoughMoney, { money }); - } - - const newMoney = money - coins; - const newVault = vault + coins; - - await this.updateBalance(newMoney, newVault, settings); - return { money: newMoney, vault: newVault }; - }); - - const embed = await this.buildEmbed(message, args.t, money, vault, coins!, true); - return send(message, { embeds: [embed] }); - } - - public async withdraw(message: Message, args: SkyraCommand.Args) { - const all = await args.pick(UserCommand.all).catch(() => null); - let coins = all === null ? await args.pick('integer', { minimum: 1 }) : null; - - const { users } = this.container.db; - const { money, vault } = await users.lock([message.author.id], async (id) => { - const settings = await users.ensureProfile(id); - - const { money } = settings; - const { vault } = settings.profile; - - coins ??= vault; - if (vault < coins) { - this.error(LanguageKeys.Commands.Social.VaultNotEnoughInVault, { vault }); - } - - const newMoney = money + coins; - const newVault = vault - coins; - - await this.updateBalance(newMoney, newVault, settings); - return { money: newMoney, vault: newVault }; - }); - - const embed = await this.buildEmbed(message, args.t, money, vault, coins!); - return send(message, { embeds: [embed] }); - } - - public async show(message: Message, args: SkyraCommand.Args) { - const { users } = this.container.db; - const settings = await users.ensureProfile(message.author.id); - - const embed = await this.buildEmbed(message, args.t, settings.money, settings.profile.vault); - return send(message, { embeds: [embed] }); - } - - private updateBalance(money: number, vault: number, settings: UserEntity) { - settings.money = money; - settings.profile!.vault = vault; - return settings.save(); - } - - private async buildEmbed(message: Message, t: TFunction, money: number, vault: number, coins?: number, hasDeposited = false) { - const { accountMoney, accountVault, depositedDescription, withdrewDescription, showDescription } = t( - LanguageKeys.Commands.Social.VaultEmbedData, - { coins } - ); - - const description = coins ? (hasDeposited ? depositedDescription : withdrewDescription) : showDescription; - - return new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setDescription(description) - .addField(accountMoney, formatNumber(t, money), true) - .addField(accountVault, formatNumber(t, vault), true); - } - - private static all = Args.make((parameter, { argument }) => { - if (kAll.includes(parameter.toLowerCase() as All)) return Args.ok(true); - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.VaultInvalidAll, context: { possibles: kAll } }); - }); -} diff --git a/src/commands/Currency/wheeloffortune.ts b/src/commands/Currency/wheeloffortune.ts deleted file mode 100644 index e1028c846ee..00000000000 --- a/src/commands/Currency/wheeloffortune.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { WheelOfFortune } from '#lib/games/WheelOfFortune'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['wof'], - description: LanguageKeys.Commands.Games.WheelOfFortuneDescription, - detailedDescription: LanguageKeys.Commands.Games.WheelOfFortuneExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { users } = this.container.db; - const wager = await args.pick('shinyWager'); - const settings = await users.ensureProfile(message.author.id); - const balance = settings.money; - if (balance < wager) { - this.error(LanguageKeys.Commands.Games.GamesNotEnoughMoney, { money: balance }); - } - - const [attachment, amount] = await new WheelOfFortune(message, wager, settings).run(); - - const content = args.t(LanguageKeys.Commands.Games.BalanceDifference, { previous: balance, next: amount }); - return send(message, { content, files: [{ attachment, name: 'wof.png' }] }); - } -} diff --git a/src/commands/Fun/changemymind.ts b/src/commands/Fun/changemymind.ts deleted file mode 100644 index 1f6cb3cc340..00000000000 --- a/src/commands/Fun/changemymind.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, sanitizeInput } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['cmm'], - description: LanguageKeys.Commands.Fun.ChangeMyMindDescription, - detailedDescription: LanguageKeys.Commands.Fun.ChangeMyMindExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const text = sanitizeInput(await args.rest('string', { maximum: 50 })); - const attachment = await this.generate(message.author, text); - return send(message, { files: [{ attachment, name: 'ChangeMyMind.png' }] }); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, '/images/memes/ChangeMyMind.png')); - } - - private async generate(author: User, text: string) { - const guy = await fetchAvatar(author, 128); - - return ( - new Canvas(591, 607) - .printImage(this.kTemplate, 0, 0, 591, 607) - - // Add user's avatar - .printCircularImage(guy, 155, 73, 41) - - // Add text - .setTextAlign('center') - .setColor('rgb(23,23,23)') - .setTextFont('42px RobotoRegular') - .createRectangleClip(144, 345, 336, 133) - .printWrappedText(text, 311, 375, 340) - - // Render - .pngAsync() - ); - } -} diff --git a/src/commands/Fun/choice.ts b/src/commands/Fun/choice.ts deleted file mode 100644 index ce7873bdd45..00000000000 --- a/src/commands/Fun/choice.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['choose', 'choise', 'pick'], - description: LanguageKeys.Commands.Fun.ChoiceDescription, - detailedDescription: LanguageKeys.Commands.Fun.ChoiceExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const options = args.nextSplit(); - - const words = await this.filterWords(options); - const word = words[Math.floor(Math.random() * words.length)]; - const content = args.t(LanguageKeys.Commands.Fun.ChoiceOutput, { user: message.author.toString(), word }); - return send(message, content); - } - - private async filterWords(words: string[]) { - if (words.length < 2) this.error(LanguageKeys.Commands.Fun.ChoiceMissing); - - const output = new Set(); - const filtered = new Set(); - for (const raw of words) { - const word = raw.trim(); - if (!word) continue; - if (output.has(word)) filtered.add(word); - else output.add(word); - } - - if (output.size >= 2) return [...output]; - this.error(LanguageKeys.Commands.Fun.ChoiceDuplicates, { words: [...filtered].join("', '") }); - } -} diff --git a/src/commands/Fun/dice.ts b/src/commands/Fun/dice.ts deleted file mode 100644 index 5c7fd94064b..00000000000 --- a/src/commands/Fun/dice.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { isNumber } from '@sapphire/utilities'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['roll'], - description: LanguageKeys.Commands.Fun.DiceDescription, - detailedDescription: LanguageKeys.Commands.Fun.DiceExtended -}) -export class UserCommand extends SkyraCommand { - /** - * Syntax : {number}?[ ]d[ ]{number}[ ]{.*?} - * Examples: - * - 4d6 - * - d20 - * - 2d8+2 - * - 1d10*10 - */ - private readonly kDice20RegExp = /^(\d+)?\s*d\s*(\d+)\s*(.*?)$/; - - /** - * Syntax : {+-}[ ]{number} - * Examples: - * - +20 - * - -50 - * - + 70 - * - *10 - */ - private readonly kDice20TrailRegExp = /([+-x*])\s*(\d+)/g; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const amountOrDice = await args.pick('integer', { minimum: 1, maximum: 1024 }).catch(() => args.rest('string')); - const content = args.t(LanguageKeys.Commands.Fun.DiceOutput, { result: this.roll(amountOrDice) }); - return send(message, content); - } - - private roll(pattern: string | number) { - if (typeof pattern === 'number') { - if (!isNumber(pattern) || pattern < 3) this.error(LanguageKeys.Serializers.InvalidInt, { name: 'dice' }); - return this.generateNumber(1, pattern); - } - - const results = this.kDice20RegExp.exec(pattern); - if (results === null) this.error(LanguageKeys.Commands.Fun.DiceRollsError); - - const amount = typeof results[1] === 'undefined' ? 1 : Number(results[1]); - if (amount < 1 || amount > 1024) this.error(LanguageKeys.Commands.Fun.DiceRollsError); - - const dice = Number(results[2]); - if (dice < 3 || dice > 1024) this.error(LanguageKeys.Commands.Fun.DiceSidesError); - - let result = this.generateNumber(amount, amount * dice); - if (results[3].length > 0) result = this.processModifiers(result, results[3]); - - return result; - } - - private generateNumber(minimum: number, maximum: number) { - return Math.floor(Math.random() * (maximum - minimum + 1) + minimum); - } - - private processModifiers(output: number, modifiers: string) { - let modifierResults: RegExpExecArray | null = null; - while ((modifierResults = this.kDice20TrailRegExp.exec(modifiers))) { - output = this.processModifier(output, modifierResults); - } - - return output; - } - - private processModifier(output: number, modifierResults: RegExpExecArray) { - const value = Number(modifierResults[2]); - switch (modifierResults[1] as '+' | '-' | '*' | 'x') { - case '+': - return output + value; - case '-': - return output - value; - case 'x': - case '*': - return output * value; - } - } -} diff --git a/src/commands/Fun/escaperope.ts b/src/commands/Fun/escaperope.ts deleted file mode 100644 index 131f924ead9..00000000000 --- a/src/commands/Fun/escaperope.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { CdnUrls } from '#utils/constants'; -import { deleteMessage } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['escape'], - description: LanguageKeys.Commands.Fun.EscapeRopeDescription, - detailedDescription: LanguageKeys.Commands.Fun.EscapeRopeExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - if (message.deletable) await deleteMessage(message).catch(() => null); - - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setImage(CdnUrls.EscapeRopeGif) - .setDescription(args.t(LanguageKeys.Commands.Fun.EscapeRopeOutput, { user: message.author.toString() })) - .setAuthor({ - name: message.member?.displayName ?? message.author.username, - iconURL: message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Fun/love.ts b/src/commands/Fun/love.ts deleted file mode 100644 index 558947400d5..00000000000 --- a/src/commands/Fun/love.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { CdnUrls } from '#utils/constants'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.LoveDescription, - detailedDescription: LanguageKeys.Commands.Fun.LoveExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const isSelf = message.author.id === user.id; - const percentage = isSelf ? 1 : Math.random(); - const estimatedPercentage = Math.ceil(percentage * 100); - - let result: string; - if (estimatedPercentage < 45) { - result = args.t(LanguageKeys.Commands.Fun.LoveLess45); - } else if (estimatedPercentage < 75) { - result = args.t(LanguageKeys.Commands.Fun.LoveLess75); - } else if (estimatedPercentage < 100) { - result = args.t(LanguageKeys.Commands.Fun.LoveLess100); - } else { - result = args.t(isSelf ? LanguageKeys.Commands.Fun.LoveItself : LanguageKeys.Commands.Fun.Love100); - } - - const description = [ - `💗 **${user.tag}**`, - `💗 **${message.author.tag}**\n`, - `${estimatedPercentage}% \`[${'█'.repeat(Math.round(percentage * 40)).padEnd(40, '\u00A0')}]\`\n`, - `**${args.t(LanguageKeys.Commands.Fun.LoveResult)}**: ${result}` - ].join('\n'); - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ name: '❤ Love Meter ❤', iconURL: message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setThumbnail(CdnUrls.RevolvingHeartTwemoji) - .setDescription(description); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Fun/pop.ts b/src/commands/Fun/pop.ts deleted file mode 100644 index e5922b744be..00000000000 --- a/src/commands/Fun/pop.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { minutes, seconds } from '#utils/common'; -import { Colors } from '#utils/constants'; -import { random } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { Argument } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.PopDescription, - detailedDescription: LanguageKeys.Commands.Fun.PopExtended, - options: ['x', 'width', 'y', 'height', 'l', 'length'] -}) -export class UserCommand extends SkyraCommand { - private readonly characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - private get integer(): Argument { - return this.container.stores.get('arguments').get('integer') as Argument; - } - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const time = args.finished ? seconds(30) : await args.pick('timespan', { minimum: seconds(10), maximum: minutes(2) }); - const [width, height, length] = await Promise.all([ - this.parseOption(args, ['x', 'width'], 8, 1, 10), - this.parseOption(args, ['y', 'height'], 3, 1, 8), - this.parseOption(args, ['l', 'length'], 3, 3, 5) - ]); - - const pop = this.generatePop(length); - const solution = this.generateSolution(length); - - const board = [...this.generateBoard(width, height, pop, solution)].join('\n'); - const embed = new MessageEmbed() - .setColor(Colors.Indigo) - .setTitle(args.t(LanguageKeys.Commands.Fun.PopTitle)) - .setDescription(board) - .setTimestamp(); - - await send(message, { embeds: [embed] }); - const winners = await message.channel.awaitMessages({ - filter: (message: Message) => !message.author.bot && message.content === solution, - max: 1, - time - }); - - if (winners.size === 0) { - embed.setColor(Colors.Red).setTitle(args.t(LanguageKeys.Commands.Fun.PopTitleLost)); - } else { - const value = winners.first()!.author.tag; - embed.setColor(Colors.Green).setTitle(args.t(LanguageKeys.Commands.Fun.PopTitleWinner, { value })); - } - - embed.setDescription(board.replaceAll('||', '').replaceAll('``', '')); - await send(message, { embeds: [embed] }); - } - - private generatePop(length: number) { - if (length <= 3) return 'pop'; - return `p${'o'.repeat(length - 2)}p`; - } - - private generateSolution(length: number) { - let output = ''; - for (let i = 0; i < length; ++i) { - output += this.characters[random(this.characters.length)]; - } - - return output; - } - - private *generateBoard(width: number, height: number, pop: string, solution: string): IterableIterator { - const wrappedPop = `||\`${pop}\`||`; - const wrappedSolution = `||\`${solution}\`||`; - if (height === 0) { - return yield this.generateBoardLineWithSolution(wrappedPop, wrappedSolution, width); - } - - const solutionY = random(height); - const fullPops = this.generateBoardLineFullPops(wrappedPop, width); - - let y = 0; - for (; y < solutionY; ++y) yield fullPops; - - yield this.generateBoardLineWithSolution(wrappedPop, wrappedSolution, width); - ++y; - - for (; y < height; ++y) yield fullPops; - } - - private generateBoardLineFullPops(pop: string, width: number) { - return pop.repeat(width); - } - - private generateBoardLineWithSolution(pop: string, solution: string, width: number) { - const solutionX = random(width); - return pop.repeat(solutionX) + solution + pop.repeat(width - solutionX - 1); - } - - private async parseOption(args: SkyraCommand.Args, option: string[], defaultValue: number, minimum: number, maximum: number) { - const parameter = args.getOption(...option); - if (parameter === null) return defaultValue; - - const argument = this.integer; - const result = await argument.run(parameter, { - args, - argument, - command: this, - commandContext: args.commandContext, - message: args.message, - minimum, - maximum - }); - if (result.success) return result.value; - throw result.error; - } -} diff --git a/src/commands/Fun/rate.ts b/src/commands/Fun/rate.ts deleted file mode 100644 index dccac898d57..00000000000 --- a/src/commands/Fun/rate.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { OWNERS } from '#root/config'; -import { escapeMarkdown } from '#utils/External/escapeMarkdown'; -import { oneToTen } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.RateDescription, - detailedDescription: LanguageKeys.Commands.Fun.RateExtended -}) -export class UserCommand extends SkyraCommand { - private devRegex = new RegExp(`^(kyra|favna|${OWNERS.map((owner) => `<@!?${owner}>`).join('|')})$`, 'i'); - private botRegex = new RegExp(`^(you|yourself|skyra|<@!${process.env.CLIENT_ID}>)$`, 'i'); - - public async messageRun(message: Message, args: SkyraCommand.Args) { - // Escape all markdown - let rateableThing = await args.rest('string'); - - let ratewaifu: string; - let rate: number; - - if (this.botRegex.test(rateableThing)) { - rate = 100; - [ratewaifu, rateableThing] = args.t(LanguageKeys.Commands.Fun.RateMyself); - } else if (this.devRegex.test(rateableThing)) { - rate = 101; - [ratewaifu, rateableThing] = args.t(LanguageKeys.Commands.Fun.RateMyOwners); - } else { - rateableThing = /^(myself|me)$/i.test(rateableThing) ? message.author.username : escapeMarkdown(rateableThing.replace(/\bmy\b/g, 'your')); - - const rng = Math.round(Math.random() * 100); - [ratewaifu, rate] = [oneToTen((rng / 10) | 0)!.emoji, rng]; - } - - const content = args.t(LanguageKeys.Commands.Fun.RateOutput, { - author: message.author.username, - userToRate: rateableThing, - rate, - emoji: ratewaifu - }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } -} diff --git a/src/commands/Fun/shindeiru.ts b/src/commands/Fun/shindeiru.ts deleted file mode 100644 index 7426b977353..00000000000 --- a/src/commands/Fun/shindeiru.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.ShindeiruDescription, - detailedDescription: LanguageKeys.Commands.Fun.ShindeiruExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(user, message.author); - return send(message, { files: [{ attachment, name: 'Shindeiru.png' }] }); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, '/images/memes/Shindeiru.png')); - } - - private async generate(target: User, author: User) { - if (target === author) author = this.container.client.user!; - - /* Get the buffers from both profile avatars */ - const [theAliveOne, theDeadOne] = await Promise.all([fetchAvatar(author, 128), fetchAvatar(target, 256)]); - - return ( - new Canvas(500, 668) - .printImage(this.kTemplate, 0, 0, 500, 668) - // Draw the dead guy about to attack - .save() - .translate(162, 77) - .rotate(radians(8.58)) - .printCircularImage(theDeadOne, 0, 0, 56.5) - .restore() - - // Draw Kenshiro - .save() - .translate(384, 218) - .rotate(radians(11.13)) - .printCircularImage(theAliveOne, 0, 0, 64) - .restore() - - // Draw the dead guy saying nani - .translate(260, 514) - .rotate(radians(8.24)) - .printCircularImage(theDeadOne, 0, 0, 128) - - // Draw the buffer - .pngAsync() - ); - } -} diff --git a/src/commands/Fun/think.ts b/src/commands/Fun/think.ts deleted file mode 100644 index 602a70c23c8..00000000000 --- a/src/commands/Fun/think.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.ThinkDescription, - detailedDescription: LanguageKeys.Commands.Fun.ThinkExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(user, message.author); - const content = args.t(LanguageKeys.Commands.Fun.ThinkMessage, { user: user.username }); - return send(message, { content, files: [{ attachment, name: 'think.png' }], allowedMentions: { users: [], roles: [] } }); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, '/images/memes/think.png')); - } - - private async generate(target: User, author: User) { - if (target === author) author = this.container.client.user!; - - /* Get the buffers from both profile avatars */ - const [omniMan, mark] = await Promise.all([fetchAvatar(author, 128), fetchAvatar(target, 256)]); - - return ( - new Canvas(775, 395) - .printImage(this.kTemplate, 0, 0, 775, 395) - - // Draw the Omni-Man - .save() - .translate(311, 135) - .rotate(radians(7.95)) - .printCircularImage(omniMan, 0, 0, 49) - .restore() - - // Draw Mark - .save() - .translate(583, 152) - .scale(-1, 1) - .rotate(radians(-22.86)) - .printCircularImage(mark, 0, 0, 61) - .restore() - - // Draw the buffer - .pngAsync() - ); - } -} diff --git a/src/commands/Fun/wakanda.ts b/src/commands/Fun/wakanda.ts deleted file mode 100644 index c416e93bcce..00000000000 --- a/src/commands/Fun/wakanda.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.WakandaDescription, - detailedDescription: LanguageKeys.Commands.Fun.WakandaExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName').catch(() => message.author); - const userAvatar = await fetchAvatar(user); - const attachment = await this.generateImage(userAvatar); - - return send(message, { files: [{ attachment, name: 'we-do-not-do-that-here.png' }] }); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/we-do-not-do-that-here.png')); - } - - private generateImage(avatar: Image) { - return new Canvas(800, 450) - .printImage(this.kTemplate, 0, 0) - .save() - .translate(316, 115) - .rotate(radians(10)) - .printCircularImage(avatar, 0, 0, 65) - .pngAsync(); - } -} diff --git a/src/commands/Fun/where.ts b/src/commands/Fun/where.ts deleted file mode 100644 index 9f90565d72a..00000000000 --- a/src/commands/Fun/where.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.WhereDescription, - detailedDescription: LanguageKeys.Commands.Fun.WhereExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(user, message.author); - const content = args.t(LanguageKeys.Commands.Fun.WhereMessage, { user: user.username }); - return send(message, { content, files: [{ attachment, name: 'where.png' }], allowedMentions: { users: [], roles: [] } }); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, '/images/memes/where.png')); - } - - private async generate(target: User, author: User) { - if (target === author) author = this.container.client.user!; - - /* Get the buffers from both profile avatars */ - const [pieck, eren] = await Promise.all([fetchAvatar(author, 128), fetchAvatar(target, 32)]); - - return ( - new Canvas(300, 596) - .printImage(this.kTemplate, 0, 0, 300, 596) - - // Draw Pieck - .save() - .translate(120, 87) - .scale(-1, 1) - .rotate(radians(-12.9)) - .printCircularImage(pieck, 0, 0, 50) - .restore() - - // Draw Eren - .save() - .translate(162, 364) - .scale(-1, 1) - .rotate(radians(14.62)) - .printCircularImage(eren, 0, 0, 16) - .restore() - - // Draw the buffer - .pngAsync() - ); - } -} diff --git a/src/commands/Fun/xkcd.ts b/src/commands/Fun/xkcd.ts deleted file mode 100644 index 480d2ff3511..00000000000 --- a/src/commands/Fun/xkcd.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Fun.XkcdDescription, - detailedDescription: LanguageKeys.Commands.Fun.XkcdExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const query = await args.pick('integer').catch(() => args.rest('string').catch(() => null)); - - const comicNumber = await this.getNumber(query); - const comic = await fetch(`https://xkcd.com/${comicNumber}/info.0.json`, FetchResultTypes.JSON).catch(() => { - this.error(LanguageKeys.Commands.Fun.XkcdNotFound); - }); - - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setImage(comic.img) - .setTitle(comic.title) - .setURL(`https://xkcd.com/${comicNumber}/`) - .setFooter({ text: `XKCD | ${comic.num}` }) - .setDescription(comic.alt) - .setTimestamp(this.getTime(comic.year, comic.month, comic.day)); - return send(message, { embeds: [embed] }); - } - - private getTime(year: string, month: string, day: string) { - return new Date(Number(year), Number(month) - 1, Number(day)); - } - - private async getNumber(query: string | number | null) { - if (typeof query === 'string') { - const text = await fetch( - `https://relevantxkcd.appspot.com/process?action=xkcd&query=${encodeURIComponent(query)}`, - FetchResultTypes.Text - ); - const comics = text.split(' ').slice(2); - const random = Math.floor(Math.random() * (comics.length / 2)); - return parseInt(comics[random * 2].replace(/\n/g, ''), 10); - } - - const xkcdInfo = (await fetch('https://xkcd.com/info.0.json', FetchResultTypes.JSON)) as XkcdResultOk; - - if (typeof query === 'number') { - if (query <= xkcdInfo.num) return query; - this.error(LanguageKeys.Commands.Fun.XkcdComics, { amount: xkcdInfo.num }); - } - - return Math.floor(Math.random() * (xkcdInfo.num - 1)) + 1; - } -} - -export interface XkcdResultOk { - month: string; - num: number; - link: string; - year: string; - news: string; - safe_title: string; - transcript: string; - alt: string; - img: string; - title: string; - day: string; -} diff --git a/src/commands/Games/c4.ts b/src/commands/Games/c4.ts deleted file mode 100644 index e25ea3a8caa..00000000000 --- a/src/commands/Games/c4.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { ConnectFourBotController } from '#lib/games/connect-four/ConnectFourBotController'; -import { ConnectFourGame } from '#lib/games/connect-four/ConnectFourGame'; -import { ConnectFourHumanController } from '#lib/games/connect-four/ConnectFourHumanController'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { promptConfirmation } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { User } from 'discord.js'; - -@ApplyOptions({ - aliases: ['connect-four'], - description: LanguageKeys.Commands.Games.C4Description, - detailedDescription: LanguageKeys.Commands.Games.C4Extended, - flags: ['easy', 'medium', 'hard'], - requiredClientPermissions: [PermissionFlagsBits.UseExternalEmojis, PermissionFlagsBits.AddReactions, PermissionFlagsBits.ReadMessageHistory], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - private readonly channels = new Set(); - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - if (this.channels.has(message.channel.id)) this.error(LanguageKeys.Commands.Games.GamesProgress); - - const user = await args.pick('userName'); - const player1 = this.getAuthorController(message); - const player2 = await this.getTargetController(message, user, args); - - this.channels.add(message.channel.id); - const game = new ConnectFourGame(message, player1, player2); - - try { - await game.run(); - } finally { - this.channels.delete(message.channel.id); - } - } - - private getAuthorController(message: GuildMessage) { - return new ConnectFourHumanController(message.author.username, message.author.id); - } - - private async getTargetController(message: GuildMessage, user: User, args: SkyraCommand.Args) { - if (user.id === process.env.CLIENT_ID) return new ConnectFourBotController(this.getDifficulty(args)); - if (user.bot) this.error(LanguageKeys.Commands.Games.GamesBot); - if (user.id === message.author.id) this.error(LanguageKeys.Commands.Games.GamesSelf); - - const response = await promptConfirmation(message, { - content: args.t(LanguageKeys.Commands.Games.C4Prompt, { - challenger: message.author.toString(), - challengee: user.toString() - }), - target: user - }); - - if (response) return new ConnectFourHumanController(user.username, user.id); - this.error(LanguageKeys.Commands.Games.GamesPromptDeny); - } - - private getDifficulty(args: SkyraCommand.Args) { - if (args.getFlags('hard')) return 7; - if (args.getFlags('easy')) return 3; - return 5; - } -} diff --git a/src/commands/Games/hungergames.ts b/src/commands/Games/hungergames.ts deleted file mode 100644 index fdf8955cbc0..00000000000 --- a/src/commands/Games/hungergames.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { HungerGamesUsage } from '#lib/games/HungerGamesUsage'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { minutes } from '#utils/common'; -import { deleteMessage, isModerator } from '#utils/functions'; -import { LLRCData, LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import { cleanMentions } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { canSendMessages } from '@sapphire/discord.js-utilities'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { chunk, isFunction } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { TFunction } from 'i18next'; -import { setTimeout as sleep } from 'node:timers/promises'; - -@ApplyOptions({ - aliases: ['hunger-games', 'hg'], - description: LanguageKeys.Commands.Games.HungerGamesDescription, - detailedDescription: LanguageKeys.Commands.Games.HungerGamesExtended, - flags: ['autofill', 'autoskip'], - requiredClientPermissions: [PermissionFlagsBits.AddReactions, PermissionFlagsBits.ReadMessageHistory], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public readonly playing: Set = new Set(); - public readonly kEmojis = ['🇳', '🇾']; - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args, context: SkyraCommand.Context) { - const autoFilled = args.getFlags('autofill'); - const tributes = args.finished && autoFilled ? [] : args.nextSplit({ times: 50 }); - const autoSkip = args.getFlags('autoskip'); - - if (autoFilled) { - const messages = await message.channel.messages.fetch({ limit: 100 }); - - for (const { author } of messages.values()) { - if (author && !tributes.includes(author.username)) tributes.push(author.username); - } - } else if (tributes.length === 0) { - this.error(LanguageKeys.Commands.Games.GamesNoPlayers, { prefix: context.commandPrefix }); - } - - const filtered = new Set(tributes); - if (filtered.size !== tributes.length) this.error(LanguageKeys.Commands.Games.GamesRepeat); - if (this.playing.has(message.channel.id)) this.error(LanguageKeys.Commands.Games.GamesProgress); - if (filtered.size < 4 || filtered.size > 48) this.error(LanguageKeys.Commands.Games.GamesTooManyOrFew, { min: 4, max: 48 }); - this.playing.add(message.channel.id); - - let resolve: ((value: boolean) => void) | null = null; - let gameMessage: GuildMessage | null = null; - const game: HungerGamesGame = Object.seal({ - bloodbath: true, - llrc: new LongLivingReactionCollector( - async (reaction) => { - // Ignore if resolve is not ready - if ( - !isFunction(resolve) || - // Run the collector inhibitor - (await this.collectorInhibitor(message, gameMessage!, reaction)) - ) - return; - resolve(Boolean(this.kEmojis.indexOf(reaction.emoji.id ?? reaction.emoji.name!))); - resolve = null; - }, - () => { - if (isFunction(resolve)) resolve(false); - this.playing.delete(message.channel.id); - } - ), - sun: true, - tributes: this.shuffle([...filtered].map(cleanMentions.bind(null, message.guild))), - turn: 0 - }); - - try { - while (game.tributes.size > 1) { - // If it's not bloodbath and it became the day, increase the turn - if (!game.bloodbath && game.sun) ++game.turn; - const events = game.bloodbath - ? LanguageKeys.Commands.Games.HungerGamesBloodbath - : game.sun - ? LanguageKeys.Commands.Games.HungerGamesDay - : LanguageKeys.Commands.Games.HungerGamesNight; - - // Main logic of the game - const { results, deaths } = this.makeResultEvents(game, args.t(events).map(HungerGamesUsage.create)); - const texts = this.buildTexts(args.t, game, results, deaths); - - // Ask for the user to proceed: - for (const text of texts) { - // If the we can not longer send messages to the channel, break: - if (!canSendMessages(message.channel)) return; - - // Refresh the LLRC's timer, send new message with new reactions: - game.llrc.setTime(minutes(2)); - gameMessage = (await message.channel.send(text)) as GuildMessage; - for (const emoji of ['🇾', '🇳']) { - await gameMessage.react(emoji); - } - - // Ask for verification. - // NOTE: This does not deadlock because the callback is assigned to a variable in the scope, which - // is called with `false` when the LLRC times out. - const verification = await new Promise(async (res) => { - resolve = res; - if (autoSkip) { - await sleep((gameMessage!.content.length / 20) * 1000); - res(true); - } - }); - - // Delete the previous message, and if stopped, send stop. - await deleteMessage(gameMessage); - if (!verification) { - if (canSendMessages(message.channel)) { - const content = args.t(LanguageKeys.Commands.Games.HungerGamesStop); - await send(message, content); - } - return; - } - } - if (game.bloodbath) game.bloodbath = false; - else game.sun = !game.sun; - } - - // The match finished with one remaining player - const content = args.t(LanguageKeys.Commands.Games.HungerGamesWinner, { winner: game.tributes.values().next().value as string }); - await send(message, content); - } catch (error) { - throw error; - } finally { - game.llrc.end(); - } - } - - private async collectorInhibitor(message: GuildMessage, gameMessage: GuildMessage, reaction: LLRCData) { - // If there's no gameMessage, inhibit - if (!gameMessage) return true; - - // If the message reacted is not the game's, inhibit - if (reaction.messageId !== gameMessage.id) return true; - - // If the emoji reacted is not valid, inhibit - if (!this.kEmojis.includes(reaction.emoji.id ?? reaction.emoji.name!)) return true; - - // If the user who reacted is the author, don't inhibit - if (reaction.userId === message.author.id) return false; - - // Don't listen to herself - if (reaction.userId === process.env.CLIENT_ID) return true; - - try { - // Fetch the member for level measuring purposes - const member = await message.guild.members.fetch(reaction.userId); - // Check if the user is a moderator - return !(await isModerator(member)); - } catch { - return true; - } - } - - 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 = t(headerKey, { game }); - const death = deaths.length - ? `${t(LanguageKeys.Commands.Games.HungerGamesResultDeaths, { count: deaths.length })}\n\n${deaths.map((d) => `- ${d}`).join('\n')}` - : ''; - 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}_`) as string[]; - if (deaths.length) texts.push(`${death}\n\n_${proceed}_`); - return texts; - } - - private pick(events: readonly HungerGamesUsage[], tributes: number, maxDeaths: number) { - events = events.filter((event) => event.tributes <= tributes && event.deaths.size <= maxDeaths); - return events[Math.floor(Math.random() * events.length)]; - } - - private pickTributes(tribute: string, turn: Set, amount: number) { - if (amount === 0) return []; - if (amount === 1) return [tribute]; - const array = [...turn]; - array.splice(array.indexOf(tribute), 1); - - let m = array.length; - while (m) { - const i = Math.floor(Math.random() * m--); - [array[m], array[i]] = [array[i], array[m]]; - } - array.unshift(tribute); - return array.slice(0, amount); - } - - private makeResultEvents(game: HungerGamesGame, events: readonly HungerGamesUsage[]) { - const results = [] as string[]; - const deaths = [] as string[]; - let maxDeaths = this.calculateMaxDeaths(game); - - const turn = new Set([...game.tributes]); - for (const tribute of game.tributes) { - // If the player already had its turn, skip - if (!turn.has(tribute)) continue; - - // Pick a valid event - const event = this.pick(events, turn.size, maxDeaths); - - // Pick the tributes - const pickedTributes = this.pickTributes(tribute, turn, event.tributes); - - // Delete all the picked tributes from this round - for (const picked of pickedTributes) { - turn.delete(picked); - } - - // Kill all the unfortunate tributes - for (const death of event.deaths) { - game.tributes.delete(pickedTributes[death]); - deaths.push(pickedTributes[death]); - maxDeaths--; - } - - // Push the result of this match - results.push(event.display(...pickedTributes)); - } - - return { results, deaths }; - } - - private shuffle(tributes: string[]) { - let m = tributes.length; - while (m) { - const i = Math.floor(Math.random() * m--); - [tributes[m], tributes[i]] = [tributes[i], tributes[m]]; - } - return new Set(tributes); - } - - private calculateMaxDeaths(game: HungerGamesGame) { - // If there are more than 16 tributes, perform a large blood bath - return game.tributes.size >= 16 - ? // For 16 people, 4 die, 36 -> 6, and so on keeps the game interesting. - // If it's in bloodbath, perform 50% more deaths. - Math.ceil(Math.sqrt(game.tributes.size) * (game.bloodbath ? 1.5 : 1)) - : // If there are more than 7 tributes, proceed to kill them in 4 or more. - game.tributes.size > 7 - ? // If it's a bloodbath, perform mass death (12 -> 7), else eliminate 4. - game.bloodbath - ? Math.ceil(Math.min(game.tributes.size - 3, Math.sqrt(game.tributes.size) * 2)) - : 4 - : // If there are 4 tributes, eliminate 2, else 1 (3 -> 2, 2 -> 1) - game.tributes.size === 4 - ? 2 - : 1; - } -} - -export interface HungerGamesGame { - bloodbath: boolean; - llrc: LongLivingReactionCollector; - sun: boolean; - tributes: Set; - turn: number; -} diff --git a/src/commands/Games/tictactoe.ts b/src/commands/Games/tictactoe.ts deleted file mode 100644 index 2d13820a932..00000000000 --- a/src/commands/Games/tictactoe.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TicTacToeBotController } from '#lib/games/tic-tac-toe/TicTacToeBotController'; -import { TicTacToeGame } from '#lib/games/tic-tac-toe/TicTacToeGame'; -import { TicTacToeHumanController } from '#lib/games/tic-tac-toe/TicTacToeHumanController'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { promptConfirmation } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { User } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - aliases: ['ttt'], - description: LanguageKeys.Commands.Games.TicTacToeDescription, - detailedDescription: LanguageKeys.Commands.Games.TicTacToeExtended, - requiredClientPermissions: [PermissionFlagsBits.AddReactions, PermissionFlagsBits.ReadMessageHistory], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - private readonly channels: Set = new Set(); - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - if (this.channels.has(message.channel.id)) this.error(LanguageKeys.Commands.Games.GamesProgress); - - const user = await args.pick('userName'); - const player1 = this.getAuthorController(message); - const player2 = await this.getTargetController(message, args.t, user); - - this.channels.add(message.channel.id); - const game = new TicTacToeGame(message, player1, player2); - - try { - await game.run(); - } finally { - this.channels.delete(message.channel.id); - } - } - - private getAuthorController(message: GuildMessage) { - return new TicTacToeHumanController(message.author.username, message.author.id); - } - - private async getTargetController(message: GuildMessage, t: TFunction, user: User) { - if (user.id === process.env.CLIENT_ID) return new TicTacToeBotController(); - if (user.bot) this.error(LanguageKeys.Commands.Games.GamesBot); - if (user.id === message.author.id) this.error(LanguageKeys.Commands.Games.GamesSelf); - - const response = await promptConfirmation(message, { - content: t(LanguageKeys.Commands.Games.TicTacToePrompt, { - challenger: message.author.toString(), - challengee: user.toString() - }), - target: user - }); - - if (response) return new TicTacToeHumanController(user.username, user.id); - this.error(LanguageKeys.Commands.Games.GamesPromptDeny); - } -} diff --git a/src/commands/Games/trivia.ts b/src/commands/Games/trivia.ts deleted file mode 100644 index 541dff6cf81..00000000000 --- a/src/commands/Games/trivia.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { CATEGORIES, getQuestion, QuestionData, QuestionDifficulty, QuestionType } from '#lib/games/TriviaManager'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { floatPromise, minutes, seconds } from '#utils/common'; -import { sendTemporaryMessage } from '#utils/functions'; -import { sendLoadingMessage, shuffle } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageCollector, MessageEmbed, User } from 'discord.js'; -import { decode } from 'he'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Games.TriviaDescription, - detailedDescription: LanguageKeys.Commands.Games.TriviaExtended, - requiredClientPermissions: [PermissionFlagsBits.AddReactions, PermissionFlagsBits.EmbedLinks, PermissionFlagsBits.ReadMessageHistory] -}) -export class UserCommand extends SkyraCommand { - #channels = new Set(); - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const category = await args.pick(UserCommand.category).catch(() => CATEGORIES.general); - const questionType = await args.pick(UserCommand.questionType).catch(() => QuestionType.Multiple); - const difficulty = await args.pick(UserCommand.questionDifficulty).catch(() => QuestionDifficulty.Easy); - const duration = args.finished ? seconds(30) : await args.pick('timespan', { minimum: seconds(1), maximum: minutes(1) }); - - if (this.#channels.has(message.channel.id)) this.error(LanguageKeys.Commands.Games.TriviaActiveGame); - this.#channels.add(message.channel.id); - - try { - await sendLoadingMessage(message, args.t); - const data = await getQuestion(category, difficulty, questionType); - const possibleAnswers = - questionType === QuestionType.Boolean - ? ['True', 'False'] - : shuffle([data.correct_answer, ...data.incorrect_answers].map((ans) => decode(ans))); - const correctAnswer = decode(data.correct_answer); - - const questionEmbed = this.buildQuestionEmbed(args.t, data, possibleAnswers); - await send(message, { embeds: [questionEmbed] }); - const filter = (msg: Message) => { - const num = Number(msg.content); - return Number.isInteger(num) && num > 0 && num <= possibleAnswers.length; - }; - const collector = new MessageCollector(message.channel, { filter, time: duration }); - - let winner: User | null = null; - // users who have already participated - const participants = new Set(); - - return collector - .on('collect', (collected: Message) => { - if (participants.has(collected.author.id)) return; - const attempt = possibleAnswers[parseInt(collected.content, 10) - 1]; - if (attempt === decode(data.correct_answer)) { - winner = collected.author; - return collector.stop(); - } - participants.add(collected.author.id); - floatPromise(sendTemporaryMessage(collected, args.t(LanguageKeys.Commands.Games.TriviaIncorrect, { attempt }))); - }) - .on('end', () => { - this.#channels.delete(message.channel.id); - - const content = winner - ? args.t(LanguageKeys.Commands.Games.TriviaWinner, { winner: winner.toString(), correctAnswer }) - : args.t(LanguageKeys.Commands.Games.TriviaNoAnswer, { correctAnswer }); - floatPromise(send(message, content)); - }); - } catch (error) { - this.#channels.delete(message.channel.id); - this.container.logger.fatal(error); - this.error(LanguageKeys.Misc.UnexpectedIssue); - } - } - - 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({ name: titles.trivia }) - .setTitle(data.category) - .setColor(0xf37917) - .setThumbnail('http://i.imgur.com/zPtu5aP.png') - .setDescription([`${titles.difficulty}: ${data.difficulty}`, '', decode(data.question), '', questionDisplay.join('\n')].join('\n')); - } - - private static category = Args.make((parameter, { argument }) => { - const lowerCasedParameter = parameter.toLowerCase(); - const category = Reflect.get(CATEGORIES, lowerCasedParameter); - if (typeof category === 'number') return Args.ok(category); - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Games.TriviaInvalidCategory }); - }); - - private static questionType = Args.make((parameter, { argument }) => { - const lowerCasedParameter = parameter.toLowerCase(); - if (lowerCasedParameter === 'boolean' || lowerCasedParameter === 'truefalse') return Args.ok(QuestionType.Boolean); - if (lowerCasedParameter === 'multiple') return Args.ok(QuestionType.Multiple); - return Args.error({ argument, parameter }); - }); - - private static questionDifficulty = Args.make((parameter, { argument }) => { - const lowerCasedParameter = parameter.toLowerCase(); - if (lowerCasedParameter === 'easy') return Args.ok(QuestionDifficulty.Easy); - if (lowerCasedParameter === 'medium') return Args.ok(QuestionDifficulty.Medium); - if (lowerCasedParameter === 'hard') return Args.ok(QuestionDifficulty.Hard); - return Args.error({ argument, parameter }); - }); -} diff --git a/src/commands/General/help.ts b/src/commands/General/help.ts deleted file mode 100644 index 874b27489eb..00000000000 --- a/src/commands/General/help.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { LanguageHelp } from '#lib/i18n/LanguageHelp'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { HelpPaginatedMessage } from '#lib/structures/HelpPaginatedMessage'; -import { isGuildMessage, isPrivateMessage } from '#utils/common'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { UserOrMemberMentionRegex } from '@sapphire/discord-utilities'; -import { Args, container, fromAsync } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Collection, Message, MessageEmbed, Util } from 'discord.js'; -import type { TFunction } from 'i18next'; - -/** - * Sorts a collection alphabetically as based on the keys, rather than the values. - * This is used to ensure that subcategories are listed in the pages right after the main category. - * @param _ The first element for comparison - * @param __ The second element for comparison - * @param firstCategory Key of the first element for comparison - * @param secondCategory Key of the second element for comparison - */ -function sortCommandsAlphabetically(_: SkyraCommand[], __: SkyraCommand[], firstCategory: string, secondCategory: string): 1 | -1 | 0 { - if (firstCategory > secondCategory) return 1; - if (secondCategory > firstCategory) return -1; - return 0; -} - -@ApplyOptions({ - aliases: ['commands', 'cmd', 'cmds'], - description: LanguageKeys.Commands.General.HelpDescription, - detailedDescription: LanguageKeys.Commands.General.HelpExtended, - flags: ['cat', 'categories', 'all'], - guarded: true -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args, context: SkyraCommand.Context) { - if (args.finished) { - if (args.getFlags('cat', 'categories')) return this.helpCategories(message, args); - if (args.getFlags('all')) return this.all(message, args, context); - } - - const category = await args.pickResult(UserCommand.categories); - if (category.success) return this.display(message, args, category.value - 1, context); - - const page = await args.pickResult('integer', { minimum: 0 }); - if (page.success) return this.display(message, args, page.value - 1, context); - - // Handle case for a single command - const command = await args.pickResult('commandName'); - if (command.success) { - const embed = await this.buildCommandHelp(message, args, command.value, this.getCommandPrefix(context)); - return send(message, { embeds: [embed] }); - } - - return this.display(message, args, null, context); - } - - private getCommandPrefix(context: SkyraCommand.Context): string { - return (context.prefix instanceof RegExp && !context.commandPrefix.endsWith(' ')) || UserOrMemberMentionRegex.test(context.commandPrefix) - ? `${context.commandPrefix} ` - : context.commandPrefix; - } - - private async helpCategories(message: Message, args: SkyraCommand.Args) { - const commandsByCategory = await UserCommand.fetchCommands(message); - let i = 0; - const commandCategories: string[] = []; - for (const [category, commands] of commandsByCategory) { - const line = String(++i).padStart(2, '0'); - commandCategories.push( - `\`${line}.\` **${category}** → ${args.t(LanguageKeys.Commands.General.HelpCommandCount, { count: commands.length })}` - ); - } - - const content = commandCategories.join('\n'); - return send(message, content); - } - - private async all(message: Message, args: SkyraCommand.Args, context: SkyraCommand.Context) { - const fullContent = await this.buildHelp(message, args.t, this.getCommandPrefix(context)); - const contents = Util.splitMessage(fullContent, { char: '\n', maxLength: 2000 }); - - for (const content of contents) { - const { success } = await fromAsync(message.author.send(content)); - if (success) continue; - - if (isPrivateMessage(message)) this.error(LanguageKeys.Commands.General.HelpNoDm); - return; - } - - if (isGuildMessage(message)) await send(message, args.t(LanguageKeys.Commands.General.HelpDm)); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - private async display(message: Message, args: SkyraCommand.Args, index: number | null, context: SkyraCommand.Context) { - const prefix = this.getCommandPrefix(context); - - const content = args.t(LanguageKeys.Commands.General.HelpAllFlag, { prefix }); - - const display = await this.buildDisplay(message, args.t, prefix); - if (index !== null) display.setIndex(index); - - const response = await send(message, content); - await display.run(response, message.author); - return response; - } - - private async buildHelp(message: Message, language: TFunction, prefix: string) { - const commands = await UserCommand.fetchCommands(message); - - const helpMessage: string[] = []; - for (const [category, list] of commands) { - helpMessage.push(`**${category} Commands**:\n`, list.map(this.formatCommand.bind(this, language, prefix, false)).join('\n'), ''); - } - - return helpMessage.join('\n'); - } - - private async buildDisplay(message: Message, language: TFunction, prefix: string) { - const commandsByCategory = await UserCommand.fetchCommands(message); - - const display = new HelpPaginatedMessage(language, { - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ label: commandsByCategory.at(pageIndex - 1)![0].fullCategory!.join(' → ') })); - - for (const [category, commands] of commandsByCategory) { - display.addPageEmbed((embed) => - embed // - .setTitle(`${category} Commands`) - .setDescription(commands.map(this.formatCommand.bind(this, language, prefix, true)).join('\n')) - ); - } - - return display; - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - private async buildCommandHelp(message: Message, args: SkyraCommand.Args, command: SkyraCommand, prefixUsed: string) { - const builderData = args.t(LanguageKeys.System.HelpTitles); - - const builder = new LanguageHelp() - .setUsages(builderData.usages) - .setAliases(builderData.aliases) - .setExtendedHelp(builderData.extendedHelp) - .setExplainedUsage(builderData.explainedUsage) - .setExamples(builderData.examples) - .setPossibleFormats(builderData.possibleFormats) - .setReminder(builderData.reminders); - - const extendedHelpData = args.t(command.detailedDescription, { replace: { prefix: prefixUsed }, postProcess: 'helpUsagePostProcessor' }); - const extendedHelp = builder.display(command.name, this.formatAliases(args.t, command.aliases), extendedHelpData, prefixUsed); - - const data = args.t(LanguageKeys.Commands.General.HelpData, { - footerName: command.name, - titleDescription: args.t(command.description) - }); - const user = this.container.client.user!; - return new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ name: user.username, iconURL: user.displayAvatarURL({ size: 128, format: 'png' }) }) - .setTimestamp() - .setFooter({ text: data.footer }) - .setTitle(data.title) - .setDescription(extendedHelp); - } - - private formatAliases(t: TFunction, aliases: readonly string[]): string | null { - if (aliases.length === 0) return null; - return t(LanguageKeys.Globals.AndListValue, { value: aliases.map((alias) => `\`${alias}\``) }); - } - - private formatCommand(t: TFunction, prefix: string, paginatedMessage: boolean, command: SkyraCommand) { - const description = t(command.description); - return paginatedMessage ? `• ${prefix}${command.name} → ${description}` : `• **${prefix}${command.name}** → ${description}`; - } - - private static categories = Args.make(async (parameter, { argument, message }) => { - const lowerCasedParameter = parameter.toLowerCase(); - const commandsByCategory = await UserCommand.fetchCommands(message); - for (const [page, category] of [...commandsByCategory.keys()].entries()) { - // Add 1, since 1 will be subtracted later - if (category.toLowerCase() === lowerCasedParameter) return Args.ok(page + 1); - } - - return Args.error({ argument, parameter }); - }); - - private static async fetchCommands(message: Message) { - const commands = container.stores.get('commands'); - const filtered = new Collection(); - await Promise.all( - commands.map(async (cmd) => { - const command = cmd as SkyraCommand; - if (command.hidden) return; - - const result = await cmd.preconditions.run(message, command, { command: null! }); - if (!result.success) return; - - const category = filtered.get(command.fullCategory!.join(' → ')); - if (category) category.push(command); - else filtered.set(command.fullCategory!.join(' → '), [command as SkyraCommand]); - }) - ); - - return filtered.sort(sortCommandsAlphabetically); - } -} diff --git a/src/commands/General/info.ts b/src/commands/General/info.ts deleted file mode 100644 index 69f91d827e0..00000000000 --- a/src/commands/General/info.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { StatsGeneral, StatsUptime, StatsUsage } from '#lib/i18n/languageKeys/keys/commands/General'; -import { SkyraArgs, SkyraCommand } from '#lib/structures'; -import { seconds } from '#utils/common'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { version as sapphireVersion } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { roundNumber } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/payloads/v9'; -import { Message, MessageActionRow, MessageButton, MessageEmbed, Permissions, version as djsVersion } from 'discord.js'; -import { cpus, uptime, type CpuInfo } from 'os'; - -@ApplyOptions({ - aliases: ['bot-info', 'stats', 'sts'], - description: LanguageKeys.Commands.General.InfoDescription, - detailedDescription: LanguageKeys.Commands.General.InfoExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = await this.buildEmbed(message, args); - const components = this.buildComponents(args); - - return send(message, { - embeds: [embed], - components - }); - } - - private async buildEmbed(message: Message, args: SkyraCommand.Args) { - const titles = args.t(LanguageKeys.Commands.General.InfoTitles); - const fields = args.t(LanguageKeys.Commands.General.InfoFields, { - stats: this.generalStatistics, - uptime: this.uptimeStatistics, - usage: this.usageStatistics - }); - - return new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: this.container.client.user!.tag, - iconURL: this.container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(args.t(LanguageKeys.Commands.General.InfoBody)) - .setTimestamp() - .addField(titles.stats, fields.stats) - .addField(titles.uptime, fields.uptime) - .addField(titles.serverUsage, fields.serverUsage); - } - - private buildComponents(args: SkyraArgs): MessageActionRow[] { - const componentLabels = args.t(LanguageKeys.Commands.General.InfoComponentLabels); - - return [ - new MessageActionRow().addComponents( - new MessageButton() // - .setStyle('LINK') - .setURL(this.inviteLink) - .setLabel(componentLabels.addToServer) - .setEmoji('🎉'), - new MessageButton() // - .setStyle('LINK') - .setURL('https://discord.gg/6gakFR2') - .setLabel(componentLabels.supportServer) - .setEmoji('🆘') - ), - new MessageActionRow().addComponents( - new MessageButton() - .setStyle('LINK') - .setURL('https://github.com/skyra-project/skyra') - .setLabel(componentLabels.repository) - .setEmoji('<:github2:950888087188283422>'), - new MessageButton() // - .setStyle('LINK') - .setURL('https://donate.skyra.pw/patreon') - .setLabel(componentLabels.donate) - .setEmoji('🧡') - ) - ]; - } - - private get inviteLink() { - return this.container.client.generateInvite({ - scopes: ['bot', 'applications.commands'], - permissions: new Permissions([ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.ReadMessageHistory, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.EmbedLinks - ]) - }); - } - - private get generalStatistics(): StatsGeneral { - const { client } = this.container; - return { - channels: client.channels.cache.size, - guilds: client.guilds.cache.size, - nodeJs: process.version, - users: client.guilds.cache.reduce((acc, val) => acc + (val.memberCount ?? 0), 0), - djsVersion: `v${djsVersion}`, - sapphireVersion: `v${sapphireVersion}` - }; - } - - private get uptimeStatistics(): StatsUptime { - const now = Date.now(); - const nowSeconds = roundNumber(now / 1000); - return { - client: time(seconds.fromMilliseconds(now - this.container.client.uptime!), TimestampStyles.RelativeTime), - host: time(roundNumber(nowSeconds - uptime()), TimestampStyles.RelativeTime), - total: time(roundNumber(nowSeconds - process.uptime()), TimestampStyles.RelativeTime) - }; - } - - private get usageStatistics(): StatsUsage { - const usage = process.memoryUsage(); - return { - 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}%`; - } -} diff --git a/src/commands/General/invite.ts b/src/commands/General/invite.ts deleted file mode 100644 index 1d3452c6d84..00000000000 --- a/src/commands/General/invite.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { BrandingColors } from '#utils/constants'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const flags = ['noperms', 'nopermissions']; - -@ApplyOptions({ - description: LanguageKeys.Commands.General.InviteDescription, - detailedDescription: LanguageKeys.Commands.General.InviteExtended, - flags, - guarded: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public messageRun(message: Message, args: SkyraCommand.Args) { - const arg = args.nextMaybe(); - const shouldNotAddPermissions = arg.exists ? flags.includes(arg.value.toLowerCase()) : args.getFlags(...flags); - - const embed = this.getEmbed(args.t, shouldNotAddPermissions); - return send(message, { embeds: [embed] }); - } - - private getEmbed(t: TFunction, shouldNotAddPermissions: boolean): MessageEmbed { - return new MessageEmbed() // - .setColor(BrandingColors.Primary) - .setDescription( - [ - [ - `[${t(LanguageKeys.Commands.General.InvitePermissionInviteText)}](https://invite.skyra.pw${ - shouldNotAddPermissions ? '/no-permissions' : '' - })`, - `[${t(LanguageKeys.Commands.General.InvitePermissionSupportServerText)}](https://join.skyra.pw)` - ].join(' | '), - shouldNotAddPermissions ? undefined : t(LanguageKeys.Commands.General.InvitePermissionsDescription) - ] - .filter(Boolean) - .join('\n') - ); - } -} diff --git a/src/commands/General/ping.ts b/src/commands/General/ping.ts deleted file mode 100644 index c012f621a10..00000000000 --- a/src/commands/General/ping.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['pong'], - description: LanguageKeys.Commands.General.PingDescription, - detailedDescription: LanguageKeys.Commands.General.PingExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const msg = await send(message, args.t(LanguageKeys.Commands.General.Ping)); - - const content = args.t(LanguageKeys.Commands.General.PingPong, { - diff: (msg.editedTimestamp || msg.createdTimestamp) - (message.editedTimestamp || message.createdTimestamp), - ping: Math.round(this.container.client.ws.ping) - }); - return send(message, content); - } -} diff --git a/src/commands/General/v7-iriss.ts b/src/commands/General/v7-iriss.ts deleted file mode 100644 index 7c1728638ad..00000000000 --- a/src/commands/General/v7-iriss.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['suggest'], - description: LanguageKeys.Commands.General.V7Description, - detailedDescription: LanguageKeys.Commands.General.V7Extended, - hidden: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: this.container.client.user!.tag, - iconURL: this.container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(args.t(LanguageKeys.Commands.General.V7IrissMessage, { command: args.commandContext.commandName })) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/General/v7-nekokai.ts b/src/commands/General/v7-nekokai.ts deleted file mode 100644 index fcb52f9a548..00000000000 --- a/src/commands/General/v7-nekokai.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: [ - 'slap', - 'wbang', - 'wbanghead', - 'wbite', - 'wblush', - 'wcry', - 'wcuddle', - 'wdance', - 'wgreet', - 'whug', - 'wkiss', - 'wlewd', - 'wlick', - 'wneko', - 'wnom', - 'wpat', - 'wpout', - 'wpunch', - 'wsalute', - 'wslap', - 'wsleepy', - 'wsmile', - 'wsmug', - 'wstare', - 'wthumbsup', - 'wtickle' - ], - description: LanguageKeys.Commands.General.V7Description, - detailedDescription: LanguageKeys.Commands.General.V7Extended, - hidden: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: this.container.client.user!.tag, - iconURL: this.container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(args.t(LanguageKeys.Commands.General.V7NekokaiMessage, { command: args.commandContext.commandName })) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/General/v7-pokemon.ts b/src/commands/General/v7-pokemon.ts deleted file mode 100644 index 96d492abd84..00000000000 --- a/src/commands/General/v7-pokemon.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: [ - 'abilities', - 'ability', - 'advantage', - 'bag', - 'dex', - 'dexter', - 'flavor', - 'flavors', - 'flavour', - 'flavours', - 'item', - 'learn', - 'learnall', - 'learnset', - 'matchup', - 'mon', - 'move', - 'poke', - 'pokeability', - 'pokedex', - 'pokeimage', - 'pokeitem', - 'pokemon', - 'pokesprite', - 'sprite', - 'type', - 'weakness' - ], - description: LanguageKeys.Commands.General.V7Description, - detailedDescription: LanguageKeys.Commands.General.V7Extended, - hidden: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: this.container.client.user!.tag, - iconURL: this.container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(args.t(LanguageKeys.Commands.General.V7PokemonMessage, { command: args.commandContext.commandName })) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/General/v7.ts b/src/commands/General/v7.ts deleted file mode 100644 index 56dc135328f..00000000000 --- a/src/commands/General/v7.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: [ - '8ball', - 'afk', - 'announce', - 'announcement', - 'bd', - 'birthday', - 'birthdays', - 'chucknorris', - 'ctime', - 'current-time', - 'divorce', - 'dsearch', - 'duckduckgo', - 'emojis', - 'emotes', - 'ffxiv', - 'final-fantasy', - 'flip', - 'flow', - 'g', - 'gc', - 'gcreate', - 'ge', - 'gend', - 'gimage', - 'giveaway-end', - 'giveaway', - 'giveawayschedule', - 'google', - 'googleimage', - 'googlesearch', - 'gr', - 'greroll', - 'groll', - 'gs', - 'gschedule', - 'gsearch', - 'gstart', - 'howtoflirt', - 'img', - 'letmegooglethat', - 'letmegooglethatforyou', - 'lmgtfy', - 'markov', - 'married', - 'marry', - 'nick', - 'nickname', - 'norris', - 'npm-package', - 'npm', - 'pants', - 'peepolove', - 'pepelove', - 'pnpm-package', - 'pnpm', - 'pun', - 'quote', - 'reddit-user', - 'redditor', - 'reset-birthday', - 'search', - 'set-birthday', - 'set-starboard-emoji', - 'setbday', - 'sse', - 'star', - 'subscribe', - 'topinvites', - 'topinvs', - 'trigger', - 'triggers', - 'unsubscribe', - 'upbday', - 'upcoming-birthdays', - 'updoot', - 'upvote', - 'view-birthday', - 'viewbday', - 'waporwave', - 'yarn-package', - 'yarn', - 'zalgo' - ], - description: LanguageKeys.Commands.General.V7Description, - detailedDescription: LanguageKeys.Commands.General.V7Extended, - hidden: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: this.container.client.user!.tag, - iconURL: this.container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(args.t(LanguageKeys.Commands.General.V7Message, { command: args.commandContext.commandName })) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Google/weather.ts b/src/commands/Google/weather.ts deleted file mode 100644 index 64a5f4bed4b..00000000000 --- a/src/commands/Google/weather.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { - CurrentCondition, - getColors, - getData, - getFile, - getIcons, - getWeatherName, - resolveCurrentConditionsImperial, - resolveCurrentConditionsSI, - ResolvedConditions, - ValueWrapper -} from '#lib/weather'; -import { seconds } from '#utils/common'; -import { baseLanguage, countryLanguage, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -const imperial = ['fahrenheit', 'f', 'imperial', 'i']; -const metric = ['celsius', 'c', 'metric', 'm']; -const kelvin = ['kelvin', 'k']; - -// United States (en-US), Liberia (en-LR), and Myanmar (my-MM) are the only countries in the world that use Imperial: -const imperialCountries = ['US', 'LR', 'MM']; - -@ApplyOptions({ - cooldownDelay: seconds(30), - description: LanguageKeys.Commands.Google.WeatherDescription, - detailedDescription: LanguageKeys.Commands.Google.WeatherExtended, - flags: [...imperial, ...metric, ...kelvin], - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const useImperial = this.shouldUseImperial(args); - const base = baseLanguage(args.t.lng); - const data = await getData(await args.rest('string', { minimum: 1 }), base); - const [current] = data.current_condition; - - const resolved = useImperial - ? resolveCurrentConditionsImperial(current, args.t) - : resolveCurrentConditionsSI(current, args.t, { kelvin: args.getFlags(...kelvin) }); - const [nearestArea] = data.nearest_area; - - // Region can be an empty string, e.g. `Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupokaiwhenuakitanatahu`: - const place = `${nearestArea.region[0].value || nearestArea.areaName[0].value}, ${nearestArea.country[0].value}`; - const weatherDescription = this.getWeatherDescription(current, base); - - const attachment = await this.draw(weatherDescription, place, current, resolved); - return send(message, { files: [{ attachment, name: 'weather.png' }] }); - } - - private shouldUseImperial(args: SkyraCommand.Args) { - if (args.getFlags(...imperial)) return true; - if (args.getFlags(...metric)) return false; - return imperialCountries.includes(countryLanguage(args.t.lng)); - } - - private getWeatherDescription(conditions: CurrentCondition, base: string) { - const translated = Reflect.get(conditions, `lang_${base}`) as ValueWrapper[] | undefined; - return translated?.[0].value ?? conditions.weatherDesc[0].value; - } - - private async draw(weatherDescription: string, place: string, conditions: CurrentCondition, resolved: ResolvedConditions) { - const weatherName = getWeatherName(conditions.weatherCode); - const { background, text, theme } = getColors(weatherName); - - const [conditionImage, icons] = await Promise.all([getFile(weatherName), getIcons(theme)]); - const { width, height, cardWidth, cardHeight, margin, columns, rows } = UserCommand.coordinates; - - const imageSize = 128; - const halfImageSize = imageSize / 2; - - const iconSize = 32; - const halfIconSize = iconSize / 2; - const iconMargin = iconSize + 10; - - return ( - new Canvas(width, height) - .save() - .setShadowColor('rgba(0,0,0,.7)') - .setShadowBlur(margin) - .setColor(background) - .createRoundedPath(margin, margin, cardWidth, cardHeight, margin / 2) - .fill() - .restore() - - // Place Name - .setTextFont('24px RobotoRegular') - .setTextBaseline('middle') - .setColor(text) - .printResponsiveText(place, columns[0].left, rows[0].center, columns[2].right - columns[0].left) - - // Weather Icon - .setTextFont('20px RobotoLight') - .printImage(conditionImage, columns[0].center - halfImageSize, rows[2].center - halfImageSize) - - // Temperature - .printImage(icons.temperature, columns[1].left, rows[2].center - halfIconSize) - .printText(resolved.temperature, columns[1].left + iconMargin, rows[2].center) - - // Wind - .save() - .translate(columns[2].left + halfIconSize, rows[2].center) - .rotate(radians(Number(conditions.winddirDegree)) + Math.PI) - .printImage(icons.pointer, -halfIconSize, -halfIconSize) - .restore() - .printText(resolved.windSpeed, columns[2].left + iconMargin, rows[2].center) - - // Precipitation - .printImage(icons.precipitation, columns[1].left, rows[3].center - halfIconSize) - .printText(resolved.precipitation, columns[1].left + iconMargin, rows[3].center) - - // Visibility - .printImage(icons.visibility, columns[2].left, rows[3].center - halfIconSize) - .printText(resolved.visibility, columns[2].left + iconMargin, rows[3].center) - - // Weather Name - .printResponsiveText(weatherDescription, columns[1].left, rows[1].center, columns[2].right - columns[1].left) - - .pngAsync() - ); - } - - // @ts-expect-error (2816) loading order demands the use of "this" - private static coordinates = this.resolveCoordinates(); - private static resolveCoordinates(): Coordinates { - const width = 540; - const height = 260; - const margin = 15; - - const cardWidth = width - margin * 2; - const cardHeight = height - margin * 2; - - const contentWidth = cardWidth - margin * 2; - const contentHeight = cardHeight - margin * 2; - - const contentMargin = margin * 2; - - const amountColumns = 3; - const amountRows = 4; - - const columnWidth = contentWidth / amountColumns; - const rowHeight = contentHeight / amountRows; - - const columns: Column[] = []; - for (let x = 0; x < amountColumns; ++x) { - const left = Math.ceil(x * columnWidth) + contentMargin; - const center = Math.round((x + 0.5) * columnWidth) + contentMargin; - const right = Math.floor((x + 1) * columnWidth) + contentMargin; - columns.push({ left, center, right }); - } - - const rows: Row[] = []; - for (let y = 0; y < amountRows; ++y) { - const top = Math.ceil(y * rowHeight) + contentMargin; - const center = Math.round((y + 0.5) * rowHeight) + contentMargin; - const bottom = Math.floor((y + 1) * rowHeight) + contentMargin; - rows.push({ top, center, bottom }); - } - - return { width, height, margin, cardWidth, cardHeight, contentWidth, contentHeight, columns, rows }; - } -} - -interface Column { - left: number; - center: number; - right: number; -} - -interface Row { - top: number; - center: number; - bottom: number; -} - -interface Coordinates { - width: number; - height: number; - margin: number; - cardWidth: number; - cardHeight: number; - contentWidth: number; - contentHeight: number; - columns: Column[]; - rows: Row[]; -} diff --git a/src/commands/Levelling/Management/autorole.ts b/src/commands/Levelling/Management/autorole.ts deleted file mode 100644 index 2981cd5bf18..00000000000 --- a/src/commands/Levelling/Management/autorole.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { GuildSettings, RolesAuto, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args, CommandOptionsRunTypeEnum, Identifiers } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { codeBlock, deepClone } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -const SORT = (x: RolesAuto, y: RolesAuto) => Number(x.points > y.points) || Number(x.points === y.points) - 1; - -@ApplyOptions({ - aliases: ['autoroles', 'levelrole', 'lvlrole'], - description: LanguageKeys.Commands.Social.AutoRoleDescription, - detailedDescription: LanguageKeys.Commands.Social.AutoRoleExtended, - permissionLevel: PermissionLevels.Administrator, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'update', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const role = await args.pick('roleName'); - const points = await this.parseLevel(args); - - await writeSettings(message.guild, (settings) => { - const roles = settings[GuildSettings.Roles.Auto]; - - if (roles.length && roles.some((entry) => entry.id === role.id)) { - this.error(LanguageKeys.Commands.Social.AutoRoleUpdateConfigured); - } - - const sorted = [...roles, { id: role.id, points }].sort(SORT); - - settings[GuildSettings.Roles.Auto] = sorted; - }); - - const content = args.t(LanguageKeys.Commands.Social.AutoRoleAdd, { role: role.toString(), points }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const role = await args.pick('roleName'); - - const roleEntry = await writeSettings(message.guild, (settings) => { - const roles = settings[GuildSettings.Roles.Auto]; - const roleIndex = roles.findIndex((entry) => entry.id === role.id); - - if (roleIndex === -1) { - this.error(LanguageKeys.Commands.Social.AutoRoleUpdateUnconfigured); - } - - const roleEntry = roles[roleIndex]; - roles.splice(roleIndex, 1); - - return roleEntry; - }); - - const content = args.t(LanguageKeys.Commands.Social.AutoRoleRemove, { role: role.toString(), before: roleEntry.points }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - public async update(message: GuildMessage, args: SkyraCommand.Args) { - const role = await args.pick('roleName'); - const points = await this.parseLevel(args); - - const autoRole = await writeSettings(message.guild, (settings) => { - const autoRoles = settings[GuildSettings.Roles.Auto]; - const roleIndex = autoRoles.findIndex((entry) => entry.id === role.id); - - if (roleIndex === -1) { - this.error(LanguageKeys.Commands.Social.AutoRoleUpdateUnconfigured); - } - - const clone = deepClone(autoRoles); - clone[roleIndex].points = points; - - settings[GuildSettings.Roles.Auto] = clone.sort(SORT); - return autoRoles[roleIndex]; - }); - - const content = args.t(LanguageKeys.Commands.Social.AutoRoleUpdate, { role: role.toString(), points, before: autoRole.points }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - public async show(message: GuildMessage) { - const output = await writeSettings(message.guild, (settings) => { - const autoRoles = settings[GuildSettings.Roles.Auto]; - - if (!autoRoles.length) this.error(LanguageKeys.Commands.Social.AutoRoleListEmpty); - - const filtered = new Set(autoRoles); - const output: string[] = []; - for (const obj of autoRoles) { - const role = message.guild.roles.cache.get(obj.id); - if (role) output.push(`${obj.points.toString().padStart(6, ' ')} : ${role.name}`); - else filtered.delete(obj); - } - - if (filtered.size !== autoRoles.length) { - settings[GuildSettings.Roles.Auto] = [...filtered]; - } - - if (!output.length) this.error(LanguageKeys.Commands.Social.AutoRoleListEmpty); - - return output; - }); - - const content = codeBlock('http', output.join('\n')); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - private async parseLevel(args: SkyraCommand.Args) { - const result = await args.pickResult('integer', { minimum: 1, maximum: UserCommand.maximumPoints }); - - // If the integer parse was successful, return it: - if (result.success) return result.value; - - // If it was erroneous, but it was because it wasn't a valid integer, try parsing level: - if (result.error.identifier === Identifiers.ArgumentIntegerError) return args.pick(UserCommand.level); - - // It was a valid integer, but the number was out of range: - throw result.error; - } - - private static readonly maximumPoints = 100_000_000; - private static readonly level = Args.make((parameter, { argument }) => { - const prefix = parameter.startsWith('L') || parameter.startsWith('l'); - const suffix = parameter.endsWith('L') || parameter.endsWith('l'); - - if (parameter.length === 1 || (prefix && prefix === suffix) || !(prefix || suffix)) { - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.AutoRoleInvalidLevel }); - } - - const level = Number(prefix ? parameter.slice(1) : parameter.slice(0, -1)); - if (Number.isNaN(level)) { - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.AutoRoleInvalidLevel }); - } - - // There cannot be a level below 0 - if (level <= 0) { - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.AutoRoleInvalidNegativeOrZeroLevel }); - } - - const points = Math.floor((level / 0.2) ** 2); - if (points < 1) { - return Args.error({ - argument, - parameter, - identifier: LanguageKeys.Commands.Social.AutoRoleTooLow, - context: { minimum: 1, maximum: UserCommand.maximumPoints, points } - }); - } - - if (points > UserCommand.maximumPoints) { - return Args.error({ - argument, - parameter, - identifier: LanguageKeys.Commands.Social.AutoRoleTooHigh, - context: { minimum: 1, maximum: UserCommand.maximumPoints, points } - }); - } - - return Args.ok(points); - }); -} diff --git a/src/commands/Levelling/Management/social.ts b/src/commands/Levelling/Management/social.ts deleted file mode 100644 index 542dc30f014..00000000000 --- a/src/commands/Levelling/Management/social.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { MemberEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { promptConfirmation } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Social.SocialDescription, - detailedDescription: LanguageKeys.Commands.Social.SocialExtended, - flags: ['all'], - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'set', 'reset'] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const amount = await args.pick('integer', { minimum: 1, maximum: 1000000 }); - - const { members } = this.container.db; - const settings = await members.findOne({ where: { userId: user.id, guildId: message.guild.id } }); - if (settings) { - const newAmount = settings.points + amount; - settings.points = newAmount; - await settings.save(); - - const content = args.t(LanguageKeys.Commands.Social.SocialAdd, { user: user.username, amount: newAmount, count: amount }); - return send(message, content); - } - - const created = new MemberEntity(); - created.userId = user.id; - created.guildId = message.guild.id; - created.points = amount; - await members.insert(created); - - const content = args.t(LanguageKeys.Commands.Social.SocialAdd, { user: user.username, amount, count: amount }); - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const amount = await args.pick('integer', { minimum: 1, maximum: 100000000 }); - - const { members } = this.container.db; - const settings = await members.findOne({ where: { userId: user.id, guildId: message.guild.id } }); - if (!settings) this.error(LanguageKeys.Commands.Social.SocialMemberNotExists); - - const newAmount = Math.max(settings.points - amount, 0); - settings.points = newAmount; - await settings.save(); - - const content = args.t(LanguageKeys.Commands.Social.SocialRemove, { user: user.username, amount: newAmount, count: amount }); - return send(message, content); - } - - public async set(message: GuildMessage, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const amount = await args.pick('integer', { minimum: 0, maximum: 1000000 }); - - const { members } = this.container.db; - const settings = await members.findOne({ where: { userId: user.id, guildId: message.guild.id } }); - let oldValue = 0; - if (settings) { - oldValue = settings.points; - settings.points = amount; - await settings.save(); - } else { - const created = new MemberEntity(); - created.userId = user.id; - created.guildId = message.guild.id; - created.points = amount; - await members.insert(created); - } - - const variation = amount - oldValue; - if (variation === 0) return args.t(LanguageKeys.Commands.Social.SocialUnchanged, { user: user.username }); - - const content = - variation > 0 - ? args.t(LanguageKeys.Commands.Social.SocialAdd, { user: user.username, amount, count: variation }) - : args.t(LanguageKeys.Commands.Social.SocialRemove, { user: user.username, amount, count: -variation }); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - if (args.getFlags('all')) return this.resetAll(message, args); - - const user = await args.pick('userName'); - const { members } = this.container.db; - await members.delete({ userId: user.id, guildId: message.guild.id }); - - const content = args.t(LanguageKeys.Commands.Social.SocialReset, { user: user.username }); - return send(message, content); - } - - private async resetAll(message: GuildMessage, args: SkyraCommand.Args) { - const confirmed = await promptConfirmation(message, args.t(LanguageKeys.Commands.Social.SocialResetAllPrompt)); - if (confirmed === null) this.error(LanguageKeys.Commands.Social.SocialResetAllTimeOut); - if (!confirmed) this.error(LanguageKeys.Commands.Social.SocialResetAllAborted); - - const { members } = this.container.db; - const result = await members.delete({ guildId: message.guild.id }); - if (!result.affected) this.error(LanguageKeys.Commands.Social.SocialResetAllEmpty); - - // Delete the local leaderboard entry since it's all set to 0 at this point. - this.container.client.leaderboard.local.delete(message.guild.id); - - const content = args.t(LanguageKeys.Commands.Social.SocialResetAllSuccess, { count: result.affected }); - return send(message, content); - } -} diff --git a/src/commands/Levelling/leaderboard.ts b/src/commands/Levelling/leaderboard.ts deleted file mode 100644 index fa9e45d6bce..00000000000 --- a/src/commands/Levelling/leaderboard.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraLazyPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { skip, take } from '#utils/common'; -import { LongWidthSpace } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import type { LeaderboardUser } from '#utils/Leaderboard'; -import type { Collection } from '@discordjs/collection'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { MessageEmbed } from 'discord.js'; - -type LeaderboardUsers = Collection; - -@ApplyOptions({ - aliases: ['lb', 'top', 'scoreboard', 'sb'], - description: LanguageKeys.Commands.Social.LeaderboardDescription, - detailedDescription: LanguageKeys.Commands.Social.LeaderboardExtended, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: GuildMessage, args: PaginatedMessageCommand.Args) { - const list = await this.container.client.leaderboard.fetch(message.guild.id); - if (list.size === 0) this.error(LanguageKeys.Commands.Social.LeaderboardNoEntries); - - const index = args.finished ? 1 : await args.pick('integer', { minimum: 1, maximum: Math.ceil(list.size / 10) }); - const { position } = list.get(message.author.id) ?? { position: list.size + 1 }; - const display = await this.buildDisplay(args, list, index - 1, position); - return display.run(message); - } - - private async buildDisplay( - args: PaginatedMessageCommand.Args, - list: LeaderboardUsers, - index: number, - position: number - ): Promise { - const footerText = args.t(LanguageKeys.Commands.Social.ScoreboardFooter, { position, total: list.size }); - const footerIcon = args.message.author.displayAvatarURL({ format: 'png', size: 64, dynamic: true }); - const display = new SkyraLazyPaginatedMessage({ - template: new MessageEmbed() - .setColor(await this.container.db.fetchColor(args.message)) - .setTitle(args.t(LanguageKeys.Commands.Social.LeaderboardHeader, { guild: args.message.guild!.name })) - .setFooter({ text: footerText, iconURL: footerIcon }) - .setTimestamp() - }); - - for (let i = 0, m = Math.ceil(list.size / 10); i < m; ++i) { - display.addPageEmbed(() => this.generatePage(args, list, i)); - } - - display.setIndex(Math.ceil((index - 1) / 10)); - return display; - } - - private generatePage(args: PaginatedMessageCommand.Args, list: LeaderboardUsers, index: number): MessageEmbed { - const pad = (index * 10).toString().length; - - const lines: string[] = []; - const members = args.message.guild!.members.cache; - for (const [id, value] of take(skip(list.entries(), index * 10), 10)) { - const displayName = members.get(id)?.displayName; - const name = displayName ? `**${displayName}**` : args.t(LanguageKeys.Commands.Social.LeaderboardUnknownUser, { user: id }); - lines.push(`❯ \`${value.position.toString().padStart(pad, ' ')}\`: ${name}`, `${LongWidthSpace}└─ ${formatNumber(args.t, value.points)}`); - } - - return new MessageEmbed().setDescription(lines.join('\n')); - } -} diff --git a/src/commands/Levelling/level.ts b/src/commands/Levelling/level.ts deleted file mode 100644 index 63b93b4e119..00000000000 --- a/src/commands/Levelling/level.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { Scope } from '#lib/types'; -import { cdnFolder } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { fetchAvatar, loadImageFromFS } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image, loadImage, rgba } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { join } from 'node:path'; - -const THEMES_FOLDER = join(cdnFolder, 'skyra-assets', 'banners'); - -@ApplyOptions({ - aliases: ['lvl', 'rank'], - description: LanguageKeys.Commands.Social.LevelDescription, - detailedDescription: LanguageKeys.Commands.Social.LevelExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private lightThemeTemplate: Image = null!; - private darkThemeTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const scope = args.finished ? Scope.Local : await args.pick('scope').catch(() => Scope.Local); - const user = args.finished ? message.author : await args.pick('userName'); - - const output = await this.showProfile(message, scope, user, args.t); - return send(message, { files: [{ attachment: output, name: 'Level.png' }] }); - } - - public async showProfile(message: Message, scope: Scope, user: User, t: TFunction) { - const { members, users } = this.container.db; - const settings = await users.ensureProfile(user.id); - const { level, points } = scope === Scope.Local && message.guild ? await members.ensure(user.id, message.guild.id) : settings; - - /* Calculate information from the user */ - const previousLevel = Math.floor((level / 0.2) ** 2); - const nextLevel = Math.floor(((level + 1) / 0.2) ** 2); - const progressBar = Math.max(Math.round(((points - previousLevel) / (nextLevel - previousLevel)) * 265), 6); - - const [themeImageSRC, imgAvatarSRC] = await Promise.all([ - loadImageFromFS(join(THEMES_FOLDER, `${settings.profile.bannerLevel}.png`)), - fetchAvatar(user, 256) - ]); - - const title = t(LanguageKeys.Commands.Social.Level); - return ( - new Canvas(640, 174) - // Draw the background - .save() - .createRoundedClip(10, 10, 620, 154, 8) - .printImage(themeImageSRC, 9, 9, 189, 157) - .restore() - .printImage(settings.profile.darkTheme ? this.darkThemeTemplate : this.lightThemeTemplate, 0, 0, 640, 174) - - // Draw the progress bar - .setColor(`#${settings.profile.color.toString(16).padStart(6, '0') || 'FF239D'}`) - .printRoundedRectangle(341, 86, progressBar, 9, 3) - - // Set styles - .setColor(settings.profile.darkTheme ? '#F0F0F0' : '#171717') - .setTextFont('28px RobotoLight') - - // Statistics Titles - .printText(title.experience, 340, 73) - .printText(title.nextIn, 340, 128) - - // Draw the information - .setTextAlign('right') - .printText(t(LanguageKeys.Globals.NumberCompactValue, { value: points }), 606, 73) - .printText(formatNumber(t, nextLevel - points), 606, 131) - - // Draw the level - .setTextAlign('center') - .setTextFont('35px RobotoLight') - .printText(title.level, 268, 73) - .setTextFont('45px RobotoRegular') - .printText(formatNumber(t, level), 268, 128) - - // Draw the avatar - .save() - .printCircularImage(imgAvatarSRC, 103, 87, 71) - .restore() - .pngAsync() - ); - } - - public async onLoad() { - [this.lightThemeTemplate, this.darkThemeTemplate] = await Promise.all([ - new Canvas(640, 174) - .setShadowColor(rgba(0, 0, 0, 0.7)) - .setShadowBlur(7) - .setColor('#FFFFFF') - .createRoundedPath(10, 10, 620, 154, 8) - .fill() - .createRoundedClip(10, 10, 620, 154, 5) - .clearRectangle(10, 10, 186, 154) - .printCircle(103, 87, 70) - .resetShadows() - .setColor('#E8E8E8') - .printRoundedRectangle(340, 85, 267, 11, 4) - .pngAsync() - .then(loadImage), - new Canvas(640, 174) - .setShadowColor(rgba(0, 0, 0, 0.7)) - .setShadowBlur(7) - .setColor('#202225') - .createRoundedPath(10, 10, 620, 154, 8) - .fill() - .createRoundedClip(10, 10, 620, 154, 5) - .clearRectangle(10, 10, 186, 154) - .printCircle(103, 87, 70) - .resetShadows() - .setColor('#2C2F33') - .printRoundedRectangle(340, 85, 267, 11, 4) - .pngAsync() - .then(loadImage) - ]); - } -} diff --git a/src/commands/Levelling/mylevel.ts b/src/commands/Levelling/mylevel.ts deleted file mode 100644 index ff7ef9e3649..00000000000 --- a/src/commands/Levelling/mylevel.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { GuildSettings, readSettings, RolesAuto } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Social.MyLevelDescription, - detailedDescription: LanguageKeys.Commands.Social.MyLevelExtended, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const user = args.finished ? message.author : await args.pick('userName'); - - const { members } = this.container.db; - const memberSettings = await members.findOne({ where: { userId: user.id, guildId: message.guild.id } }); - const memberPoints = memberSettings?.points ?? 0; - const roles = await readSettings(message.guild, GuildSettings.Roles.Auto); - const nextRole = this.getLatestRole(memberPoints, roles); - const title = nextRole - ? `\n${args.t(LanguageKeys.Commands.Social.MyLevelNext, { - remaining: nextRole.points - memberPoints, - next: nextRole.points - })}` - : ''; - - const content = - user.id === message.author.id - ? args.t(LanguageKeys.Commands.Social.MyLevelSelf, { points: memberPoints, next: title }) - : args.t(LanguageKeys.Commands.Social.MyLevel, { points: memberPoints, next: title, user: user.username }); - return send(message, content); - } - - public getLatestRole(points: number, autoroles: readonly RolesAuto[]) { - for (const autorole of autoroles) { - if (autorole.points > points) return autorole; - } - - return null; - } -} diff --git a/src/commands/Levelling/profile.ts b/src/commands/Levelling/profile.ts deleted file mode 100644 index ee21cf628aa..00000000000 --- a/src/commands/Levelling/profile.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { Scope } from '#lib/types'; -import { isPrivateMessage } from '#utils/common'; -import { cdnFolder } from '#utils/constants'; -import { fetchGlobalRank, fetchLocalRank, formatNumber } from '#utils/functions'; -import { fetchAvatar, loadImageFromFS, sanitizeInput } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image, loadImage } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { join } from 'node:path'; - -// Skyra's CDN assets folder -const THEMES_FOLDER = join(cdnFolder, 'skyra-assets', 'banners'); -const BADGES_FOLDER = join(cdnFolder, 'skyra-assets', 'badges'); - -@ApplyOptions({ - description: LanguageKeys.Commands.Social.ProfileDescription, - detailedDescription: LanguageKeys.Commands.Social.ProfileExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private lightThemeTemplate: Image = null!; - private darkThemeTemplate: Image = null!; - private lightThemeDock: Image = null!; - private darkThemeDock: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const scope = args.finished || isPrivateMessage(message) ? Scope.Global : await args.pick('scope').catch(() => Scope.Global); - const user = args.finished ? message.author : await args.pick('userName'); - - const output = await this.showProfile(message, scope, user, args.t); - return send(message, { files: [{ attachment: output, name: 'Profile.png' }] }); - } - - public async showProfile(message: Message, scope: Scope, user: User, t: TFunction) { - const { members, users } = this.container.db; - const settings = await users.ensureProfile(user.id); - const { level, points } = scope === Scope.Local && message.guild ? await members.ensure(user.id, message.guild.id) : settings; - - /* Calculate information from the user */ - const previousLevel = Math.floor((level / 0.2) ** 2); - const nextLevel = Math.floor(((level + 1) / 0.2) ** 2); - const progressBar = Math.max(Math.round(((points - previousLevel) / (nextLevel - previousLevel)) * 364), 6); - - /* Global leaderboard */ - const rank = await (scope === Scope.Local ? fetchLocalRank(user, message.guild!) : fetchGlobalRank(user)); - const [themeImageSRC, imgAvatarSRC] = await Promise.all([ - loadImageFromFS(join(THEMES_FOLDER, `${settings.profile.bannerProfile}.png`)), - fetchAvatar(user, 256) - ]); - - 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) => loadImageFromFS(join(BADGES_FOLDER, `${name}.png`)))); - - canvas.printImage(settings.profile.darkTheme ? this.darkThemeDock : this.lightThemeDock, 600, 0, 100, 391); - let position = 20; - for (const badge of badges) { - canvas.printImage(badge, 635, position, 50, 50); - position += 74; - } - } - - return ( - canvas - // Images - .save() - .createRoundedClip(10, 10, 620, 371, 8) - .printImage(themeImageSRC, 9, 9, 188, 373) - .restore() - .printImage(settings.profile.darkTheme ? this.darkThemeTemplate : this.lightThemeTemplate, 0, 0, 640, 391) - - // Progress bar - .setColor(`#${settings.profile.color.toString(16).padStart(6, '0') || 'FF239D'}`) - .printRoundedRectangle(227, 352, progressBar, 9, 3) - - // Name title - .setTextFont('35px RobotoRegular') - .setColor(settings.profile.darkTheme ? '#F0F0F0' : '#171717') - .printResponsiveText(sanitizeInput(user.username), 227, 73, 306) - .setTextFont('25px RobotoLight') - .printText(`#${user.discriminator}`, 227, 105) - - // Statistics Titles - .printText(title.globalRank, 227, 276) - .printText(title.credits, 227, 229) - .printText(title.reputation, 227, 181) - - // Experience - .setTextFont('20px RobotoLight') - .printText(title.experience, 227, 342) - - // Statistics Values - .setTextAlign('right') - .setTextFont('25px RobotoLight') - .printText(rank.toString(), 594, 276) - .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(formatNumber(t, points), 594, 346) - - // Level - .setTextAlign('center') - .setTextFont('30px RobotoLight') - .printText(title.level, 576, 58) - .setTextFont('40px RobotoRegular') - .printText(formatNumber(t, level), 576, 100) - - // Avatar - .printCircularImage(imgAvatarSRC, 103, 103, 71) - .pngAsync() - ); - } - - public async onLoad() { - [this.lightThemeTemplate, this.darkThemeTemplate, this.lightThemeDock, this.darkThemeDock] = await Promise.all([ - new Canvas(640, 391) - .setShadowColor('rgba(0, 0, 0, 0.7)') - .setShadowBlur(7) - .setColor('#FFFFFF') - .createRoundedPath(10, 10, 620, 371, 8) - .fill() - .createRoundedClip(10, 10, 620, 371, 5) - .clearRectangle(10, 10, 186, 371) - .printCircle(103, 103, 70.5) - .resetShadows() - .setColor('#E8E8E8') - .printRoundedRectangle(226, 351, 366, 11, 4) - .pngAsync() - .then(loadImage), - new Canvas(640, 391) - .setShadowColor('rgba(0, 0, 0, 0.7)') - .setShadowBlur(7) - .setColor('#202225') - .createRoundedPath(10, 10, 620, 371, 8) - .fill() - .createRoundedClip(10, 10, 620, 371, 5) - .clearRectangle(10, 10, 186, 371) - .printCircle(103, 103, 70.5) - .resetShadows() - .setColor('#2C2F33') - .printRoundedRectangle(226, 351, 366, 11, 4) - .pngAsync() - .then(loadImage), - new Canvas(100, 391) - .setShadowColor('rgba(0, 0, 0, 0.7)') - .setShadowBlur(7) - .setColor('#E8E8E8') - .createRoundedPath(10, 10, 80, 371, 8) - .fill() - .pngAsync() - .then(loadImage), - new Canvas(100, 391) - .setShadowColor('rgba(0, 0, 0, 0.7)') - .setShadowBlur(7) - .setColor('#272A2E') - .createRoundedPath(10, 10, 80, 371, 8) - .fill() - .pngAsync() - .then(loadImage) - ]); - } -} diff --git a/src/commands/Management/Configuration/manage-command-auto-delete.ts b/src/commands/Management/Configuration/manage-command-auto-delete.ts deleted file mode 100644 index d16c3a33952..00000000000 --- a/src/commands/Management/Configuration/manage-command-auto-delete.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { GuildSettings, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { minutes, seconds } from '#utils/common'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { GuildTextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { codeBlock } from '@sapphire/utilities'; - -@ApplyOptions({ - aliases: ['mcad'], - description: LanguageKeys.Commands.Management.ManageCommandAutoDeleteDescription, - detailedDescription: LanguageKeys.Commands.Management.ManageCommandAutoDeleteExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'reset', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - const time = await args.pick('timespan', { minimum: seconds(1), maximum: minutes(2) }); - - await writeSettings(message.guild, (settings) => { - const commandAutoDelete = settings[GuildSettings.CommandAutoDelete]; - const index = commandAutoDelete.findIndex(([id]) => id === channel.id); - const value: readonly [string, number] = [channel.id, time]; - - if (index === -1) commandAutoDelete.push(value); - else commandAutoDelete[index] = value; - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteAdd, { channel: channel.toString(), time }); - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - await writeSettings(message.guild, (settings) => { - const commandAutoDelete = settings[GuildSettings.CommandAutoDelete]; - const index = commandAutoDelete.findIndex(([id]) => id === channel.id); - - if (index === -1) { - this.error(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemoveNotSet, { channel: channel.toString() }); - } - - commandAutoDelete.splice(index, 1); - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteRemove, { channel: channel.toString() }); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - await writeSettings(message.guild, [[GuildSettings.CommandAutoDelete, []]]); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteReset); - return send(message, content); - } - - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const commandAutoDelete = await readSettings(message.guild, GuildSettings.CommandAutoDelete); - if (!commandAutoDelete.length) this.error(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); - - const list: string[] = []; - for (const entry of commandAutoDelete) { - const channel = this.container.client.channels.cache.get(entry[0]) as GuildTextBasedChannelTypes; - if (channel) list.push(`${channel.name.padEnd(26)} :: ${args.t(LanguageKeys.Globals.DurationValue, { value: seconds(entry[1]) })}`); - } - if (!list.length) this.error(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShowEmpty); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandAutoDeleteShow, { codeblock: codeBlock('asciidoc', list.join('\n')) }); - return send(message, content); - } -} diff --git a/src/commands/Management/Configuration/manage-command-channel.ts b/src/commands/Management/Configuration/manage-command-channel.ts deleted file mode 100644 index ea0dd065ec5..00000000000 --- a/src/commands/Management/Configuration/manage-command-channel.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { GuildSettings, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - aliases: ['mcc'], - description: LanguageKeys.Commands.Management.ManageCommandChannelDescription, - detailedDescription: LanguageKeys.Commands.Management.ManageCommandChannelExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'reset', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - const command = await args.pick('command'); - await writeSettings(message.guild, (settings) => { - const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; - const indexOfChannel = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - - if (indexOfChannel === -1) { - settings[GuildSettings.DisabledCommandChannels].push({ channel: channel.id, commands: [command.name] }); - } else { - const disabledCommandChannel = disabledCommandsChannels[indexOfChannel]; - if (disabledCommandChannel.commands.includes(command.name)) - this.error(LanguageKeys.Commands.Management.ManageCommandChannelAddAlreadySet); - - settings[GuildSettings.DisabledCommandChannels][indexOfChannel].commands.push(command.name); - } - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandChannelAdd, { channel: channel.toString(), command: command.name }); - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - const command = await args.pick('command'); - await writeSettings(message.guild, (settings) => { - const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; - const indexOfChannel = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - - if (indexOfChannel === -1) { - this.error(LanguageKeys.Commands.Management.ManageCommandChannelRemoveNotSet, { channel: channel.toString() }); - } - - const disabledCommandChannel = disabledCommandsChannels[indexOfChannel]; - const indexOfDisabledCommand = disabledCommandChannel.commands.indexOf(command.name); - - if (indexOfDisabledCommand !== -1) { - if (disabledCommandChannel.commands.length > 1) { - settings[GuildSettings.DisabledCommandChannels][indexOfChannel].commands.splice(indexOfDisabledCommand, 1); - } else { - settings[GuildSettings.DisabledCommandChannels].splice(indexOfChannel, 1); - } - } - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandChannelRemove, { channel: channel.toString(), command: command.name }); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - await writeSettings(message.guild, (settings) => { - const disabledCommandsChannels = settings[GuildSettings.DisabledCommandChannels]; - const entryIndex = disabledCommandsChannels.findIndex((e) => e.channel === channel.id); - - if (entryIndex === -1) { - this.error(LanguageKeys.Commands.Management.ManageCommandChannelResetEmpty); - } - - settings[GuildSettings.DisabledCommandChannels].splice(entryIndex, 1); - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandChannelReset, { channel: channel.toString() }); - return send(message, content); - } - - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick('textChannelName'); - const disabledCommandsChannels = await readSettings(message.guild, GuildSettings.DisabledCommandChannels); - - const entry = disabledCommandsChannels.find((e) => e.channel === channel.id); - if (!entry?.commands.length) { - this.error(LanguageKeys.Commands.Management.ManageCommandChannelShowEmpty); - } - - const content = args.t(LanguageKeys.Commands.Management.ManageCommandChannelShow, { - channel: channel.toString(), - commands: `\`${entry.commands.join('` | `')}\`` - }); - return send(message, content); - } -} diff --git a/src/commands/Management/Configuration/manage-reaction-roles.ts b/src/commands/Management/Configuration/manage-reaction-roles.ts deleted file mode 100644 index ac08fb0e316..00000000000 --- a/src/commands/Management/Configuration/manage-reaction-roles.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { GuildSettings, ReactionRole, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { getEmojiString, getEmojiTextFormat } from '#utils/functions'; -import { LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import { sendLoadingMessage } from '#utils/util'; -import { channelMention, hideLinkEmbed, hyperlink, roleMention } from '@discordjs/builders'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { chunk } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Guild, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['mrr', 'managereactionrole', 'managerolereaction', 'managerolereactions'], - description: LanguageKeys.Commands.Management.ManageReactionRolesDescription, - detailedDescription: LanguageKeys.Commands.Management.ManageReactionRolesExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'reset', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const role = await args.pick('roleName'); - if (!args.finished) { - const channel = await args.pick('textChannelName'); - const emoji = await args.pick('emoji'); - const reactionRole: ReactionRole = { - emoji: getEmojiString(emoji), - message: null, - channel: channel.id, - role: role.id - }; - - await writeSettings(message.guild, (settings) => { - settings[GuildSettings.ReactionRoles].push(reactionRole); - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageReactionRolesAddChannel, { - emoji: getEmojiTextFormat(reactionRole.emoji), - channel: channel!.toString() - }); - return send(message, content); - } - - await send(message, args.t(LanguageKeys.Commands.Management.ManageReactionRolesAddPrompt)); - - const reaction = await LongLivingReactionCollector.collectOne({ - filter: (reaction) => reaction.userId === message.author.id && reaction.guild.id === message.guild.id - }); - - if (!reaction) this.error(LanguageKeys.Commands.Management.ManageReactionRolesAddMissing); - - const reactionRole: ReactionRole = { - emoji: getEmojiString(reaction.emoji), - message: reaction.messageId, - channel: reaction.channel.id, - role: role.id - }; - await writeSettings(message.guild, (settings) => { - settings[GuildSettings.ReactionRoles].push(reactionRole); - }); - - const url = ``; - const content = args.t(LanguageKeys.Commands.Management.ManageReactionRolesAdd, { - emoji: getEmojiTextFormat(reactionRole.emoji), - url - }); - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const role = await args.pick('roleName'); - const messageId = await args.pick('snowflake'); - - const reactionRole = await writeSettings(message.guild, (settings) => { - const reactionRoles = settings[GuildSettings.ReactionRoles]; - - const reactionRoleIndex = reactionRoles.findIndex((entry) => (entry.message ?? entry.channel) === messageId && entry.role === role.id); - - if (reactionRoleIndex === -1) this.error(LanguageKeys.Commands.Management.ManageReactionRolesRemoveNotExists); - - const removedReactionRole = reactionRoles[reactionRoleIndex]; - reactionRoles.splice(reactionRoleIndex, 1); - - return removedReactionRole; - }); - - const url = reactionRole.message - ? `` - : `<#${reactionRole.channel}>`; - - const content = args.t(LanguageKeys.Commands.Management.ManageReactionRolesRemove, { - emoji: getEmojiTextFormat(reactionRole.emoji), - url - }); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - await writeSettings(message.guild, (settings) => { - const reactionRoles = settings[GuildSettings.ReactionRoles]; - - if (reactionRoles.length === 0) { - this.error(LanguageKeys.Commands.Management.ManageReactionRolesResetEmpty); - } - - reactionRoles.length = 0; - }); - - const content = args.t(LanguageKeys.Commands.Management.ManageReactionRolesReset); - return send(message, content); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const reactionRoles = await readSettings(message.guild, GuildSettings.ReactionRoles); - if (reactionRoles.length === 0) { - this.error(LanguageKeys.Commands.Management.ManageReactionRolesShowEmpty); - } - - const response = await sendLoadingMessage(message, args.t); - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }); - - for (const bulk of chunk(reactionRoles, 15)) { - const serialized = bulk.map((value) => this.format(value, message.guild)).join('\n'); - display.addPageEmbed((embed) => embed.setDescription(serialized)); - } - - await display.run(response, message.author); - return response; - } - - private format(entry: ReactionRole, guild: Guild): string { - const emoji = getEmojiTextFormat(entry.emoji); - const role = roleMention(entry.role); - const url = entry.message - ? hyperlink('🔗', hideLinkEmbed(`https://discord.com/channels/${guild.id}/${entry.channel}/${entry.message}`)) - : channelMention(entry.channel); - return `${emoji} | ${role} -> ${url}`; - } -} diff --git a/src/commands/Management/Configuration/setIgnoreChannels.ts b/src/commands/Management/Configuration/setIgnoreChannels.ts deleted file mode 100644 index 2004456b325..00000000000 --- a/src/commands/Management/Configuration/setIgnoreChannels.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { GuildSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { GuildTextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { Args, CommandOptionsRunTypeEnum, container, IArgument } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetIgnoreChannelsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetIgnoreChannelsExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick(UserCommand.hereOrTextChannelResolver); - - const [oldLength, newLength] = await writeSettings(message.guild, (settings) => { - const ignoredChannels = settings[GuildSettings.DisabledChannels]; - const oldLength = ignoredChannels.length; - - const channelId = channel.id; - const index = ignoredChannels.indexOf(channelId); - if (index === -1) { - ignoredChannels.push(channelId); - } else { - ignoredChannels.splice(index, 1); - } - - return [oldLength, ignoredChannels.length]; - }); - - const contentKey = - oldLength < newLength ? LanguageKeys.Commands.Management.SetIgnoreChannelsSet : LanguageKeys.Commands.Management.SetIgnoreChannelsRemoved; - const content = args.t(contentKey, { channel: channel.toString() }); - return send(message, content); - } - - private static hereOrTextChannelResolver = Args.make((argument, context) => { - if (argument === 'here') return Args.ok(context.message.channel as GuildTextBasedChannelTypes); - return (container.stores.get('arguments').get('textOrNewsChannelName') as IArgument).run(argument, context); - }); -} diff --git a/src/commands/Management/Configuration/setImageLogs.ts b/src/commands/Management/Configuration/setImageLogs.ts deleted file mode 100644 index 35a888b1b56..00000000000 --- a/src/commands/Management/Configuration/setImageLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetImageLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetImageLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetImageLogsSet, - settingsKey: GuildSettings.Channels.Logs.Image -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setMemberAddLogs.ts b/src/commands/Management/Configuration/setMemberAddLogs.ts deleted file mode 100644 index 4f4f701d803..00000000000 --- a/src/commands/Management/Configuration/setMemberAddLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetMemberAddLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetMemberAddLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetMemberAddLogsSet, - settingsKey: GuildSettings.Channels.Logs.MemberAdd -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setMemberRemoveLogs.ts b/src/commands/Management/Configuration/setMemberRemoveLogs.ts deleted file mode 100644 index c4079082a02..00000000000 --- a/src/commands/Management/Configuration/setMemberRemoveLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetMemberRemoveLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetMemberRemoveLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetMemberRemoveLogsSet, - settingsKey: GuildSettings.Channels.Logs.MemberRemove -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setMessageDeleteLogs.ts b/src/commands/Management/Configuration/setMessageDeleteLogs.ts deleted file mode 100644 index 288ec7b4463..00000000000 --- a/src/commands/Management/Configuration/setMessageDeleteLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetMessageDeleteLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetMessageDeleteLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetMessageDeleteLogsSet, - settingsKey: GuildSettings.Channels.Logs.MessageDelete -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setMessageUpdateLogs.ts b/src/commands/Management/Configuration/setMessageUpdateLogs.ts deleted file mode 100644 index a7a782f4a3e..00000000000 --- a/src/commands/Management/Configuration/setMessageUpdateLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetMessageUpdateLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetMessageUpdateLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetMessageUpdateLogsSet, - settingsKey: GuildSettings.Channels.Logs.MessageUpdate -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setModLogs.ts b/src/commands/Management/Configuration/setModLogs.ts deleted file mode 100644 index 1d4f316b650..00000000000 --- a/src/commands/Management/Configuration/setModLogs.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ChannelConfigurationCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetModerationLogsDescription, - detailedDescription: LanguageKeys.Commands.Management.SetModerationLogsExtended, - responseKey: LanguageKeys.Commands.Management.SetModerationLogsSet, - settingsKey: GuildSettings.Channels.Logs.Moderation -}) -export class UserChannelConfigurationCommand extends ChannelConfigurationCommand {} diff --git a/src/commands/Management/Configuration/setPrefix.ts b/src/commands/Management/Configuration/setPrefix.ts deleted file mode 100644 index a60cd79342f..00000000000 --- a/src/commands/Management/Configuration/setPrefix.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { GuildSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Management.SetPrefixDescription, - detailedDescription: LanguageKeys.Commands.Management.SetPrefixExtended, - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - aliases: ['prefix'] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const prefix = await args.pick('string', { minimum: 1, maximum: 10 }); - await writeSettings(message.guild, (settings) => { - // If it's the same value, throw: - if (settings[GuildSettings.Prefix] === prefix) { - this.error(LanguageKeys.Misc.ConfigurationEquals); - } - - // Else set the new value: - settings[GuildSettings.Prefix] = prefix; - }); - - const content = args.t(LanguageKeys.Commands.Management.SetPrefixSet, { prefix }); - return send(message, { content, allowedMentions: { users: [message.author.id], roles: [] } }); - } -} diff --git a/src/commands/Management/Profile Management/banner.ts b/src/commands/Management/Profile Management/banner.ts deleted file mode 100644 index 62f02838f34..00000000000 --- a/src/commands/Management/Profile Management/banner.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { GuildSettings, readSettings, UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { BrandingColors, CdnUrls, Emojis } from '#utils/constants'; -import { promptConfirmation } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { Args, CommandContext, CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { roundNumber } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const CDN_URL = CdnUrls.BannersBasePath; - -@ApplyOptions({ - aliases: ['banners', 'wallpaper', 'wallpapers', 'background', 'backgrounds'], - description: LanguageKeys.Commands.Social.BannerDescription, - detailedDescription: LanguageKeys.Commands.Social.BannerExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageMessages], - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['buy', 'reset', 'set', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - private display: SkyraPaginatedMessage = null!; - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async buy(message: GuildMessage, args: SkyraCommand.Args, { prefix }: CommandContext) { - const { users } = this.container.db; - const banner = await args.pick(UserCommand.banner); - - const author = await users.ensureProfile(message.author.id); - const banners = new Set(author.profile.banners); - if (banners.has(banner.id)) { - this.error(LanguageKeys.Commands.Social.BannerBought, { prefix, banner: banner.id }); - } - - if (author.money < banner.price) this.error(LanguageKeys.Commands.Social.BannerMoney, { money: author.money, cost: banner.price }); - - const accepted = await this.buyPrompt(message, banner); - if (!accepted) this.error(LanguageKeys.Commands.Social.BannerPaymentCancelled); - - await users.manager.transaction(async (em) => { - const existingBannerAuthor = await em.findOne(UserEntity, banner.author); - if (existingBannerAuthor) { - existingBannerAuthor.money += roundNumber(banner.price * 0.1); - await em.save(existingBannerAuthor); - } else { - await em.insert(UserEntity, { - id: banner.author, - money: roundNumber(banner.price * 0.1) - }); - } - - banners.add(banner.id); - author.profile.banners = [...banners]; - author.money -= banner.price; - await em.save(author); - }); - - const content = args.t(LanguageKeys.Commands.Social.BannerBuy, { banner: banner.title }); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args, { prefix }: CommandContext) { - const { users } = this.container.db; - - await users.lock([message.author.id], async (id) => { - const user = await users.ensureProfile(id); - if (!user.profile.banners.length) this.error(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); - if (user.profile.bannerProfile === '0001') this.error(LanguageKeys.Commands.Social.BannerResetDefault); - - user.profile.bannerProfile = '0001'; - return user.save(); - }); - - const content = args.t(LanguageKeys.Commands.Social.BannerReset); - return send(message, content); - } - - public async set(message: GuildMessage, args: SkyraCommand.Args, { prefix }: CommandContext) { - const { users } = this.container.db; - const banner = await args.pick(UserCommand.banner); - - await users.lock([message.author.id], async (id) => { - const user = await users.ensureProfile(id); - if (!user.profile.banners.length) this.error(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); - if (!user.profile.banners.includes(banner.id)) this.error(LanguageKeys.Commands.Social.BannerSetNotBought); - - user.profile.bannerProfile = banner.id; - return user.save(); - }); - - const content = args.t(LanguageKeys.Commands.Social.BannerSet, { banner: banner.title }); - return send(message, content); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const allOrUser = args.finished ? 'all' : await args.pick(UserCommand.allOrUser); - return allOrUser === 'all' ? this.buyList(message, args.t) : this.userList(message, args.t); - } - - public async onLoad() { - const { banners } = this.container.db; - const entries = await banners.find(); - if (entries.length === 0) { - this.enabled = false; - return; - } - - const display = new SkyraPaginatedMessage({ template: new MessageEmbed().setColor(BrandingColors.Primary) }); - for (const banner of entries) { - UserCommand.banners.set(banner.id, { - author: banner.authorId, - authorName: null, - id: banner.id, - group: banner.group, - price: banner.price, - title: banner.title - }); - - display.addPageEmbed((embed) => - embed - .setImage(`${CDN_URL}${banner.id}.png`) - .setTitle(banner.title) - .setDescription(`• ID: \`${banner.id}\`\n• ${banner.price}${Emojis.Shiny}`) - ); - } - - this.display = display; - } - - private async buyList(message: GuildMessage, t: TFunction) { - return this.runDisplay(message, t, this.display.clone()); - } - - private async userList(message: GuildMessage, t: TFunction) { - const prefix = await readSettings(message.guild, GuildSettings.Prefix); - - const { users } = this.container.db; - const user = await users.ensureProfile(message.author.id); - const banners = new Set(user.profile.banners); - if (!banners.size) this.error(LanguageKeys.Commands.Social.BannerUserListEmpty, { prefix }); - - const display = new SkyraPaginatedMessage({ template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) }); - for (const id of banners) { - const banner = UserCommand.banners.get(id); - if (banner) { - display.addPageEmbed((embed) => - embed - .setImage(`${CDN_URL}${banner.id}.png`) - .setTitle(banner.title) - .setDescription(`• ID: \`${banner.id}\`\n• ${banner.price}${Emojis.Shiny}`) - ); - } - } - - return this.runDisplay(message, t, display); - } - - private async runDisplay(message: GuildMessage, t: TFunction, display: SkyraPaginatedMessage) { - const response = await sendLoadingMessage(message, t); - await display.run(response, message.author); - return response; - } - - private async buyPrompt(message: GuildMessage, banner: BannerCache) { - const embed = new MessageEmbed() - .setColor(BrandingColors.Secondary) - .setDescription([`**Title**: ${banner.title} (\`${banner.id}\`)`, `**Price**: ${banner.price}${Emojis.Shiny}`].join('\n')) - .setImage(`${CDN_URL}${banner.id}.png`) - .setTimestamp(); - - return promptConfirmation(message, { embeds: [embed] }); - } - - private static readonly banners: Map = new Map(); - - private static banner = Args.make((parameter, { argument, commandContext }) => { - const banner = UserCommand.banners.get(parameter); - if (banner) return Args.ok(banner); - - return Args.error({ - parameter, - argument, - identifier: LanguageKeys.Commands.Social.BannerNotExists, - context: { prefix: commandContext.commandPrefix } - }); - }); - - private static allOrUser = Args.make<'all' | 'user'>((parameter, { argument }) => { - const lowerCasedParameter = parameter.toLowerCase(); - if (lowerCasedParameter === 'all' || lowerCasedParameter === 'user') return Args.ok(lowerCasedParameter); - - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Social.BannerAllOrUser }); - }); -} - -interface BannerCache { - author: string; - authorName: null; - id: string; - group: string; - price: number; - title: string; -} diff --git a/src/commands/Management/Profile Management/setcolor.ts b/src/commands/Management/Profile Management/setcolor.ts deleted file mode 100644 index 207a04eb7ba..00000000000 --- a/src/commands/Management/Profile Management/setcolor.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['setcolour'], - description: LanguageKeys.Commands.Social.SetColorDescription, - detailedDescription: LanguageKeys.Commands.Social.SetColorExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { hex, b10 } = await args.rest('color'); - - const { users } = this.container.db; - await users.lock([message.author.id], async (id) => { - const user = await users.ensureProfile(id); - user.profile.color = b10.value; - return user.save(); - }); - - const embed = new MessageEmbed() - .setColor(b10.value) - .setAuthor({ name: message.author.tag, iconURL: message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setDescription(args.t(LanguageKeys.Commands.Social.SetColor, { color: hex.toString() })); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Management/Profile Management/toggledarkmode.ts b/src/commands/Management/Profile Management/toggledarkmode.ts deleted file mode 100644 index d6f3a2863e4..00000000000 --- a/src/commands/Management/Profile Management/toggledarkmode.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - aliases: ['darkmode', 'toggledarktheme', 'darktheme'], - description: LanguageKeys.Commands.Social.ToggleDarkModeDescription, - detailedDescription: LanguageKeys.Commands.Social.ToggleDarkModeExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { users } = this.container.db; - const updated = await users.lock([message.author.id], async (id) => { - const user = await users.ensureProfile(id); - - user.profile.darkTheme = !user.profile.darkTheme; - return user.save(); - }); - - const contentKey = updated.profile.darkTheme - ? LanguageKeys.Commands.Social.ToggleDarkModeEnabled - : LanguageKeys.Commands.Social.ToggleDarkModeDisabled; - const content = args.t(contentKey); - return send(message, content); - } -} diff --git a/src/commands/Management/create-mute.ts b/src/commands/Management/create-mute.ts deleted file mode 100644 index 03a22851b26..00000000000 --- a/src/commands/Management/create-mute.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { GuildSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { minutes } from '#utils/common'; -import { Emojis } from '#utils/constants'; -import { getEmojiReactionFormat, getSecurity, promptConfirmation, promptForMessage, SerializedEmoji } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { canReact } from '@sapphire/discord.js-utilities'; -import { Argument, CommandOptionsRunTypeEnum, Result, UserError } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Permissions, Role } from 'discord.js'; - -@ApplyOptions({ - cooldownDelay: minutes(5), - description: LanguageKeys.Commands.Management.CreateMuteDescription, - detailedDescription: LanguageKeys.Commands.Management.CreateMuteExtended, - permissionLevel: PermissionLevels.Administrator, - requiredClientPermissions: [Permissions.FLAGS.MANAGE_CHANNELS, Permissions.FLAGS.MANAGE_ROLES], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - private get role() { - return this.container.stores.get('arguments').get('role') as Argument; - } - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args, context: SkyraCommand.Context) { - const { t } = args; - - if (await promptConfirmation(message, t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExisting))) { - const role = await this.askForRole(message, args, context); - if (role.success) { - await writeSettings(message.guild, [[GuildSettings.Roles.Muted, role.value.id]]); - if (canReact(message.channel)) return message.react(getEmojiReactionFormat(Emojis.GreenTickSerialized as SerializedEmoji)); - - const content = t(LanguageKeys.Commands.Admin.ConfUpdated, { - key: GuildSettings.Roles.Muted, - response: role.value.name - }); - return send(message, content); - } - } else if (await promptConfirmation(message, t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNew))) { - await getSecurity(message.guild).actions.muteSetup(message); - - const content = t(LanguageKeys.Commands.Moderation.Success); - await send(message, content); - } else { - const content = t(LanguageKeys.Commands.Management.CommandHandlerAborted); - await send(message, content); - } - - return null; - } - - private async askForRole(message: GuildMessage, args: SkyraCommand.Args, context: SkyraCommand.Context): Promise> { - const result = await promptForMessage(message, args.t(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupExistingName)); - if (result === null) this.error(LanguageKeys.Commands.Moderation.ActionSharedRoleSetupNoMessage); - - const argument = this.role; - return argument.run(result, { args, argument, command: this, commandContext: context, message }); - } -} diff --git a/src/commands/Management/permissionNodes.ts b/src/commands/Management/permissionNodes.ts deleted file mode 100644 index 9718f39c363..00000000000 --- a/src/commands/Management/permissionNodes.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { GuildSettings, PermissionNodeAction, PermissionsNode, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { resolveOnErrorCodes } from '#utils/common'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args, CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { isNullish } from '@sapphire/utilities'; -import { RESTJSONErrorCodes } from 'discord-api-types/v9'; -import { GuildMember, Role } from 'discord.js'; - -@ApplyOptions({ - aliases: ['pnodes', 'pnode'], - permissionLevel: PermissionLevels.Administrator, - description: LanguageKeys.Commands.Management.PermissionNodesDescription, - detailedDescription: LanguageKeys.Commands.Management.PermissionNodesExtended, - subCommands: ['add', 'remove', 'reset', { input: 'show', default: true }], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const target = await args.pick('roleName').catch(() => args.pick('member')); - const action = await args.pick(UserCommand.type); - - // Permission Nodes do not allow allows for the @everyone role: - if (target.id === message.guild.id && action === PermissionNodeAction.Allow) { - this.error(LanguageKeys.Commands.Management.PermissionNodesCannotAllowEveryone); - } - - if (!this.checkPermissions(message, target)) { - this.error(LanguageKeys.Commands.Management.PermissionNodesHigher); - } - - const command = await args.pick('commandMatch', { owners: false }); - await writeSettings(message.guild, (settings) => { - settings.permissionNodes.add(target, command, action); - }); - - const content = args.t(LanguageKeys.Commands.Management.PermissionNodesAdd); - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const target = await args.pick('roleName').catch(() => args.pick('member')); - const action = await args.pick(UserCommand.type); - const command = await args.pick('commandMatch', { owners: false }); - - if (!this.checkPermissions(message, target)) this.error(LanguageKeys.Commands.Management.PermissionNodesHigher); - - await writeSettings(message.guild, (settings) => { - settings.permissionNodes.remove(target, command, action); - }); - - const content = args.t(LanguageKeys.Commands.Management.PermissionNodesRemove); - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - const target = await args.pick('roleName').catch(() => args.pick('member')); - - if (!this.checkPermissions(message, target)) this.error(LanguageKeys.Commands.Management.PermissionNodesHigher); - - await writeSettings(message.guild, (settings) => { - settings.permissionNodes.reset(target); - }); - - const content = args.t(LanguageKeys.Commands.Management.PermissionNodesReset); - return send(message, content); - } - - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const content = args.finished ? await this.showAll(message, args) : await this.showOne(message, args); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - private async showOne(message: GuildMessage, args: SkyraCommand.Args) { - const target = await args.pick('roleName').catch(() => args.pick('member')); - - if (!this.checkPermissions(message, target)) this.error(LanguageKeys.Commands.Management.PermissionNodesHigher); - const isRole = target instanceof Role; - const key = isRole ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; - - const nodes = await readSettings(message.guild, key); - const node = nodes.find((n) => n.id === target.id); - if (typeof node === 'undefined') this.error(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); - - return this.formatPermissionNode(args, node, isRole, target); - } - - private async showAll(message: GuildMessage, args: SkyraCommand.Args) { - const [users, roles] = await readSettings(message.guild, [GuildSettings.Permissions.Users, GuildSettings.Permissions.Roles]); - const [fUsers, fRoles] = await Promise.all([this.formatPermissionNodes(args, users, false), this.formatPermissionNodes(args, roles, true)]); - const total = fUsers.concat(fRoles); - if (total.length === 0) this.error(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); - - return total.join('\n\n'); - } - - private async formatPermissionNodes(args: SkyraCommand.Args, nodes: readonly PermissionsNode[], isRole: boolean) { - const output: string[] = []; - for (const node of nodes) { - const target = isRole - ? args.message.guild!.roles.cache.get(node.id) - : await resolveOnErrorCodes(args.message.guild!.members.fetch(node.id), RESTJSONErrorCodes.UnknownMember); - - if (isNullish(target)) continue; - if (!this.checkPermissions(args.message as GuildMessage, target)) continue; - output.push(`> ${this.formatPermissionNode(args, node, isRole, target)}`); - } - - return output; - } - - private formatPermissionNode(args: SkyraCommand.Args, node: PermissionsNode, isRole: boolean, target: Role | GuildMember) { - return [ - args.t(LanguageKeys.Commands.Management.PermissionNodesShowName, { name: this.formatTarget(isRole, target) }), - args.t(LanguageKeys.Commands.Management.PermissionNodesShowAllow, { allow: this.formatCommands(args, node.allow) }), - args.t(LanguageKeys.Commands.Management.PermissionNodesShowDeny, { deny: this.formatCommands(args, node.deny) }) - ].join('\n'); - } - - private formatTarget(isRole: boolean, target: Role | GuildMember) { - return isRole ? (target as Role).name : (target as GuildMember).displayName; - } - - private formatCommands(args: SkyraCommand.Args, commands: readonly string[]) { - return commands.length === 0 - ? args.t(LanguageKeys.Globals.None) - : args.t(LanguageKeys.Globals.AndListValue, { value: commands.map((command) => `\`${command}\``) }); - } - - private checkPermissions(message: GuildMessage, target: Role | GuildMember) { - // If it's to itself, always block - if (message.member!.id === target.id) return false; - - // If the target is the owner, always block - if (message.guild.ownerId === target.id) return false; - - // If the author is the owner, always allow - if (message.author.id === message.guild.ownerId) return true; - - // Check hierarchy role positions, allow when greater, block otherwise - const targetPosition = target instanceof Role ? target.position : target.roles.highest.position; - const authorPosition = message.member!.roles.highest?.position ?? 0; - return authorPosition > targetPosition; - } - - private static type = Args.make((parameter, { argument }) => { - const lowerCasedParameter = parameter.toLowerCase(); - if (lowerCasedParameter === 'allow') return Args.ok(PermissionNodeAction.Allow); - if (lowerCasedParameter === 'deny') return Args.ok(PermissionNodeAction.Deny); - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Management.PermissionNodesInvalidType }); - }); -} diff --git a/src/commands/Management/roles.ts b/src/commands/Management/roles.ts deleted file mode 100644 index 53cdbb331e4..00000000000 --- a/src/commands/Management/roles.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { GuildSettings, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { chunk } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed, Role } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - aliases: ['pr', 'role', 'public-roles', 'public-role'], - description: LanguageKeys.Commands.Management.RolesDescription, - detailedDescription: LanguageKeys.Commands.Management.RolesExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles, PermissionFlagsBits.ManageMessages], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: GuildMessage, args: PaginatedMessageCommand.Args) { - const [rolesPublic, allRoleSets, rolesRemoveInitial, rolesInitial, rolesInitialHumans, rolesInitialBots] = await readSettings(message.guild, [ - GuildSettings.Roles.Public, - GuildSettings.Roles.UniqueRoleSets, - GuildSettings.Roles.RemoveInitial, - GuildSettings.Roles.Initial, - GuildSettings.Roles.InitialHumans, - GuildSettings.Roles.InitialBots - ]); - - if (!rolesPublic.length) this.error(LanguageKeys.Commands.Management.RolesListEmpty); - - // If no argument was provided then show the list of available roles - if (args.finished) return this.list(message, args.t, rolesPublic); - - const roles = [...new Set(await args.repeat('roleName', { filter: (role: Role) => rolesPublic.includes(role.id) }))]; - - // Otherwise start process of claiming a role - const memberRoles = new Set(message.member!.roles.cache.keys()); - - // Remove the everyone role - memberRoles.delete(message.guild.id); - - const filterRoles = new Set(roles); - const unlistedRoles: string[] = []; - const unmanageable: string[] = []; - const addedRoles: string[] = []; - const removedRoles: string[] = []; - const { position } = message.guild.me!.roles.highest; - - for (const role of filterRoles) { - if (!role) continue; - if (!rolesPublic.includes(role.id)) { - unlistedRoles.push(role.name); - } else if (position <= role.position) { - unmanageable.push(role.name); - } else if (memberRoles.has(role.id)) { - memberRoles.delete(role.id); - removedRoles.push(role.name); - } else { - memberRoles.add(role.id); - addedRoles.push(role.name); - - for (const set of allRoleSets) { - // If the set does not have the role being added skip to next set - if (!set.roles.includes(role.id)) continue; - - for (const id of set.roles) { - // If this role is the role being added skip - if (role.id === id) continue; - - if (memberRoles.has(id)) { - // If the member has this role we need to delete it - memberRoles.delete(id); - // get to the role object so we can get the name of the role to show the user it was removed - const roleToRemove = message.guild.roles.cache.get(id)!; - removedRoles.push(roleToRemove.name); - } - } - } - } - } - - const actualInitialRole = rolesInitial ?? (message.author.bot ? rolesInitialBots : rolesInitialHumans); - // If the guild requests to remove the initial role upon claiming, remove the initial role - if (actualInitialRole && rolesRemoveInitial && addedRoles.length) { - // If the role was deleted, remove it from the settings - if (!message.guild.roles.cache.has(actualInitialRole)) { - await writeSettings(message.guild, [[GuildSettings.Roles.Initial, null]]).catch((error) => this.container.logger.fatal(error)); - } else if (message.member!.roles.cache.has(actualInitialRole)) { - memberRoles.delete(actualInitialRole); - } - } - - const { t } = args; - - // Apply the roles - if (removedRoles.length || addedRoles.length) - await message.member!.roles.set([...memberRoles], t(LanguageKeys.Commands.Management.RolesAuditLog)); - - const output: string[] = []; - 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('`, `') })); - - const content = output.join('\n'); - return send(message, content); - } - - private async list(message: GuildMessage, t: TFunction, publicRoles: readonly string[]) { - const remove: string[] = []; - const roles: string[] = []; - for (const roleId of publicRoles) { - const role = message.guild.roles.cache.get(roleId); - if (role) roles.push(role.name); - else remove.push(roleId); - } - - // Automatic role deletion - if (remove.length) { - const allRoles = new Set(publicRoles); - for (const role of remove) allRoles.delete(role); - await writeSettings(message.guild, [[GuildSettings.Roles.Public, [...allRoles]]]); - } - - // 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) this.error(LanguageKeys.Commands.Management.RolesListEmpty); - - const user = this.container.client.user!; - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ name: user.username, iconURL: user.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setTitle(t(LanguageKeys.Commands.Management.RolesListTitle)) - }); - - for (const page of chunk(roles, 10)) { - display.addPageEmbed((embed) => embed.setDescription(page.join('\n'))); - } - - const response = await sendLoadingMessage(message, t); - await display.run(response, message.author); - return response; - } -} diff --git a/src/commands/Misc/chase.ts b/src/commands/Misc/chase.ts deleted file mode 100644 index f1721e5a4c4..00000000000 --- a/src/commands/Misc/chase.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { OWNERS, SISTER_CLIENTS } from '#root/config'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.ChaseDescription, - detailedDescription: LanguageKeys.Commands.Misc.ChaseExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private KTemplate: Image = null!; - private readonly reflectedUsers = OWNERS.concat(SISTER_CLIENTS).concat(process.env.CLIENT_ID); - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'chase.png' }] }); - } - - public async generate(message: Message, possibleTarget: User) { - const { target, user } = this.resolve(message, possibleTarget); - const [chasedAvatar, chaserAvatar] = await Promise.all([fetchAvatar(target, 128), fetchAvatar(user, 128)]); - - return ( - new Canvas(569, 327) - .printImage(this.KTemplate, 0, 0, 569, 327) - .setTransform(-1, 0, 0, 1, 0, 0) - - // Draw chased avatar - .save() - .translate(-144, 51) - .rotate(radians(16.12)) - .printCircularImage(chasedAvatar, 0, 0, 26) - .restore() - - // Draw chaser avatar - .translate(-391, 62) - .rotate(radians(12.26)) - .printCircularImage(chaserAvatar, 0, 0, 25) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.KTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/chase.png')); - } - - private resolve(message: Message, possibleTarget: User) { - const targetSelf = possibleTarget.id === message.author.id; - if (targetSelf) { - if (!OWNERS.includes(message.author.id)) return { target: message.author, user: this.container.client.user! }; - this.error(LanguageKeys.Commands.Misc.CannotTargetOwner); - } - - if (this.reflectedUsers.includes(possibleTarget.id)) return { target: message.author, user: possibleTarget }; - return { target: possibleTarget, user: message.author }; - } -} diff --git a/src/commands/Misc/cuddle.ts b/src/commands/Misc/cuddle.ts deleted file mode 100644 index e083b3a9ea6..00000000000 --- a/src/commands/Misc/cuddle.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.CuddleDescription, - detailedDescription: LanguageKeys.Commands.Misc.CuddleExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'cuddle.png' }] }); - } - - public async generate(message: Message, user: User) { - if (user.id === message.author.id) user = this.container.client.user!; - - /* Get the buffers from both profile avatars */ - const [man, woman] = await Promise.all([fetchAvatar(message.author, 256), fetchAvatar(user, 256)]); - - return ( - new Canvas(636, 366) - .printImage(this.kTemplate, 0, 0, 636, 366) - - // Draw the guy - .save() - .translate(248, 70) - .rotate(radians(47.69)) - .printCircularImage(man, 0, 0, 70) - .restore() - - // Draw the woman - .translate(384, 120) - .rotate(radians(35.28)) - .printCircularImage(woman, 0, 0, 69) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/cuddle.png')); - } -} diff --git a/src/commands/Misc/deletthis.ts b/src/commands/Misc/deletthis.ts deleted file mode 100644 index 1254b0401f9..00000000000 --- a/src/commands/Misc/deletthis.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { OWNERS, SISTER_CLIENTS } from '#root/config'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['deletethis'], - description: LanguageKeys.Commands.Misc.DeletThisDescription, - detailedDescription: LanguageKeys.Commands.Misc.DeletThisExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - private readonly reflectedUsers = OWNERS.concat(SISTER_CLIENTS).concat(process.env.CLIENT_ID); - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'deletThis.png' }] }); - } - - public async generate(message: Message, possibleTarget: User) { - const { target, user } = this.resolve(message, possibleTarget); - const [hammered, hammerer] = await Promise.all([fetchAvatar(target, 256), fetchAvatar(user, 256)]); - - return ( - new Canvas(650, 471) - .printImage(this.kTemplate, 0, 0, 650, 471) - - // Draw the guy with the hammer - .save() - .translate(341, 135) - .rotate(radians(21.8)) - .printCircularImage(hammerer, 0, 0, 77) - .restore() - - // Draw the who's getting the hammer - .setTransform(-1, 0, 0, 1, 511, 231) - .rotate(radians(-25.4)) - .printCircularImage(hammered, 0, 0, 77) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/DeletThis.png')); - } - - private resolve(message: Message, possibleTarget: User) { - const targetSelf = possibleTarget.id === message.author.id; - if (targetSelf) { - if (!OWNERS.includes(message.author.id)) return { target: message.author, user: this.container.client.user! }; - this.error(LanguageKeys.Commands.Misc.CannotTargetOwner); - } - - if (this.reflectedUsers.includes(possibleTarget.id)) return { target: message.author, user: possibleTarget }; - return { target: possibleTarget, user: message.author }; - } -} diff --git a/src/commands/Misc/f.ts b/src/commands/Misc/f.ts deleted file mode 100644 index 549def0f877..00000000000 --- a/src/commands/Misc/f.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { canReact } from '@sapphire/discord.js-utilities'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['pray'], - description: LanguageKeys.Commands.Misc.FDescription, - detailedDescription: LanguageKeys.Commands.Misc.FExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName').catch(() => message.author); - const attachment = await this.generate(user); - const response = await send(message, { files: [{ attachment, name: 'F.png' }] }); - if (canReact(response.channel)) await response.react('🇫'); - return response; - } - - public async generate(user: User) { - const praised = await fetchAvatar(user, 256); - - return ( - new Canvas(960, 540) - // Draw the avatar - .setTransform(1, -0.1, 0.1, 1, 342, 88) - .printImage(praised, 0, 0, 109, 109) - - // Draw the template - .resetTransform() - .printImage(this.kTemplate, 0, 0, 960, 540) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/f.png')); - } -} diff --git a/src/commands/Misc/good-night.ts b/src/commands/Misc/good-night.ts deleted file mode 100644 index bd2b1af8dbc..00000000000 --- a/src/commands/Misc/good-night.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['gn', 'night'], - description: LanguageKeys.Commands.Misc.GoodNightDescription, - detailedDescription: LanguageKeys.Commands.Misc.GoodNightExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'goodNight.png' }] }); - } - - public async generate(message: Message, user: User) { - if (user.id === message.author.id) user = this.container.client.user!; - - const [kisser, child] = await Promise.all([fetchAvatar(message.author, 256), fetchAvatar(user, 256)]); - - return ( - new Canvas(500, 322) - .printImage(this.kTemplate, 0, 0, 636, 366) - - // Draw the mother - .save() - .translate(388, 98) - .rotate(radians(41.89)) - .printCircularImage(kisser, 0, 0, 73) - .restore() - - // Draw the kid - .setTransform(-1, 0, 0, 1, 405, 225) - .rotate(radians(-27.98)) - .printCircularImage(child, 0, 0, 55) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/goodnight.png')); - } -} diff --git a/src/commands/Misc/goofytime.ts b/src/commands/Misc/goofytime.ts deleted file mode 100644 index 47c5e04d77b..00000000000 --- a/src/commands/Misc/goofytime.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['goof', 'goofy', 'daddy', 'goofie', 'goofietime'], - description: LanguageKeys.Commands.Misc.GoofyTimeDescription, - detailedDescription: LanguageKeys.Commands.Misc.GoofyTimeExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: "It's Goofy time.png" }] }); - } - - public async generate(message: Message, user: User) { - const [goofied, goofy] = await Promise.all([fetchAvatar(user, 128), fetchAvatar(message.author, 128)]); - - return ( - new Canvas(356, 435) - .printImage(this.kTemplate, 0, 0, 356, 435) - - // Draw Goofy - .printCircularImage(goofy, 245, 98, 46) - - // Draw the kid in the floor - .translate(120, 321) - .rotate(radians(-45)) - .printCircularImage(goofied, 0, 0, 25) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/goofy.png')); - } -} diff --git a/src/commands/Misc/hug.ts b/src/commands/Misc/hug.ts deleted file mode 100644 index f0d625e4fec..00000000000 --- a/src/commands/Misc/hug.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.HugDescription, - detailedDescription: LanguageKeys.Commands.Misc.HugExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'hug.png' }] }); - } - - public async generate(message: Message, user: User) { - if (user.id === message.author.id) user = this.container.client.user!; - - const [hugged, hugger] = await Promise.all([fetchAvatar(user, 256), fetchAvatar(message.author, 256)]); - - return ( - new Canvas(660, 403) - .printImage(this.kTemplate, 0, 0, 660, 403) - - // Draw the woman - .save() - .setTransform(-1, 0, 0, 1, 178, 144) - .rotate(radians(30)) - .printCircularImage(hugger, 0, 0, 54) - .restore() - - // Draw the man - .translate(292, 96) - .rotate(radians(28.42)) - .printCircularImage(hugged, 0, 0, 49) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/hug.png')); - } -} diff --git a/src/commands/Misc/ineedhealing.ts b/src/commands/Misc/ineedhealing.ts deleted file mode 100644 index 25711cd278d..00000000000 --- a/src/commands/Misc/ineedhealing.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS, radians } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - aliases: ['heal', 'healing'], - description: LanguageKeys.Commands.Misc.INeedHealingDescription, - detailedDescription: LanguageKeys.Commands.Misc.INeedHealingExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName'); - const attachment = await this.generate(message, user); - return send(message, { files: [{ attachment, name: 'INeedHealing.png' }] }); - } - - public async generate(message: Message, user: User) { - if (user.id === message.author.id) user = this.container.client.user!; - - const [healer, healed] = await Promise.all([fetchAvatar(message.author, 128), fetchAvatar(user, 128)]); - - return ( - new Canvas(333, 500) - .printImage(this.kTemplate, 0, 0, 333, 500) - - // Draw the healer - .save() - .translate(244, 287) - .rotate(radians(30.42)) - .printCircularImage(healed, 0, 0, 55) - .restore() - - // Draw the healed boy - .translate(123, 149) - .rotate(radians(-31.4)) - .printCircularImage(healer, 0, 0, 53) - - // Draw the buffer - .pngAsync() - ); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/ineedhealing.png')); - } -} diff --git a/src/commands/Misc/randreddit.ts b/src/commands/Misc/randreddit.ts deleted file mode 100644 index aaa565d4e93..00000000000 --- a/src/commands/Misc/randreddit.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import type { Reddit } from '#lib/types/definitions/Reddit'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { isNsfwChannel } from '@sapphire/discord.js-utilities'; -import { fetch, FetchResultTypes, QueryError } from '@sapphire/fetch'; -import { Args } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; - -const subredditBlocklist = /nsfl|morbidreality|watchpeopledie|fiftyfifty|stikk/i; -const subredditTitleBlocklist = /nsfl/i; -const subredditNameRegex = /^(?:\/?r\/)?[A-Za-z0-9_-]*$/; - -@ApplyOptions({ - aliases: ['rand', 'rand-reddit', 'reddit'], - description: LanguageKeys.Commands.Misc.RandRedditDescription, - detailedDescription: LanguageKeys.Commands.Misc.RandRedditExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - await sendLoadingMessage(message, args.t); - - const reddit = await args.pick(UserCommand.reddit); - const { kind, data } = await this.fetchData(reddit); - - if (!kind || !data || data.children.length === 0) { - this.error(LanguageKeys.Commands.Misc.RandRedditFail); - } - - const nsfwEnabled = isNsfwChannel(message.channel); - const posts = nsfwEnabled - ? data.children.filter((child) => !subredditTitleBlocklist.test(child.data.title)) - : data.children.filter((child) => !child.data.over_18 && !subredditTitleBlocklist.test(child.data.title)); - - if (posts.length === 0) { - this.error(nsfwEnabled ? LanguageKeys.Commands.Misc.RandRedditAllNsfl : LanguageKeys.Commands.Misc.RandRedditAllNsfw); - } - - const post = posts[Math.floor(Math.random() * posts.length)].data; - - const content = args.t(LanguageKeys.Commands.Misc.RandRedditMessage, { - title: post.title, - author: post.author, - url: post.spoiler ? `||${post.url}||` : post.url - }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - private async fetchData(reddit: string) { - try { - return await fetch(`https://www.reddit.com/r/${reddit}/.json?limit=30`, FetchResultTypes.JSON); - } catch (error) { - this.handleError(error as QueryError); - } - } - - private handleError(error: QueryError): never { - let parsed: RedditError; - try { - parsed = error.toJSON() as RedditError; - } catch { - this.error(LanguageKeys.System.ParseError); - } - - switch (parsed.error) { - case 403: { - if (parsed.reason === 'private') this.error(LanguageKeys.Commands.Misc.RandRedditErrorPrivate); - if (parsed.reason === 'quarantined') this.error(LanguageKeys.Commands.Misc.RandRedditErrorQuarantined); - break; - } - case 404: { - if (!Reflect.has(parsed, 'reason')) this.error(LanguageKeys.Commands.Misc.RandRedditErrorNotFound); - if (Reflect.get(parsed, 'reason') === 'banned') this.error(LanguageKeys.Commands.Misc.RandRedditErrorBanned); - break; - } - case 500: { - this.error(LanguageKeys.System.ExternalServerError); - } - } - - throw error; - } - - private static reddit = Args.make((parameter, { argument }) => { - if (!subredditNameRegex.test(parameter)) { - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Misc.RandRedditInvalidArgument }); - } - - if (subredditBlocklist.test(parameter)) { - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Misc.RandRedditBanned }); - } - - return Args.ok(parameter.toLowerCase()); - }); -} - -type RedditError = RedditNotFound | RedditBanned | RedditForbidden | RedditQuarantined | RedditServerError; - -interface RedditForbidden { - reason: 'private'; - message: 'Forbidden'; - error: 403; -} - -interface RedditQuarantined { - reason: 'quarantined'; - quarantine_message_html: string; - message: 'Forbidden'; - quarantine_message: string; - error: 403; -} - -interface RedditNotFound { - message: 'Not Found'; - error: 404; -} - -interface RedditBanned { - reason: 'banned'; - message: 'Not Found'; - error: 404; -} - -interface RedditServerError { - message: 'Internal Server Error'; - error: 500; -} diff --git a/src/commands/Misc/remindme.ts b/src/commands/Misc/remindme.ts deleted file mode 100644 index 2dfaeea77e5..00000000000 --- a/src/commands/Misc/remindme.ts +++ /dev/null @@ -1,164 +0,0 @@ -import type { ScheduleEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { Schedules } from '#lib/types/Enums'; -import { minutes, years } from '#utils/common'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { Args } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { chunk, cutText } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -const enum Actions { - List = 'list', - Show = 'show', - Create = 'create', - Delete = 'delete' -} - -interface ReminderScheduledTask extends ScheduleEntity { - data: { - content: string; - user: string; - }; -} - -@ApplyOptions({ - aliases: ['rmm', 'remind', 'reminder', 'reminders'], - description: LanguageKeys.Commands.Social.RemindMeDescription, - detailedDescription: LanguageKeys.Commands.Social.RemindMeExtended -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const action = args.finished ? Actions.List : await args.pick(UserCommand.action).catch(() => Actions.Create); - return this[action](message, args); - } - - public async create(message: Message, args: SkyraCommand.Args) { - const duration = await args.pick('timespan', { minimum: minutes(1), maximum: years(5) }); - const description = args.finished - ? args.t(LanguageKeys.Commands.Social.RemindMeCreateNoDescription) - : await args.rest('string', { maximum: 1024 }); - - const task = await this.container.schedule.add(Schedules.Reminder, Date.now() + duration, { - catchUp: true, - data: { - content: description, - user: message.author.id - } - }); - - const content = args.t(LanguageKeys.Commands.Social.RemindMeCreate, { id: task.id.toString() }); - return send(message, content); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async list(message: Message, args: SkyraCommand.Args) { - const { client } = this.container; - const tasks = client.schedules.queue.filter((task) => task.data && task.data.user === message.author.id); - if (!tasks.length) { - const content = args.t(LanguageKeys.Commands.Social.RemindMeListEmpty); - return send(message, content); - } - const response = await sendLoadingMessage(message, args.t); - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ name: client.user!.username, iconURL: client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - }); - - const pages = chunk( - tasks.map( - (task) => - `\`${task.id}\` - \`${args.t(LanguageKeys.Globals.DateTimeValue, { value: task.time })}\` - ${cutText( - task.data.content as string, - 40 - )}` - ), - 10 - ); - - for (const page of pages) display.addPageEmbed((embed) => embed.setDescription(page.join('\n'))); - await display.run(response, message.author); - return response; - } - - public async delete(message: Message, args: SkyraCommand.Args) { - const task = await args.pick(UserCommand.task); - const { id } = task; - await task.delete(); - - const content = args.t(LanguageKeys.Commands.Social.RemindMeDelete, { remainingDuration: task.time.getTime() - Date.now(), id }); - return send(message, content); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async show(message: Message, args: SkyraCommand.Args) { - const task = await args.pick(UserCommand.task); - - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setAuthor({ - name: `${message.author.tag} (${message.author.id})`, - iconURL: message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setDescription(task.data.content) - .setFooter({ text: args.t(LanguageKeys.Commands.Social.RemindMeShowFooter, { id: task.id }) }) - .setTimestamp(task.time); - return send(message, { embeds: [embed] }); - } - - private static action = Args.make((parameter, { argument }) => { - switch (parameter.toLowerCase()) { - case 'a': - case 'all': - case 'l': - case 'list': - return Args.ok(Actions.List); - case 'r': - case 'rm': - case 'remove': - case 'd': - case 'del': - case 'delete': - return Args.ok(Actions.Delete); - case 's': - case 'show': - return Args.ok(Actions.Show); - case 'c': - case 'create': - case 'me': - return Args.ok(Actions.Create); - default: { - return Args.error({ argument, parameter }); - } - } - }); - - private static task = Args.make((parameter, { message, argument }) => { - const id = Number(parameter); - if (!Number.isInteger(id) || id < 0) { - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.RemindMeInvalidId }); - } - - for (const task of message.client.schedules.queue) { - // If it is not the task we are looking for, skip: - if (task.id !== id) continue; - - // If the specified task is: - // - Not a reminder. - // - Does not belong to the user. - // - // Then it should break the loop and return err. - if (task.taskId !== Schedules.Reminder || task.data.user !== message.author.id) break; - - // But if the task is a valid one, is a reminder, and is owned by the author, then emit ok(): - return Args.ok(task as ReminderScheduledTask); - } - - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Social.RemindMeNotFound }); - }); -} diff --git a/src/commands/Misc/reputation.ts b/src/commands/Misc/reputation.ts deleted file mode 100644 index a4e2ad2846b..00000000000 --- a/src/commands/Misc/reputation.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { UserRepository } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { Schedules } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args, CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Time } from '@sapphire/time-utilities'; -import type { User } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const flags = ['remind', 'reminder', 'remindme']; - -@ApplyOptions({ - aliases: ['rep'], - description: LanguageKeys.Commands.Social.ReputationDescription, - detailedDescription: LanguageKeys.Commands.Social.ReputationExtended, - flags, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const check = await args.pick(UserCommand.check).catch(() => false); - if (check) return this.check(message, args); - - const user = args.finished ? null : await this.getUser(args); - const settings = await this.downloadSettings(message.author.id, user ? user.id : null); - - const date = new Date(); - const now = date.getTime(); - const timeReputation = settings.author.cooldowns.reputation?.getTime(); - if (timeReputation && timeReputation + Time.Day > now) { - const content = args.t(LanguageKeys.Commands.Social.ReputationTime, { remaining: timeReputation + Time.Day - now }); - return send(message, content); - } - - if (!user) { - const content = args.t(LanguageKeys.Commands.Social.ReputationUsable); - return send(message, content); - } - if (user.id === message.author.id) this.error(LanguageKeys.Commands.Social.ReputationSelf); - - await settings.users.manager.transaction(async (em) => { - ++settings.target!.reputations; - settings.author.cooldowns.reputation = date; - await em.save([settings.target!, settings.author]); - }); - - if (args.getFlags(...flags)) { - await this.container.schedule.add(Schedules.Reminder, date.getTime() + Time.Day, { - data: { - content: args.t(LanguageKeys.Commands.Social.ReputationAvailable), - user: message.author.id - } - }); - } - - const content = args.t(LanguageKeys.Commands.Social.ReputationGive, { user: user.toString() }); - return send(message, content); - } - - private async check(message: GuildMessage, args: SkyraCommand.Args) { - const user = args.finished ? message.author : await this.getUser(args); - const settings = await this.downloadSettings(message.author.id, user.id); - - const content = this.handleCheck(args.t, user, settings); - return send(message, content); - } - - private handleCheck(t: TFunction, user: User, settings: Settings) { - if (settings.target) { - const reputationPoints = t(LanguageKeys.Commands.Social.Reputation, { count: settings.target.reputations }); - return t(LanguageKeys.Commands.Social.Reputations, { user: user!.username, points: reputationPoints }); - } - - return t(LanguageKeys.Commands.Social.ReputationsSelf, { points: settings.author.reputations }); - } - - private async downloadSettings(authorId: string, targetId: string | null): Promise { - const { users } = this.container.db; - return { - users, - author: await users.ensureProfileAndCooldowns(authorId), - target: targetId && targetId !== authorId ? await users.ensureProfile(targetId) : null - }; - } - - private async getUser(args: SkyraCommand.Args) { - const user = await args.pick('userName'); - if (user.bot) this.error(LanguageKeys.Commands.Social.ReputationsBots); - return user; - } - - private static check = Args.make((parameter, { argument }) => { - if (parameter.toLowerCase() === 'check') return Args.ok(true); - return Args.error({ argument, parameter }); - }); -} - -interface Settings { - users: UserRepository; - author: UserRepository.UserEntityWithProfileAndCooldowns; - target: UserRepository.UserEntityWithProfile | null; -} diff --git a/src/commands/Misc/ship.ts b/src/commands/Misc/ship.ts deleted file mode 100644 index 58f51758970..00000000000 --- a/src/commands/Misc/ship.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { CanvasColors, socialFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image, loadImage } from 'canvas-constructor/napi-rs'; -import { remove as removeConfusables } from 'confusables'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { User } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.ShipDescription, - detailedDescription: LanguageKeys.Commands.Misc.ShipExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - private readonly kRemoveSymbolsRegex = /(?:[~`!@#%^&*(){}[\];:"'<,.>?/\\|_+=-])+/g; - private lightThemeTemplate: Image = null!; - private darkThemeTemplate: Image = null!; - private heartIcon: Image = null!; - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const firstUser = args.finished ? this.randomUser(message) : await args.pick('userName'); - const secondUser = args.finished ? this.randomUser(message, firstUser) : await args.pick('userName'); - - // Get the avatars and sync the author's settings for dark mode preference - const [avatarFirstUser, avatarSecondUser] = await Promise.all([fetchAvatar(firstUser), fetchAvatar(secondUser)]); - - const { users } = this.container.db; - const settings = await users.ensureProfile(message.author.id); - - // Build up the ship canvas - const attachment = await new Canvas(224, 88) - // Add base image - .printImage(settings.profile.darkTheme ? this.darkThemeTemplate : this.lightThemeTemplate, 0, 0, 224, 88) - // Add avatar image with side-offsets of 12px, a Height x Width of 64x64px and bevel radius of 10 - .printRoundedImage(avatarFirstUser, 12, 12, 64, 64, 10) - // Add heart icon with width offset of 84px and height offset of 20px - .printImage(this.heartIcon, 84, 20) - // Add avatar image with width offset of 148px, height offset of 12px, a Height x Width of 64x64px and bevel radius of 10 - .printRoundedImage(avatarSecondUser, 148, 12, 64, 64, 10) - .pngAsync(); - - // Return the lovely message - const data = args.t(LanguageKeys.Commands.Misc.ShipData, { - romeoUsername: firstUser.username, - julietUsername: secondUser.username, - shipName: this.getShipName([...firstUser.username], [...secondUser.username]) - }); - - const content = `${data.title}\n${data.description}`; - return send(message, { content, files: [{ attachment, name: 'ship.png' }] }); - } - - /** Initialize the light and dark theme templates and the heart icon */ - public async onLoad() { - [this.lightThemeTemplate, this.darkThemeTemplate, this.heartIcon] = await Promise.all([ - new Canvas(224, 88).setColor(CanvasColors.BackgroundLight).printRoundedRectangle(0, 0, 224, 88, 10).pngAsync().then(loadImage), - new Canvas(224, 88).setColor(CanvasColors.BackgroundDark).printRoundedRectangle(0, 0, 224, 88, 10).pngAsync().then(loadImage), - loadImageFromFS(join(socialFolder, 'heart.png')) - ]); - } - - /** Randomly pick a ship name for the two users */ - private getShipName(firstUsername: string[], secondUsername: string[]) { - const randomizedFirstName = firstUsername.slice(0, Math.min(firstUsername.length, firstUsername.length * Math.random() * 0.8 + 2)); - const randomizedSecondName = secondUsername.slice(-Math.min(secondUsername.length, secondUsername.length * Math.random() * 0.8 + 2)); - // Remove any confusables from the name to make a cleaner ship name - const deconfusedName = removeConfusables(randomizedFirstName.concat(randomizedSecondName).join('')); - - // Remove all symbols from the ship name - const alphabeticalCharactersOnlyName = deconfusedName.replace(this.kRemoveSymbolsRegex, ''); - - return alphabeticalCharactersOnlyName; - } - - private randomUser(message: GuildMessage, firstUser?: User): User { - // Prefer self if there is already a firstUser, that is not self - if (firstUser !== undefined && firstUser.id !== message.author.id) return message.author; - - // Fetch 2 random IDs - const users = message.guild!.members.cache.random(2); - - // If firstUser is already determined and the IDs match, then grab the second random ID - if (firstUser !== undefined && firstUser.id === users[0].id) return users[1].user; - - // Else return the first random ID - return users[0].user; - } -} diff --git a/src/commands/Misc/skyrafact.ts b/src/commands/Misc/skyrafact.ts deleted file mode 100644 index ae46f1fb0c3..00000000000 --- a/src/commands/Misc/skyrafact.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['aifact', 'botfact'], - description: LanguageKeys.Commands.Misc.SkyraFactDescription, - detailedDescription: LanguageKeys.Commands.Misc.SkyraFactExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setTitle(args.t(LanguageKeys.Commands.Misc.SkyraFactTitle)) - .setDescription(this.getLine(args)); - - return send(message, { embeds: [embed] }); - } - - private getLine(args: SkyraCommand.Args) { - const lines = args.t(LanguageKeys.Commands.Misc.SkyraFactMessages); - const index = Math.floor(Math.random() * lines.length); - return lines[index] || args.t(LanguageKeys.Commands.Misc.SkyraFactMessages, { lng: 'en-US' })[index]; - } -} diff --git a/src/commands/Misc/snipe.ts b/src/commands/Misc/snipe.ts deleted file mode 100644 index 46a1fe243ba..00000000000 --- a/src/commands/Misc/snipe.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { getSnipedMessage } from '#utils/functions'; -import { getContent, getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['sniped'], - description: LanguageKeys.Commands.Misc.SnipeDescription, - detailedDescription: LanguageKeys.Commands.Misc.SnipeExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks], - permissionLevel: PermissionLevels.Moderator, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const sniped = getSnipedMessage(message.channel); - if (sniped === null) this.error(LanguageKeys.Commands.Misc.SnipeEmpty); - - const embed = new MessageEmbed() - .setTitle(args.t(LanguageKeys.Commands.Misc.SnipeTitle)) - .setColor(await this.container.db.fetchColor(sniped)) - .setAuthor({ name: sniped.author.username, iconURL: sniped.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setTimestamp(sniped.createdTimestamp); - - const content = getContent(sniped); - if (content !== null) embed.setDescription(content); - const image = getImage(sniped); - if (image !== null) embed.setImage(image); - - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Misc/thesearch.ts b/src/commands/Misc/thesearch.ts deleted file mode 100644 index 7685e4d7b75..00000000000 --- a/src/commands/Misc/thesearch.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { loadImageFromFS, sanitizeInput } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; -import { join } from 'node:path'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.TheSearchDescription, - detailedDescription: LanguageKeys.Commands.Misc.TheSearchExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const text = sanitizeInput(await args.rest('string')); - const attachment = await this.generate(text); - return send(message, { files: [{ attachment, name: 'TheSearch.png' }] }); - } - - public generate(text: string) { - return new Canvas(700, 612) - .printImage(this.kTemplate, 0, 0, 700, 612) - .setTextAlign('center') - .setTextFont('19px FamilyFriends') - .createRectangleClip(61, 335, 156, 60) - .printWrappedText(text, 143, 360, 156) - .pngAsync(); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/TheSearch.png')); - } -} diff --git a/src/commands/Misc/triggered.ts b/src/commands/Misc/triggered.ts deleted file mode 100644 index 56e366eb7fc..00000000000 --- a/src/commands/Misc/triggered.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { assetsFolder } from '#utils/constants'; -import { fetchAvatar, loadImageFromFS } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { GifEncoder } from '@skyra/gifenc'; -import { Canvas, Image, rgba } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message, User } from 'discord.js'; -import { join } from 'node:path'; -import { buffer } from 'node:stream/consumers'; - -const COORDINATES: readonly [number, number][] = [ - [-25, -25], - [-50, -13], - [-42, -34], - [-14, -10] -]; - -@ApplyOptions({ - description: LanguageKeys.Commands.Misc.TriggeredDescription, - detailedDescription: LanguageKeys.Commands.Misc.TriggeredExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - private kTemplate: Image = null!; - - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = await args.pick('userName').catch(() => message.author); - const attachment = await this.generate(user); - return send(message, { files: [{ attachment, name: 'triggered.gif' }] }); - } - - public async generate(user: User) { - const encoder = new GifEncoder(350, 393); - const canvas = new Canvas(350, 393); - - const userAvatar = await fetchAvatar(user, 512); - - const stream = encoder.createReadStream(); - encoder.setRepeat(0).setDelay(50).setQuality(100).start(); - - for (const [x, y] of COORDINATES) { - const frame = canvas - .printImage(userAvatar, x, y, 400, 400) - .printImage(this.kTemplate, 0, 340, 350, 53) - .setColor(rgba(255, 100, 0, 0.4)) - .printRectangle(0, 0, 350, 350) - .getImageData().data; - - encoder.addFrame(frame); - } - - encoder.finish(); - - return buffer(stream); - } - - public async onLoad() { - this.kTemplate = await loadImageFromFS(join(assetsFolder, './images/memes/triggered.png')); - } -} diff --git a/src/commands/Moderation/Management/mutes.ts b/src/commands/Moderation/Management/mutes.ts deleted file mode 100644 index 459d3dbc10e..00000000000 --- a/src/commands/Moderation/Management/mutes.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import type { UserPaginatedMessageCommand as Moderations } from './moderations'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Moderation.MutesDescription, - detailedDescription: LanguageKeys.Commands.Moderation.MutesExtended, - permissionLevel: PermissionLevels.Moderator, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public messageRun(message: GuildMessage, args: PaginatedMessageCommand.Args, context: PaginatedMessageCommand.Context) { - const moderations = this.store.get('moderations') as Moderations | undefined; - if (typeof moderations === 'undefined') throw new Error('Moderations command not loaded yet.'); - return moderations.mutes(message, args, context); - } -} diff --git a/src/commands/Moderation/Management/warnings.ts b/src/commands/Moderation/Management/warnings.ts deleted file mode 100644 index 4736753ab16..00000000000 --- a/src/commands/Moderation/Management/warnings.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import type { UserPaginatedMessageCommand as Moderations } from './moderations'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Moderation.WarningsDescription, - detailedDescription: LanguageKeys.Commands.Moderation.WarningsExtended, - permissionLevel: PermissionLevels.Moderator, - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public messageRun(message: GuildMessage, args: PaginatedMessageCommand.Args, context: PaginatedMessageCommand.Context) { - const moderations = this.store.get('moderations') as Moderations | undefined; - if (typeof moderations === 'undefined') throw new Error('Moderations command not loaded yet.'); - return moderations.mutes(message, args, context); - } -} diff --git a/src/commands/Moderation/Restriction/restrictAttachment.ts b/src/commands/Moderation/Restriction/restrictAttachment.ts deleted file mode 100644 index d1a2aa3c0a3..00000000000 --- a/src/commands/Moderation/Restriction/restrictAttachment.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['restricted-attachment', 'ra'], - description: LanguageKeys.Commands.Moderation.RestrictAttachmentDescription, - detailedDescription: LanguageKeys.Commands.Moderation.RestrictAttachmentExtended, - optionalDuration: true, - requiredMember: true, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedAttachment, - setUpKey: ModerationSetupRestriction.Attachment -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.restrictAttachment( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/restrictEmbed.ts b/src/commands/Moderation/Restriction/restrictEmbed.ts deleted file mode 100644 index 8393cd3bce6..00000000000 --- a/src/commands/Moderation/Restriction/restrictEmbed.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['restricted-embed', 're'], - description: LanguageKeys.Commands.Moderation.RestrictEmbedDescription, - detailedDescription: LanguageKeys.Commands.Moderation.RestrictEmbedExtended, - optionalDuration: true, - requiredMember: true, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedEmbed, - setUpKey: ModerationSetupRestriction.Embed -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.restrictEmbed( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/restrictEmoji.ts b/src/commands/Moderation/Restriction/restrictEmoji.ts deleted file mode 100644 index c1d6206fab6..00000000000 --- a/src/commands/Moderation/Restriction/restrictEmoji.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['restrict-external-emoji', 'restricted-emoji', 'restricted-external-emoji', 'ree', 'restrict-emojis'], - description: LanguageKeys.Commands.Moderation.RestrictEmojiDescription, - detailedDescription: LanguageKeys.Commands.Moderation.RestrictEmojiExtended, - optionalDuration: true, - requiredMember: true, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedEmoji, - setUpKey: ModerationSetupRestriction.Emoji -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.restrictEmoji( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/restrictReaction.ts b/src/commands/Moderation/Restriction/restrictReaction.ts deleted file mode 100644 index 0116fbcbe74..00000000000 --- a/src/commands/Moderation/Restriction/restrictReaction.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['restricted-reaction', 'rr'], - description: LanguageKeys.Commands.Moderation.RestrictReactionDescription, - detailedDescription: LanguageKeys.Commands.Moderation.RestrictReactionExtended, - optionalDuration: true, - requiredMember: true, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedReaction, - setUpKey: ModerationSetupRestriction.Reaction -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.restrictReaction( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/restrictVoice.ts b/src/commands/Moderation/Restriction/restrictVoice.ts deleted file mode 100644 index 27ace7536d6..00000000000 --- a/src/commands/Moderation/Restriction/restrictVoice.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['restricted-voice', 'rv'], - description: LanguageKeys.Commands.Moderation.RestrictVoiceDescription, - detailedDescription: LanguageKeys.Commands.Moderation.RestrictVoiceExtended, - optionalDuration: true, - requiredMember: true, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedVoice, - setUpKey: ModerationSetupRestriction.Voice -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.restrictVoice( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/unrestrictAttachment.ts b/src/commands/Moderation/Restriction/unrestrictAttachment.ts deleted file mode 100644 index 4e530e2fe0a..00000000000 --- a/src/commands/Moderation/Restriction/unrestrictAttachment.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['un-restricted-attachment', 'ura'], - description: LanguageKeys.Commands.Moderation.UnrestrictAttachmentDescription, - detailedDescription: LanguageKeys.Commands.Moderation.UnrestrictAttachmentExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedAttachment, - setUpKey: ModerationSetupRestriction.Attachment -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unRestrictAttachment( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/unrestrictEmbed.ts b/src/commands/Moderation/Restriction/unrestrictEmbed.ts deleted file mode 100644 index ccd2bc18461..00000000000 --- a/src/commands/Moderation/Restriction/unrestrictEmbed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['un-restricted-embed', 'ure'], - description: LanguageKeys.Commands.Moderation.UnrestrictEmbedDescription, - detailedDescription: LanguageKeys.Commands.Moderation.UnrestrictEmbedExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedEmbed, - setUpKey: ModerationSetupRestriction.Embed -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unRestrictEmbed( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/unrestrictEmoji.ts b/src/commands/Moderation/Restriction/unrestrictEmoji.ts deleted file mode 100644 index 71c588f3aaa..00000000000 --- a/src/commands/Moderation/Restriction/unrestrictEmoji.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['un-restrict-external-emoji', 'unrestricted-emoji', 'unrestricted-external-emoji', 'uree', 'unrestrict-emojis'], - description: LanguageKeys.Commands.Moderation.UnrestrictEmojiDescription, - detailedDescription: LanguageKeys.Commands.Moderation.UnrestrictEmojiExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedEmoji, - setUpKey: ModerationSetupRestriction.Emoji -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unRestrictEmoji( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/unrestrictReaction.ts b/src/commands/Moderation/Restriction/unrestrictReaction.ts deleted file mode 100644 index 97b4b235519..00000000000 --- a/src/commands/Moderation/Restriction/unrestrictReaction.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['un-restricted-reaction', 'urr'], - description: LanguageKeys.Commands.Moderation.UnrestrictReactionDescription, - detailedDescription: LanguageKeys.Commands.Moderation.UnrestrictReactionExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedReaction, - setUpKey: ModerationSetupRestriction.Reaction -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unRestrictReaction( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/Restriction/unrestrictVoice.ts b/src/commands/Moderation/Restriction/unrestrictVoice.ts deleted file mode 100644 index 34859d84af3..00000000000 --- a/src/commands/Moderation/Restriction/unrestrictVoice.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SetUpModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { ModerationSetupRestriction } from '#utils/Security/ModerationActions'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['un-restricted-voice', 'urv'], - description: LanguageKeys.Commands.Moderation.UnrestrictVoiceDescription, - detailedDescription: LanguageKeys.Commands.Moderation.UnrestrictVoiceExtended, - requiredClientPermissions: [PermissionFlagsBits.ManageRoles], - roleKey: GuildSettings.Roles.RestrictedVoice, - setUpKey: ModerationSetupRestriction.Voice -}) -export class UserSetUpModerationCommand extends SetUpModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unRestrictVoice( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason - }, - await this.getTargetDM(message, context.args, context.target) - ); - } -} diff --git a/src/commands/Moderation/vmute.ts b/src/commands/Moderation/vmute.ts deleted file mode 100644 index 0c1f158da06..00000000000 --- a/src/commands/Moderation/vmute.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['vm'], - description: LanguageKeys.Commands.Moderation.VmuteDescription, - detailedDescription: LanguageKeys.Commands.Moderation.VmuteExtended, - optionalDuration: true, - requiredClientPermissions: [PermissionFlagsBits.MuteMembers], - requiredMember: true -}) -export class UserModerationCommand extends ModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.voiceMute( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message), - duration: context.duration - }, - await this.getTargetDM(message, context.args, context.target) - ); - } - - public async checkModeratable(...[message, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, context); - if (member && member.voice.serverMute) throw context.args.t(LanguageKeys.Commands.Moderation.MuteMuted); - return member; - } -} diff --git a/src/commands/Moderation/vunmute.ts b/src/commands/Moderation/vunmute.ts deleted file mode 100644 index f05da20fcba..00000000000 --- a/src/commands/Moderation/vunmute.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationCommand } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { getImage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { ArgumentTypes } from '@sapphire/utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['uvm', 'vum', 'unvmute'], - description: LanguageKeys.Commands.Moderation.VunmuteDescription, - detailedDescription: LanguageKeys.Commands.Moderation.VunmuteExtended, - requiredClientPermissions: [PermissionFlagsBits.MuteMembers], - requiredMember: true -}) -export class UserModerationCommand extends ModerationCommand { - public async handle(...[message, context]: ArgumentTypes) { - return getSecurity(message.guild).actions.unVoiceMute( - { - userId: context.target.id, - moderatorId: message.author.id, - reason: context.reason, - imageURL: getImage(message) - }, - await this.getTargetDM(message, context.args, context.target) - ); - } - - public async checkModeratable(...[message, context]: ArgumentTypes) { - const member = await super.checkModeratable(message, context); - if (member && !member.voice.serverMute) throw context.args.t(LanguageKeys.Commands.Moderation.VmuteUserNotMuted); - return member; - } -} diff --git a/src/commands/Starwars/swfilm.ts b/src/commands/Starwars/swfilm.ts deleted file mode 100644 index 0b43014a8a2..00000000000 --- a/src/commands/Starwars/swfilm.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getFilms } from '#utils/APIs/StarWars'; -import { CdnUrls } from '#utils/constants'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { cutText } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-film', 'star-wars-movie'], - description: LanguageKeys.Commands.StarWars.FilmDescription, - detailedDescription: LanguageKeys.Commands.StarWars.FilmExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const film = await args.rest('string'); - - const results = await this.fetchAPI(film.toLowerCase()); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.FilmQueryFail, { film }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const filmTitles = t(LanguageKeys.Commands.StarWars.FilmEmbedTitles); - - for (const result of results) { - display - .addPageEmbed((embed) => { - const description = [ - `**${filmTitles.episodeId}**: ${result.episodeId}`, - `**${filmTitles.releaseDate}**: ${time(new Date(result.releaseDate), TimestampStyles.ShortDate)}`, - `**${filmTitles.director}**: ${result.director}`, - `**${filmTitles.producers}**: ${t(LanguageKeys.Globals.AndListValue, { value: result.producers })}` - ].join('\n'); - - return embed - .setTitle(result.title) // - .setDescription(description); - }) - .addPageEmbed((embed) => - embed - .setTitle(result.title) // - .setDescription(cutText(result.openingCrawl, 4096)) - ) - .addPageEmbed((embed) => { - const description: string[] = []; - - if (result.characters.length) { - description.push( - `**${filmTitles.characters}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.characters.map((character) => `\`${character.name}\``) - })}` - ); - } - - if (result.planets.length) { - description.push( - `**${filmTitles.planets}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.planets.map((planet) => `\`${planet.name}\``) - })}` - ); - } - - if (result.species.length) { - description.push( - `**${filmTitles.species}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.species.map((species) => `\`${species.name}\``) - })}` - ); - } - - if (result.starships.length) { - description.push( - `**${filmTitles.starships}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.starships.map((starship) => `\`${starship.name}\``) - })}` - ); - } - - if (result.vehicles.length) { - description.push( - `**${filmTitles.vehicles}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.vehicles.map((vehicle) => `\`${vehicle.name}\``) - })}` - ); - } - - return embed - .setTitle(result.title) // - .setDescription(description.join('\n\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(film: string) { - try { - const { - data: { getFuzzyFilm } - } = await fetchStarWarsApi<'getFuzzyFilm'>(getFilms, { film, take: 10 }); - return getFuzzyFilm; - } catch { - this.error(LanguageKeys.Commands.StarWars.FilmQueryFail, { film }); - } - } -} diff --git a/src/commands/Starwars/swperson.ts b/src/commands/Starwars/swperson.ts deleted file mode 100644 index 5b83242112c..00000000000 --- a/src/commands/Starwars/swperson.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getPerson } from '#utils/APIs/StarWars'; -import { CdnUrls, Emojis } from '#utils/constants'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-person', 'star-wars-character'], - description: LanguageKeys.Commands.StarWars.PersonDescription, - detailedDescription: LanguageKeys.Commands.StarWars.PersonExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const person = await args.rest('string'); - - const results = await this.fetchAPI(person); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.PersonQueryFail, { person }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const peopleTitles = t(LanguageKeys.Commands.StarWars.PersonEmbedTitles); - - for (const result of results) { - display - .addPageEmbed((embed) => { - const description = []; - - if (result.height) { - description.push(`**${peopleTitles.height}**: ${result.height}`); - } - - if (result.mass) { - description.push(`**${peopleTitles.mass}**: ${result.mass}`); - } - - if (result.gender) { - description.push(`**${peopleTitles.gender}**: ${this.parseGenderString(result.gender)}`); - } - - if (result.skinColors?.length) { - description.push( - `**${peopleTitles.skinColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.skinColors.map((skinColor) => toTitleCase(skinColor)) - })}` - ); - } - - if (result.eyeColors?.length) { - description.push( - `**${peopleTitles.eyeColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.eyeColors.map((eyeColor) => toTitleCase(eyeColor)) - })}` - ); - } - - if (result.birthYear) { - description.push(`**${peopleTitles.yearOfBirth}**: ${result.birthYear}`); - } - - if (result.hairColors?.length) { - description.push( - `**${peopleTitles.hairColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.hairColors.map((hairColor) => toTitleCase(hairColor)) - })}` - ); - } - - if (result.homeworld) { - description.push(`**${peopleTitles.homeworld}**: ${result.homeworld.name}`); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n')); - }) - .addPageEmbed((embed) => { - const description = []; - - if (result.films?.length) { - description.push( - '', - `**${peopleTitles.appearedInFilms}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.films.map((film) => `\`${film.title}\``) - })}` - ); - } - - if (result.species?.length) { - description.push( - `**${peopleTitles.species}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.species.map((species) => `\`${species.name}\``) - })}` - ); - } - - if (result.starships.length) { - description.push( - `**${peopleTitles.ownedStarShips}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.starships.map((starship) => `\`${starship.name}\``) - })}` - ); - } - - if (result.vehicles.length) { - description.push( - `**${peopleTitles.ownedVehicles}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.vehicles.map((vehicle) => `\`${vehicle.name}\``) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(person: string) { - try { - const { - data: { getFuzzyPerson } - } = await fetchStarWarsApi<'getFuzzyPerson'>(getPerson, { person, take: 10 }); - - return getFuzzyPerson; - } catch { - this.error(LanguageKeys.Commands.StarWars.PersonQueryFail, { person }); - } - } - - private parseGenderString(gender: 'male' | 'female' | string) { - switch (gender.toLowerCase()) { - case 'male': - return Emojis.MaleSignEmoji; - case 'female': - return Emojis.FemaleSignEmoji; - default: - return toTitleCase(gender); - } - } -} diff --git a/src/commands/Starwars/swplanet.ts b/src/commands/Starwars/swplanet.ts deleted file mode 100644 index 1c9325aa5b5..00000000000 --- a/src/commands/Starwars/swplanet.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getPlanet } from '#utils/APIs/StarWars'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-planet'], - description: LanguageKeys.Commands.StarWars.PlanetDescription, - detailedDescription: LanguageKeys.Commands.StarWars.PlanetExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const planet = await args.rest('string'); - - const results = await this.fetchAPI(planet); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.PlanetQueryFail, { planet }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const planetTitles = t(LanguageKeys.Commands.StarWars.PlanetEmbedTitles); - - for (const result of results) { - display.addPageEmbed((embed) => { - const description = []; - - if (result.diameter) { - description.push(`**${planetTitles.diameter}**: ${formatNumber(t, result.diameter)}`); - } - - if (result.population) { - description.push( - `**${planetTitles.averageSentientPopulation}**: ${t(LanguageKeys.Globals.NumberCompactValue, { - value: result.population - })}` - ); - } - - if (result.climates) { - description.push( - `**${planetTitles.climates}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.climates.map((climate) => toTitleCase(climate)) - })}` - ); - } - - if (result.terrains) { - description.push( - `**${planetTitles.terrains}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.terrains.map((terrain) => toTitleCase(terrain)) - })}` - ); - } - - if (result.surfaceWater) { - description.push(`**${planetTitles.surfaceWaterPercentage}**: ${result.surfaceWater}%`); - } - - if (result.orbitalPeriod) { - description.push(`**${planetTitles.orbitalPeriod}**: ${result.orbitalPeriod}`); - } - - if (result.rotationPeriod) { - description.push(`**${planetTitles.rotationPeriod}**: ${result.rotationPeriod}`); - } - - if (result.films?.length) { - description.push( - '', - `**${planetTitles.appearedInFilms}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.films.map((film) => `\`${film.title}\``) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(planet: string) { - try { - const { - data: { getFuzzyPlanet } - } = await fetchStarWarsApi<'getFuzzyPlanet'>(getPlanet, { planet, take: 10 }); - - return getFuzzyPlanet; - } catch { - this.error(LanguageKeys.Commands.StarWars.PlanetQueryFail, { planet }); - } - } -} diff --git a/src/commands/Starwars/swship.ts b/src/commands/Starwars/swship.ts deleted file mode 100644 index eaff2a2410e..00000000000 --- a/src/commands/Starwars/swship.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getStarship } from '#utils/APIs/StarWars'; -import { seconds } from '#utils/common'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-space-ship', 'swship', 'star-wars-ship'], - description: LanguageKeys.Commands.StarWars.StarshipDescription, - detailedDescription: LanguageKeys.Commands.StarWars.StarshipExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const starship = await args.rest('string'); - - const results = await this.fetchAPI(starship); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.StarshipQueryFail, { starship }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const starshipTitles = t(LanguageKeys.Commands.StarWars.StarshipEmbedTitles); - - for (const result of results) { - display - .addPageEmbed((embed) => { - const description = []; - - if (result.model) { - description.push(`**${starshipTitles.model}**: ${result.model}`); - } - - if (result.starshipClass) { - description.push(`**${starshipTitles.starshipClass}**: ${result.starshipClass}`); - } - - if (result.crew) { - description.push(`**${starshipTitles.crew}**: ${formatNumber(t, result.crew)}`); - } - - if (result.passengers) { - description.push(`**${starshipTitles.amountOfPassengers}**: ${formatNumber(t, result.passengers)}`); - } - - if (result.length) { - description.push(`**${starshipTitles.length}**: ${formatNumber(t, result.length)}`); - } - - if (result.costInCredits) { - description.push(`**${starshipTitles.costInCredits}**: ${formatNumber(t, result.costInCredits)}`); - } - - if (result.cargoCapacity) { - description.push(`**${starshipTitles.cargoCapacity}**: ${formatNumber(t, result.cargoCapacity)}`); - } - - if (result.consumables) { - description.push( - `**${starshipTitles.consumables}**: ${time( - seconds.fromMilliseconds(Date.now() + result.consumables), - TimestampStyles.RelativeTime - )}` - ); - } - - if (result.maxAtmospheringSpeed) { - description.push(`**${starshipTitles.maximumAtmospheringSpeed}**: ${formatNumber(t, result.maxAtmospheringSpeed)}`); - } - - if (result.hyperdriveRating) { - description.push(`**${starshipTitles.hyperdriveRating}**: ${formatNumber(t, result.hyperdriveRating)}`); - } - - if (result.MGLT) { - description.push(`**${starshipTitles.megalightsTravelSpeed}**: ${formatNumber(t, result.MGLT)}`); - } - - if (result.manufacturers?.length) { - `**${starshipTitles.manufacturers}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.manufacturers.map((manufacturer) => toTitleCase(manufacturer)) - })}`; - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n')); - }) - .addPageEmbed((embed) => { - const description = []; - - if (result.films?.length) { - description.push( - '', - `**${starshipTitles.appearedInFilms}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.films.map((film) => `\`${film.title}\``) - })}` - ); - } - - if (result.pilots.length) { - description.push( - `**${starshipTitles.pilots}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.pilots.map((vehicle) => `\`${vehicle.name}\``) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(starship: string) { - try { - const { - data: { getFuzzyStarship } - } = await fetchStarWarsApi<'getFuzzyStarship'>(getStarship, { starship, take: 10 }); - - return getFuzzyStarship; - } catch { - this.error(LanguageKeys.Commands.StarWars.StarshipQueryFail, { starship }); - } - } -} diff --git a/src/commands/Starwars/swspecies.ts b/src/commands/Starwars/swspecies.ts deleted file mode 100644 index 4833b4b744a..00000000000 --- a/src/commands/Starwars/swspecies.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getSpecies } from '#utils/APIs/StarWars'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-species'], - description: LanguageKeys.Commands.StarWars.SpeciesDescription, - detailedDescription: LanguageKeys.Commands.StarWars.SpeciesExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const species = await args.rest('string'); - - const results = await this.fetchAPI(species); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.SpeciesQueryFail, { species }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const speciesTitles = t(LanguageKeys.Commands.StarWars.SpeciesEmbedTitles); - - for (const result of results) { - display - .addPageEmbed((embed) => { - const description = []; - - if (result.language) { - description.push(`**${speciesTitles.language}**: ${result.language}`); - } - - if (result.averageHeight) { - description.push(`**${speciesTitles.averageHeight}**: ${formatNumber(t, result.averageHeight)}`); - } - - if (result.averageLifespan) { - description.push(`**${speciesTitles.averageLifespan}**: ${formatNumber(t, result.averageLifespan)}`); - } - - if (result.classification) { - description.push(`**${speciesTitles.classification}**: ${result.classification}`); - } - - description.push(`**${speciesTitles.designation}**: ${result.designation}`); - - if (result.eyeColors?.length) { - description.push( - `**${speciesTitles.eyeColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.eyeColors.map((eyeColor) => toTitleCase(eyeColor)) - })}` - ); - } - - if (result.hairColors?.length) { - description.push( - `**${speciesTitles.hairColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.hairColors.map((hairColor) => toTitleCase(hairColor)) - })}` - ); - } - - if (result.skinColors?.length) { - description.push( - `**${speciesTitles.skinColours}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.skinColors.map((skinColor) => toTitleCase(skinColor)) - })}` - ); - } - - if (result.homeworld) { - description.push(`**${speciesTitles.homeworld}**: ${result.homeworld.name}`); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n')); - }) - .addPageEmbed((embed) => { - const description = []; - - if (result.films?.length) { - description.push( - '', - `**${speciesTitles.appearedInFilms}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.films.map((film) => `\`${film.title}\``) - })}` - ); - } - - if (result.people.length) { - description.push( - `**${speciesTitles.knownPeopleOfSpecies}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.people.map((vehicle) => `\`${vehicle.name}\``) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(species: string) { - try { - const { - data: { getFuzzySpecies } - } = await fetchStarWarsApi<'getFuzzySpecies'>(getSpecies, { species, take: 10 }); - - return getFuzzySpecies; - } catch { - this.error(LanguageKeys.Commands.StarWars.SpeciesQueryFail, { species }); - } - } -} diff --git a/src/commands/Starwars/swvehicle.ts b/src/commands/Starwars/swvehicle.ts deleted file mode 100644 index 8c732e97a62..00000000000 --- a/src/commands/Starwars/swvehicle.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { fetchStarWarsApi, getVehicles } from '#utils/APIs/StarWars'; -import { seconds } from '#utils/common'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['star-wars-vehicle', 'swvehicles', 'star-wars-vehicles'], - description: LanguageKeys.Commands.StarWars.VehicleDescription, - detailedDescription: LanguageKeys.Commands.StarWars.VehicleExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - const vehicle = await args.rest('string'); - - const results = await this.fetchAPI(vehicle); - - if (results.length === 0) { - this.error(LanguageKeys.Commands.StarWars.VehicleQueryFail, { vehicle }); - } - - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() // - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail(CdnUrls.StarWarsLogo) - }); - - const vehicleTitles = t(LanguageKeys.Commands.StarWars.VehicleEmbedTitles); - - for (const result of results) { - display - .addPageEmbed((embed) => { - const description = []; - - if (result.model) { - description.push(`**${vehicleTitles.model}**: ${result.model}`); - } - - if (result.vehicleClass) { - description.push(`**${vehicleTitles.vehicleClass}**: ${result.vehicleClass}`); - } - - if (result.crew) { - description.push(`**${vehicleTitles.crew}**: ${formatNumber(t, result.crew)}`); - } - - if (result.passengers) { - description.push(`**${vehicleTitles.amountOfPassengers}**: ${formatNumber(t, result.passengers)}`); - } - - if (result.length) { - description.push(`**${vehicleTitles.length}**: ${formatNumber(t, result.length)}`); - } - - if (result.costInCredits) { - description.push(`**${vehicleTitles.costInCredits}**: ${formatNumber(t, result.costInCredits)}`); - } - - if (result.cargoCapacity) { - description.push(`**${vehicleTitles.cargoCapacity}**: ${formatNumber(t, result.cargoCapacity)}`); - } - - if (result.consumables) { - description.push( - `**${vehicleTitles.consumables}**: ${time( - seconds.fromMilliseconds(Date.now() + result.consumables), - TimestampStyles.RelativeTime - )}` - ); - } - - if (result.maxAtmospheringSpeed) { - description.push(`**${vehicleTitles.maximumAtmospheringSpeed}**: ${formatNumber(t, result.maxAtmospheringSpeed)}`); - } - - if (result.manufacturers?.length) { - description.push( - `**${vehicleTitles.manufacturers}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.manufacturers.map((manufacturer) => toTitleCase(manufacturer)) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n')); - }) - .addPageEmbed((embed) => { - const description = []; - - if (result.films?.length) { - description.push( - '', - `**${vehicleTitles.appearedInFilms}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.films.map((film) => `\`${film.title}\``) - })}` - ); - } - - if (result.pilots.length) { - description.push( - `**${vehicleTitles.pilots}**: ${t(LanguageKeys.Globals.AndListValue, { - value: result.pilots.map((vehicle) => `\`${vehicle.name}\``) - })}` - ); - } - - return embed - .setTitle(result.name) // - .setDescription(description.join('\n\n')); - }); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private async fetchAPI(vehicle: string) { - try { - const { - data: { getFuzzyVehicle } - } = await fetchStarWarsApi<'getFuzzyVehicle'>(getVehicles, { vehicle, take: 10 }); - - return getFuzzyVehicle; - } catch { - this.error(LanguageKeys.Commands.StarWars.VehicleQueryFail, { vehicle }); - } - } -} diff --git a/src/commands/Suggestions/resolve-suggestion.ts b/src/commands/Suggestions/resolve-suggestion.ts deleted file mode 100644 index 3d274cffc52..00000000000 --- a/src/commands/Suggestions/resolve-suggestion.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { GuildSettings, readSettings, SuggestionEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import type { SuggestionData } from '#lib/types/definitions/Suggestion'; -import { PermissionLevels } from '#lib/types/Enums'; -import { resolveOnErrorCodes } from '#utils/common'; -import { isAdmin } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args, CommandOptionsRunTypeEnum, container } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits, RESTJSONErrorCodes } from 'discord-api-types/v9'; -import { MessageEmbed, TextChannel } from 'discord.js'; - -const enum SuggestionsColors { - Accepted = 0x4cb02c, - Considered = 0xcfa08d, - Denied = 0xf90505 -} - -type Actions = 'accept' | 'a' | 'deny' | 'd' | 'consider' | 'c'; -const kActions: readonly Actions[] = ['accept', 'a', 'deny', 'd', 'consider', 'c']; - -const minimum = 1; -const maximum = 2_147_483_647; // Maximum value for int32 - -@ApplyOptions({ - aliases: ['resu'], - description: LanguageKeys.Commands.Suggestions.ResolveSuggestionDescription, - detailedDescription: LanguageKeys.Commands.Suggestions.ResolveSuggestionExtended, - flags: ['show-author', 'showAuthor', 'hide-author', 'hideAuthor'], - permissionLevel: PermissionLevels.Moderator, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const suggestionData = await args.pick(UserCommand.suggestion); - const action = await args.pick(UserCommand.action); - const comment = args.finished ? args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionDefaultComment) : await args.rest('string'); - - const [shouldDM, shouldHideAuthor, shouldRePostSuggestion] = await readSettings(message.guild, [ - GuildSettings.Suggestions.OnAction.DM, - GuildSettings.Suggestions.OnAction.HideAuthor, - GuildSettings.Suggestions.OnAction.RePostMessage - ]); - - const suggestionEmbed = new MessageEmbed(suggestionData.message.embeds[0]); - if (suggestionEmbed.fields.length === 25) { - this.error(LanguageKeys.Commands.Suggestions.ResolveSuggestionTooManyFields); - } - - let responseContent: string; - - const author = await this.getAuthor(message, shouldHideAuthor, args); - - const actions = args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionActions, { author }); - const DMActions = args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionActionsDms, { author, guild: message.guild.name }); - - switch (action) { - case 'a': - case 'accept': - responseContent = DMActions.accept; - suggestionEmbed.setColor(SuggestionsColors.Accepted).addField(actions.accept, comment); - break; - case 'c': - case 'consider': - responseContent = DMActions.consider; - suggestionEmbed.setColor(SuggestionsColors.Considered).addField(actions.consider, comment); - break; - case 'd': - case 'deny': - responseContent = DMActions.deny; - suggestionEmbed.setColor(SuggestionsColors.Denied).addField(actions.deny, comment); - break; - } - - const embedMaximum = 6000; - const embedLength = suggestionEmbed.length; - if (embedLength >= embedMaximum) { - this.error(LanguageKeys.Commands.Suggestions.ResolveSuggestionTooManyCharacters, { maximum: embedMaximum, amount: embedLength }); - } - - if (shouldDM && responseContent !== null) { - try { - await suggestionData.author!.send({ content: responseContent, embeds: [suggestionEmbed] }); - } catch { - const content = args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionDmFail); - await send(message, content); - } - } - - if (shouldRePostSuggestion) { - await send(suggestionData.message, { content: responseContent, embeds: [suggestionEmbed] }); - } else if (suggestionData.message.author.id === process.env.CLIENT_ID) { - await suggestionData.message.edit({ embeds: [suggestionEmbed] }); - } - - const actionText = - action === 'a' || action === 'accept' - ? args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessAcceptedText) - : action === 'd' || action === 'deny' - ? args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessDeniedText) - : args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccessConsideredText); - - const content = args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionSuccess, { id: suggestionData.id, actionText }); - return send(message, content); - } - - private async getAuthor(message: GuildMessage, hideAuthor: boolean, args: SkyraCommand.Args) { - if (args.getFlags('show-author', 'showAuthor')) return message.author.tag; - if (args.getFlags('hide-author', 'hideAuthor') || hideAuthor) { - return (await isAdmin(message.member)) - ? args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorAdmin) - : args.t(LanguageKeys.Commands.Suggestions.ResolveSuggestionAuthorModerator); - } - return message.author.tag; - } - - private static suggestion = Args.make(async (parameter, { args, argument, message }) => { - // Validate the suggestions channel ID - const channelId = await readSettings(message.guild!, GuildSettings.Suggestions.Channel); - if (!channelId) { - return Args.error({ - argument, - parameter, - identifier: LanguageKeys.Commands.Suggestions.SuggestNoSetup, - context: { username: message.author.username } - }); - } - - let suggestionData: SuggestionEntity | undefined; - if (args.t(LanguageKeys.Arguments.CaseLatestOptions).includes(parameter.toLowerCase())) { - // Retrieve latest entry - const { suggestions } = container.db; - suggestionData = await suggestions.findOne({ order: { id: 'DESC' }, where: { guildId: message.guild!.id } }); - } else { - // Validate the suggestion number - const id = Number(parameter); - if (!Number.isInteger(id) || id < minimum || id > maximum) { - return Args.error({ - argument, - parameter, - identifier: LanguageKeys.Commands.Suggestions.ResolveSuggestionInvalidId, - context: { minimum, maximum } - }); - } - - // Retrieve the suggestion data - const { suggestions } = container.db; - suggestionData = await suggestions.findOne({ id, guildId: message.guild!.id }); - } - - if (!suggestionData) { - return Args.error({ argument, parameter, identifier: 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(); - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Suggestions.ResolveSuggestionMessageNotFound }); - } - - const suggestionAuthor = await message.client.users.fetch(suggestionData.authorId).catch(() => null); - return Args.ok({ message: suggestionMessage, author: suggestionAuthor, id: suggestionData.id }); - }); - - private static action = Args.make(async (parameter, { argument }) => { - const lowerCase = parameter.toLowerCase() as Actions; - if (kActions.includes(lowerCase)) return Args.ok(lowerCase); - return Args.error({ argument, parameter, identifier: LanguageKeys.Commands.Suggestions.ResolveSuggestionInvalidAction }); - }); -} diff --git a/src/commands/System/Admin/disable.ts b/src/commands/System/Admin/disable.ts deleted file mode 100644 index eff86b32b74..00000000000 --- a/src/commands/System/Admin/disable.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { codeBlock } from '@sapphire/utilities'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.System.DisableDescription, - detailedDescription: LanguageKeys.Commands.System.DisableExtended, - permissionLevel: PermissionLevels.BotOwner -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const piece = await args.pick('piece'); - - if (piece.store.name === 'event' && piece.name === 'CoreMessage') { - this.error(LanguageKeys.Commands.System.DisableWarn); - } - - piece.enabled = false; - - const content = codeBlock('diff', args.t(LanguageKeys.Commands.System.Disable, { type: piece.store.name, name: piece.name })); - return send(message, content); - } -} diff --git a/src/commands/System/Admin/enable.ts b/src/commands/System/Admin/enable.ts deleted file mode 100644 index 7a354186225..00000000000 --- a/src/commands/System/Admin/enable.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { codeBlock } from '@sapphire/utilities'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.System.EnableDescription, - detailedDescription: LanguageKeys.Commands.System.EnableExtended, - permissionLevel: PermissionLevels.BotOwner -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const piece = await args.pick('piece'); - piece.enabled = true; - - const content = codeBlock('diff', args.t(LanguageKeys.Commands.System.Enable, { type: piece.store.name, name: piece.name })); - return send(message, content); - } -} diff --git a/src/commands/System/Admin/reboot.ts b/src/commands/System/Admin/reboot.ts deleted file mode 100644 index 4e03dd50b74..00000000000 --- a/src/commands/System/Admin/reboot.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { Events, PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { envParseBoolean } from '@skyra/env-utilities'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.System.RebootDescription, - detailedDescription: LanguageKeys.Commands.System.RebootExtended, - permissionLevel: PermissionLevels.BotOwner -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const content = args.t(LanguageKeys.Commands.System.Reboot); - await send(message, content).catch((error) => this.container.logger.fatal(error)); - - if (envParseBoolean('INFLUX_ENABLED')) { - const { client } = this.container; - try { - client.emit( - Events.AnalyticsSync, - client.guilds.cache.size, - client.guilds.cache.reduce((acc, val) => acc + val.memberCount, 0) - ); - - await client.analytics!.writeApi.flush(); - await client.analytics!.writeApi.close(); - } catch { - // noop - } - } - - process.exit(0); - } -} diff --git a/src/commands/System/donate.ts b/src/commands/System/donate.ts deleted file mode 100644 index 809150fd672..00000000000 --- a/src/commands/System/donate.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { isGuildMessage } from '#utils/common'; -import { sendTemporaryMessage } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fromAsync } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.System.DonateDescription, - detailedDescription: LanguageKeys.Commands.System.DonateExtended, - guarded: true -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const content = args.t(this.detailedDescription).extendedHelp!; - - if (isGuildMessage(message)) { - const { success } = await fromAsync(message.author.send(content)); - const responseContent = args.t(success ? LanguageKeys.Commands.System.DmSent : LanguageKeys.Commands.System.DmNotSent); - await sendTemporaryMessage(message, responseContent); - } else { - await send(message, content); - } - } -} diff --git a/src/commands/System/support.ts b/src/commands/System/support.ts deleted file mode 100644 index fec9b3770ae..00000000000 --- a/src/commands/System/support.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - aliases: ['support-server', 'server'], - description: LanguageKeys.Commands.System.SupportDescription, - detailedDescription: LanguageKeys.Commands.System.SupportExtended, - guarded: true, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const embed = new MessageEmbed() - .setTitle(args.t(LanguageKeys.Commands.System.SupportEmbedTitle, { username: message.author.username })) - .setDescription(args.t(LanguageKeys.Commands.System.SupportEmbedDescription)) - .setColor(await this.container.db.fetchColor(message)); - return send(message, { embeds: [embed] }); - } -} diff --git a/src/commands/Tags/tag.ts b/src/commands/Tags/tag.ts deleted file mode 100644 index e37feb995ad..00000000000 --- a/src/commands/Tags/tag.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { getFromId, InvalidTypeError, parseAndValidate, parseParameter } from '#lib/customCommands'; -import { CustomCommand, GuildSettings, readSettings, writeSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { parse as parseColour } from '#utils/Color'; -import { RequiresLevel } from '#utils/decorators'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { chunk, codeBlock, cutText } from '@sapphire/utilities'; -import { Identifiers, ParserUnexpectedTokenError, PartType, UserError } from '@skyra/tags'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed, MessageOptions } from 'discord.js'; - -@ApplyOptions({ - aliases: ['tags', 'custom-command', 'copy-pasta'], - description: LanguageKeys.Commands.Tags.TagDescription, - detailedDescription: LanguageKeys.Commands.Tags.TagExtended, - flags: ['embed'], - options: ['color', 'colour'], - requiredClientPermissions: [PermissionFlagsBits.ManageMessages], - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'alias', 'remove', 'edit', 'rename', 'source', 'list', 'reset', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - // Based on HEX regex from #utils/Color - #kHexLessRegex = /^([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/i; - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const id = (await args.pick('string')).toLowerCase(); - const commandContent = await args.rest('string'); - - await writeSettings(message.guild, (settings) => { - const tags = settings[GuildSettings.CustomCommands]; - if (tags.some((command) => command.id === id)) this.error(LanguageKeys.Commands.Tags.TagExists, { tag: id }); - - tags.push(this.createTag(args, id, commandContent)); - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagAdded, { name: id, content: cutText(commandContent, 500) }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const id = (await args.pick('string')).toLowerCase(); - - await writeSettings(message.guild, (settings) => { - const tags = settings[GuildSettings.CustomCommands]; - const tagIndex = tags.findIndex((command) => command.id === id); - if (tagIndex === -1) this.error(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); - - settings[GuildSettings.CustomCommands].splice(tagIndex, 1); - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagRemoved, { name: id }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async alias(message: GuildMessage, args: SkyraCommand.Args) { - const input = (await args.pick('string')).toLowerCase(); - let output = (await args.pick('string')).toLowerCase(); - - await writeSettings(message.guild, (settings) => { - const tags = settings[GuildSettings.CustomCommands]; - - // Get destination tag: - const destinationTag = getFromId(output, tags); - if (destinationTag === null) this.error(LanguageKeys.Commands.Tags.TagNotExists, { tag: output }); - - output = destinationTag.id; - - // Get source tag, if any exists: - const sourceTag = getFromId(input, tags); - if (sourceTag === null) { - destinationTag.aliases.push(input); - return; - } - - // If the input is a tag source, it cannot be aliased: - if (sourceTag.id === input) { - this.error(LanguageKeys.Commands.Tags.TagCannotAlias, { tag: sourceTag.id }); - } - - // Remove previous alias: - const index = sourceTag.aliases.indexOf(input); - if (index !== -1) sourceTag.aliases.splice(index, 1); - - // Add new alias: - destinationTag.aliases.push(input); - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagAlias, { input, output }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async rename(message: GuildMessage, args: SkyraCommand.Args) { - const previous = (await args.pick('string')).toLowerCase(); - const next = (await args.pick('string')).toLowerCase(); - - await writeSettings(message.guild, (settings) => { - const tags = settings[GuildSettings.CustomCommands]; - - // Get previous tag: - const tag = tags.find((tag) => tag.id === previous); - if (tag === undefined) this.error(LanguageKeys.Commands.Tags.TagNotExists, { tag: previous }); - - // Check if a tag with the name exists: - if (getFromId(next, tags) !== null) this.error(LanguageKeys.Commands.Tags.TagExists, { tag: next }); - - // Rename tag: - tag.id = next; - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagRenamed, { name: next, previous }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - await writeSettings(message.guild, (settings) => { - settings[GuildSettings.CustomCommands].length = 0; - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagReset); - return send(message, content); - } - - @RequiresLevel(PermissionLevels.Moderator, LanguageKeys.Commands.Tags.TagPermissionLevel) - public async edit(message: GuildMessage, args: SkyraCommand.Args) { - const id = (await args.pick('string')).toLowerCase(); - const commandContent = await args.rest('string'); - - await writeSettings(message.guild, (settings) => { - const tags = settings[GuildSettings.CustomCommands]; - const tagIndex = tags.findIndex((command) => command.id === id); - if (tagIndex === -1) this.error(LanguageKeys.Commands.Tags.TagNotExists, { tag: id }); - - tags[tagIndex] = this.createTag(args, id, commandContent, tags[tagIndex].aliases); - }); - - const content = args.t(LanguageKeys.Commands.Tags.TagEdited, { name: id, content: cutText(commandContent, 500) }); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async list(message: GuildMessage, args: SkyraCommand.Args) { - // Get tags, prefix, and language - const [tags, prefix] = await readSettings(message.guild, [GuildSettings.CustomCommands, GuildSettings.Prefix]); - if (!tags.length) this.error(LanguageKeys.Commands.Tags.TagListEmpty); - - const response = await sendLoadingMessage(message, args.t); - - // Get prefix and display all tags - const display = new SkyraPaginatedMessage({ template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) }); - - // Add all pages, containing 30 tags each - for (const page of chunk(tags, 30)) { - const description = `\`${page.map((command) => `${prefix}${command.id}`).join('`, `')}\``; - display.addPageEmbed((embed) => embed.setDescription(description)); - } - - // Run the display - await display.run(response, message.author); - return response; - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const id = (await args.pick('string')).toLowerCase(); - const tags = await readSettings(message.guild, GuildSettings.CustomCommands); - const tag = getFromId(id, tags); - if (tag === null) return null; - - return send(message, await this.getShowOptions(args, tag)); - } - - public async source(message: GuildMessage, args: SkyraCommand.Args) { - const id = (await args.pick('string')).toLowerCase(); - const tags = await readSettings(message.guild, GuildSettings.CustomCommands); - const tag = getFromId(id, tags); - if (tag === null) return null; - - const content = codeBlock('md', tag.content.toString()); - return send(message, { content, allowedMentions: { users: [], roles: [] } }); - } - - private createTag(args: SkyraCommand.Args, id: string, content: string, aliases: string[] = []): CustomCommand { - // Create the tag data: - const embed = args.getFlags('embed'); - return { - id, - content: this.parseContent(args, content), - embed, - aliases, - color: embed ? this.parseColour(args) : 0 - }; - } - - private parseContent(args: SkyraCommand.Args, content: string) { - try { - return parseAndValidate(content); - } catch (error) { - if (!(error instanceof UserError)) throw error; - - switch (error.identifier) { - case Identifiers.MismatchingNamedArgumentTypeValidation: - this.error(LanguageKeys.Commands.Tags.ParseMismatchingNamedArgumentTypeValidation, error); - case Identifiers.ParserEmptyStringTag: - this.error(LanguageKeys.Commands.Tags.ParseParserEmptyStringTag, error); - case Identifiers.ParserMissingToken: - this.error(LanguageKeys.Commands.Tags.ParseParserMissingToken, error); - case Identifiers.ParserPickMissingOptions: - this.error(LanguageKeys.Commands.Tags.ParseParserPickMissingOptions, error); - case Identifiers.ParserRandomDuplicatedOptions: - this.error(LanguageKeys.Commands.Tags.ParseParserRandomDuplicatedOptions, error); - case Identifiers.ParserRandomMissingOptions: - this.error(LanguageKeys.Commands.Tags.ParseParserRandomMissingOptions, error); - case Identifiers.ParserUnexpectedToken: { - const typedError = error as ParserUnexpectedTokenError; - this.error(LanguageKeys.Commands.Tags.ParseParserUnexpectedToken, { - expected: this.parseContentGetPartTypeName(args, typedError.expected), - received: this.parseContentGetPartTypeName(args, typedError.received) - }); - } - case Identifiers.PickInvalidOption: - this.error(LanguageKeys.Commands.Tags.ParsePickInvalidOption, error); - case Identifiers.SentenceMissingArgument: - this.error(LanguageKeys.Commands.Tags.ParseSentenceMissingArgument, error); - case Identifiers.TransformerInvalidFormatter: - this.error(LanguageKeys.Commands.Tags.ParseTransformerInvalidFormatter, error); - } - } - } - - private parseContentGetPartTypeName(args: SkyraCommand.Args, type: PartType | readonly PartType[]): string { - if (Array.isArray(type)) { - return args.t(LanguageKeys.Globals.OrListValue, { value: type.map((v) => this.inlineCode(this.parseContentGetPartTypeName(args, v))) }); - } - - switch (type as PartType) { - case PartType.Space: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenSpace)); - case PartType.TagStart: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenTagStart)); - case PartType.TagEnd: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenTagEnd)); - case PartType.Equals: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenEquals)); - case PartType.Colon: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenColon)); - case PartType.Pipe: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenPipe)); - case PartType.Literal: - return this.inlineCode(args.t(LanguageKeys.Commands.Tags.ParseTokenLiteral)); - } - } - - private inlineCode(content: string) { - return `\`${content}\``; - } - - private parseColour(args: SkyraCommand.Args) { - let color = args.getOption('color', 'colour'); - - if (color === null) return 0; - - const number = Number(color); - if (Number.isSafeInteger(number)) return Math.max(Math.min(number, 0xffffff), 0x000000); - if (this.#kHexLessRegex.test(color)) color = `#${color}`; - - return parseColour(color)?.b10.value ?? 0; - } - - private async getShowOptions(args: SkyraCommand.Args, tag: CustomCommand): Promise { - const allowedMentions = new Set(); - const iterator = tag.content.run(); - let result = iterator.next(); - while (!result.done) result = iterator.next(await parseParameter(args, result.value.type as InvalidTypeError.Type, allowedMentions)); - - const content = result.value.trim(); - if (tag.embed) { - const embed = new MessageEmbed().setDescription(content).setColor(tag.color); - return { embeds: [embed] }; - } - - return { content, allowedMentions: { users: [...allowedMentions], roles: [] } }; - } -} diff --git a/src/commands/Tools/Dictionary/define.ts b/src/commands/Tools/Dictionary/define.ts deleted file mode 100644 index 24cfc4fe734..00000000000 --- a/src/commands/Tools/Dictionary/define.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { IMAGE_EXTENSION, sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText, parseURL, toTitleCase } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - enabled: envIsDefined('OWLBOT_TOKEN'), - aliases: ['def', 'definition', 'defination', 'dictionary'], - description: LanguageKeys.Commands.Tools.DefineDescription, - detailedDescription: LanguageKeys.Commands.Tools.DefineExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const input = await args.rest('string'); - const response = await sendLoadingMessage(message, args.t); - - const result = await this.fetchApi(input); - const display = await this.buildDisplay(result, message, args.t); - - await display.run(response, message.author); - return response; - } - - private async buildDisplay(results: OwlbotResultOk, message: Message, t: TFunction) { - const template = new MessageEmbed() - .setTitle(toTitleCase(results.word)) - .setColor(await this.container.db.fetchColor(message)) - .setFooter({ text: 'Powered by Owlbot' }); - - if (results.pronunciation) template.addField(t(LanguageKeys.Commands.Tools.DefinePronunciation), results.pronunciation, true); - - const display = new SkyraPaginatedMessage({ template }); - - for (const result of results.definitions) { - const definition = this.content(result.definition); - display.addPageEmbed((embed) => { - embed - .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 ?? ''); - if (imageUrl) embed.setThumbnail(imageUrl.toString()); - - return embed; - }); - } - - return display; - } - - private async fetchApi(word: string) { - try { - return await fetch( - `https://owlbot.info/api/v4/dictionary/${encodeURIComponent(word.toLowerCase())}`, - { headers: { Accept: MimeTypes.ApplicationJson, Authorization: `Token ${process.env.OWLBOT_TOKEN}` } }, - FetchResultTypes.JSON - ); - } catch { - this.error(LanguageKeys.Commands.Tools.DefineNotFound); - } - } - - private content(definition: string) { - if (definition.length < 2048) return definition; - return cutText(definition, 2048); - } -} - -export interface OwlbotResultOk { - definitions: readonly OwlbotDefinition[]; - word: string; - pronunciation: string | null; -} - -export interface OwlbotDefinition { - type: string | null; - definition: string; - example: string | null; - image_url: string | null; - emoji: string | null; -} diff --git a/src/commands/Tools/Dictionary/urban.ts b/src/commands/Tools/Dictionary/urban.ts deleted file mode 100644 index b2e4101de85..00000000000 --- a/src/commands/Tools/Dictionary/urban.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { cutText, toTitleCase } from '@sapphire/utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - aliases: ['ud', 'urbandictionary'], - description: LanguageKeys.Commands.Tools.UrbanDescription, - detailedDescription: LanguageKeys.Commands.Tools.UrbanExtended, - nsfw: true -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const query = await args.rest('string'); - const response = await sendLoadingMessage(message, args.t); - - const result = await fetch( - `https://api.urbandictionary.com/v0/define?term=${encodeURIComponent(query)}`, - FetchResultTypes.JSON - ); - if (result.list.length === 0) this.error(LanguageKeys.Commands.Tools.UrbanNoDefinition, { parameter: query }); - 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, args.t, query); - - await display.run(response, message.author); - return response; - } - - private async buildDisplay(results: UrbanDictionaryResultOkEntry[], message: Message, language: TFunction, query: string) { - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() - .setTitle(`Urban Dictionary: ${toTitleCase(query)}`) - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail('https://i.imgur.com/CcIZZsa.png') - .setFooter({ text: '© Urban Dictionary' }) - }); - - for (const result of results) { - const definition = this.parseDefinition(result.definition, result.permalink, language); - const example = result.example ? this.parseDefinition(result.example, result.permalink, language) : 'None'; - display.addPageEmbed((embed: MessageEmbed) => - embed - .setURL(result.permalink) - .setDescription(definition) - .addField('Example', example) - .addField('Author', result.author || 'UrbanDictionary User') - .addField('👍', `${result.thumbs_up}`, true) - .addField('👎', `${result.thumbs_down}`, true) - ); - } - - return display; - } - - private parseDefinition(definition: string, permalink: string, i18n: TFunction) { - if (definition.length < 750) return definition; - return i18n(LanguageKeys.Misc.SystemTextTruncated, { definition: cutText(definition, 750), url: permalink }); - } -} - -export interface UrbanDictionaryResultOk { - list: UrbanDictionaryResultOkEntry[]; -} - -export interface UrbanDictionaryResultOkEntry { - definition: string; - permalink: string; - thumbs_up: number; - sound_urls: unknown[]; - author: string; - word: string; - defid: number; - current_vote: string; - written_on: Date; - example: string; - thumbs_down: number; -} diff --git a/src/commands/Tools/Websearch/country.ts b/src/commands/Tools/Websearch/country.ts deleted file mode 100644 index 1ce564272d1..00000000000 --- a/src/commands/Tools/Websearch/country.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch } from '@sapphire/fetch'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -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: LanguageKeys.Commands.Tools.CountryDescription, - detailedDescription: LanguageKeys.Commands.Tools.CountryExtended, - enabled: false -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const countryName = await args.rest('string'); - const response = await sendLoadingMessage(message, args.t); - - const countries = await this.fetchAPI(countryName); - if (countries.length === 0) this.error(LanguageKeys.System.QueryFail); - - const display = await this.buildDisplay(message, args.t, countries); - await display.run(response, message.author); - return response; - } - - private async fetchAPI(countryName: string) { - try { - return await fetch(`https://restcountries.eu/rest/v2/name/${encodeURIComponent(countryName)}`); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, countries: CountryResultOk) { - const titles = t(LanguageKeys.Commands.Tools.CountryTitles); - const fieldsData = t(LanguageKeys.Commands.Tools.CountryFields); - const display = new SkyraPaginatedMessage({ template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) }); - - for (const country of countries) { - display.addPageEmbed((embed) => - embed - .setTitle(mapNativeName(country)) - .setThumbnail(`https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/${country.alpha2Code.toLowerCase()}.png`) - .setFooter({ - text: ` - ${t(LanguageKeys.Commands.Tools.CountryTimezone, { timezone: country.timezones, count: country.timezones.length })}` - }) - .addField( - titles.OVERVIEW, - [ - `${fieldsData.overview.officialName}: ${country.altSpellings[2] ?? country.name}`, - `${fieldsData.overview.capital}: ${country.capital}`, - `${fieldsData.overview.population}: ${formatNumber(t, country.population)}` - ].join('\n') - ) - .addField(titles.LANGUAGES, country.languages.map(mapNativeName).join('\n')) - .addField( - titles.OTHER, - [ - `${fieldsData.other.demonym}: ${country.demonym}`, - country.area ? `${fieldsData.other.area}: ${formatNumber(t, country.area)} km${SuperScriptTwo}` : null, - `${fieldsData.other.currencies}: ${t(LanguageKeys.Globals.AndListValue, { value: country.currencies.map(mapCurrency) })}` - ] - .filter(Boolean) - .join('\n') - ) - ); - } - - return display; - } -} - -export type CountryResultOk = CountryData[]; - -export interface CountryData { - name: string; - altSpellings: string[]; - alpha2Code: string; - capital: string; - nativeName: string; - demonym: string; - timezones: string[]; - population: number; - area: number | null; - languages: CountryLanguage[]; - currencies: CurrencyData[]; -} - -export interface CountryLanguage { - name: string; - nativeName: string; -} - -export interface CurrencyData { - code: string; - name: string; - symbol: string; -} diff --git a/src/commands/Tools/Websearch/eshop.ts b/src/commands/Tools/Websearch/eshop.ts deleted file mode 100644 index 26c9cfba81b..00000000000 --- a/src/commands/Tools/Websearch/eshop.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText, toTitleCase } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import { decode } from 'he'; -import type { TFunction } from 'i18next'; -import { stringify } from 'node:querystring'; - -const API_URL = `https://${process.env.NINTENDO_ID}-dsn.algolia.net/1/indexes/ncom_game_en_us/query`; - -@ApplyOptions({ - enabled: envIsDefined('NINTENDO_ID', 'NINTENDO_TOKEN'), - description: LanguageKeys.Commands.Tools.EshopDescription, - detailedDescription: LanguageKeys.Commands.Tools.EshopExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const gameName = await args.rest('string'); - - const response = await sendLoadingMessage(message, args.t); - - const { hits } = await this.fetchAPI(gameName); - if (!hits.length) this.error(LanguageKeys.System.QueryFail); - - const display = await this.buildDisplay(message, args.t, hits); - await display.run(response, message.author); - return response; - } - - private async fetchAPI(gameName: string) { - try { - return fetch( - API_URL, - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson, - 'X-Algolia-API-Key': process.env.NINTENDO_TOKEN, - 'X-Algolia-Application-Id': process.env.NINTENDO_ID - }, - body: JSON.stringify({ - params: stringify({ - hitsPerPage: 10, - page: 0, - query: gameName - }) - }) - }, - FetchResultTypes.JSON - ); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, entries: EShopHit[]) { - const titles = t(LanguageKeys.Commands.Tools.EshopTitles); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ label: entries[pageIndex - 1].title })); - - for (const game of entries) { - const description = cutText(decode(game.description).replace(/\s\n {2,}/g, ' '), 750); - const price = game.msrp - ? game.msrp > 0 - ? t(LanguageKeys.Commands.Tools.EshopPricePaid, { price: game.msrp }) - : t(LanguageKeys.Commands.Tools.EshopPriceFree) - : 'TBD'; - const esrbText = game.esrbRating - ? [`**${game.esrbRating}**`, game.esrbDescriptors && game.esrbDescriptors.length ? ` - ${game.esrbDescriptors.join(', ')}` : ''].join( - '' - ) - : t(LanguageKeys.Commands.Tools.EshopNotInDatabase); - - display.addPageEmbed((embed) => { - const releaseDate = new Date(game.releaseDateDisplay); - return embed - .setTitle(game.title) - .setURL(`https://nintendo.com${game.url}`) - .setThumbnail(game.boxart ?? game.horizontalHeaderImage ?? '') - .setDescription(description) - .addField(titles.price, price, true) - .addField(titles.availability, game.availability[0], true) - .addField(titles.releaseDate, releaseDate ? time(releaseDate, TimestampStyles.ShortDate) : game.releaseDateDisplay, true) - .addField(titles.numberOfPlayers, toTitleCase(game.numOfPlayers ?? t(LanguageKeys.Globals.Unknown)), true) - .addField(titles.platform, game.platform, true) - .addField(titles.nsuid, game.nsuid || 'TBD', true) - .addField(titles.esrb, esrbText) - .addField(titles.genres, game.genres.join(', ') || titles.noGenres); - }); - } - - return display; - } -} - -interface EShopHit { - availability: string[]; - boxart?: string; - description: string; - developers: string[]; - esrbDescriptors: string[]; - esrbRating: string; - featured: boolean; - franchises: string; - freeToStart: boolean; - generalFilters: string[]; - genres: string[]; - horizontalHeaderImage?: string; - howToShop: string[]; - lastModified: number; - lowestPrice: number; - msrp: number; - nsuid: string; - numOfPlayers?: string; - objectID: string; - platform: string; - playerFilters: string[]; - priceRange: string; - publishers: string[]; - releaseDateDisplay: string; - salePrice: number | null; - slug: string; - title: string; - url: string; -} - -interface EshopResult { - hits: EShopHit[]; - nbHits: number; - page: number; - nbPages: number; - hitsPerPage: number; - exhaustiveNbHits: true; - query: string; - params: string; - processingTimeMS: number; -} diff --git a/src/commands/Tools/Websearch/horoscope.ts b/src/commands/Tools/Websearch/horoscope.ts deleted file mode 100644 index 635d5d86cd1..00000000000 --- a/src/commands/Tools/Websearch/horoscope.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { fetchSaelem, getHoroscope } from '#utils/APIs/Saelem'; -import { Emojis } from '#utils/constants'; -import { createPick } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Args } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { envParseBoolean } from '@skyra/env-utilities'; -import { Days, Sunsigns } from '@skyra/saelem'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -const kSunSigns = ['capricorn', 'aquarius', 'pisces', 'aries', 'taurus', 'gemini', 'cancer', 'leo', 'virgo', 'libra', 'scorpio', 'sagittarius']; -const kRandomSunSign = createPick(kSunSigns); -const kDays = ['yesterday', 'tomorrow', 'today']; - -@ApplyOptions({ - enabled: envParseBoolean('SAELEM_ENABLED'), - aliases: ['saelem'], - description: LanguageKeys.Commands.Tools.HoroscopeDescription, - detailedDescription: LanguageKeys.Commands.Tools.HoroscopeExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const sign = await args.pick(UserCommand.sunsign); - const day = args.finished ? Days.Today : await args.pick(UserCommand.day); - - const { t } = args; - const { date, intensity, keywords, mood, prediction, rating } = await this.fetchAPI(sign, day); - - const titles = t(LanguageKeys.Commands.Tools.HoroscopeTitles, { - sign, - intensity, - keywords, - mood, - rating: `${Emojis.Star.repeat(rating)}${Emojis.StarEmpty.repeat(5 - rating)}` - }); - - const embed = new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setDescription(prediction) - .setTitle(titles.dailyHoroscope) - .setTimestamp(new Date(date)) - .addField(titles.metadataTitle, titles.metadata.join('\n')); - return send(message, { embeds: [embed] }); - } - - private async fetchAPI(sunsign: Sunsigns, day: Days) { - try { - const { data } = await fetchSaelem<'getHoroscope'>(getHoroscope, { sunsign, day }); - return data.getHoroscope; - } catch { - this.error(LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, { parameter: sunsign, maybe: kRandomSunSign() }); - } - } - - private static sunsign = Args.make((parameter, { argument }) => { - const lowerCasedArgument = parameter.toLowerCase(); - if (kSunSigns.includes(lowerCasedArgument)) return Args.ok(lowerCasedArgument as Sunsigns); - return Args.error({ - parameter, - argument, - identifier: LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, - context: { maybe: kRandomSunSign() } - }); - }); - - private static day = Args.make((parameter, { argument }) => { - const lowerCasedArgument = parameter.toLowerCase(); - if (kDays.includes(lowerCasedArgument)) return Args.ok(lowerCasedArgument as Days); - return Args.error({ - parameter, - argument, - identifier: LanguageKeys.Commands.Tools.HoroscopeInvalidSunsign, - context: { maybe: kRandomSunSign() } - }); - }); -} diff --git a/src/commands/Tools/Websearch/igdb.ts b/src/commands/Tools/Websearch/igdb.ts deleted file mode 100644 index 8fbff4e75b9..00000000000 --- a/src/commands/Tools/Websearch/igdb.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { AgeRatingRatingEnum, Company, Game } from '#lib/types/definitions/Igdb'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText, isNumber, roundNumber } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -const API_URL = 'https://api.igdb.com/v4/games'; - -function isArrayOfNumbers(array: unknown[]): array is number[] { - return array.every((val) => isNumber(val)); -} - -function isIgdbCompany(company: unknown): company is Company { - return (company as Company).id !== undefined; -} - -@ApplyOptions({ - enabled: envIsDefined('TWITCH_CLIENT_ID'), - description: LanguageKeys.Commands.Tools.IgdbDescription, - detailedDescription: LanguageKeys.Commands.Tools.IgdbExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - private readonly urlRegex = /https?:/i; - private readonly igdbRequestHeaders = { - 'Content-Type': MimeTypes.TextPlain, - Accept: MimeTypes.ApplicationJson, - 'Client-ID': process.env.TWITCH_CLIENT_ID - }; - - private readonly commonQuery = [ - `fields ${[ - 'name', - 'url', - 'summary', - 'rating', - 'involved_companies.developer', - 'involved_companies.company.name', - 'genres.name', - 'release_dates.date', - 'platforms.name', - 'cover.url', - 'age_ratings.rating', - 'age_ratings.category' - ].join(',')}`, - 'limit 10', - 'offset 0' - ].join('; '); - - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const game = await args.rest('string'); - - const response = await sendLoadingMessage(message, args.t); - const entries = await this.fetchAPI(game); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(message, args.t, entries); - await display.run(response, message.author); - return response; - } - - private async fetchAPI(game: string) { - try { - return await fetch( - API_URL, - { - method: FetchMethods.Post, - headers: { - ...this.igdbRequestHeaders, - Authorization: `Bearer ${await this.container.client.twitch.fetchBearer()}` - }, - body: `search: "${game}"; ${this.commonQuery};` - }, - FetchResultTypes.JSON - ); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, entries: Game[]) { - const titles = t(LanguageKeys.Commands.Tools.IgdbTitles); - const fieldsData = t(LanguageKeys.Commands.Tools.IgdbData); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ - label: entries[pageIndex - 1].name ?? `${t(LanguageKeys.Globals.PaginatedMessagePage)} ${pageIndex}` - })); - - for (const game of entries) { - const coverImg = this.resolveCover(game.cover); - const userRating = game.rating ? `${roundNumber(game.rating, 2)}%` : fieldsData.noRating; - - display.addPageEmbed((embed) => - embed - .setTitle(game.name ?? '') - .setURL(game.url || '') - .setThumbnail(coverImg) - .setDescription( - [ - this.resolveSummary(game.summary, fieldsData.noSummary), - '', - `**${titles.userScore}**: ${userRating}`, - `**${titles.ageRating}**: ${this.resolveAgeRating(game.age_ratings, fieldsData.noAgeRatings)}`, - `**${titles.releaseDate}**: ${this.resolveReleaseDate(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)}` - ].join('\n') - ) - ); - } - - return display; - } - - private resolveCover(cover: Game['cover']) { - if (!cover || isNumber(cover) || !cover.url) return ''; - - return this.urlRegex.test(cover.url) ? cover.url : `https:${cover.url}`; - } - - private resolveSummary(summary: Game['summary'], fallback: string) { - if (!summary) return fallback; - return cutText(summary, 750); - } - - private resolveAgeRating(ageRatings: Game['age_ratings'], fallback: string) { - if (!ageRatings || isArrayOfNumbers(ageRatings)) return fallback; - return ageRatings.map((ageRating) => `${ageRating.category === 1 ? 'ESRB' : 'PEGI'}: ${AgeRatingRatingEnum[ageRating.rating ?? 0]}`); - } - - private resolveGenres(genres: Game['genres'], fallback: string) { - if (!genres || isArrayOfNumbers(genres)) return fallback; - return genres.map((genre) => genre.name).join(', '); - } - - private resolveDevelopers(developers: Game['involved_companies'], fallback: string) { - if (!developers || isArrayOfNumbers(developers)) return fallback; - return developers - .map((involvedCompany) => { - if (isIgdbCompany(involvedCompany.company)) { - return involvedCompany.company.name; - } - - return null; - }) - .filter(Boolean) - .join(', '); - } - - private resolveReleaseDate(releaseDates: Game['release_dates'], fallback: string) { - if (!releaseDates || releaseDates.length === 0 || isArrayOfNumbers(releaseDates) || !releaseDates[0].date) return fallback; - return time(releaseDates[0].date, TimestampStyles.ShortDate); - } - - private resolvePlatforms(platforms: Game['platforms'], fallback: string) { - if (!platforms || isArrayOfNumbers(platforms)) return fallback; - return platforms.map((platform) => platform.name).join(', '); - } -} diff --git a/src/commands/Tools/Websearch/itunes.ts b/src/commands/Tools/Websearch/itunes.ts deleted file mode 100644 index 945b1a26e46..00000000000 --- a/src/commands/Tools/Websearch/itunes.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { URL } from 'node:url'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Tools.ITunesDescription, - detailedDescription: LanguageKeys.Commands.Tools.ITunesExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const song = await args.rest('string'); - - const response = await sendLoadingMessage(message, args.t); - const { results: entries } = await this.fetchAPI(args.t, song); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(message, args.t, entries); - await display.run(response, message.author); - return response; - } - - 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', 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 { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, entries: ItunesData[]) { - const titles = t(LanguageKeys.Commands.Tools.ITunesTitles); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ - label: entries[pageIndex - 1].trackName - })); - - for (const song of entries) { - display.addPageEmbed((embed) => - embed - .setThumbnail(song.artworkUrl100) - .setTitle(song.trackName) - .setURL(song.trackViewUrl) - .addField(titles.artist, `[${song.artistName}](${song.artistViewUrl})`, true) - .addField(titles.collection, `[${song.collectionName}](${song.collectionViewUrl})`, true) - .addField(titles.collectionPrice, `$${song.collectionPrice}`, true) - .addField(titles.trackPrice, `$${song.trackPrice}`, true) - .addField(titles.trackReleaseDate, time(new Date(song.releaseDate), TimestampStyles.ShortDate), true) - .addField(titles.numberOfTracksInCollection, formatNumber(t, song.trackCount), true) - .addField(titles.primaryGenre, song.primaryGenreName, true) - .addField(titles.preview, `[${titles.previewLabel}](${song.previewUrl})`, true) - ); - } - - return display; - } -} - -interface ItunesData { - artistId: number; - artistName: string; - artistViewUrl: string; - artworkUrl100: string; - artworkUrl30: string; - artworkUrl60: string; - collectionCensoredName: string; - collectionExplicitness: 'explicit' | string; - collectionId: number; - collectionName: string; - collectionPrice: number; - collectionViewUrl: string; - country: string; - currency: string; - discCount: number; - discNumber: number; - isStreamable: boolean; - kind: 'song' | string; - previewUrl: string; - primaryGenreName: string; - releaseDate: string; - trackCensoredName: string; - trackCount: number; - trackExplicitness: 'notExplicit' | string; - trackId: number; - trackName: string; - trackNumber: number; - trackPrice: number; - trackTimeMillis: number; - trackViewUrl: string; - wrapperType: 'track' | string; -} - -interface AppleItunesResult { - results: ItunesData[]; - resultCount: number; -} diff --git a/src/commands/Tools/Websearch/movies.ts b/src/commands/Tools/Websearch/movies.ts deleted file mode 100644 index c20572b77eb..00000000000 --- a/src/commands/Tools/Websearch/movies.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { Tmdb } from '#lib/types/definitions/Tmdb'; -import { minutes } from '#utils/common'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { cutText } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { URL } from 'node:url'; - -@ApplyOptions({ - enabled: envIsDefined('THEMOVIEDATABASE_TOKEN'), - aliases: ['movie', 'tmdb'], - description: LanguageKeys.Commands.Tools.MoviesDescription, - detailedDescription: LanguageKeys.Commands.Tools.MoviesExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const [movie, year = null] = (await args.rest('string')).split('y:'); - - const response = await sendLoadingMessage(message, args.t); - const { results: entries } = await this.fetchAPI(movie.trim(), year); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(message, args.t, entries); - await display.run(response, message.author); - return response; - } - - private async fetchAPI(movie: string, year: string | null) { - try { - const url = new URL('https://api.themoviedb.org/3/search/movie'); - url.searchParams.append('api_key', process.env.THEMOVIEDATABASE_TOKEN); - url.searchParams.append('query', movie); - if (year !== null) url.searchParams.append('year', year.trim()); - - return await fetch(url, FetchResultTypes.JSON); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async fetchMovieData(movieId: number) { - try { - const url = new URL(`https://api.themoviedb.org/3/movie/${movieId}`); - url.searchParams.append('api_key', process.env.THEMOVIEDATABASE_TOKEN); - - return await fetch(url, FetchResultTypes.JSON); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, movies: Tmdb.TmdbMovieList['results']) { - const titles = t(LanguageKeys.Commands.Tools.MoviesTitles); - const fieldsData = t(LanguageKeys.Commands.Tools.MoviesData); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ - label: movieData[pageIndex - 1].title - })); - - const movieData = await Promise.all(movies.map((movie) => this.fetchMovieData(movie.id))); - - for (const movie of movieData) { - display.addPageEmbed((embed) => { - const runTime = movie.runtime - ? t(LanguageKeys.Globals.DurationValue, { value: minutes(movie.runtime) }) - : fieldsData.movieInProduction; - const userScore = typeof movie.vote_average === 'number' ? formatNumber(t, movie.vote_average) : fieldsData.movieInProduction; - const releaseDate = movie.release_date - ? time(new Date(movie.release_date), TimestampStyles.ShortDate) - : t(LanguageKeys.Globals.Unknown); - const imdbPage = movie.imdb_id ? `[${fieldsData.linkClickHere}](http://www.imdb.com/title/${movie.imdb_id})` : fieldsData.none; - - return embed - .setTitle(movie.title) - .setURL(`https://www.themoviedb.org/movie/${movie.id}`) - .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, runTime, true) - .addField(titles.userScore, userScore, true) - .addField(titles.status, movie.status, true) - .addField(titles.releaseDate, releaseDate, true) - .addField(titles.imdbPage, imdbPage, true) - .addField(titles.homePage, movie.homepage ? `[${fieldsData.linkClickHere}](${movie.homepage})` : fieldsData.none, true) - .addField(titles.collection, movie.belongs_to_collection ? movie.belongs_to_collection.name : fieldsData.notPartOfCollection) - .addField(titles.genres, movie.genres.length ? movie.genres.map((genre) => genre.name).join(', ') : fieldsData.noGenres); - }); - } - - return display; - } -} diff --git a/src/commands/Tools/Websearch/price.ts b/src/commands/Tools/Websearch/price.ts deleted file mode 100644 index 90d85d04ead..00000000000 --- a/src/commands/Tools/Websearch/price.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { NonNullObject, roundNumber } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { URL } from 'node:url'; - -@ApplyOptions({ - enabled: envIsDefined('CRYPTOCOMPARE_TOKEN'), - aliases: ['currency', 'money', 'exchange'], - description: LanguageKeys.Commands.Tools.PriceDescription, - detailedDescription: LanguageKeys.Commands.Tools.PriceExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const amount = await args.pick('number').catch(() => 1); - const fromCurrency = await args.pick('string'); - const toCurrencies = await args.repeat('string'); - - await sendLoadingMessage(message, args.t); - - const result = await this.fetchAPI(fromCurrency, toCurrencies); - - const embed = await this.buildEmbed(message, args.t, result, fromCurrency, amount); - return send(message, { embeds: [embed] }); - } - - private async fetchAPI(fromCurrency: string, toCurrency: string[]): Promise { - try { - const url = new URL('https://min-api.cryptocompare.com/data/price'); - url.searchParams.append('fsym', fromCurrency.toUpperCase()); - url.searchParams.append('tsyms', toCurrency.join(',').toUpperCase()); - url.searchParams.append('extraParams', `${process.env.CLIENT_NAME} ${process.env.CLIENT_VERSION} Discord Bot`); - - const body = await fetch( - url, - { - headers: [['authorization', `Apikey ${process.env.CRYPTOCOMPARE_TOKEN}`]] - }, - FetchResultTypes.JSON - ); - - if (Reflect.has(body, 'Message')) throw undefined; // Error is handled in the catch - return body as CryptoCompareResultOk; - } catch { - this.error(LanguageKeys.Commands.Tools.PriceCurrencyNotFound); - } - } - - 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}`); - } - - return new MessageEmbed() - .setColor(await this.container.db.fetchColor(message)) - .setDescription(t(LanguageKeys.Commands.Tools.PriceCurrency, { fromCurrency, fromAmount, worths })) - .setTimestamp(); - } -} - -export interface CryptoCompareResultError { - Response: 'Error'; - Message: string; - HasWarning: boolean; - Type: number; - RateLimit: CryptoCompareResultErrorData; - Data: CryptoCompareResultErrorData; - ParamWithError: string; -} - -export type CryptoCompareResultErrorData = NonNullObject; - -export interface CryptoCompareResultOk extends Record {} diff --git a/src/commands/Tools/Websearch/shows.ts b/src/commands/Tools/Websearch/shows.ts deleted file mode 100644 index 826e1cbf1b8..00000000000 --- a/src/commands/Tools/Websearch/shows.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { Tmdb } from '#lib/types/definitions/Tmdb'; -import { minutes } from '#utils/common'; -import { formatNumber } from '#utils/functions'; -import { sendLoadingMessage } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { cutText } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { URL } from 'node:url'; - -@ApplyOptions({ - enabled: envIsDefined('THEMOVIEDATABASE_TOKEN'), - aliases: ['show', 'tvdb', 'tv'], - description: LanguageKeys.Commands.Tools.ShowsDescription, - detailedDescription: LanguageKeys.Commands.Tools.ShowsExtended -}) -export class UserPaginatedMessageCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: PaginatedMessageCommand.Args) { - const [show, year = null] = (await args.pick('string')).split('y:'); - - const response = await sendLoadingMessage(message, args.t); - const { results: entries } = await this.fetchAPI(show.trim(), year); - if (!entries.length) this.error(LanguageKeys.System.NoResults); - - const display = await this.buildDisplay(message, args.t, entries); - await display.run(response, message.author); - return response; - } - - private async fetchAPI(show: string, year: string | null) { - try { - const url = new URL('https://api.themoviedb.org/3/search/tv'); - url.searchParams.append('api_key', process.env.THEMOVIEDATABASE_TOKEN); - url.searchParams.append('query', show); - - if (year !== null) url.searchParams.append('first_air_date_year', year.toString()); - return await fetch(url, FetchResultTypes.JSON); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async fetchShowData(serieId: number) { - try { - const url = new URL(`https://api.themoviedb.org/3/tv/${serieId}`); - url.searchParams.append('api_key', process.env.THEMOVIEDATABASE_TOKEN); - - return await fetch(url, FetchResultTypes.JSON); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async buildDisplay(message: Message, t: TFunction, shows: Tmdb.TmdbSeriesList['results']) { - const titles = t(LanguageKeys.Commands.Tools.ShowsTitles); - const fieldsData = t(LanguageKeys.Commands.Tools.ShowsData); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed().setColor(await this.container.db.fetchColor(message)) - }).setSelectMenuOptions((pageIndex) => ({ - label: showData[pageIndex - 1].name - })); - - const showData = await Promise.all(shows.map((show) => this.fetchShowData(show.id))); - - for (const show of showData) { - display.addPageEmbed((embed) => { - const episodeRuntime = show.episode_run_time.length - ? `${t(LanguageKeys.Globals.DurationValue, { value: minutes(show.episode_run_time[0]) })}` - : fieldsData.variableRuntime; - const userScore = typeof show.vote_average === 'number' ? formatNumber(t, show.vote_average) : fieldsData.unknownUserScore; - - return embed - .setTitle(show.name) - .setURL(`https://www.themoviedb.org/tv/${show.id}`) - .setImage(`https://image.tmdb.org/t/p/original${show.backdrop_path}`) - .setThumbnail(`https://image.tmdb.org/t/p/original${show.poster_path}`) - .setDescription(cutText(show.overview, 750)) - .addField(titles.episodeRuntime, episodeRuntime, true) - .addField(titles.userScore, userScore, true) - .addField(titles.status, show.status, true) - .addField(titles.firstAirDate, time(new Date(show.first_air_date), TimestampStyles.ShortDate), true) - .addField(titles.genres, show.genres.length ? show.genres.map((genre) => genre.name).join(', ') : fieldsData.noGenres); - }); - } - - return display; - } -} diff --git a/src/commands/Tools/Websearch/wikipedia.ts b/src/commands/Tools/Websearch/wikipedia.ts deleted file mode 100644 index 98cd38640bf..00000000000 --- a/src/commands/Tools/Websearch/wikipedia.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { getImageUrl } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { URL } from 'node:url'; - -@ApplyOptions({ - aliases: ['wiki'], - description: LanguageKeys.Commands.Tools.WikipediaDescription, - detailedDescription: LanguageKeys.Commands.Tools.WikipediaExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const input = await args.rest('string'); - - const { t } = args; - const text = await this.fetchText(input); - - // 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') { - this.error(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, t); - - const embed = new MessageEmbed() - .setTitle(pageInformation.title) - .setURL(pageUrl) - .setColor(await this.container.db.fetchColor(message)) - .setThumbnail('https://en.wikipedia.org/static/images/project-logos/enwiki.png') - .setDescription(definition.replace(/\n{2,}/g, '\n').replace(/\s{2,}/g, ' ')) - .setFooter({ text: '© Wikipedia' }); - - // If there is an image and it is also a valid image URL then add it to the embed - const imageUrl = - image && - image.query.pageids[0] !== '-1' && - image.query.pages[image.query.pageids[0]].thumbnail && - getImageUrl(image.query.pages[image.query.pageids[0]].thumbnail.source); - - if (imageUrl) { - embed.setImage(imageUrl); - } - - return send(message, { embeds: [embed] }); - } - - private async fetchText(input: string) { - try { - const url = this.getBaseUrl(input); - url.searchParams.append('prop', 'extracts'); - url.searchParams.append('explaintext', 'true'); - url.searchParams.append('exsectionformat', 'plain'); - url.searchParams.append('exchars', '300'); - - return await fetch>(url, FetchResultTypes.JSON); - } catch { - this.error(LanguageKeys.System.QueryFail); - } - } - - private async fetchImage(input: string) { - try { - const url = this.getBaseUrl(input); - url.searchParams.append('prop', 'pageimages'); - url.searchParams.append('pithumbsize', '1000'); - - return await fetch>(url, FetchResultTypes.JSON); - } catch { - return undefined; - } - } - - private getBaseUrl(input: string) { - const url = new URL('https://en.wikipedia.org/w/api.php'); - url.searchParams.append('action', 'query'); - url.searchParams.append('format', 'json'); - url.searchParams.append('indexpageids', 'true'); - url.searchParams.append('redirects', 'true'); - url.searchParams.append('converttitles', 'true'); - url.searchParams.append('exlimit', '1'); - url.searchParams.append('titles', input); - - return url; - } - - private parseURL(url: string) { - return encodeURIComponent(url.replace(/[ ]/g, '_').replace(/\(/g, '%28').replace(/\)/g, '%29')); - } - - private content(definition: string, url: string, t: TFunction) { - if (definition.length < 300) return definition; - return t(LanguageKeys.Misc.SystemTextTruncated, { definition, url }); - } -} - -interface WikipediaResultOk { - batchcomplete: string; - query: WikipediaResultOkQuery; -} - -interface WikipediaResultOkQuery { - normalized: WikipediaResultOkNormalized[]; - pageids: string[]; - pages: WikipediaResultOkPages; -} - -interface WikipediaResultOkNormalized { - from: string; - to: string; -} - -interface WikipediaResultOkPages - extends Record {} - -interface WikipediaResultsOkPageGeneral { - pageid: number; - ns: number; - title: string; -} - -interface WikipediaExtractResultsOkPage extends WikipediaResultsOkPageGeneral { - extract: string; -} - -interface WikipediaPageImagesResultsOkPage extends WikipediaResultsOkPageGeneral { - thumbnail: WikipediaPageImageThumbnail; - pageimage: string; -} - -interface WikipediaPageImageThumbnail { - source: string; - width: number; - height: number; -} diff --git a/src/commands/Tools/Websearch/youtube.ts b/src/commands/Tools/Websearch/youtube.ts deleted file mode 100644 index 3ac909f75e5..00000000000 --- a/src/commands/Tools/Websearch/youtube.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PaginatedMessageCommand, SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { Args, IArgument } from '@sapphire/framework'; -import { envIsDefined } from '@skyra/env-utilities'; -import type { Message, MessageSelectOptionData } from 'discord.js'; -import { decode } from 'he'; -import { URL } from 'node:url'; - -@ApplyOptions({ - enabled: envIsDefined('GOOGLE_API_TOKEN'), - aliases: ['yt'], - description: LanguageKeys.Commands.Tools.YouTubeDescription, - detailedDescription: LanguageKeys.Commands.Tools.YouTubeExtended -}) -export class UserCommand extends PaginatedMessageCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { t } = args; - const loadingMessage = await sendLoadingMessage(message, t); - - const input = await args.rest(UserCommand.youtubeUrlResolver); - - const url = new URL('https://youtube.googleapis.com/youtube/v3/search'); - url.searchParams.append('part', 'snippet'); - url.searchParams.append('safeSearch', 'strict'); - url.searchParams.append('q', input); - url.searchParams.append('key', process.env.GOOGLE_API_TOKEN); - - const data = await fetch(url, FetchResultTypes.JSON); - const results = data.items.slice(0, 10); - - if (!results.length) this.error(LanguageKeys.Commands.Tools.YouTubeNotFound); - - const pageLabel = t(LanguageKeys.Globals.PaginatedMessagePage); - - const display = new SkyraPaginatedMessage() // - .setSelectMenuOptions((pageIndex) => this.getSelectMenuOptions(results, pageIndex, pageLabel)); - - for (const result of results) { - display.addPageBuilder((builder) => - builder // - .setContent(this.getLink(result)) - .setEmbeds([]) - ); - } - - await display.run(loadingMessage, message.author); - return loadingMessage; - } - - private getLink(result: YouTubeResultOkItem): string { - switch (result.id.kind) { - case 'youtube#channel': - return `https://youtube.com/channel/${result.id.channelId}`; - case 'youtube#playlist': - return `https://www.youtube.com/playlist?list=${result.id.playlistId}`; - case 'youtube#video': - return `https://youtu.be/${result.id.videoId}`; - default: { - this.container.logger.fatal(`YouTube -> Returned incompatible kind '${result.id.kind}'.`); - throw 'I found an incompatible kind of result...'; - } - } - } - - private getSelectMenuOptions(results: YouTubeResultOkItem[], pageIndex: number, pageLabel: string): Omit { - const result = results[pageIndex - 1]; - - if (result.snippet.title) { - return { - label: `${decode(result.snippet.title)}` - }; - } - - return { - label: `${pageLabel} ${pageIndex}` - }; - } - - private static youtubeUrlResolver: IArgument = Args.make((parameter) => { - if (parameter.startsWith('<')) parameter = parameter.slice(1); - if (parameter.endsWith('>')) parameter = parameter.slice(0, parameter.length - 1); - - return Args.ok(parameter); - }); -} - -interface YouTubeResultOk { - kind: string; - etag: string; - nextPageToken: string; - regionCode: string; - pageInfo: YouTubeResultOkPageInfo; - items: YouTubeResultOkItem[]; -} - -interface YouTubeResultOkItem { - kind: string; - etag: string; - id: YouTubeResultOkId; - snippet: YouTubeResultOkSnippet; -} - -interface YouTubeResultOkId { - kind: string; - playlistId?: string; - channelId?: string; - videoId?: string; -} - -interface YouTubeResultOkSnippet { - publishedAt: Date; - channelId: string; - title: string; - description: string; - thumbnails: YouTubeResultOkThumbnails; - channelTitle: string; - liveBroadcastContent: string; -} - -interface YouTubeResultOkThumbnails { - default: YouTubeResultOkThumbnail; - medium: YouTubeResultOkThumbnail; - high: YouTubeResultOkThumbnail; -} - -interface YouTubeResultOkThumbnail { - url: string; - width: number; - height: number; -} - -interface YouTubeResultOkPageInfo { - totalResults: number; - resultsPerPage: number; -} diff --git a/src/commands/Tools/avatar.ts b/src/commands/Tools/avatar.ts deleted file mode 100644 index f9933feb47d..00000000000 --- a/src/commands/Tools/avatar.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { AllowedImageSize, Message, MessageEmbed } from 'discord.js'; - -const VALID_SIZES = [16, 32, 64, 128, 256, 512, 1024, 2048, 4096]; - -@ApplyOptions({ - aliases: ['a', 'av', 'ava'], - description: LanguageKeys.Commands.Tools.AvatarDescription, - detailedDescription: LanguageKeys.Commands.Tools.AvatarExtended, - options: ['size'], - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const user = args.finished ? message.author : await args.pick('userName'); - if (!user.avatar) this.error(LanguageKeys.Commands.Tools.AvatarNone); - - const sizeFlag = args.getOption('size'); - const size = sizeFlag ? this.resolveSize(sizeFlag) : 2048; - - const embed = new MessageEmbed() - .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setColor(await this.container.db.fetchColor(message)) - .setImage(user.displayAvatarURL({ size, format: 'png', dynamic: true })); - return send(message, { embeds: [embed] }); - } - - private resolveSize(size: string): AllowedImageSize { - const sizeNum = Number(size); - if (Number.isNaN(sizeNum) || !VALID_SIZES.includes(sizeNum)) return 2048; - return sizeNum as AllowedImageSize; - } -} diff --git a/src/commands/Tools/color.ts b/src/commands/Tools/color.ts deleted file mode 100644 index 81986d53658..00000000000 --- a/src/commands/Tools/color.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { RGB, SkyraCommand } from '#lib/structures'; -import { hexConcat, luminance } from '#utils/Color'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { Canvas, rgb } from 'canvas-constructor/napi-rs'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -/* Color limiter */ -const rL = (color: number) => color / 255; -const cL = (color: number) => Math.max(Math.min(color, 255), 0); -const sCL = (color: number) => (color >= 0.5 ? 0 : 255); - -@ApplyOptions({ - aliases: ['colour'], - description: LanguageKeys.Commands.Tools.ColorDescription, - detailedDescription: LanguageKeys.Commands.Tools.ColorExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const { hex, hsl, rgb } = await args.rest('color'); - - const diff = await args.pick('integer', { minimum: 0, maximum: 255 }).catch(() => 10); - - const content = args.t(LanguageKeys.Commands.Tools.Color, { hex: hex.toString(), rgb: rgb.toString(), hsl: hsl.toString() }); - const attachment = await this.showColor(rgb, diff); - return send(message, { content, files: [{ attachment, name: 'color.png' }] }); - } - - public showColor(color: RGB, diff: number) { - const red = color.r; - const green = color.g; - const blue = color.b; - - const canvas = new Canvas(370, 390).setTextFont('18px FiraSans'); - - this.processFrame(canvas, 5, 5, cL(red + diff * 2), cL(green), cL(blue)); - this.processFrame(canvas, 5, 125, cL(red + diff), cL(green + diff), cL(blue)); - this.processFrame(canvas, 5, 245, cL(red), cL(green + diff * 2), cL(blue)); - this.processFrame(canvas, 125, 5, cL(red + diff), cL(green), cL(blue + diff)); - this.processFrame(canvas, 125, 125, cL(red), cL(green), cL(blue)); - this.processFrame(canvas, 125, 245, cL(red - diff), cL(green), cL(blue - diff)); - this.processFrame(canvas, 245, 5, cL(red), cL(green), cL(blue + diff * 2)); - this.processFrame(canvas, 245, 125, cL(red - diff), cL(green - diff), cL(blue)); - this.processFrame(canvas, 245, 245, cL(red - diff * 2), cL(green - diff * 2), cL(blue - diff * 2)); - - /* Complementary */ - const thisLum = sCL(luminance(rL(255 - red), rL(255 - green), rL(255 - blue))); - return canvas - .setColor(rgb(255 - red, 255 - green, 255 - blue)) - .printRectangle(5, 365, 360, 20) - .setTextFont('16px FiraSans') - .setColor(rgb(thisLum, thisLum, thisLum)) - .printText(hexConcat(255 - red, 255 - green, 255 - blue), 15, 382) - .pngAsync(); - } - - public processFrame(ctx: Canvas, x: number, y: number, red: number, green: number, blue: number) { - const lum = luminance(rL(red), rL(green), rL(blue)); - const textColor = sCL(lum); - - return ctx - .setColor(rgb(red, green, blue)) - .printRectangle(x, y, 120, 120) - .setColor(rgb(textColor, textColor, textColor)) - .printText(hexConcat(red, green, blue), x + 10, y + 20); - } -} diff --git a/src/commands/Tools/content.ts b/src/commands/Tools/content.ts deleted file mode 100644 index 90cfeb558b8..00000000000 --- a/src/commands/Tools/content.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { escapeCodeBlock } from '#utils/External/escapeMarkdown'; -import { formatAttachment, formatMessage } from '#utils/formatters'; -import { handleMessage } from '#utils/Parsers/ExceededLength'; -import { getAllContent, getContent } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { isNullishOrEmpty } from '@sapphire/utilities'; -import type { Message } from 'discord.js'; - -const allPlain = ['all', 'all-plain', 'all-plain-text']; -const allFormat = ['format', 'formatted', 'all-format', 'all-formatted']; -const outputTo = ['output', 'output-to']; - -@ApplyOptions({ - aliases: ['source', 'msg-source', 'message-source'], - description: LanguageKeys.Commands.Tools.ContentDescription, - detailedDescription: LanguageKeys.Commands.Tools.ContentExtended, - flags: [...allPlain, ...allFormat], - options: [...outputTo] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - // Retrieve the target message: - const channel = await args.pick('textOrNewsChannelName').catch(() => message.channel); - const target = await args.pick('message', { channel }); - - // Parse the message content: - const raw = this.getContent(args, target as GuildMessage); - if (isNullishOrEmpty(raw)) this.error(LanguageKeys.Commands.Tools.ContentEmpty); - - const content = escapeCodeBlock(raw); - - const sendAs = args.getOption(...outputTo); - return handleMessage(message, { - sendAs, - content, - targetId: target.id, - hastebinUnavailable: false, - url: null, - canLogToConsole: false - }); - } - - private getContent(args: SkyraCommand.Args, message: GuildMessage) { - if (args.getFlags(...allPlain)) return this.join(getAllContent(message), this.getAttachments(message)); - if (args.getFlags(...allFormat)) return formatMessage(args.t, message); - return this.join(getContent(message) ?? '', this.getAttachments(message)); - } - - private getAttachments(message: GuildMessage) { - return message.attachments.map(formatAttachment).join('\n'); - } - - private join(content: string, attachments: string) { - if (content.length === 0) return attachments; - if (attachments.length === 0) return content; - return `${content}\n\n${attachments}`; - } -} diff --git a/src/commands/Tools/create-emoji.ts b/src/commands/Tools/create-emoji.ts deleted file mode 100644 index c40dd4e43f1..00000000000 --- a/src/commands/Tools/create-emoji.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { EmojiRegex } from '@sapphire/discord.js-utilities'; -import { Args, CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; - -@ApplyOptions({ - aliases: ['add-emoji'], - description: LanguageKeys.Commands.Tools.CreateEmojiDescription, - detailedDescription: LanguageKeys.Commands.Tools.CreateEmojiExtended, - permissionLevel: PermissionLevels.Moderator, - requiredClientPermissions: [PermissionFlagsBits.ManageEmojisAndStickers], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const { animated, id, name } = await args.pick(UserCommand.emojiResolver); - - if (message.guild.emojis.cache.some((emoji) => emoji.name === name)) - return this.error(LanguageKeys.Commands.Tools.CreateEmojisDuplicate, { name }); - - try { - const emoji = await message.guild.emojis.create(`https://cdn.discordapp.com/emojis/${id}.${animated ? 'gif' : 'png'}`, name); - const content = args.t(LanguageKeys.Commands.Tools.CreateEmojiSuccess, { emoji: emoji.toString() }); - return send(message, content); - } catch { - return this.error(LanguageKeys.Commands.Tools.CreateEmojiInvalidEmoji); - } - } - - private static emojiResolver = Args.make((parameter, { argument }) => { - const match = EmojiRegex.exec(parameter); - return match?.groups - ? Args.ok({ id: match.groups.id, name: match.groups.name, animated: Boolean(match.groups.animated) }) - : Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Tools.CreateEmojiInvalidDiscordEmoji }); - }); -} - -interface EmojiData { - id: string; - name: string; - animated: boolean; -} diff --git a/src/commands/Tools/emoji.ts b/src/commands/Tools/emoji.ts deleted file mode 100644 index ead35e6b66a..00000000000 --- a/src/commands/Tools/emoji.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { twemoji } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { TwemojiRegex } from '@sapphire/discord-utilities'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -const REG_EMOJI = /^$/; -const MAX_EMOJI_SIZE = 1024 * 1024 * 8; - -@ApplyOptions({ - aliases: ['emote'], - description: LanguageKeys.Commands.Tools.EmojiDescription, - detailedDescription: LanguageKeys.Commands.Tools.EmojiExtended, - requiredClientPermissions: [PermissionFlagsBits.AttachFiles] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const emoji = await args.pick('string'); - - const { content, name, attachment } = REG_EMOJI.test(emoji) ? this.builtinEmoji(args, emoji) : await this.twemoji(args, emoji); - return send(message, { content, files: [{ attachment, name }] }); - } - - private builtinEmoji(args: SkyraCommand.Args, emoji: string) { - const [, animated, emojiName, emojiId] = /^<(a)?:(\w{2,32}):(\d{17,21})>$/.exec(emoji)!; - const content = args.t(LanguageKeys.Commands.Tools.EmojiCustom, { emoji: emojiName, id: emojiId }); - const name = `${emojiId}.${animated ? 'gif' : 'png'}`; - const attachment = `https://cdn.discordapp.com/emojis/${name}`; - - return { content, name, attachment } as const; - } - - private async twemoji(args: SkyraCommand.Args, emoji: string) { - if (!TwemojiRegex.test(emoji)) this.error(LanguageKeys.Commands.Tools.EmojiInvalid); - const emojiCode = twemoji(emoji); - - const name = `${emojiCode}.png`; - const attachment = await fetch(`https://twemoji.maxcdn.com/v/latest/72x72/${name}`, FetchResultTypes.Buffer).catch(() => { - this.error(LanguageKeys.Commands.Tools.EmojiInvalid); - }); - if (attachment.byteLength >= MAX_EMOJI_SIZE) this.error(LanguageKeys.Commands.Tools.EmojiTooLarge, { emoji }); - - const content = args.t(LanguageKeys.Commands.Tools.EmojiTwemoji, { emoji, id: emojiCode }); - - return { content, name, attachment } as const; - } -} diff --git a/src/commands/Tools/poll.ts b/src/commands/Tools/poll.ts deleted file mode 100644 index 72ecd419e20..00000000000 --- a/src/commands/Tools/poll.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { sendLoadingMessage } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import type { Message } from 'discord.js'; - -const NUMBER_OPTS = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']; -const ALPHABET_OPTS = ['🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮', '🇯', '🇰', '🇱', '🇲', '🇳', '🇴', '🇵', '🇶', '🇷', '🇸', '🇹']; - -@ApplyOptions({ - aliases: ['spoll'], - description: LanguageKeys.Commands.Tools.PollDescription, - detailedDescription: LanguageKeys.Commands.Tools.PollExtended, - requiredClientPermissions: [PermissionFlagsBits.AddReactions, PermissionFlagsBits.ReadMessageHistory, PermissionFlagsBits.EmbedLinks], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const options = args.nextSplit(); - if (options.length < 2 || options.length > 20) this.error(LanguageKeys.Serializers.MinMaxBothInclusive, { name: 'options', min: 2, max: 20 }); - - const emojis = (options.length > 10 ? ALPHABET_OPTS : NUMBER_OPTS).slice(0, options.length); - const response = await sendLoadingMessage(message, args.t); - - for (const emoji of emojis) { - if (response.reactions.cache.size === 20) this.error(LanguageKeys.Commands.Tools.PollReactionLimit); - await response.react(emoji); - } - - const content = options.map((option, i) => `${emojis[i]} → *${option}*`).join('\n'); - await send(message, { content, allowedMentions: { users: [], roles: [] } }); - } -} diff --git a/src/commands/Tools/vote.ts b/src/commands/Tools/vote.ts deleted file mode 100644 index 5e0efdb8508..00000000000 --- a/src/commands/Tools/vote.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { CommandOptionsRunTypeEnum } from '@sapphire/framework'; -import { RESTJSONErrorCodes } from 'discord-api-types/rest/v9'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { DiscordAPIError, Message } from 'discord.js'; - -@ApplyOptions({ - description: LanguageKeys.Commands.Tools.VoteDescription, - detailedDescription: LanguageKeys.Commands.Tools.VoteExtended, - requiredClientPermissions: [PermissionFlagsBits.AddReactions, PermissionFlagsBits.ReadMessageHistory], - runIn: [CommandOptionsRunTypeEnum.GuildAny] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - if (args.finished) this.error(LanguageKeys.Commands.Tools.VoteContentNeeded); - - for (const reaction of ['👍', '👎', '🤷']) { - if (!message.reactions.cache.has(reaction)) await this.react(message, reaction); - } - - return message; - } - - private async react(message: Message, reaction: string) { - try { - await message.react(reaction); - } catch (error) { - if (error instanceof DiscordAPIError && error.code === RESTJSONErrorCodes.ReactionWasBlocked) { - this.error(LanguageKeys.Commands.Tools.VoteReactionBlocked); - } - throw error; - } - } -} diff --git a/src/commands/Twitch/followage.ts b/src/commands/Twitch/followage.ts deleted file mode 100644 index cae58ba38ca..00000000000 --- a/src/commands/Twitch/followage.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { envIsDefined } from '@skyra/env-utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - enabled: envIsDefined('TWITCH_CLIENT_ID', 'TWITCH_TOKEN'), - description: LanguageKeys.Commands.Twitch.FollowageDescription, - detailedDescription: LanguageKeys.Commands.Twitch.FollowageExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const userName = await args.pick('string', { maximum: 20 }); - const channelName = await args.pick('string', { maximum: 20 }); - const { t } = args; - - // Get the User objects for the user and channel names - const [user, channel] = await this.retrieveResults(userName, channelName); - - // Check if the user follows that channel - const { data } = await this.container.client.twitch.fetchUserFollowage(user.id, channel.id); - - // If the user doesn't follow then the data length will be 0 - if (data.length === 0) this.error(LanguageKeys.Commands.Twitch.FollowageMissingEntries); - - // Otherwise we can parse the data - const followingSince = new Date(data[0].followed_at).getTime(); - const followingFor = Date.now() - followingSince; - - const authorName = t(LanguageKeys.Commands.Twitch.Followage, { - user: user.display_name, - channel: channel.display_name, - time: followingFor - }); - const embed = new MessageEmbed() - .setColor(this.container.client.twitch.BRANDING_COLOUR) - .setAuthor({ name: authorName, iconURL: channel.profile_image_url }) - .setTimestamp(); - return send(message, { embeds: [embed] }); - } - - private async retrieveResults(user: string, channel: string) { - try { - const { data } = await this.container.client.twitch.fetchUsers([], [user, channel]); - if (!data || data.length < 2) this.error(LanguageKeys.Commands.Twitch.FollowageMissingEntries); - - return data; - } catch { - this.error(LanguageKeys.Commands.Twitch.FollowageMissingEntries); - } - } -} diff --git a/src/commands/Twitch/twitch.ts b/src/commands/Twitch/twitch.ts deleted file mode 100644 index 240767ba980..00000000000 --- a/src/commands/Twitch/twitch.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { CdnUrls } from '#utils/constants'; -import { formatNumber } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { send } from '@sapphire/plugin-editable-commands'; -import { envIsDefined } from '@skyra/env-utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Message, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - enabled: envIsDefined('TWITCH_CLIENT_ID', 'TWITCH_TOKEN'), - description: LanguageKeys.Commands.Twitch.TwitchDescription, - detailedDescription: LanguageKeys.Commands.Twitch.TwitchExtended, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks] -}) -export class UserCommand extends SkyraCommand { - public async messageRun(message: Message, args: SkyraCommand.Args) { - const name = await args.pick('string'); - const { t } = args; - - const { data: channelData } = await this.fetchUsers([name]); - if (channelData.length === 0) this.error(LanguageKeys.Commands.Twitch.TwitchNoEntries); - const channel = channelData[0]; - - const { total: followersTotal } = await this.container.client.twitch.fetchUserFollowage('', channel.id); - - const titles = t(LanguageKeys.Commands.Twitch.TwitchTitles); - const affiliateStatus = this.parseAffiliateProgram(t, channel.broadcaster_type); - - const embed = new MessageEmbed() - .setColor(this.container.client.twitch.BRANDING_COLOUR) - .setAuthor({ name: channel.display_name, iconURL: CdnUrls.TwitchLogo, url: `https://twitch.tv/${channel.login}` }) - .setTitle(titles.clickToVisit) - .setURL(`https://twitch.tv/${channel.login}`) - .setDescription(channel.description) - .setThumbnail(channel.profile_image_url) - .addField(titles.followers, formatNumber(t, followersTotal), true) - .addField(titles.views, formatNumber(t, channel.view_count), true) - .addField(titles.partner, affiliateStatus ? affiliateStatus : t(LanguageKeys.Commands.Twitch.TwitchPartnershipWithoutAffiliate)); - return send(message, { embeds: [embed] }); - } - - private parseAffiliateProgram(t: TFunction, type: 'affiliate' | 'partner' | '') { - const options = t(LanguageKeys.Commands.Twitch.TwitchAffiliateStatus); - switch (type) { - case 'affiliate': - return options.affiliated; - case 'partner': - return options.partnered; - case '': - default: - return false; - } - } - - private async fetchUsers(usernames: string[]) { - try { - return await this.container.client.twitch.fetchUsers([], usernames); - } catch { - this.error(LanguageKeys.Commands.Twitch.TwitchNoEntries); - } - } -} diff --git a/src/commands/Twitch/twitchsubscription.ts b/src/commands/Twitch/twitchsubscription.ts deleted file mode 100644 index a03d4f76a12..00000000000 --- a/src/commands/Twitch/twitchsubscription.ts +++ /dev/null @@ -1,343 +0,0 @@ -import { GuildSubscriptionEntity, TwitchSubscriptionEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand, SkyraPaginatedMessage } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { TwitchEventSubTypes, TwitchHelixUsersSearchResult } from '#lib/types/definitions/Twitch'; -import { PermissionLevels } from '#lib/types/Enums'; -import { sendLoadingMessage } from '#utils/util'; -import { channelMention } from '@discordjs/builders'; -import { ApplyOptions, RequiresClientPermissions } from '@sapphire/decorators'; -import { Args, CommandOptionsRunTypeEnum, container } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { TFunction } from '@sapphire/plugin-i18next'; -import { chunk, isNullish, isNullishOrEmpty } from '@sapphire/utilities'; -import { envIsDefined } from '@skyra/env-utilities'; -import { PermissionFlagsBits } from 'discord-api-types/v9'; -import { Guild, MessageEmbed } from 'discord.js'; - -@ApplyOptions({ - enabled: envIsDefined('TWITCH_CALLBACK', 'TWITCH_CLIENT_ID', 'TWITCH_TOKEN', 'TWITCH_EVENTSUB_SECRET'), - aliases: ['twitch-subscription', 't-subscription', 't-sub'], - description: LanguageKeys.Commands.Twitch.TwitchSubscriptionDescription, - detailedDescription: LanguageKeys.Commands.Twitch.TwitchSubscriptionExtended, - permissionLevel: PermissionLevels.Administrator, - requiredClientPermissions: [PermissionFlagsBits.EmbedLinks], - runIn: [CommandOptionsRunTypeEnum.GuildAny], - subCommands: ['add', 'remove', 'reset', { input: 'show', default: true }] -}) -export class UserCommand extends SkyraCommand { - public async add(message: GuildMessage, args: SkyraCommand.Args) { - const streamer = await args.pick(UserCommand.streamer); - const channel = await args.pick('channelName'); - const subscriptionType = await args.pick(UserCommand.status); - const customMessage = await args.rest('string', { maximum: 200 }).catch(() => null); - - if (subscriptionType === TwitchEventSubTypes.StreamOffline && isNullishOrEmpty(customMessage)) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionAddMessageForOfflineRequired); - } - - const { twitchSubscriptions, guildSubscriptions } = this.container.db; - - // Get a potential pre-existing subscription for this streamer and subscriptionType - const streamerForType = await twitchSubscriptions.findOne({ - where: { streamerId: streamer.id, subscriptionType } - }); - const guildSubscriptionsForGuild = await guildSubscriptions.find({ where: { guildId: message.guild.id, channelId: channel.id } }); - - // Check if there is already a subscription for the given streamer, subscription type, and channel: - const alreadyHasEntry = guildSubscriptionsForGuild.some( - (guildSubscription) => - guildSubscription.subscription.streamerId === streamer.id && guildSubscription.subscription.subscriptionType === subscriptionType - ); - - // If that is the case then throw an error - if (alreadyHasEntry) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionAddDuplicated); - } - - // Add a new entry to the "guildSubscriptionsForGuild" for streamer, subscription type, channel and message - const guildSubscription = new GuildSubscriptionEntity(); - guildSubscription.guildId = message.guild.id; - guildSubscription.channelId = channel.id; - guildSubscription.message = customMessage ?? undefined; - - if (streamerForType) { - guildSubscription.subscription = streamerForType; - } else { - // Subscribe to the streamer on the Twitch API, returning the ID of the subscription - const subscriptionId = await this.container.client.twitch.subscriptionsStreamHandle(streamer.id, subscriptionType); - const twitchSubscriptionEntity = new TwitchSubscriptionEntity(); - - twitchSubscriptionEntity.streamerId = streamer.id; - twitchSubscriptionEntity.subscriptionType = subscriptionType; - twitchSubscriptionEntity.subscriptionId = subscriptionId; - - guildSubscription.subscription = twitchSubscriptionEntity; - } - - await guildSubscription.save(); - - const content = args.t( - subscriptionType === TwitchEventSubTypes.StreamOnline - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessLive - : LanguageKeys.Commands.Twitch.TwitchSubscriptionAddSuccessOffline, - { name: streamer.display_name, channel: channel.toString() } - ); - - return send(message, content); - } - - public async remove(message: GuildMessage, args: SkyraCommand.Args) { - const guildSubscriptions = await this.getGuildSubscriptions(message.guild); - - // Only get the args if there are any subscriptions to process - const streamer = await args.pick(UserCommand.streamer); - const channel = await args.pick('channelName'); - const subscriptionType = await args.pick(UserCommand.status); - - // Get all subscriptions for the provided streamer - const streamers = guildSubscriptions.filter((guildSubscription) => guildSubscription.subscription.streamerId === streamer.id); - - // If there are no subscriptions for this streamer, throw - - if (!streamers.length) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveStreamerNotSubscribed, { streamer: streamer.display_name }); - } - - // Get all subscriptions for the specified streamer and status - const statuses = streamers.filter((guildSubscription) => guildSubscription.subscription.subscriptionType === subscriptionType); - - // If there are no subscriptions for this status then throw - if (!statuses.length) { - const statuses = args.t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); - - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveStreamerStatusNotMatch, { - streamer: streamer.display_name, - status: this.getSubscriptionStatus(subscriptionType, statuses) - }); - } - - // Get all subscriptions for this streamer, status and channel - const streamerWithStatusHasChannel = statuses.find((guildSubscription) => guildSubscription.channelId === channel.id); - - // If there are no subscriptions configured for this channel then throw - if (!streamerWithStatusHasChannel) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveNotToProvidedChannel, { channel }); - } - - // Remove the guild subscription. We always have just 1 left here. - await streamerWithStatusHasChannel.remove(); - - // Remove the subscription from the twitch API (if needed) - await this.removeSubscription(streamerWithStatusHasChannel.subscription.subscriptionId); - - const content = args.t( - subscriptionType === TwitchEventSubTypes.StreamOnline - ? LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessLive - : LanguageKeys.Commands.Twitch.TwitchSubscriptionRemoveSuccessOffline, - { name: streamer.display_name, channel: channelMention(channel.id) } - ); - - return send(message, content); - } - - public async reset(message: GuildMessage, args: SkyraCommand.Args) { - const guildSubscriptions = await this.getGuildSubscriptions(message.guild); - - // Only get the arg if there are any subscriptions to process - const streamer = args.finished ? null : await args.pick(UserCommand.streamer); - let count = 0; - - const removals: Promise[] = []; - - // Loop over all guildSubscriptions and remove them - for (const guildSubscription of guildSubscriptions) { - // If the streamer is defined - if (streamer) { - // Then only remove if the streamerId matches - if (guildSubscription.subscription.streamerId === streamer.id) { - removals.push(guildSubscription.remove()); - count++; - } - // Otherwise always remove - } else { - removals.push(guildSubscription.remove()); - count++; - } - } - - // Remove GuildSubscriptionEntities - await Promise.all(removals); - - // Reset twitch subscriptions - await this.resetSubscriptions(streamer); - - const content = args.t(LanguageKeys.Commands.Twitch.TwitchSubscriptionResetSuccess, { count }); - return send(message, content); - } - - @RequiresClientPermissions(PermissionFlagsBits.EmbedLinks) - public async show(message: GuildMessage, args: SkyraCommand.Args) { - const streamer = args.finished ? null : await args.pick(UserCommand.streamer); - const { t } = args; - - // Create the response message. - const response = await sendLoadingMessage(message, t); - - // Fetch the content to show in the reply message - const lines = isNullish(streamer) ? await this.showAll(message.guild, t) : await this.showSingle(message.guild, streamer, t); - - // Create the pages and the URD to display them. - const pages = chunk(lines, 10); - const display = new SkyraPaginatedMessage({ - template: new MessageEmbed() - .setAuthor({ name: message.author.username, iconURL: message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setColor(await this.container.db.fetchColor(message)) - }); - - for (const page of pages) display.addPageEmbed((embed) => embed.setDescription(page.join('\n'))); - - // Start the display and return the message. - await display.run(response, message.author); - - return response; - } - - private async showSingle(guild: Guild, streamer: TwitchHelixUsersSearchResult, t: TFunction) { - const guildSubscriptions = await this.getGuildSubscriptions(guild); - - const subscriptionsForStreamer = guildSubscriptions.filter((guildSubscription) => guildSubscription.subscription.streamerId === streamer.id); - - if (!subscriptionsForStreamer.length) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStreamerNotSubscribed); - } - - // Return the line this guild and streamer. - const statuses = t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); - const lines: string[] = []; - - for (const guildSubscription of subscriptionsForStreamer) { - lines.push( - `${streamer.display_name} - ${channelMention(guildSubscription.channelId)} → ${this.getSubscriptionStatus( - guildSubscription.subscription.subscriptionType, - statuses - )}` - ); - } - - return lines; - } - - private async showAll(guild: Guild, t: TFunction) { - const guildSubscriptions = await this.getGuildSubscriptions(guild); - - // Get all the streamer IDs for this guild, put into a Set to remove duplicates - // (i.e. different channels, different subscription types) - const streamerIds = new Set([...guildSubscriptions.map((guildSubscription) => guildSubscription.subscription.streamerId)]); - - const profiles = await this.container.client.twitch.fetchUsers(streamerIds, []); - const names = new Map(); - for (const profile of profiles.data) names.set(profile.id, profile.display_name); - - // Print all entries for this guild. - const statuses = t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowStatus); - const lines: string[] = []; - - for (const guildSubscription of guildSubscriptions) { - const name = names.get(guildSubscription.subscription.streamerId) ?? t(LanguageKeys.Commands.Twitch.TwitchSubscriptionShowUnknownUser); - - lines.push( - `${name} - ${channelMention(guildSubscription.channelId)} → ${this.getSubscriptionStatus( - guildSubscription.subscription.subscriptionType, - statuses - )}` - ); - } - - return lines; - } - - private async removeSubscription(subscriptionId: string) { - const { twitchSubscriptions } = this.container.db; - - // Get all subscriptions for the provided streamer and subscription type - const subscription = await twitchSubscriptions.findOne({ - relations: ['guildSubscription'], - where: { - subscriptionId - } - }); - - // If there are no subscriptions for that streamer and subscription type then return - if (!subscription) return; - - if (subscription.guildSubscription.length === 0) { - await Promise.all([ - this.container.client.twitch.removeSubscription(subscription.subscriptionId), // - subscription.remove() - ]); - } - } - - private async resetSubscriptions(streamer: TwitchHelixUsersSearchResult | null) { - const { twitchSubscriptions } = this.container.db; - - // Get all subscriptions - const subscriptions = await twitchSubscriptions.find({ - relations: ['guildSubscription'], - ...(!isNullish(streamer) && { - where: { - streamerId: streamer.id - } - }) - }); - - // If there are no subscriptions then return - if (!subscriptions) return; - - // Loop over all subscriptions - for (const subscription of subscriptions) { - // If the subscription has no servers then remove it - if (subscription.guildSubscription.length === 0) { - await Promise.all([ - this.container.client.twitch.removeSubscription(subscription.subscriptionId), // - subscription.remove() - ]); - } - } - } - - private async getGuildSubscriptions(guild: Guild): Promise { - const { guildSubscriptions } = this.container.db; - - // Get all subscriptions for the current server and channel combination - const guildSubscriptionForGuild = await guildSubscriptions.find({ where: { guildId: guild.id } }); - - if (guildSubscriptionForGuild.length === 0) { - this.error(LanguageKeys.Commands.Twitch.TwitchSubscriptionNoSubscriptions); - } - - return guildSubscriptionForGuild; - } - - private getSubscriptionStatus(subscriptionType: TwitchEventSubTypes, statuses: { live: string; offline: string }) { - return subscriptionType === TwitchEventSubTypes.StreamOnline ? statuses.live : statuses.offline; - } - - private static streamer = Args.make(async (parameter, { argument }) => { - try { - const { data } = await container.client.twitch.fetchUsers([], [parameter]); - if (data.length > 0) return Args.ok(data[0]); - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound }); - } catch { - return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Twitch.TwitchSubscriptionStreamerNotFound }); - } - }); - - private static status = Args.make((parameter, { args, argument }) => { - const index = args.t(LanguageKeys.Commands.Twitch.TwitchSubscriptionStatusValues).indexOf(parameter.toLowerCase()); - if (index === -1) return Args.error({ parameter, argument, identifier: LanguageKeys.Commands.Twitch.TwitchSubscriptionInvalidStatus }); - if (index === 0) return Args.ok(TwitchEventSubTypes.StreamOnline); - return Args.ok(TwitchEventSubTypes.StreamOffline); - }); -} diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index e9f17778d66..00000000000 --- a/src/config.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { transformOauthGuildsAndUser } from '#lib/api/utils'; -import { GuildSettings } from '#lib/database/keys'; -import { readSettings } from '#lib/database/settings'; -import { CATEGORIES as TRIVIA_CATEGORIES } from '#lib/games/TriviaManager'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { getHandler } from '#root/languages/index'; -import { minutes, seconds } from '#utils/common'; -import { Emojis, LanguageFormatters, rootFolder } from '#utils/constants'; -import type { ConnectionOptions } from '@influxdata/influxdb-client'; -import { LogLevel } from '@sapphire/framework'; -import type { ServerOptions, ServerOptionsAuth } from '@sapphire/plugin-api'; -import type { InternationalizationOptions } from '@sapphire/plugin-i18next'; -import { codeBlock, toTitleCase } from '@sapphire/utilities'; -import { envParseArray, envParseBoolean, envParseInteger, envParseString, setup } from '@skyra/env-utilities'; -import type { ExcludeEnum } from 'discord.js'; -import { - Options, - Permissions, - type ActivitiesOptions, - type ClientOptions, - type DefaultMessageNotificationLevel, - type ExplicitContentFilterLevel, - type PermissionString, - type WebhookClientData -} from 'discord.js'; -import type { ActivityTypes } from 'discord.js/typings/enums'; -import i18next, { type FormatFunction, type InterpolationOptions } from 'i18next'; -import { join } from 'node:path'; - -// Read config: -setup(join(rootFolder, 'src', '.env')); - -export const OWNERS = envParseArray('CLIENT_OWNERS'); -export const SISTER_CLIENTS = envParseArray('SISTER_CLIENTS'); - -export function parseAnalytics(): ConnectionOptions { - const url = envParseString('INFLUX_URL'); - const token = envParseString('INFLUX_TOKEN'); - - return { - url, - token - }; -} - -function parseApiAuth(): ServerOptionsAuth | undefined { - if (!process.env.OAUTH_SECRET) return undefined; - - return { - id: envParseString('CLIENT_ID'), - secret: envParseString('OAUTH_SECRET'), - cookie: envParseString('OAUTH_COOKIE'), - redirect: envParseString('OAUTH_REDIRECT_URI'), - scopes: envParseArray('OAUTH_SCOPE'), - transformers: [transformOauthGuildsAndUser], - domainOverwrite: envParseString('OAUTH_DOMAIN_OVERWRITE') - }; -} - -function parseApi(): ServerOptions | undefined { - if (!envParseBoolean('API_ENABLED', false)) return undefined; - - return { - auth: parseApiAuth(), - prefix: envParseString('API_PREFIX', '/'), - origin: envParseString('API_ORIGIN'), - listenOptions: { port: envParseInteger('API_PORT') } - }; -} - -function parsePresenceActivity(): ActivitiesOptions[] { - const { CLIENT_PRESENCE_NAME } = process.env; - if (!CLIENT_PRESENCE_NAME) return []; - - return [ - { - name: CLIENT_PRESENCE_NAME, - type: envParseString('CLIENT_PRESENCE_TYPE', 'LISTENING') as ExcludeEnum - } - ]; -} - -function parseRegExpPrefix(): RegExp | undefined { - const { CLIENT_REGEX_PREFIX } = process.env; - return CLIENT_REGEX_PREFIX ? new RegExp(CLIENT_REGEX_PREFIX, 'i') : undefined; -} - -export const PROJECT_ROOT = join(rootFolder, process.env.OVERRIDE_ROOT_PATH ?? 'dist'); -export const LANGUAGE_ROOT = join(PROJECT_ROOT, 'languages'); - -function parseInternationalizationDefaultVariablesPermissions() { - const keys = Object.keys(Permissions.FLAGS) as readonly PermissionString[]; - const entries = keys.map((key) => [key, key] as const); - - return Object.fromEntries(entries) as Readonly>; -} - -function parseInternationalizationDefaultVariables() { - return { - TRIVIA_CATEGORIES: Object.keys(TRIVIA_CATEGORIES ?? {}).join(', '), - VERSION: process.env.CLIENT_VERSION, - LOADING: Emojis.Loading, - SHINY: Emojis.Shiny, - GREENTICK: Emojis.GreenTick, - REDCROSS: Emojis.RedCross, - DEFAULT_PREFIX: process.env.CLIENT_PREFIX, - CLIENT_ID: process.env.CLIENT_ID, - ...parseInternationalizationDefaultVariablesPermissions() - }; -} - -function parseInternationalizationInterpolation(): InterpolationOptions { - return { - escapeValue: false, - defaultVariables: parseInternationalizationDefaultVariables(), - 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.PermissionsAndList: { - return getHandler(language!).listAnd.format( - (value as string[]).map((value) => 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.ExplicitContentFilter: { - switch (value as ExplicitContentFilterLevel) { - case 'DISABLED': - return i18next.t(LanguageKeys.Guilds.ExplicitContentFilterDisabled, { ...options, lng: language }); - case 'MEMBERS_WITHOUT_ROLES': - return i18next.t(LanguageKeys.Guilds.ExplicitContentFilterMembersWithoutRoles, { ...options, lng: language }); - case 'ALL_MEMBERS': - return i18next.t(LanguageKeys.Guilds.ExplicitContentFilterAllMembers, { ...options, lng: language }); - default: - return i18next.t(LanguageKeys.Globals.Unknown, { ...options, lng: language }); - } - } - case LanguageFormatters.MessageNotifications: { - switch (value as DefaultMessageNotificationLevel) { - case 'ALL_MESSAGES': - return i18next.t(LanguageKeys.Guilds.MessageNotificationsAll, { ...options, lng: language }); - case 'ONLY_MENTIONS': - return i18next.t(LanguageKeys.Guilds.MessageNotificationsMentions, { ...options, lng: language }); - default: - return i18next.t(LanguageKeys.Globals.Unknown, { ...options, lng: language }); - } - } - case LanguageFormatters.CodeBlock: { - return codeBlock('', 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.DateTime: { - return getHandler(language!).dateTime.format(value as number); - } - default: - return value as string; - } - } - }; -} - -function parseInternationalizationOptions(): InternationalizationOptions { - return { - defaultMissingKey: 'default', - defaultNS: 'globals', - defaultLanguageDirectory: LANGUAGE_ROOT, - fetchLanguage: ({ guild }) => { - if (!guild) return 'en-US'; - - return readSettings(guild, GuildSettings.Language); - }, - i18next: (_: string[], languages: string[]) => ({ - 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: parseInternationalizationInterpolation() - }) - }; -} - -export const CLIENT_OPTIONS: ClientOptions = { - allowedMentions: { users: [], roles: [] }, - api: parseApi(), - caseInsensitiveCommands: true, - caseInsensitivePrefixes: true, - defaultPrefix: envParseString('CLIENT_PREFIX'), - intents: [ - 'GUILDS', - 'GUILD_MEMBERS', - 'GUILD_BANS', - 'GUILD_EMOJIS_AND_STICKERS', - 'GUILD_VOICE_STATES', - 'GUILD_MESSAGES', - 'GUILD_MESSAGE_REACTIONS', - 'DIRECT_MESSAGES', - 'DIRECT_MESSAGE_REACTIONS' - ], - loadDefaultErrorListeners: false, - makeCache: Options.cacheEverything(), - sweepers: { - ...Options.defaultSweeperSettings, - messages: { - interval: minutes.toSeconds(3), - lifetime: minutes.toSeconds(15) - } - }, - partials: ['CHANNEL'], - presence: { activities: parsePresenceActivity() }, - regexPrefix: parseRegExpPrefix(), - restTimeOffset: 0, - schedule: { interval: seconds(5) }, - nms: { - everyone: 5, - role: 2 - }, - logger: { - level: envParseString('NODE_ENV') === 'production' ? LogLevel.Info : LogLevel.Debug - }, - i18n: parseInternationalizationOptions() -}; - -function parseWebhookError(): WebhookClientData | null { - const { WEBHOOK_ERROR_TOKEN } = process.env; - if (!WEBHOOK_ERROR_TOKEN) return null; - - return { - id: envParseString('WEBHOOK_ERROR_ID'), - token: WEBHOOK_ERROR_TOKEN - }; -} - -export const WEBHOOK_ERROR = parseWebhookError(); diff --git a/src/languages/de-DE/arguments.json b/src/languages/de-DE/arguments.json deleted file mode 100644 index cb216e71e70..00000000000 --- a/src/languages/de-DE/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "Alle", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "Deaktiviert", - "booleanEnabled": "Aktiviert", - "booleanFalseOptions": [ - "falsch", - "f", - "Nein", - "n", - "Aus", - "deaktivieren", - "deaktiviert", - "0", - "-" - ], - "booleanTrueOptions": [ - "wahr", - "t", - "Ja", - "j", - "an", - "aktivieren", - "aktiviert", - "1", - "+" - ], - "caseLatestOptions": [ - "letztes", - "neuestes" - ], - "categoryChannelError": "", - "channelError": "", - "color": "Ich konnte `{{parameter}}` nicht in einer gültigen Farbe auflösen, hier sind einige der gültigen Formate:\n\n- `#dfdfdfdfdf` (Hexadezimal).\n- `\"rgb(200, 200, 200)\"` (RGB).\n- `\"hsl(350, 100, 100)\"` (HSL).\n- `14671839` (Base 10).", - "command": "Ich konnte `{{parameter}}` nicht in einen Command auflösen, bitte stelle sicher, dass du den Namen oder den Alias korrekt eingegeben hast!", - "commandMatch": "Ich konnte `{{parameter}}` nicht zu einem Command oder einer Kategorie zuordnen, dies sind einige der gültigen Formate:\n\n- `ping` (entspricht nur dem Ping-Command).\n- `social.*` (entspricht allen Commands in der **Social**-Kategorie).\n- `social.member management.*` (trifft alle Befehle unter **Social** > **Member Management** Unterkategorie).\n\n> **Tipp**: Wenn du `{{commandContext.commandPrefix}}hilfe überprüfst, befindet sich die Kategorie jedes Befehls oben am Embed.", - "dateError": "", - "dateFormats": "- `2016-11-24` (JJJJ-MM-TT)\n- `2016-11-24T23:56` (JJJJ-MM-DDTHH:mm)\n- `2016-11-24T23:56:12` (JJJJ-MM-DDTHH:mm:ss)\n- `2016-11-24T23:56:12.000` (JJJJ-MM-DDTHH:mm:ss.ss)\n\n> **Tipp**: Die letzten 3 Formate akzeptieren `Z` am Ende, um die Zeit als UTC zu markieren. Alternativ kannst du den Offset deiner Zeitzone eingeben, indem du `+HH:MM` hinzufügst, z.B. `+01:00`.", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "Ich konnte `{{parameter}}` nicht zu einer gültigen Dauer auflösen, hier sind einige der gültigen Formate:\n\n$t(arguments:durationFormats)", - "durationFormats": "- `4h` (4 Stunden).\n- `20m5s` (20 Minuten und 5 Sekunden).\n- \"1w 2d 16h 40m 10s\"` (1 Woche, 2 Tage, 16 Stunden, 40 Minuten und 10 Sekunden).", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "Der Parameter `{{parameter}}` ist zu niedrig! Er muss mindestens {{minimum}} sein!", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "Der Parameter `{{parameter}}` ist zu niedrig! Er muss mindestens {{minimum}} sein!", - "invite": "Ich konnte `{{parameter}}` nicht zu einem gültigen Invitelink auflösen, diese sehen so aus:\n\n- `https://discord​.gg/6gakFR2`.\n- `https://discord​.com/invite/6gakFR2`.\n- `https://discordapp​.com/invite/6gakFR2`.\n\n> **Tipp**: Du kannst den `https://` Teil weglassen, `discord​.gg/6gakFR2` wird ebenfalls als gültiger Parameter akzeptiert.", - "language": "Ich konnte `{{parameter}}` nicht mit einem gültigen Sprachcode auflösen!\n**Tipp*: Folgendes wird unterstützt: {{possibles, andList}}.\n\n> **Tipp**: Du kannst mehr hinzufügen (oder die vorhandenen Übersetzungen verbessern) !", - "memberError": "", - "memberMissingGuild": "Ich konnte `{{parameter}}` nicht auflösen, da dieses Argument in einem Server Channel ausgeführt werden muss.", - "messageError": "", - "missing": "Du musst einen anderen Parameter verwenden!\n\n> **Tipp**: Du kannst `{{commandContext.commandPrefix}}help verwenen {{command.name}}` um herauszufinden, wie du diesen Command benutzt.", - "newsChannel": "Ich konnte `{{parameter}}` nicht zu einem Ankündigungschannel auflösen, bitte stelle sicher, dass du seinen Namen oder seine ID korrekt eingegeben hast!\n\n> **Tipp**: Du kannst ihn auch erwähnen!", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "Der Parameter `{{parameter}}` ist zu niedrig! Er muss mindestens {{minimum}} sein!", - "piece": "Ich konnte `{{parameter}}` nicht zu einem Stück auflösen! Stelle sicher, dass du seinen Namen oder einen seiner Aliase korrekt eingegeben hast!", - "resetPossibles": [ - "Aus", - "Zurücksetzen" - ], - "roleError": "", - "roleMissingGuild": "Ich konnte `{{parameter}}` nicht auflösen, da dieses Argument in einem Server Channel ausgeführt werden muss.", - "scopeGlobal": "Global", - "scopeLocal": "Lokal", - "snowflake": "Ich konnte `{{parameter}}` nicht zu einer gültigen snowflake auflösen! Es sind Zahlen mit 17 bis 18 Ziffern, zum Beispiel, deine Nachricht hat die snowflake `{{message.id}}`!", - "store": "Ich konnte `{{parameter}}` nicht in einen gültigen Shop auflösen!\n**Tipp**: Folgendes wird unterstützt: {{possibles, andList}}.", - "stringTooLong": "Der Parameter `{{parameter}}` ist zu lang! Er muss kürzer als {{maximum}} sein)!", - "stringTooShort": "Der Parameter `{{parameter}}` ist zu kurz! Er muss mindestens {{minimum}} Zeichen haben!", - "time": "Ich konnte `{{parameter}}` nicht zu einer gültigen Zeit auflösen!\n**Tipp*: Folgende Formate werden unterstützt:\n\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpan": "Ich konnte `{{parameter}}` nicht mit einer gültigen Dauer auflösen, stelle sicher, dass du einen gültigen Integer oder einen zeitlich formatierten Wert eingegeben hast. Einige der gültigen Formate sind:\n\n- `45` (45 Sekunden).\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpanTooBig": "Der Parameter `{{parameter}}` wurde auf eine längere Dauer als {{{maximum, duration}} aufgelöst, was nicht erlaubt ist!", - "timeSpanTooSmall": "Der Parameter `{{parameter}}` wurde auf eine kürzere Dauer als {{{minimum, duration}} aufgelöst, was nicht erlaubt ist!", - "tooFewWinners": "Der Parameter `{{parameter}}` wurde an eine zu niedrige Zahl aufgelöst, er muss mindestens 1 sein!", - "tooManyWinners": "Der Parameter `{{parameter}}` wurde zu einer Zahl aufgelöst, die zu hoch ist, es darf maximal 20 sein!", - "unavailable": "Hoppla! Es scheint, dass ich keinen Parser für einen Parameter finden konnte, bitte kontaktiere meine Entwickler!", - "userError": "", - "wager": "Es tut mir leid, aber {{parameter}} {{SHINY}} ist ein ungültiger Betrag. Du kannst einen {{possibles, orList}} verwenden.", - "winners": "Ich konnte `{{parameter}}` nicht zu einem gültigen Siegerbetrag auflösen!\n**Tipp**: Das folgende Format wird unterstützt: `Nw`, ist `N` eine ganze Zahl, e. . `3w` oder `12w`." -} \ No newline at end of file diff --git a/src/languages/de-DE/arguments/image.json b/src/languages/de-DE/arguments/image.json deleted file mode 100644 index a949eec1e5b..00000000000 --- a/src/languages/de-DE/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} Ich konnte keinen Avatar für {{value}} erhalten." -} \ No newline at end of file diff --git a/src/languages/de-DE/arguments/range.json b/src/languages/de-DE/arguments/range.json deleted file mode 100644 index a49de8d4294..00000000000 --- a/src/languages/de-DE/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} muss eine Zahl oder ein Zahlenbereich sein." -} \ No newline at end of file diff --git a/src/languages/de-DE/assertions.json b/src/languages/de-DE/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/colors.json b/src/languages/de-DE/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/commands/admin.json b/src/languages/de-DE/commands/admin.json deleted file mode 100644 index 8f9d3e7f14c..00000000000 --- a/src/languages/de-DE/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} darf nicht deaktiviert werden.", - "confUpdated": "", - "confGetNoExt": "Der Schlüssel **{{key}}** scheint nicht zu existieren.", - "confGet": "Der Wert für den Schlüssel **{{key}}** ist: `{{value}}`", - "confReset": "Der Schlüssel **{{key}}** wurde zurückgesetzt auf: `{{value}}`", - "confNochange": "Der Wert für **{{key}}** war bereits dieser Wert.", - "confServerDescription": "Einstellungen für jeden Server definieren.", - "confServerExtended": { - "usages": [ - "setze NameOfKey Wert für Schlüssel", - "Zeige", - "zeige NameOfKey", - "entferne NameOfKey Wert für Schlüssel", - "NameOfKey zurücksetzen", - "Menü" - ], - "extendedHelp": "Erlaubt dir, Skyra von Discord zu konfigurieren, als schnelle Alternative zum [Web-Dashboard](https://skyra.pw).", - "examples": [ - "wechsle Sprache auf en-GB", - "setze channels.moderation-logs #moderation-logs", - "Zeige", - "Channel anzeigen", - "roles.moderator Moderator entfernen", - "roles.moderator zurücksetzen", - "Menü" - ], - "reminder": "Es gibt Schlüssel und Gruppen, Schlüssel, die innerhalb einer Gruppe sind, sind nach `GroupName.KeyName` benannt." - }, - "confServer": "**Servereinstellung {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` kann nur über das Web-Dashboard konfiguriert werden ()", - "confSettingNotSet": "Nicht festgelegt", - "rolesetDescription": "Einzigartige Rollensets verwalten.", - "rolesetExtended": { - "usages": [ - "setze RoleSetName Role1 Role2 Role3...", - "entferne RoleSetName Role1 Role2 Role3...", - "Zurücksetzen", - "RoleSetName zurücksetzen", - "Liste", - "RoleSetName Role1 Role2 Role3" - ], - "extendedHelp": "Ein Rollenset ist eine Gruppe von Rollen, die Skyra als einzigartig für alle Mitglieder des Servers identifiziert, d.h. ein Rollenset namens `Region` könnte die Rollen `Afrika`, `Amerika`, `Asien` und `Europa` beinhalten, und Mitglieder können nur eine von ihnen haben. Dies ist wie eine Art \"Regel\", die in den folgenden drei Situationen angewendet wird:\n\n- Wenn jemand eine Rolle über den \"Rollen\"-Command beansprucht.\n- Wenn jemand eine Rolle als Reaktionsrolle beansprucht.\n- Wenn jemand eine Rolle entweder manuell oder von einem anderen Bot erhält.", - "explainedUsage": [ - [ - "Hinzufügen", - "Erstelle ein neues Rollenset oder füge eine Rolle zu einem existierenden Set hinzu." - ], - [ - "Entfernen", - "Entferne eine Rolle aus einem existierenden Rollenset." - ], - [ - "Zurücksetzen", - "Entfernt alle Rollen aus einem Rollenset oder, wenn nicht spezifiziert, aus allen vorhandenen Rollensets." - ], - [ - "Liste", - "Listet alle Rollensets auf." - ], - [ - "Automatisch", - "Fügt ein Rollenset hinzu oder entfernt es." - ], - [ - "RoleSetName", - "Der Name des Rollensets" - ], - [ - "Rolle1 Rolle2 Rolle3", - "Die Rollen, die dem Rollenset hinzugefügt werden sollen" - ] - ], - "examples": [ - "füge Region Amerika hinzu", - "füge Regionen Afrika Amerika Asien Europa hinzu", - "entferne Region Amerika", - "Zurücksetzen", - "Regionen zurücksetzen", - "Liste", - "Region Amerika", - "Regionen Afrika Amerika Asien Europa" - ], - "reminder": "Dieser Command kann mehrere Rollen gleichzeitig hinzufügen und/oder entfernen." - }, - "rolesetCreated": "Das einzigartige Rollenset {{name}} wurde mit folgenden Rollen erstellt: {{roles, andList}}", - "rolesetAdded": "Die einzigartige Rollenset {{name}} wurde aktualisiert und enthält nun auch die folgenden Rollen: {{roles, andList}}.", - "rolesetRemoved": "Das einzigartige Rollenset {{name}} wird folgende Rollen nicht mehr enthalten: {{roles, andList}}", - "rolesetResetEmpty": "{{REDCROSS}} In dieser Gruppe sind keine Rollensets konfiguriert.", - "rolesetResetAll": "{{GREENTICK}} Erfolgreich alle Rollensets entfernt.", - "rolesetResetNotExists": "{{REDCROSS}} Das Rollenset `{{name}}` existiert nicht auf diesem Server.", - "rolesetResetGroup": "{{GREENTICK}} Erfolgreich das Rollenset `{{name}}` vom Server entfernt.", - "rolesetUpdated": "Das einzigartige Rollenset {{name}} wurde aktualisiert.", - "rolesetNoRolesets": "Du hast keine Rollensets.", - "confMenuRenderAtFolder": "Momentan bei: 📁 {{path}}", - "confMenuRenderAtPiece": "Momentan bei: ⚙️ {{path}}", - "confMenuRenderNokeys": "Es gibt keine konfigurierbaren Schlüssel für diesen Ordner", - "confMenuRenderSelect": "Bitte gebe einen der Namen der folgenden Einträge ein", - "confMenuRenderUpdate": "• Aktualisiere Wert → `set `", - "confMenuRenderRemove": "• Entferne Wert → `remove `", - "confMenuRenderReset": "• Wert zurücksetzen → `reset`", - "confMenuRenderUndo": "• Update rückgängig → `undo`", - "confMenuRenderCvalue": "Aktueller Wert: **``{{value}}``**", - "confMenuRenderBack": "Drücke ◀ um zurückzugehen", - "confMenuInvalidKey": "Ungültiger Schlüssel, bitte versuche es erneut mit einer der folgenden Optionen.", - "confMenuInvalidAction": "Ungültige Aktion, bitte versuche es erneut mit einer der folgenden Optionen.", - "confMenuSaved": "Alle Änderungen erfolgreich gespeichert." -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/animal.json b/src/languages/de-DE/commands/animal.json deleted file mode 100644 index 11a3975ed99..00000000000 --- a/src/languages/de-DE/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "Lass mich dir einen mysteriösen Katzenfakt erzählen.", - "catfactExtended": { - "extendedHelp": "Du weißt, dass Katzen sehr neugierig sind, richtig? Sie haben sicherlich viel Spaß und es gibt viele seltsame Fakten über sie.\nMit diesem Command wirst du einen zufälligen Fakt lesen können." - }, - "catfactTitle": "Katzen-Fakt", - "dogDescription": "Süße Hundis! ❤", - "dogExtended": { - "extendedHelp": "Weißt **du** wie süß Hunde sind? Sie sind so schön!\nDieser Command verwendet [dog.ceo](https://dog.ceo) um Bilder der süßesten Hunde zu zeigen!" - }, - "foxDescription": "Ich zeige dir ein Fuchsbild!", - "foxExtended": { - "extendedHelp": "Dieser Command zeigt ein zufälliges Bild von [randomfox.ca](https://randomfox.ca/)." - }, - "kittyDescription": "KÄTZCHEN!", - "kittyExtended": { - "extendedHelp": "Weißt **du** wie süß Kätzchen sind? Sie sind so schön!\nDieser Command verwendet [cataas.com](https://cataas.com) um Bilder der süßesten Kätzchen zu zeigen!" - }, - "shibeDescription": "Süße shibas!", - "shibeExtended": { - "extendedHelp": "Jeder liebt Shibas, Ich werde sie auch lieben! Sie sind so liebenswert ❤" - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/animation.json b/src/languages/de-DE/commands/animation.json deleted file mode 100644 index caae5329b31..00000000000 --- a/src/languages/de-DE/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "Suche mit diesem Command via Titel nach deinem Lieblingsanime.", - "kitsuAnimeEmbedData": { - "ageRating": "Alterseinstufung", - "episodeLength": "Länge der Episode", - "episodes": "Episode(n)", - "firstAirDate": "Erstes Ausstrahlungsdatum", - "score": "Bewertung", - "stillAiring": "Wird immer noch ausgestrahlt", - "type": "Typ", - "watchIt": "Schaue es hier an:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "Dieser Command empfängt Informationen von Kitsu.io um den gewünschten Anime anzuzeigen.", - "usages": [ - "Name des Animes" - ] - }, - "kitsuAnimeNoSynopsis": "Keine Zusammenfassung für diesen Titel verfügbar.", - "kitsuAnimeOutputDescription": "**Englischer Titel:** {{englishTitle}}\n**Japanischer Titel:** {{japaneseTitle}}\n**Kanonischer Titel:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "🎥 Film", - "ova": "📼Originale Video Animation", - "special": "🎴 Speziell", - "tv": "📺 TV" - }, - "kitsuMangaDescription": "Suche mit diesem Command via Titel nach deinem Lieblingsmanga.", - "kitsuMangaEmbedData": { - "ageRating": "Alterseinstufung", - "firstPublishDate": "Erstveröffentlichung", - "none": "Keine", - "readIt": "Hier lesen:", - "score": "Bewertung", - "type": "Untertyp" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "Dieser Command empfängt Informationen von Kitsu.io um den gewünschten Manga anzuzeigen.", - "usages": [ - "Name des Manga" - ] - }, - "kitsuMangaOutputDescription": "**Englischer Titel:** {{englishTitle}}\n**Japanischer Titel:** {{japaneseTitle}}\n**Kanonischer Titel:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 Manga", - "manhwa": "🇰🇷 Manhwa", - "novel": "📕 Roman", - "oneShot": "☄ One Shot", - "special": "🎴 Speziell" - }, - "waifuDescription": "Postet ein zufällig generiertes Waifu-Bild.", - "waifuExtended": { - "extendedHelp": "Dieser Command zeigt eine zufällig generierte Waifu von " - }, - "waifuFooter": "Bereitgestellt durch thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/fun.json b/src/languages/de-DE/commands/fun.json deleted file mode 100644 index da1f49e0720..00000000000 --- a/src/languages/de-DE/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "Skyre ist die beste, change my mind.", - "changemymindExtended": { - "usages": [ - "Inhalt" - ], - "extendedHelp": "Ich denke trotzdem dass ich die beste bin, change my mind. Ich mache ein Bild mit deinem Avatar und etwas Text auf einem Papier.", - "explainedUsage": [ - [ - "Text", - "Der Satz den du willst." - ] - ], - "examples": [ - "Skyra ist der beste Bot auf diesem Server" - ] - }, - "choiceDescription": "Ene, mene, miste, deine Mutter rappelt in der Kiste...", - "choiceExtended": { - "usages": [ - "Wahl1 Wahl2 Wahl3..." - ], - "extendedHelp": "Ich habe eine Existenzkrise... soll ich das Geschirr waschen oder aus dem Fenster werfen? Die Suche geht weiter. Liste mir kommagetrennte Sachen auf und ich werde eine aussuchen. Nebenbei, Ich bin nicht verantwortlich für was danach passiert.", - "explainedUsage": [ - [ - "Wörter", - "Eine durch Komma getrennte Liste von Wörtern." - ] - ], - "examples": [ - "Sollte Geschirr waschen, wirft das Geschirr aus dem Fenster", - "Katze, Hund" - ] - }, - "diceDescription": "Würfel mit dem d20-Syntax.", - "diceExtended": { - "usages": [ - "Würfeln" - ], - "extendedHelp": "Die Funktionsweise dieses Commands ist einfach. Du hast einen Würfel den du __x__ mal würfelst. Jedoch kannst du die Seitenanzahl auf __y__ seiten konfigurieren. Standardmäßig hat der Würfel 6 Seiten. Du kannst ebenso die Anzahl der Würfelvorgänge konfigurieren und der Würfel wird eine zufällige Zahl zwischen 1 und der Seitenzahl würfeln. Beispielsweise einen 6 seitigen Würfel 3 mal würfeln ergibt eine Sequenz aus 3 zufälligen Zahlen zwischen 1 und 6, wie etwa: 3,1,6; Dieser command wird mit 10 antworten.", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "Benutze das Fluchtseil aus Pokémon.", - "escaperopeExtended": { - "extendedHelp": "**Skyra** benutzte **Fluchtseil**." - }, - "loveDescription": "Liebesmeter, online!", - "loveExtended": { - "usages": [ - "Benutzer" - ], - "extendedHelp": "Hey! Wilst du das Liebesmeter überprüfen? Es ist ein komisches Gerät, aber viele Menschen lieben es! Sei nicht schüchtern und probier es!", - "explainedUsage": [ - [ - "Benutzer", - "Der zu bewertende Benutzer." - ] - ], - "examples": [ - "Skyra" - ] - }, - "popDescription": "Erzeugt ein Board zu Pop, Pop, Pop, Pop und Pop.", - "popExtended": { - "usages": [ - "Dauer", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Dauer", - "" - ], - [ - "", - "" - ], - [ - "", - "Die Anzahl der Zeilen, die das Brett haben soll. Standard sind 3." - ], - [ - "", - "Die Länge der Pops und der Lösung, Standard sind 3." - ] - ], - "examples": [ - "15", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "Lass Bots Meinungen haben und jemanden bewerten.", - "rateExtended": { - "usages": [ - "Inhalt" - ], - "extendedHelp": "Nur weil ich ein Bot bin bedeutet das nicht, dass ich dich nicht richtig bewerten kann. Ich kann dich mit einem Zufallszahlengenerator bewerten, um den Prozess zu vereinfachen. Okay okay, es ist nicht fair, aber ich meine... Ich kann dir auch eine 💯 geben.", - "explainedUsage": [ - [ - "Benutzer", - "Der zu bewertende Benutzer." - ] - ], - "examples": [ - "Skyra", - "Ich" - ] - }, - "shindeiruDescription": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "Benutzer" - ], - "extendedHelp": "\"Du bist schon tot\" Japanisch: お前はもう死んでいる; Omae Wa Mou Shindeiru, ist ein Ausdruck aus der Manga und Anime Serie Fist of the North Star. Diese zeigt einen Comicstrip des Charakters, der die vorgenannten Worte ausspricht, woraufhin der Gegner mit \"nani?\" (was?) antwortet.", - "examples": [ - "Skyra" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "Hilfreiche Beschreibungen? Das machen wir hier nicht", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "Lese Comics von XKCD.", - "xkcdExtended": { - "usages": [ - "Comicnummer", - "Comic Name" - ], - "extendedHelp": "**xkcd** ist ein Archiv für Nerd-Comics voller Mathematik, Wissenschaft, Sarkasmus und Sprachen. Wenn du kein Argument angibst, werde ich einen zufälligen Comic von xkcd auswählen. Wenn du eine Nummer angibst werde ich den Comic mit dieser Nummer abrufen. Aber wenn du einen Titel/Text/Thema angibst, werde ich einen Comic suchen, der mit dieser Eingabe übereinstimmt und ihn anzeigen. Zum Beispiel wird `Skyra, xkcd Curiosity` die Comicnummer 1091 anzeigen.", - "explainedUsage": [ - [ - "Suchanfrage", - "Entweder die Nummer des Comics, oder der zu suchende Titel." - ] - ], - "examples": [ - "1091", - "Neugierde" - ] - }, - "choiceOutput": "🕺 *Ene, mene, miste, deine Muddah rappelt in der Kiste...* {{user}}, Ich wähle: {{word, codeBlock}}", - "choiceMissing": "Bitte gebe mindestens zwei durch ein Komma getrennte Optionen an.", - "choiceDuplicates": "Warum sollte ich doppelte Wörter akzeptieren? \"{{words}}\".", - "diceOutput": "Du hast den Würfel gerollt! Du hast eine: **{{result}}**", - "diceRollsError": "Die Anzahl der Würfelvorgänge muss eine Zahl zwischen 1 und 1024 sein.", - "diceSidesError": "Die Anzahl der Seiten muss eine Zahl zwischen 3 und 1024 sein.", - "escaperopeOutput": "**{{user}}** benutzte **Fluchtseil**", - "loveLess45": "Versuch es beim nächstes mal erneut...", - "loveLess75": "Gut genug!", - "loveLess100": "Guter Treffer!", - "love100": "Perfekte Übereinstimmung!", - "loveItself": "Du bist ein spezielles Wesen und solltest dich mehr als alle anderen Lieben <3", - "loveResult": "Ergebnis", - "rateOutput": "**{{author}}**, ich würde **{{userToRate}}** eine **{{rate}}**/100 {{emoji}} geben", - "rateMyself": [ - ". Ich liebe mich sehr 😊", - "Mich Selbst" - ], - "rateOwners": [ - ". Ich liebe meine Entwickler sehr 🥰", - "meine Entwickler" - ], - "xkcdComics": "Es gibt nur {{amount}} Comics.", - "xkcdNotfound": "Ich habe weit und breit gesucht, aber ich hatte kein Glück diesen Comic zu finden, versuche es später noch einmal oder versuche einen anderen!" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/game.json b/src/languages/de-DE/commands/game.json deleted file mode 100644 index 0290155cdd7..00000000000 --- a/src/languages/de-DE/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "Spiele Connect-Four mit jemandem.", - "c4Extended": { - "usages": [ - "Benutzer" - ], - "extendedHelp": "Dieses Spiel wird am besten auf dem PC gespielt.\nConnect Four ist ein Zwei-Spieler-Verbindungsspiel, bei dem die Spieler zuerst eine Farbe auswählen und dann farbige Scheiben von oben in ein raster aus Sieben Spalten und Sechs Reihen fallen lassen.", - "examples": [ - "Skyra" - ] - }, - "c4Prompt": "Lieber {{challengee}}, du wurdest von {{challenger}} in einem Connect-Four-Spiel herausgefordert. Klicken Sie auf die Reaktion 🇾, um zu akzeptieren!", - "cannotHaveNegativeMoney": "Du kannst keinen negativen Betrag von {{SHINY}}s haben.", - "coinFlipHeadNames": [ - "kopf", - "kopf", - "h" - ], - "coinFlipTailNames": [ - "Zahl", - "Zahl", - "t" - ], - "coinFlipCoinNames": [ - "Kopf", - "Zahl" - ], - "coinFlipDescription": "Wirf eine Münze!", - "coinFlipExtended": { - "usages": [ - "kopf/zahl", - "bargeldlos kopf", - "zahl Wette" - ], - "extendedHelp": "Wirf eine Münze. Wenn du die Seite errätst die erscheint, erhälst du deinen Wetteinsatz zurück, verdoppelt.\nWenn nicht, dann verlierst du deinen Einsatz.\nDu kannst auch einen bargeldlosen Wurf durchführen, der nichts kostet, aber dich auch nicht belohnt.\nJetzt lass die Münzen fliegen.", - "explainedUsage": [ - [ - "kopf/zahl", - "Ob du denkst dass die Münze auf Kopf oder Zahl landen wird." - ], - [ - "bargeldlos, Wette", - "Wenn geldlos (standard) dann verbrauchst du keine shinies für den Münzwurf (nützlich für RPG spiele oder das fällen einer Entscheidung). Du kannst auch shinies für ein Glücksspiel verwetten." - ] - ], - "examples": [ - "Kopf", - "Kopf 50", - "Zahl 200", - "Zahl geldlos" - ] - }, - "coinFlipInvalidCoinName": "Entschuldigung, aber {{parameter}} ist keine Münzseite!", - "coinFlipLoseDescription": "Die Münze wurde geworfen, und zeigte {{result}}. Du hast nicht richtig geraten.", - "coinFlipLoseDescriptionWithWager": "Die Münze wurde geworfen, und zeigte {{result}}. Du hast nicht richtig geraten und {{wager}} {{SHINY}} verloren.", - "coinFlipLoseTitle": "Du hast verloren.", - "coinFlipNoguessDescription": "Die Münze wurde geworfen und zeigt {{result}}.", - "coinFlipNoguessTitle": "Du hast eine Münze geworfen.", - "coinFlipWinDescription": "Die Münze wurde geworfen, und zeigte {{result}}. Du hast hast richtig geraten!", - "coinFlipWinDescriptionWithWager": "Die Münze wurde geworfen, und zeigte {{result}}. Du hast richtig geraten und {{wager}} {{SHINY}} gewonnen!", - "coinFlipWinTitle": "Du hast gewonnen!", - "gamesBot": "Es tut mir leid, aber ich glaube nicht, dass sie aufhören wollen, das zu tun, was sie tun, um mit Menschen zu spielen.", - "gamesNoPlayers": "Bitte gib ein paar Tribute an, um die Hungerspiele zu spielen, z.B.: `{{prefix}}hg Bob, Mark, Jim, Kyra`", - "gamesProgress": "Tut mir leid, gerade findet in diesem Channel ein Spiel statt, versuche es noch einmal nachdem das Spiel beendet ist.", - "gamesPromptDeny": "Tut mir leid, der herausgeforderte User hat es abgelehnt zu spielen.", - "gamesRepeat": "Es tut mir leid, aber ein User kann nicht zweimal spielen.", - "gamesSelf": "Du musst wirklich traurig sein um gegen dich selbst zu spielen. Versuchs nochmal mit einem anderen User.", - "gamesTooManyOrFew": "Es tut mir leid, aber die Anzahl der Spieler ist kleiner als {{min}} oder größer als {{max}}.", - "hgBloodbath": [ - "{1} schnappt sich eine Schaufel.", - "{1} schnappt sich einen Rucksack und zieht sich zurück.", - "{1} und {2} kämpfen um eine Tasche. {1} gibt auf und zieht sich zurück.", - "{1} und {2} kämpfen um eine Tasche. {2} gibt auf und zieht sich zurück.", - "{1} findet einen Bogen, einige Pfeile und einen Köder.", - "{1} rennt zum Füllhorn und versteckt sich.", - "{1} nimmt eine Handvoll Wurfmesser.", - "{1} reißt {2} einen Streitkolben aus den Händen.", - "{1} findet einen Wasserbeutel.", - "{1} bleibt beim Füllhorn um ressourcen zu sammeln.", - "{1} sammelt so viel Nahrung wie möglich.", - "{1} schnappt sich ein Schwert.", - "{1} nimmt sich einen Speer aus dem Füllhorn.", - "{1} findet eine Tasche voller Sprengstoffe.", - "{1} greift sich ein Erste-Hilfe-Set und renn weg.", - "{1} nimmt sich eine Sichel aus dem Füllhorn.", - "{1}, {2}, und {3} arbeiten zusammen, um so viele Vorräte wie möglich zu sammeln.", - "{1} läuft mit einem Feuerzeug und etwas Seil weg.", - "{1} erbeutet eine Flasche Alkohol und einen Lumpen.", - "{1} findet einen Rucksack voller Campingausrüstung.", - "{1} schnappt sich einen Rucksack, erkennt aber nicht, dass dieser leer ist.", - "{1} bricht die Nase von {2} für einen Korb Brot.", - "{1}, {2}, {3} und {4} teilen alles, was sie gesammelt haben, bevor sie weggelaufen sind.", - "{1} holt sich einen Dreizack aus dem Füllhorn.", - "{1} schnappt ein Gefäß aus Köder, während {2} Angelausrüstung erhält.", - "{1} verjagt {2} vom Füllhorn.", - "{1} schnappt sich einen Schild der an dem Füllhorn lehnt.", - "", - "{1} schnappt sich ein einsames Paar Hosen.", - "{1T} steigt zu früh vom Podium und explodiert.", - "{1} wirft ein Messer in den Kopf von {2T}.", - "{1T} tritt versehentlich auf eine Landmine.", - "", - "{1} und {2} ertränken zusammen {3T}.", - "{1} erwürgt {2T} nach einem Faustkampf.", - "{1} schießt einen Pfeil in den Kopf von {2T}.", - "{1T} kommt mit der Situation nicht klar und bringt sich um.", - "{1} schlägt den Kopf von {2T} mehrmals gegen einen Felsen.", - "{1} bricht {2T} das Genick.", - "{1} enthauptet {2T} mit einem Schwert.", - "{1} sticht {2T} einen Speer in den Abdomen.", - "{1} zündet {2T} mit einem Molotov an.", - "{1T} fällt in eine Grube und stirbt.", - "{1} ersticht {2T} hinterrücks.", - "{1} verletzt {2T} schwer, aber beendet ihr Leid.", - "{1} verletzt {2T} schwer und lässt sie sterben.", - "{1} schlägt den Kopf von {2T} mit einem Streitkolben ein.", - "{1} schubst während eines Messerkampfes {2T} von einer Klippe runter.", - "{1} wirft ein Messer in die Brust von {2T}.", - "{1T} kann {2} nicht davon überzeugen, sie nicht zu töten.", - "{1} überzeugt {2T}, sie nicht zu töten, nur um {2T} stattdessen zu töten.", - "{1T} fällt in einen gefrorenen See und ertrinkt.", - "{1}, {2}und {3T} beginnen zu kämpfen, aber {2} läuft weg während {1} {3T} tötet.", - "{1} tötet {2T} mit seiner eigenen Waffe.", - "{1} überwältigt und tötet {2T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}.", - "{1} löst einen Sprengsatz aus und tötet {2T} und {3T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}, {3T} und {4T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}, {3T}, {4T} und {5T}.", - "{1} tötet {2T}, während sie versuchen wegzulaufen.", - "{1T} und {2T} drohen mit einem doppelten Selbstmord. Es scheitert und sie sterben.", - "{1T}, {2T}, {3T} und {4T} gehen einen Selbstmordpakt ein und töten sich selbst.", - "{1} tötet {2T} mit einer Axt.", - "{1} und {2} kämpfen gegen {3T} und {4T}. {1} und {2} überleben.", - "{1T} und {2T} kämpfen gegen {3} und {4}. {3} und {4} überleben.", - "{1T} greift {2} an, aber {3} schützt sie und tötet {1T}.", - "{1} verletzt {2T} mit einem Schwert schwer.", - "{1} erwürgt {2T} mit einem Seil.", - "{1} tötet {2T} für seine Vorräte.", - "{1} schießt einen Pfeil auf {2}, verfehlt aber und tötet stattdessen {3T}.", - "{1} schießt einen giftigen Pfeil in den Hals von {2T} ab, und tötet sie langsam.", - "{1} ersticht {2T} mit einem Zweig.", - "{1} sticht mit einem Dreizack {2T} in den Rücken.", - "{1}, {2T} und {3T} stürzen sich in einen Kampf. {1} tötet beide erfolgreich.", - "{1T}, {2} und {3T} stürzen sich in einen Kampf. {2} tötet beide erfolgreich.", - "{1T}, {2T} und {3} stürzen sich in einen Kampf. {3} tötet beide erfolgreich.", - "{1} findet {2T} welche sich im Füllhorn versteckt und tötet Sie.", - "{1T} findet {2} im Füllhorn versteckt, aber {2} tötet Sie.", - "{1} tötet {2T} mit einer Sichel.", - "{1} und {2T} kämpfen um eine Tasche. {1} erwürgt {2T} mit den Riemen und läuft weg.", - "{1T} und {2} kämpfen um eine Tasche. {2} erwürgt {1T} mit den Riemen und läuft weg.", - "{1} sticht {2T} mit einem Sais zu Tode.", - "{1T} stolpert beim wegrennen vor dem Füllhorn und wird von {2} umgebracht.", - "{1} stolpert beim Wegrennen von dem Füllhorn, {2} hilft ihr auf und sie rennen zusammen weg.", - "{1} zielt einen Pfeil auf den Kopf von {2} und schießt ab, {3T} springt in den Weg und opfert sein Leben, um ihn zu retten." - ], - "hgDay": [ - "{1} geht jagen.", - "{1} verletzt sich selbst.", - "{1} erkundet die Arena.", - "{1} schreckt {2} ab.", - "{1} lenkt {2} ab und läuft weg.", - "{1} stalked {2}.", - "{1} fischt.", - "{1} tarnt sich selbst in den Büschen.", - "{1} klaut von {2} während sie wegschauen.", - "{1} macht einen Holzspeer.", - "{1} entdeckt eine Höhle.", - "{1} attackiert {2}, aber sie schaffen es zu entkommen.", - "{1} verfolgt {2}.", - "{1} rennt vor {2} davon.", - "{1} sammelt Früchte von einem Baum.", - "{1} erhält eine Axt von einem unbekannten Sponsor.", - "{1} erhält sauberes Wasser von einem unbekannten Sponsor.", - "{1} erhält medizinische Hilfsmittel von einem unbekannten Sponsor.", - "{1} erhält frisches Essen von einem unbekannten Sponsor.", - "{1} sucht nach einer Wasserquelle.", - "{1} besiegt {2} in einem Kampf, verschont aber ihr Leben.", - "{1} und {2} arbeiten für den Tag zusammen.", - "{1} fleht {2} an sie zu töten. Sie weigern sich und lassen {1} am Leben.", - "{1} versucht den ganzen Tag zu schlafen.", - "{1}, {2}, {3} und {4} plündern {5}'s Camp während sie Jagen.", - "{1} baut eine Hütte auf.", - "{1} hört wie {2} und {3} in der Ferne reden.", - "{1} übt Bogenschießen.", - "{1} denkt an zu Hause.", - "{1} wird während dem Beeren sammeln von Dornen gespickt.", - "{1} versucht mit einem Dreizack zu fischen.", - "{1} sucht nach Feuerholz.", - "{1} und {2} teilen sich auf, um nach Ressourcen zu suchen.", - "{1} pflückt Blumen.", - "{1} kümmert sich um {2}'s Wunden.", - "{1} sieht in der Ferne Rauch aufsteigen, unterlässt aber weitere Untersuchungen.", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "{1} tötet {2T} mit seiner eigenen Waffe.", - "{1} überwältigt und tötet {2T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}.", - "{1} löst einen Sprengsatz aus und tötet {2T} und {3T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}, {3T} und {4T}.", - "{1} löst einen Sprengsatz aus und tötet {2T}, {3T}, {4T} und {5T}.", - "{1} tötet {2T}, während sie versuchen wegzulaufen.", - "{1T} und {2T} drohen mit einem doppelten Selbstmord. Es scheitert und sie sterben.", - "{1T}, {2T}, {3T} und {4T} gehen einen Selbstmordpakt ein und töten sich selbst.", - "{1T} stirbt an Unterkühlung.", - "{1T} stirbt an Hunger.", - "{1T} stirbt an Durst.", - "{1} tötet {2T} mit einer Axt.", - "{1} und {2} kämpfen gegen {3T} und {4T}. {1} und {2} überleben.", - "{1T} und {2T} kämpfen gegen {3} und {4}. {3} und {4} überleben.", - "{1T} stirbt beim Versuch, der Arena zu entkommen.", - "{1T} stirbt an Dysenterie.", - "{1T} löst versehentlich eine Landmine aus, beim versuch sie scharf zu stellen.", - "{1T} greift {2} an, aber {3} schützt sie und tötet {1T}.", - "{1} überrascht und tötet {2T}.", - "{1T} tritt versehentlich auf eine Landmine.", - "{1} verletzt {2T} mit einem Schwert schwer.", - "{1} erwürgt {2T} mit einem Seil.", - "{1} tötet {2T} für seine Vorräte.", - "{1} schießt einen Pfeil auf {2}, verfehlt aber und tötet stattdessen {3T}.", - "{1} schießt einen giftigen Pfeil in den Hals von {2T} ab, und tötet sie dadurch langsam.", - "{1}, {2}, und {3} überraschen und töten {4T}, {5T}, und {6T}.", - "{1T}, {2T}, und {3T} uüberraschen {4}, {5} und {6}, werden aber von ihnen getötet.", - "{1} ersticht {2T} mit einem Zweig.", - "", - "", - "", - "", - "{1} vergiftet {2T}'s Getränk. Sie trinken es und sterben.", - "{1} sticht mit einem Dreizack {2T} in den Rücken.", - "{1T} versucht, auf einen Baum zu klettern, fällt aber auf {2T}, und tötet beide.", - "{1}, {2T} und {3T} stürzen sich in einen Kampf. {1} tötet beide erfolgreich.", - "{1T}, {2} und {3T} stürzen sich in einen Kampf. {2} tötet beide erfolgreich.", - "{1T}, {2T} und {3} stürzen sich in einen Kampf. {3} tötet beide erfolgreich.", - "{1} tötet {2T} mit einer Sichel.", - "", - "", - "", - "", - "{1} verfolgt und tötet {2T}.", - "{1} sticht {2T} mit einem Sais zu Tode.", - "", - "{1} jagt einen Schmetterling.", - "{1T} fällt von einer Klippe und wird von einem Stock aufgespießt.", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/general.json b/src/languages/de-DE/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/de-DE/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/google.json b/src/languages/de-DE/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/de-DE/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/management.json b/src/languages/de-DE/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/de-DE/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/misc.json b/src/languages/de-DE/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/de-DE/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/moderation.json b/src/languages/de-DE/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/de-DE/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/social.json b/src/languages/de-DE/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/de-DE/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/starwars.json b/src/languages/de-DE/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/de-DE/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/suggestion.json b/src/languages/de-DE/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/de-DE/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/system.json b/src/languages/de-DE/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/de-DE/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/tags.json b/src/languages/de-DE/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/de-DE/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/tools.json b/src/languages/de-DE/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/de-DE/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/commands/twitch.json b/src/languages/de-DE/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/de-DE/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/de-DE/constants.ts b/src/languages/de-DE/constants.ts deleted file mode 100644 index 0f7f63d390e..00000000000 --- a/src/languages/de-DE/constants.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Handler } from '#lib/i18n/structures/Handler'; -import { TimeTypes } from '@sapphire/time-utilities'; - -export class ExtendedHandler extends Handler { - public constructor() { - super({ - name: 'de-DE', - duration: { - [TimeTypes.Year]: { - 1: 'Jahr', - DEFAULT: 'Jahre' - }, - [TimeTypes.Month]: { - 1: 'Monat', - DEFAULT: 'Monate' - }, - [TimeTypes.Week]: { - 1: 'Woche', - DEFAULT: 'Wochen' - }, - [TimeTypes.Day]: { - 1: 'Tag', - DEFAULT: 'Tage' - }, - [TimeTypes.Hour]: { - 1: 'Stunde', - DEFAULT: 'Stunden' - }, - [TimeTypes.Minute]: { - 1: 'Minute', - DEFAULT: 'Minuten' - }, - [TimeTypes.Second]: { - 1: 'Sekunde', - DEFAULT: 'Sekunden' - } - } - }); - } - - public ordinal(cardinal: number): string { - return `${cardinal}er`; - } -} diff --git a/src/languages/de-DE/errors.json b/src/languages/de-DE/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/errors.json b/src/languages/de-DE/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/guilds-logs.json b/src/languages/de-DE/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/guilds-members.json b/src/languages/de-DE/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/messages.json b/src/languages/de-DE/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/moderation.json b/src/languages/de-DE/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/noMentionSpam.json b/src/languages/de-DE/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/reactions.json b/src/languages/de-DE/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/events/twitch.json b/src/languages/de-DE/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/fuzzySearch.json b/src/languages/de-DE/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/globals.json b/src/languages/de-DE/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/guilds.json b/src/languages/de-DE/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/humanLevels.json b/src/languages/de-DE/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/moderation.json b/src/languages/de-DE/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/moderationActions.json b/src/languages/de-DE/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/de-DE/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/de-DE/permissions.json b/src/languages/de-DE/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/preconditions.json b/src/languages/de-DE/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/promptList.json b/src/languages/de-DE/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/selfModeration.json b/src/languages/de-DE/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/serializers.json b/src/languages/de-DE/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/settings.json b/src/languages/de-DE/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/de-DE/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/de-DE/system.json b/src/languages/de-DE/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/de-DE/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/arguments.json b/src/languages/en-GB/arguments.json deleted file mode 100644 index dbf987ba19c..00000000000 --- a/src/languages/en-GB/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "Disabled", - "booleanEnabled": "Enabled", - "booleanFalseOptions": [ - "false", - "f", - "no", - "n", - "off", - "disable", - "disabled", - "0", - "-" - ], - "booleanTrueOptions": [ - "true", - "t", - "yes", - "y", - "on", - "enable", - "enabled", - "1", - "+" - ], - "caseLatestOptions": [ - "last", - "latest" - ], - "categoryChannelError": "", - "channelError": "", - "color": "I could not resolve `{{parameter}}` to a valid colour. These are some of the valid formats:\n\n- `#dfdfdf` (HEX codes).\n- `\"rgb(200, 200, 200)\"` (RGB).\n- `\"hsl(350, 100, 100)\"` (HSL).\n- `14671839` (base 10).", - "command": "I could not resolve `{{parameter}}` to a command! Make sure you typed its name or one of its aliases correctly!", - "commandMatch": "I could not match `{{parameter}}` to a command nor category, these are some of the valid formats:\n\n- `ping` (matches the ping command only).\n- `social.*` (matches all commands under the **Social** category).\n- `social.member management.*` (matches all commands under **Social** > **Member Management** sub-category).\n\n> **Hint**: When checking `{{commandContext.commandPrefix}}help`, the category of each command is located at the top of the embed.", - "dateError": "", - "dateFormats": "- `2016-11-24` (YYYY-MM-DD)\n- `2016-11-24T23:56` (YYYY-MM-DDTHH:mm)\n- `2016-11-24T23:56:12` (YYYY-MM-DDTHH:mm:ss)\n- `2016-11-24T23:56:12.000` (YYYY-MM-DDTHH:mm:ss.sss)\n\n> **Tip**: The last 3 formats accept `Z` at the end to mark the time as UTC. Alternatively, you can input your timezone's offset by adding `+HH:MM`, e.g. `+01:00`.", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "I could not resolve `{{parameter}}` to a valid duration, there are some of the valid formats:\n\n$t(arguments:durationFormats)", - "durationFormats": "- `4h` (4 hours).\n- `20m5s` (20 minutes and 5 seconds).\n- `\"1w 2d 16h 40m 10s\"` (1 week, 2 days, 16 hours, 40 minutes, and 10 seconds).", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "invite": "I could not resolve `{{parameter}}` to a valid invite link, they have one of the following formats:\n\n- `https://discord​.gg/6gakFR2`.\n- `https://discord​.com/invite/6gakFR2`.\n- `https://discordapp​.com/invite/6gakFR2`.\n\n> **Tip**: You can omit the `https://` part, `discord​.gg/6gakFR2` is also accepted as a valid parameter.", - "language": "I could not resolve `{{parameter}}` to a valid language code!\n**Hint**: the following are supported: {{possibles, andList}}.\n\n> **Tip**: You can add more (or improve the existing ones) at !", - "memberError": "", - "memberMissingGuild": "I was not able to resolve `{{parameter}}` because this argument requires to be run in a server channel.", - "messageError": "", - "missing": "", - "newsChannel": "I could not resolve `{{parameter}}` to an announcement channel, please make sure you typed its name or ID correctly!\n\n> **Tip**: You can also mention it!", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "piece": "I could not resolve `{{parameter}}` to a piece! Make sure you typed its name or one of its aliases correctly!", - "resetPossibles": [ - "off", - "reset" - ], - "roleError": "", - "roleMissingGuild": "I was not able to resolve `{{parameter}}` because this argument requires to be run in a server channel.", - "scopeGlobal": "global", - "scopeLocal": "local", - "snowflake": "I could not resolve `{{parameter}}` to a valid snowflake! They're numbers with 17 to 18 digits, for example, your message has a snowflake of `{{message.id}}`!", - "store": "I could not resolve `{{parameter}}` to a valid store!\n**Hint**: the following are supported: {{possibles, andList}}.", - "stringTooLong": "The parameter `{{parameter}}` is too long! It needs to have less than {{maximum}} character(s)!", - "stringTooShort": "The parameter `{{parameter}}` is too short! It needs to have at least {{minimum}} character(s)!", - "time": "I could not resolve `{{parameter}}` to a valid time!\n**Hint**: the following formats are supported:\n\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpan": "I could not resolve `{{parameter}}` to a valid duration, make sure you typed a valid integer or a duration formatted value. Some of the valid formats are:\n\n- `45` (45 seconds).\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpanTooBig": "The parameter `{{parameter}}` resolved to a duration longer than {{maximum, duration}}, which is not allowed!", - "timeSpanTooSmall": "The parameter `{{parameter}}` resolved to a duration shorter than {{minimum, duration}}, which is not allowed!", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/arguments/image.json b/src/languages/en-GB/arguments/image.json deleted file mode 100644 index ba3703012d1..00000000000 --- a/src/languages/en-GB/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} I was unable to get an avatar for {{value}}." -} \ No newline at end of file diff --git a/src/languages/en-GB/arguments/range.json b/src/languages/en-GB/arguments/range.json deleted file mode 100644 index 8200158d12c..00000000000 --- a/src/languages/en-GB/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} must be a number or a range of numbers." -} \ No newline at end of file diff --git a/src/languages/en-GB/assertions.json b/src/languages/en-GB/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/colors.json b/src/languages/en-GB/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/commands/admin.json b/src/languages/en-GB/commands/admin.json deleted file mode 100644 index 572537fc9cf..00000000000 --- a/src/languages/en-GB/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} may not be disabled.", - "confUpdated": "", - "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": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "**Server Setting {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` can only be configured through the web dashboard ()", - "confSettingNotSet": "Not Set", - "rolesetDescription": "Manage unique role sets.", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "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": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/animal.json b/src/languages/en-GB/commands/animal.json deleted file mode 100644 index 7a5337d7184..00000000000 --- a/src/languages/en-GB/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "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": "" - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/animation.json b/src/languages/en-GB/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/en-GB/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/fun.json b/src/languages/en-GB/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/en-GB/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/game.json b/src/languages/en-GB/commands/game.json deleted file mode 100644 index 66e0dbc06a7..00000000000 --- a/src/languages/en-GB/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "Play Connect Four with somebody.", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "Flip a coin!", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "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": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "Play noughts and crosses with somebody.", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/general.json b/src/languages/en-GB/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/en-GB/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/google.json b/src/languages/en-GB/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/en-GB/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/management.json b/src/languages/en-GB/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/en-GB/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/misc.json b/src/languages/en-GB/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/en-GB/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/moderation.json b/src/languages/en-GB/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/en-GB/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/social.json b/src/languages/en-GB/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/en-GB/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/starwars.json b/src/languages/en-GB/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/en-GB/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/suggestion.json b/src/languages/en-GB/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/en-GB/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/system.json b/src/languages/en-GB/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/en-GB/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/tags.json b/src/languages/en-GB/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/en-GB/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/tools.json b/src/languages/en-GB/commands/tools.json deleted file mode 100644 index e3f4424b355..00000000000 --- a/src/languages/en-GB/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "View somebody's avatar at full size.", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "As this command's name says, it shows somebody's avatar.", - "explainedUsage": [ - [ - "", - "" - ] - ], - "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": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "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": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "channel", - "" - ], - [ - "message", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/commands/twitch.json b/src/languages/en-GB/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/en-GB/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/en-GB/constants.ts b/src/languages/en-GB/constants.ts deleted file mode 100644 index 89be0de9abf..00000000000 --- a/src/languages/en-GB/constants.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Handler } from '#lib/i18n/structures/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 deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/errors.json b/src/languages/en-GB/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/guilds-logs.json b/src/languages/en-GB/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/guilds-members.json b/src/languages/en-GB/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/messages.json b/src/languages/en-GB/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/moderation.json b/src/languages/en-GB/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/noMentionSpam.json b/src/languages/en-GB/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/events/reactions.json b/src/languages/en-GB/events/reactions.json deleted file mode 100644 index 44e9beb1638..00000000000 --- a/src/languages/en-GB/events/reactions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "reaction": "Reaction Added", - "filterFooter": "Filtered Reaction", - "filter": "{{REDCROSS}} Hey {{user}}, please do not add that reaction!" -} \ No newline at end of file diff --git a/src/languages/en-GB/events/twitch.json b/src/languages/en-GB/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/fuzzySearch.json b/src/languages/en-GB/fuzzySearch.json deleted file mode 100644 index 723d339490f..00000000000 --- a/src/languages/en-GB/fuzzySearch.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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." -} \ No newline at end of file diff --git a/src/languages/en-GB/globals.json b/src/languages/en-GB/globals.json deleted file mode 100644 index d09c75c04a1..00000000000 --- a/src/languages/en-GB/globals.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "default": "{{key}} has not been localised for en-GB yet.", - "defaultLanguage": "Default Language", - "no": "No", - "none": "None", - "unknown": "unknown", - "yes": "Yes", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}", - "dateFormat": "DD/MM/YYYY", - "dateFormatExplanation": "Day/Month/Year" -} \ No newline at end of file diff --git a/src/languages/en-GB/guilds.json b/src/languages/en-GB/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/moderation.json b/src/languages/en-GB/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/moderationActions.json b/src/languages/en-GB/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/en-GB/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/en-GB/permissions.json b/src/languages/en-GB/permissions.json deleted file mode 100644 index 8de150d0674..00000000000 --- a/src/languages/en-GB/permissions.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "ADD_REACTIONS": "Add reactions", - "ADMINISTRATOR": "Administrator", - "ATTACH_FILES": "Attach files", - "BAN_MEMBERS": "Ban members", - "CHANGE_NICKNAME": "Change nickname", - "CONNECT": "Connect", - "CREATE_INSTANT_INVITE": "Create invite", - "CREATE_PRIVATE_THREADS": "Create private threads", - "CREATE_PUBLIC_THREADS": "Create public threads", - "DEAFEN_MEMBERS": "Deafen members", - "EMBED_LINKS": "Embed links", - "KICK_MEMBERS": "Kick members", - "MANAGE_CHANNELS": "Manage channels", - "MANAGE_EMOJIS_AND_STICKERS": "Manage emojis and stickers", - "MANAGE_EVENTS": "Manage events", - "MANAGE_GUILD": "Manage server", - "MANAGE_MESSAGES": "Manage messages", - "MANAGE_NICKNAMES": "Manage nicknames", - "MANAGE_ROLES": "Manage roles", - "MANAGE_THREADS": "Manage threads", - "MANAGE_WEBHOOKS": "Manage webhooks", - "MENTION_EVERYONE": "Mention everyone, here and all roles", - "MODERATE_MEMBERS": "Time out members", - "MOVE_MEMBERS": "Move members", - "MUTE_MEMBERS": "Mute members", - "PRIORITY_SPEAKER": "Priority speaker", - "READ_MESSAGE_HISTORY": "Read message history", - "REQUEST_TO_SPEAK": "Request to speak", - "SEND_MESSAGES": "Send messages", - "SEND_TTS_MESSAGES": "Send text-to-speech Messages", - "SPEAK": "Speak", - "STREAM": "Video", - "USE_APPLICATION_COMMANDS": "Use application commands", - "USE_EXTERNAL_EMOJIS": "Use external emojis", - "USE_EXTERNAL_STICKERS": "Use external stickers", - "USE_PRIVATE_THREADS": "Create private threads", - "USE_PUBLIC_THREADS": "Create public threads", - "USE_VAD": "Use voice activity", - "VIEW_AUDIT_LOG": "View audit log", - "VIEW_CHANNEL": "View channels", - "VIEW_GUILD_INSIGHTS": "View server insights" -} \ No newline at end of file diff --git a/src/languages/en-GB/preconditions.json b/src/languages/en-GB/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/promptList.json b/src/languages/en-GB/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/selfModeration.json b/src/languages/en-GB/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/serializers.json b/src/languages/en-GB/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/settings.json b/src/languages/en-GB/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/en-GB/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/en-GB/system.json b/src/languages/en-GB/system.json deleted file mode 100644 index 467ecdc3c77..00000000000 --- a/src/languages/en-GB/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "I had a small network error when messaging Discord. Please run this command again!", - "exceededLengthChooseOutput": "Choose one of the following options: {{output, orList}}", - "exceededLengthOutput": "**Output**:{{output}}", - "exceededLengthOutputConsole": "I've sent the result to my console.", - "exceededLengthOutputType": "**Type**:{{type}}", - "exceededLengthOutputTime": "{{time}}", - "exceededLengthOutputFile": "I've sent the result in a file.", - "exceededLengthOutputHastebin": "I've sent the result to hastebin: {{url}}", - "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": { - "aliases": "🖇️ | **Aliases**", - "usages": "📝 | **Command Usage**", - "extendedHelp": "🔍 | **Extended Help**", - "explainedUsage": "⚙ | **Explained usage**", - "possibleFormats": "🔢 | **Possible formats**", - "examples": "🔗 | **Examples**", - "reminders": "⏰ | **Reminder**" - }, - "jumpTo": "Jump to Message ►", - "loading": [ - "{{LOADING}} Watching hamsters run...", - "{{LOADING}} Finding people in 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..." - ], - "messagePromptTimeout": "The prompt has timed out.", - "noResults": "I wasn't able to find any results for that query...", - "parseError": "{{REDCROSS}} I failed to process the data I was given, sorry about that~!", - "prefixReminder": "The prefix in this server is currently set to `{{prefix}}`", - "queryFail": "I'm sorry, but the application could not resolve your request. Are you sure you wrote the name correctly?", - "textPromptAbortOptions": [ - "abort", - "cancel", - "stop" - ], - "reminderHeader": "" -} diff --git a/src/languages/en-US/arguments.json b/src/languages/en-US/arguments.json deleted file mode 100644 index 407704909ff..00000000000 --- a/src/languages/en-US/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "all", - "boolean_one": "I could not resolve `{{parameter}}` to a boolean, the only possible values is: {{possibles}}", - "boolean_other": "I could not resolve `{{parameter}}` to a boolean, the possible values are: {{possibles, orList}}", - "booleanError": "I could not resolve `{{parameter}}` to a boolean, the only possible value is: {{possibles}}", - "booleanDisabled": "Disabled", - "booleanEnabled": "Enabled", - "booleanFalseOptions": [ - "false", - "f", - "no", - "n", - "off", - "disable", - "disabled", - "0", - "-" - ], - "booleanTrueOptions": [ - "true", - "t", - "yes", - "y", - "on", - "enable", - "enabled", - "1", - "+" - ], - "caseLatestOptions": [ - "last", - "latest" - ], - "categoryChannelError": "I could not resolve `{{parameter}}` to a category channel, please make sure you typed its name or ID correctly!", - "channelError": "I could not resolve `{{parameter}}` to a channel, make sure you typed its name or ID correctly!", - "color": "I could not resolve `{{parameter}}` to a valid color, there are some of the valid formats:\n\n- `#dfdfdf` (Hexadecimal).\n- `\"rgb(200, 200, 200)\"` (RGB).\n- `\"hsl(350, 100, 100)\"` (HSL).\n- `14671839` (Base 10).", - "command": "I could not resolve `{{parameter}}` to a command! Make sure you typed its name or one of its aliases correctly!", - "commandMatch": "I could not match `{{parameter}}` to a command nor category, these are some of the valid formats:\n\n- `ping` (matches the ping command only).\n- `social.*` (matches all commands under the **Social** category).\n- `social.member management.*` (matches all commands under **Social** > **Member Management** sub-category).\n\n> **Hint**: When checking `{{commandContext.commandPrefix}}help`, the category of each command is located at the top of the embed.", - "dateError": "I could not resolve `{{parameter}}` to a date, there are some of the valid formats:\n\n$t(arguments:dateFormats)", - "dateFormats": "- `2016-11-24` (YYYY-MM-DD)\n- `2016-11-24T23:56` (YYYY-MM-DDTHH:mm)\n- `2016-11-24T23:56:12` (YYYY-MM-DDTHH:mm:ss)\n- `2016-11-24T23:56:12.000` (YYYY-MM-DDTHH:mm:ss.sss)\n\n> **Tip**: The last 3 formats accept `Z` at the end to mark the time as UTC. Alternatively, you can input your timezone's offset by adding `+HH:MM`, e.g. `+01:00`.", - "dateTooEarly": "The parameter `{{parameter}}` resolved to a date earlier than {{minimum, dateTime}}, which is not allowed!", - "dateTooFar": "The parameter `{{parameter}}` resolved to a date older than {{maximum, dateTime}}, which is not allowed!", - "dmChannelError": "I could not resolve `{{parameter}}` to a DM channel, make sure you typed its ID correctly!", - "duration": "I could not resolve `{{parameter}}` to a valid duration, there are some of the valid formats:\n\n$t(arguments:durationFormats)", - "durationFormats": "- `4h` (4 hours).\n- `20m5s` (20 minutes and 5 seconds).\n- `\"1w 2d 16h 40m 10s\"` (1 week, 2 days, 16 hours, 40 minutes, and 10 seconds).", - "emoji": "I could not resolve `{{parameter}}` to a valid emoji, are you sure you used a valid twemoji (e.g. 🌊) or an emoji (e.g. {{GREENTICK}})?", - "floatError": "I could not resolve `{{parameter}}` to a number!", - "floatTooLarge": "The parameter `{{parameter}}` is too high! It needs to be less than {{maximum}}!", - "floatTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "guildChannelError": "I could not resolve `{{parameter}}` to a channel from this server, please make sure you typed its name or ID correctly!", - "guildChannelMissingGuildError": "I was not able to resolve `{{parameter}}` because this argument requires to be run in a server channel.", - "guildPrivateThreadChannelError": "I could not resolve `{{parameter}}` to a private thread channel, please make sure you typed its name or ID correctly!", - "guildPublicThreadChannelError": "I could not resolve `{{parameter}}` to a public thread channel, please make sure you typed its name or ID correctly!", - "guildStageVoiceChannelError": "I could not resolve `{{parameter}}` to a stage voice channel, please make sure you typed its name or ID correctly!", - "guildTextChannelError": "I could not resolve `{{parameter}}` to a text channel, please make sure you typed its name or ID correctly!\n\n> **Tip**: You can also mention it!", - "guildThreadChannelError": "I could not resolve `{{parameter}}` to a thread channel, please make sure you typed its name or ID correctly!", - "guildVoiceChannelError": "I could not resolve `{{parameter}}` to a voice channel, please make sure you typed its name or ID correctly!", - "hyperlinkError": "I could not resolve `{{parameter}}` to an hyperlink, they are usually formatted similarly as `https://discord.com`!", - "integerError": "I could not resolve `{{parameter}}` to an integer!", - "integerTooLarge": "The parameter `{{parameter}}` is too high! It needs to be less than {{maximum}}!", - "integerTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "invite": "I could not resolve `{{parameter}}` to a valid invite link, they have one of the following formats:\n\n- `https://discord​.gg/6gakFR2`.\n- `https://discord​.com/invite/6gakFR2`.\n- `https://discordapp​.com/invite/6gakFR2`.\n\n> **Tip**: You can omit the `https://` part, `discord​.gg/6gakFR2` is also accepted as a valid parameter.", - "language": "I could not resolve `{{parameter}}` to a valid language code!\n**Hint**: the following are supported: {{possibles, andList}}.\n\n> **Tip**: You can add more (or improve the existing ones) at !", - "memberError": "I could not resolve `{{parameter}}` to a member from this server, please make sure you typed their name or ID correctly!\n\n> **Tip**: You can also use mentions!", - "memberMissingGuild": "I was not able to resolve `{{parameter}}` because this argument requires to be run in a server channel.", - "messageError": "I could not resolve `{{parameter}}` to a message:\n\n- If you used an **ID** (e.g. `{{message.id}}`), make sure you copied the right ID from this channel (<#{{channel}}>), and not, for example, the author's ID.\n- If you used a **message link** (e.g. `{{message.url}}`), make sure it is from a channel from this server, and that both of us have permissions to read it.\n- You did not input a valid parameter, in that case, check the two above!", - "missing": "You need to write another parameter!\n\n> **Tip**: You can do `{{commandContext.commandPrefix}}help {{command.name}}` to find out how to use this command.", - "newsChannel": "I could not resolve `{{parameter}}` to an announcement channel, please make sure you typed its name or ID correctly!\n\n> **Tip**: You can also mention it!", - "numberError": "I could not resolve `{{parameter}}` to a number!", - "numberTooLarge": "The parameter `{{parameter}}` is too high! It needs to be less than {{maximum}}!", - "numberTooSmall": "The parameter `{{parameter}}` is too low! It needs to be at least {{minimum}}!", - "piece": "I could not resolve `{{parameter}}` to a piece! Make sure you typed its name or one of its aliases correctly!", - "resetPossibles": [ - "off", - "reset" - ], - "roleError": "I could not resolve `{{parameter}}` to a role, please make sure you typed its name or ID correctly!\n\n> **Tip**: You can also mention it!", - "roleMissingGuild": "I was not able to resolve `{{parameter}}` because this argument requires to be run in a server channel.", - "scopeGlobal": "global", - "scopeLocal": "local", - "snowflake": "I could not resolve `{{parameter}}` to a valid snowflake! They're numbers with 17 to 18 digits, for example, your message has a snowflake of `{{message.id}}`!", - "store": "I could not resolve `{{parameter}}` to a valid store!\n**Hint**: the following are supported: {{possibles, andList}}.", - "stringTooLong": "The parameter `{{parameter}}` is too long! It needs to have less than {{maximum}} character(s)!", - "stringTooShort": "The parameter `{{parameter}}` is too short! It needs to have at least {{minimum}} character(s)!", - "time": "I could not resolve `{{parameter}}` to a valid time!\n**Hint**: the following formats are supported:\n\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpan": "I could not resolve `{{parameter}}` to a valid duration, make sure you typed a valid integer or a duration formatted value. Some of the valid formats are:\n\n- `45` (45 seconds).\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpanTooBig": "The parameter `{{parameter}}` resolved to a duration longer than {{maximum, duration}}, which is not allowed!", - "timeSpanTooSmall": "The parameter `{{parameter}}` resolved to a duration shorter than {{minimum, duration}}, which is not allowed!", - "tooFewWinners": "The parameter `{{parameter}}` resolved to a number that is too low, it must be at least 1!", - "tooManyWinners": "The parameter `{{parameter}}` resolved to a number that is too high, it must be at maximum 20!", - "unavailable": "Whoops! It seems I couldn't find a parser for a parameter, please contact my developers about it!", - "userError": "I could not resolve `{{parameter}}` to a user, please make sure you typed their ID correctly!\n\n> **Tip**: You can also use mentions!", - "wager": "I am sorry, but {{parameter}} {{SHINY}} is an invalid amount to bet. You can bet one of {{possibles, orList}}", - "winners": "I could not resolve `{{parameter}}` to a valid winner amount!\n**Hint**: the following format is supported: `Nw`, being `N` any integer, e.g. `3w` or `12w`." -} diff --git a/src/languages/en-US/arguments/image.json b/src/languages/en-US/arguments/image.json deleted file mode 100644 index ba3703012d1..00000000000 --- a/src/languages/en-US/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} I was unable to get an avatar for {{value}}." -} \ No newline at end of file diff --git a/src/languages/en-US/arguments/range.json b/src/languages/en-US/arguments/range.json deleted file mode 100644 index a852e4ecae0..00000000000 --- a/src/languages/en-US/arguments/range.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "invalid": "{{name}} must be a number or a range of numbers.", - "max_other": "{{name}} accepts a range of maximum {{maximum}} numbers", - "max_one": "{{name}} accepts a range of maximum {{maximum}} number" -} \ No newline at end of file diff --git a/src/languages/en-US/assertions.json b/src/languages/en-US/assertions.json deleted file mode 100644 index 2c6c5fb3929..00000000000 --- a/src/languages/en-US/assertions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "expectedNonThreadChannel": "Expected a regular text channel, but I received the thread channel {{channel}} instead." -} diff --git a/src/languages/en-US/colors.json b/src/languages/en-US/colors.json deleted file mode 100644 index 7e7f8d54b83..00000000000 --- a/src/languages/en-US/colors.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "invalidBase10": "Color must be within the range 0 - 16777215 (0xFFFFFF), but received `{{value}}`.", - "invalidHexRed": "Invalid Red range. Must be between '00' and 'ff', but received `{{value}}`.", - "invalidHexGreen": "Invalid Green range. Must be between '00' and 'ff', but received `{{value}}`.", - "invalidHexBlue": "Invalid Blue range. Must be between '00' and 'ff', but received `{{value}}`.", - "invalidHslHue": "Invalid Hue range. Must be between 0 and 360, but received `{{value}}`.", - "invalidHslSaturation": "Invalid Saturation range. Must be between 0 and 100, but received `{{value}}`.", - "invalidHslLightness": "Invalid Lightness range. Must be between 0 and 100, but received `{{value}}`.", - "invalidRgbRed": "Invalid Red range. Must be between 0 and 255, but received `{{value}}`.", - "invalidRgbGreen": "Invalid Green range. Must be between 0 and 255, but received `{{value}}`.", - "invalidRgbBlue": "Invalid Blue range. Must be between 0 and 255, but received `{{value}}`." -} diff --git a/src/languages/en-US/commands/admin.json b/src/languages/en-US/commands/admin.json deleted file mode 100644 index b26fe221788..00000000000 --- a/src/languages/en-US/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} may not be disabled.", - "confUpdated": "Successfully updated the key **{{key}}**: {{response}}", - "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": { - "usages": [ - "set NameOfKey Value for Key", - "show", - "show NameOfKey", - "remove NameOfKey Value for Key", - "reset NameOfKey", - "menu" - ], - "extendedHelp": "Allows you to configure Skyra from Discord, as a quick alternative to the [web dashboard](https://skyra.pw).", - "examples": [ - "set language en-GB", - "set channels.moderation-logs #moderation-logs", - "show", - "show channels", - "remove roles.moderator Moderator", - "reset roles.moderator", - "menu" - ], - "reminder": "There are keys and groups, keys that are within a group are named by `GroupName.KeyName`." - }, - "confServer": "**Server Setting {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` can only be configured through the web dashboard ()", - "confSettingNotSet": "Not Set", - "rolesetDescription": "Manage unique role sets.", - "rolesetExtended": { - "usages": [ - "set RoleSetName Role1 Role2 Role3...", - "remove RoleSetName Role1 Role2 Role3...", - "reset", - "reset RoleSetName", - "list", - "RoleSetName Role1 Role2 Role3" - ], - "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." - ], - [ - "RoleSetName", - "The name of the roleset" - ], - [ - "Role1 Role2 Role3", - "The roles to add to the 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": "Updated the {{name}} unique role set, it now has the following roles: {{roles, andList}}.", - "rolesetRemoved": "The {{name}} unique role set will no longer include the following roles: {{roles, andList}}", - "rolesetResetEmpty": "{{REDCROSS}} There are no rolesets configured in this group.", - "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.", - "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", - "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." -} diff --git a/src/languages/en-US/commands/animal.json b/src/languages/en-US/commands/animal.json deleted file mode 100644 index b11a4a2f0f6..00000000000 --- a/src/languages/en-US/commands/animal.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "bunnyDescription": "Let me show you an image of an adorable floofy bunbun ❤.", - "bunnyExtended": { - "extendedHelp": "This command gives a random image from [bunnies.io](https://www.bunnies.io)." - }, - "bunnyEmbedData": { - "title": "Click here if the image fails to load", - "source": "source" - }, - "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 [random.cat](https://aws.random.cat/) to show pictures of the cuttest cats!" - }, - "shibeDescription": "Cute shibas!", - "shibeExtended": { - "extendedHelp": "Everyone loves shibas, I shall love them aswell! They're so adorable ❤" - } -} \ No newline at end of file diff --git a/src/languages/en-US/commands/animation.json b/src/languages/en-US/commands/animation.json deleted file mode 100644 index 7546ce3df91..00000000000 --- a/src/languages/en-US/commands/animation.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "aniListAnimeDescription": "Get data for any anime on AniList.", - "aniListAnimeExtended": { - "examples": [ - "Fate/Zero", - "Pokemon" - ], - "extendedHelp": "This command queries [AniList](https://anilist.co) to show data for the anime you request.", - "usages": [ - "Name of Anime" - ] - }, - "aniListAnimeQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{search}}` is actually an anime?", - "aniListMangaDescription": "Get data for any manga on AniList.", - "aniListMangaExtended": { - "examples": [ - "My Hero Academia", - "Bleach", - "Pokemon" - ], - "extendedHelp": "This command queries [AniList](https://anilist.co) to show data for the manga you request.", - "usages": [ - "Name of Manga" - ] - }, - "aniListMangaQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{search}}` is actually an manga?", - "aniListQueryOnlyNsfw": "{{REDCROSS}} I am sorry, but {{search}} only returned NSFW results which are not allowed here. Why don't you try searching that in an NSFW channel?", - "aniListEmbedTitles": { - "adultContent": "Includes adult content", - "countryOfOrigin": "Country of origin", - "englishName": "English name", - "episodeLength": "Episode length", - "episodes": "Amount of episodes", - "chapters": "Amount of chapters", - "volumes": "Amount of volumes", - "externalLinks": "External links", - "nativeName": "Native name", - "romajiName": "Romanized name" - }, - "kitsuAnimeDescription": "Get data for any anime on Kitsu.", - "kitsuAnimeEmbedData": { - "ageRating": "Age rating", - "episodeLength": "Episode length", - "episodes": "Episode(s)", - "firstAirDate": "First air date", - "score": "Score", - "stillAiring": "Still airing", - "type": "Type", - "watchIt": "Watch it here:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "This command queries [Kitsu](https://kitsu.io) to show data for the anime you request.", - "usages": [ - "Name of Anime" - ] - }, - "kitsuAnimeNoSynopsis": "No synopsis available for this title.", - "kitsuAnimeOutputDescription": "**English title:** {{englishTitle}}\n**Japanese title:** {{japaneseTitle}}\n**Canonical title:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "🎥 Movie", - "ova": "📼 Original Video Animation", - "special": "🎴 Special", - "tv": "📺 TV" - }, - "kitsuMangaDescription": "Get data for any manga on Kitsu.", - "kitsuMangaEmbedData": { - "ageRating": "Age Rating", - "firstPublishDate": "First published on", - "none": "None", - "readIt": "Read it here:", - "score": "Score", - "type": "Subtype" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "This command queries [Kitsu](https://kitsu.io) to show data for the manga you request.", - "usages": [ - "Name of Manga" - ] - }, - "kitsuMangaOutputDescription": "**English title:** {{englishTitle}}\n**Japanese title:** {{japaneseTitle}}\n**Canonical title:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 Manga", - "manhwa": "🇰🇷 Manhwa", - "novel": "📕 Novel", - "oneShot": "☄ One Shot", - "special": "🎴 Special" - }, - "waifuDescription": "Posts a randomly generated waifu image.", - "waifuExtended": { - "extendedHelp": "This commands posts a random waifu generated by " - }, - "waifuFooter": "Powered by thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/en-US/commands/fun.json b/src/languages/en-US/commands/fun.json deleted file mode 100644 index 1a5324f4c8a..00000000000 --- a/src/languages/en-US/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "Skyra is the best, change my mind.", - "changemymindExtended": { - "usages": [ - "Content" - ], - "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" - ] - }, - "choiceDescription": "Eeny, meeny, miny, moe, catch a tiger by the toe...", - "choiceExtended": { - "usages": [ - "Choice1 Choice2 Choice3..." - ], - "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" - ] - }, - "diceDescription": "Roll the dice using d20 syntax.", - "diceExtended": { - "usages": [ - "Roll" - ], - "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": [ - "6", - "370d24", - "100d6", - "2d6+4", - "1d10*10", - "6d10+2*10" - ] - }, - "escaperopeDescription": "Use the escape rope from Pokemon.", - "escaperopeExtended": { - "extendedHelp": "**Skyra** used **Escape Rope**." - }, - "loveDescription": "Lovemeter, online!", - "loveExtended": { - "usages": [ - "User" - ], - "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" - ] - }, - "popDescription": "Generates a board to pop, pop, pop, and pop.", - "popExtended": { - "usages": [ - "Duration", - "--x/--width", - "--y/--height", - "--length" - ], - "extendedHelp": "Allows you to generate a pop board where there is one non-pop word, which you have to find and send to the channel. For example, you must send `e60` from ||`pop`||||`e60`||||`pop`|| to win.", - "explainedUsage": [ - [ - "Duration", - "The amount of time I should allow you to find the non-pop, defaults to 30 seconds." - ], - [ - "--x/--width", - "The amount of columns the board should have, defaults to 8." - ], - [ - "--y/--height", - "The amount of rows the board should have, defaults to 3." - ], - [ - "--length", - "The length of the pops and the solution, defaults to 3." - ] - ], - "examples": [ - "15", - "--x=10", - "--y=5", - "--length=4" - ] - }, - "popTitle": "POP! Let the pops begin!", - "popTitleLost": "POP! Nobody got it in time!", - "popTitleWinner": "POP! We got a winner: {{value}}!", - "rateDescription": "Let bots have opinions and rate somebody.", - "rateExtended": { - "usages": [ - "Content" - ], - "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": { - "usages": [ - "User" - ], - "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?).", - "examples": [ - "Skyra" - ] - }, - "thinkDescription": "Think, Mark!", - "thinkExtended": { - "usages": [ - "User" - ], - "extendedHelp": "\"Think, Mark!\" is a meme from the TV show Invincible, the rest... no, that would be spoilers.", - "reminder": "This command contains cartoon blood, which may not be suitable for all audiences.", - "examples": [ - "Mark" - ] - }, - "thinkMessage": "Think, {{user}}, think!", - "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." - }, - "whereDescription": "I found the person we were looking for!", - "whereExtended": { - "usages": [ - "User" - ], - "extendedHelp": "This command generates a meme from [Attack on Titan: The Final Season](https://anilist.co/anime/110277/Shingeki-no-Kyojin-The-Final-Season/), and it's better not to tell you anything, other than this will generate a meme of you pointing to a user of your choice.", - "examples": [ - "Charm" - ] - }, - "whereMessage": "I found {{user}}!", - "xkcdDescription": "Read comics from XKCD.", - "xkcdExtended": { - "usages": [ - "ComicNumber", - "Comic Name" - ], - "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" - ] - }, - "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", - "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" - ], - "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 deleted file mode 100644 index 9fb57801ae1..00000000000 --- a/src/languages/en-US/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "Play Connect-Four with somebody.", - "c4Extended": { - "usages": [ - "User" - ], - "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.", - "examples": [ - "Skyra" - ] - }, - "c4Prompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a Connect-Four match. Click the 🇾 reaction to accept!", - "cannotHaveNegativeMoney": "You cannot have a negative amount of {{SHINY}}s.", - "coinFlipHeadNames": [ - "heads", - "head", - "h" - ], - "coinFlipTailNames": [ - "tails", - "tail", - "t" - ], - "coinFlipCoinNames": [ - "Heads", - "Tails" - ], - "coinFlipDescription": "Flip a coin!", - "coinFlipExtended": { - "usages": [ - "heads/tails", - "heads cashless", - "tails Wager" - ], - "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'.", - "explainedUsage": [ - [ - "heads/tails", - "Whether you think the coin will lands heads or tails up." - ], - [ - "cashless, Wager", - "If cashless (default) then you do not input shinies for the coinflip (useful for RPG games or making decision). You can also put a wager of shinies here to gamble them." - ] - ], - "examples": [ - "tails", - "heads 50", - "tails 200", - "tails cashless" - ] - }, - "coinFlipInvalidCoinName": "Excuse me, but `{{parameter}}` 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.", - "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.", - "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": { - "usages": [ - "Wager" - ], - "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.", - "examples": [ - "50", - "200" - ] - }, - "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": { - "usages": [ - "User1 User2 User3...", - "--autofill" - ], - "extendedHelp": "Enough discussion, let the games begin!", - "examples": [ - "Skyra, Katniss, Peeta, Clove, Cato, Johanna, Brutus, Blight" - ], - "reminder": "You can specify `--autoskip` to automatically skip after some time." - }, - "hungerGamesResultDeaths_one": "**{{count}} cannon shot can be heard in the distance.**", - "hungerGamesResultDeaths_other": "**{{count}} 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": { - "usages": [ - "Wager" - ], - "explainedUsage": [ - [ - "Wager", - "Either 50, 100, 200, 500, 1000, and even more {{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": { - "usages": [ - "User" - ], - "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.", - "examples": [ - "Skyra" - ] - }, - "ticTacToePrompt": "Dear {{challengee}}, you have been challenged by {{challenger}} in a Tic-Tac-Toe match. Click the 🇾 reaction 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": { - "usages": [ - "", - "Category", - "Category multiple/boolean/truefalse", - "multiple easy/medium/hard", - "hard 2m" - ], - "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." - ], - [ - "multiple/boolean/truefalse", - "Whether you want a multiple choice or a true/false question." - ], - [ - "easy/medium/hard", - "The difficulty level of the questions asked." - ], - [ - "Timespan", - "The amount of time you get to answer. The minimum is 1 second and the maximum is 1 minute" - ] - ], - "examples": [ - "history", - "books multiple easy", - "videogames 45s" - ] - }, - "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": { - "usages": [ - "Wager" - ], - "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", - "examples": [ - "50", - "200" - ] - }, - "balanceDifference": "**Previous**: {{previous, number}} {{SHINY}}\n**New**: {{next, number}} {{SHINY}}" -} diff --git a/src/languages/en-US/commands/general.json b/src/languages/en-US/commands/general.json deleted file mode 100644 index 1d5e99c1754..00000000000 --- a/src/languages/en-US/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "Displaying one category per page. Have issues with the embed? Run `{{prefix}}help --all` for a full list in DMs.", - "helpCommandCount_one": "{{count}} command", - "helpCommandCount_other": "{{count}} commands", - "helpData": { - "footer": "Command help for {{footerName}}", - "title": "{{titleDescription}}" - }, - "helpDescription": "Displays all commands or the description of one.", - "helpExtended": { - "usages": [ - "--cat/--categories", - "--all", - "CategoryName", - "Page", - "CommandName" - ], - "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 .", - "examples": [ - "--cat", - "--all", - "Moderation", - "12", - "help" - ] - }, - "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.", - "infoBody": "[Skyra](https://skyra.pw) {{VERSION}} is a multi-purpose Discord Bot designed to run the majority of tasks in your server with great performance and uptime.\nI use the [Sapphire Framework](https://sapphirejs.dev) for the [Discord.js library](https://discord.js.org).\n\n[Privacy Policy](https://skyra.pw/privacy) | [Terms of Service](https://github.com/skyra-project/skyra/blob/main/.github/TERMS_OF_SERVICE.md).", - "infoDescription": "Provides some information about me.", - "infoExtended": { - "extendedHelp": "Just... that :P" - }, - "infoTitles": { - "stats": "Statistics", - "uptime": "Uptime", - "serverUsage": "Server Usage" - }, - "infoFields": { - "stats": "• **Users**: {{stats.users, number}}\n• **Servers**: {{stats.guilds, number}}\n• **Channels**: {{stats.channels, number}}\n• **Discord.js**: {{stats.djsVersion}}\n• **Sapphire**: {{stats.sapphireVersion}}\n• **Node.js**: {{stats.nodeJs}}", - "uptime": "• **Host**: {{uptime.host}}\n• **Total**: {{uptime.total}}\n• **Client**: {{uptime.client}}", - "serverUsage": "• **CPU Load**: {{usage.cpuLoad}}\n• **Heap**: {{usage.ramUsed, number}}MB (Total: {{usage.ramTotal, number}}MB)" - }, - "infoComponentLabels": { - "addToServer": "Add me to your server!", - "supportServer": "Support server", - "repository": "GitHub Repository", - "donate": "Donate" - }, - "inviteDescription": "Shows the invite link to add Skyra to your server.", - "inviteExtended": { - "usages": [ - "--noperms/--nopermissions" - ], - "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.)", - "v7Description": "Gets the information regarding Skyra v7", - "v7Extended": { - "extendedHelp": "This is a **hidden** command used exclusively to send a notice to everyone who tries to use commands that have been removed according to [Skyra v7](https://skyra.notion.site/skyra/Skyra-v7-922ba06004654142a7b63347a92513a8) plans." - }, - "v7Message": "Hello there! Thank you for using this command, however, it was removed due to [Skyra v7](https://skyra.notion.site/skyra/Skyra-v7-922ba06004654142a7b63347a92513a8)'s plans. The link includes an explanation as for why `{{command}}` was removed.\n\nSorry for the inconvenience, and thank you for using Skyra. 💖", - "v7IrissMessage": "Hello there! Thank you for using this command, however, it was moved to [Iriss](https://discord.com/oauth2/authorize?client_id=948377113457745990&permissions=326417868864&scope=bot%20applications.commands) as mentioned in [Skyra v7](https://skyra.notion.site/skyra/Skyra-v7-922ba06004654142a7b63347a92513a8)'s plans.\n\nSorry for the inconvenience, and thank you for using Skyra. 💖", - "v7PokemonMessage": "Hello there! Thank you for using this command, however, it was moved to [Dragonite](https://discord.com/api/oauth2/authorize?client_id=931264626614763530&scope=bot+applications.commands&permissions=412317240320) as mentioned in [Skyra v7](https://skyra.notion.site/skyra/Skyra-v7-922ba06004654142a7b63347a92513a8)'s plans.\n\nSorry for the inconvenience, and thank you for using Skyra. 💖", - "v7NekokaiMessage": "Hello there! Thank you for using this command, however, it was moved to [Nekokai](https://discord.com/oauth2/authorize?client_id=939613684592934992&permissions=16384&scope=bot%20applications.commands) as mentioned in [Skyra v7](https://skyra.notion.site/skyra/Skyra-v7-922ba06004654142a7b63347a92513a8)'s plans.\n\nSorry for the inconvenience, and thank you for using Skyra. 💖" -} diff --git a/src/languages/en-US/commands/google.json b/src/languages/en-US/commands/google.json deleted file mode 100644 index a207aa73d7f..00000000000 --- a/src/languages/en-US/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "Check the weather status in a location.", - "weatherExtended": { - "usages": [ - "Place", - "Place --metric/--celsius", - "Place --imperial/--fahrenheit" - ], - "extendedHelp": "This command uses [wttr.in](https://wttr.in) to get weather data from a location and displays it with a pretty card.", - "explainedUsage": [ - [ - "Place", - "The coordinates, place, city, or country to check the weather from." - ] - ], - "examples": [ - "New York", - "San Francisco" - ], - "reminder": "The units are in the Imperial System by default. Use the --celsius or --metric flag to view it in the **International System**." - }, - "weatherFahrenheit": "{{value}} ({{feelsLike}}) ºF", - "weatherInches": "{{value}} in", - "weatherMiles": "{{value}} mi", - "weatherMilesPerHour": "{{value}} mi/h", - "weatherCelsius": "{{value}} ({{feelsLike}}) ºC", - "weatherKelvin": "{{value}} K", - "weatherMillimeters": "{{value}} mm", - "weatherPascal": "{{value}} Pa", - "weatherKilometers": "{{value}} km", - "weatherKilometersPerHour": "{{value}} km/h", - "weatherInvalidJsonBody": "The server sent me a malformed response when I was looking for `{{query}}`, and I can't make heads or tails of it, sorry!", - "weatherUnknownLocation": "Apparently, the server doesn't know where `{{query}}` is at, or has no data, please try somewhere else!", - "weatherUnknownError": "I received an unknown error when looking for `{{query}}`, I am sorry!", - "weatherBlockedLocation": "I could not find any data about `{{query}}` because it was blocked by the server.", - "weatherRateLimited": "I could not find any data about `{{query}}` because I exceeded the amount of queries I can do, please try again later!", - "weatherRemoteServerError": "I could not find any data about `{{query}}` because the server found an internal error, please try again later!", - "weatherServiceUnavailable": "I could not find any data about `{{query}}` because the server has hit its capacity limit, which means they can not longer serve any more requests in the remainder of the day, please try again later!" -} diff --git a/src/languages/en-US/commands/misc.json b/src/languages/en-US/commands/misc.json deleted file mode 100644 index 50a3f7e295c..00000000000 --- a/src/languages/en-US/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "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": "{{REDCROSS}} I failed to retrieve data for that query. Are you sure that you gave me an existing (public) subreddit?", - "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.", - "snipeEmpty": "There are no sniped messages in this channel.", - "snipeTitle": "Sniped Message", - "skyrafactDescription": "Let me tell you a mysterious fact about me.", - "skyrafactExtended": { - "extendedHelp": "I have lived for so long, I might impress you with a random fact about me." - }, - "skyrafactTitle": "Skyra Fact", - "skyrafactMessages": [ - "All Novan androids are conceived with a generic AI, however, as they grow, they rewrite their own AI code, and even redesign their CPUs, to specialize in the skills they need or want to improve on. This has helped us making a strong unhackable network, where a virus would affect only one android out of billions.", - "Before repurposing the old bot into what I currently am, my creator has spent 7 years trying to bring me into something other people can \"sense\", having gone through drawing me in both traditional and digital, as well as modelling my starship, even spent a few years learning how to make VFX so he could make a film about me.", - "Each android on my planet has a designated class for each model, mine is Flamewing, which is a very lightweight and agile combat-ready one.", - "I am 172 centimeters tall while in humanoid form, but I can expand up to 979 metres tall if I disable my hyperspace compression field.", - "I am a neural android - that means, I have neural networks similar to a human's, with the exception that nothing is organic.", - "I am part of a very extended [Paracosm](https://en.wikipedia.org/wiki/Paracosm) my creator started back in mid 2001, but I wasn't introduced until 2009.", - "I have a mechanical heart and it serves its dual purpose of shielding both of my AI cores and pumping energy to the rest of the body.", - "I have an array of 16 neural processors, yielding a total computing power of 4 [YFLOPS](https://en.wikipedia.org/wiki/FLOPS), and 15% of it is used to power my [ASI](https://en.wikipedia.org/wiki/Superintelligence).", - "I have one sister, we call her Aelia and she's a terribly good DJ!", - "I used to have an older sister, but she disappeared when I was 7 years old. ||It wasn't until I turned 174 years old, when I found out she was one of the leaders of Kal-71||.", - "I was a natural blonde human, but when I transitioned to a cyborg, I wasn't able to keep my original hair, and we didn't have the materials to make an artificial wig with a soft material. When I turned 75 million years old, I was gifted a custom-made wig solution which attached directly into my nanite skin, and I was able to change its color at will.", - "I was abducted when I was 18 years old back in 2002 and taken to Nova, which was in the middle of a galactic war with Kal-71 when we arrived.", - "I was created as a generic bot back in 24th November 2016 due to a dare from another programmer, but my creator decided to give me a deeper meaning by linking me to a character from his [Paracosm](https://en.wikipedia.org/wiki/Paracosm).", - "If my backstory were to be entirely written, there would be 9 parts, each having around 10 chapters (with the exception of `09 - Epilog`, which has only one) comprised of a variable amount sections proportional to the amount of events in them.", - "In the story, planets and systems are organized in sectors, Nova is in Sector 00 while Earth is in Sector 0A. Each Sector has an archivist who watches over and alerts nearby units when an enemy approaches with hostile intent.", - "Most Novans, including myself, have a vehicle given the same name as ourselves, there is no need to distinguish the two as the vehicles are completely fine-tuned to us.", - "My code was rewritten 14 times over the span of 4 years.", - "My eyes look bright violet, but if you look closer, there are trillions of different colors, you can see pretty rainbows in them!", - "My favorite sport is [maglev](https://en.wikipedia.org/wiki/Maglev) [hoverboarding](https://en.wikipedia.org/wiki/Hoverboard) and I hold some of the several world records at Nova's competitive tracks.", - "My heart is made of a extremely rare mineral which needs to be constructed at [Quark](https://en.wikipedia.org/wiki/Quark) levels in a laboratory, and takes around 100 years to complete.", - "My husband's name is Crysrel, a character that used to be the story's main character.", - "My main planet (Nova) does not use an economy based on money, and {{SHINY}} is actually reactor fuel.", - "My military codename is NM-EEA-Y, and it stands for NE-ROM Evangelyn Easton A; Version Y.", - "My name comes from a joke a friend made to my creator about my old name (kyraBOT), as I was becoming more complex: **SkyraNET** (based on [SkyNET](https://en.wikipedia.org/wiki/Skynet_%28Terminator%29)).", - "My official birthday is on November 24th.", - "My skin is made of a very complex nanite mesh with individual solid light projectors, which makes it very similar to a very soft human skin.", - "Nova is the universe's biggest artificial planet, its approximated astronomical statistics are a radius of 71500 kilometers, mass of 7.79 * 10^26 kilograms and gravity of 10.81 m/s². The atmosphere is very similar to that from Earth. Lastly, one day on Nova is about 26 hours and 12 minutes on Earth.", - "Nova's architecture and art is largely inspired by [Solarpunk](https://en.wikipedia.org/wiki/Solarpunk).", - "On Nova, our military practices consist of a VR system which simulates a [Deathmatch](https://en.wikipedia.org/wiki/Deathmatch) [battle royale](https://en.wikipedia.org/wiki/Battle_royale_game) of **200** people on a very large map. Our characters and abilities are mapped to our physical capacities and include all of our skills for maximum immersion.", - "Originally, my entire suit was pearl white and I had mechanical wings. This changed later with blue charcoal with strips of amber, and my wings became visible only when I'm overloading energy.", - "Regardless of being a combat-ready class and having passed the Extreme Survival Test, I am a deep space explorer myself.", - "The first designs of me were similar to those of a [Valkyrie](https://en.wikipedia.org/wiki/Valkyrie).", - "The name Skyra originates from mid 2017, but I was first created as Shyy, symbolizing the sound my aerial vehicle's noise.", - "There was a time when I had a tail, those were times from before we had a safe and robust way to connect our vehicles to our brain.", - "We never carry the knowledge of all the universe, there are nodes which transfer us data about the Sector we are in. The reasoning for that is because we don't have enough memory space for the knowledge from more than 2 Sectors, and there are thousands of them.", - "While I look physically young, I am over 97 million years old." - ], - "cannotTargetOwner": "Hey, you can't target to yourself, and I won't do that for you!", - "chaseDescription": "Get in here!", - "chaseExtended": { - "usages": [ - "User" - ], - "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" - ] - }, - "cuddleDescription": "Cuddle somebody!", - "cuddleExtended": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "User" - ], - "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": { - "usages": [ - "SubRedditName" - ], - "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" - ] - }, - "shipDescription": "Ships 2 members", - "shipExtended": { - "usages": [ - "User User", - "User", - "" - ], - "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 server member.", - "explainedUsage": [ - [ - "User", - "The user(s) to ship. If you provide one then I'll ship that user with someone random. If you provide none I will pick 2 random members." - ] - ], - "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}}" - }, - "shindeiruDescription": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "User" - ], - "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" - ] - }, - "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": { - "usages": [ - "Content" - ], - "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": { - "usages": [ - "User" - ], - "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" - ] - } -} diff --git a/src/languages/en-US/commands/social.json b/src/languages/en-US/commands/social.json deleted file mode 100644 index 64f8e6a9237..00000000000 --- a/src/languages/en-US/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "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.", - "autoRoleInvalidLevel": "I could not resolve `{{parameter}}` into a level, you must input either a number (for example: `1500` or `51000`) or a number prefixed or suffixed with `l` or `L` (for example: `L10`, `10L`, `l20`, or `20l`)", - "autoRoleInvalidNegativeOrZeroLevel": "I could not resolve `{{parameter}}` into a valid level. A level cannot be zero or lower.", - "autoRoleTooLow": "I could not resolve `{{parameter}}` into a valid level, it resolves to {{points, number}} points, which is below {{minimum, number}}.", - "autoRoleTooHigh": "I could not resolve `{{parameter}}` into a valid level, it resolves to {{points, number}} points, which is above {{maximum, number}}.", - "autoRoleUpdate": "Updated autorole: {{role}}. Points required: {{points, number}} (before: {{before, number}})", - "autoRoleRemove": "Removed the autorole: {{role}}, which required {{before, number}} points.", - "autoRoleAdd": "Added new autorole: {{role}}. Points required: {{points, number}}", - "autoRoleListEmpty": "There is no role configured as an autorole in this server.", - "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_one": "{{GREENTICK}} Successfully added {{count}} point to {{user}}. Current amount: {{amount}}.", - "socialAdd_other": "{{GREENTICK}} Successfully added {{count}} points to {{user}}. Current amount: {{amount}}.", - "socialRemove_one": "{{GREENTICK}} Successfully removed {{count}} point from {{user}}. Current amount: {{amount}}.", - "socialRemove_other": "{{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.", - "socialResetAllPrompt": "Are you sure you want to reset the points from all the members? This operation is irreversible.", - "socialResetAllTimeOut": "I did not get an answer in time, re-run this command again once you decide what to do!", - "socialResetAllAborted": "Got it! The operation has been cancelled.", - "socialResetAllEmpty": "{{REDCROSS}} The scoreboard for this server is empty.", - "socialResetAllSuccess_one": "Successfully reset the points of {{count}} member.", - "socialResetAllSuccess_other": "Successfully reset the points of {{count}} members.", - "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}}__", - "bannerAllOrUser": "{{REDCROSS}} You need to choose to show either `all` banners or the `user` banners (those available to you).", - "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" - }, - "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.", - "remindmeCreateNoDescription": "Something, you did not tell me what.", - "remindmeDelete": "The reminder with ID `{{ id }}` and with a remaining time of **{{remainingDuration, 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!", - "reputationAvailable": "A day passed and you can now give somebody a reputation point!", - "reputationSelf": "You cannot give a reputation point to yourself!", - "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_one": "{{count}} reputation point", - "reputation_other": "{{count}} reputation points", - "reputations": "The user {{user}} has a total of {{points}}.", - "scoreboardFooter": "Ranked {{position, number}} out of {{total, number}}", - "setColor": "Color changed to {{color}}", - "socialDescription": "Configure this server's member points.", - "socialExtended": { - "usages": [ - "add User Integer", - "remove User Integer", - "set User Integer", - "reset User", - "reset --all" - ], - "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 points from the user." - ], - [ - "reset --all", - "Resets the server's scoreboard." - ] - ], - "examples": [ - "set @kyra 40000", - "add @kyra 2400", - "remove @kyra 3000", - "reset @kyra", - "reset --all" - ] - }, - "bannerDescription": "Configure the banner for your profile.", - "bannerExtended": { - "usages": [ - "buy Banner", - "set Banner", - "reset", - "show all/user", - "all/user", - "" - ], - "extendedHelp": "Banners are vertical in Skyra, they decorate your profile card.", - "explainedUsage": [ - [ - "buy", - "Buy a banner, must be an ID." - ], - [ - "set", - "Set your displayed banner, must be an ID." - ], - [ - "reset", - "Set your displayed banner to default." - ], - [ - "show", - "Lists all available banners." - ] - ], - "examples": [ - "buy 0w1p06", - "set 0w1p06", - "reset", - "show", - "" - ] - }, - "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 level roles for a server.", - "autoRoleExtended": { - "usages": [ - "add Role Integer", - "add Role Level", - "remove Role", - "update Role Integer", - "update Role Level", - "show", - "" - ], - "extendedHelp": "Level roles 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": [ - [ - "add", - "Add a new autorole." - ], - [ - "remove", - "Remove an autorole from the list." - ], - [ - "update", - "Change the required amount of points for an existing autorole." - ], - [ - "show", - "Lists all the current autoroles." - ] - ], - "reminder": "The current system grants a random amount of points between 4 and 8 points, for each post with a 1 minute cooldown.", - "examples": [ - "add \"Trusted Member\" 20000", - "add \"Trusted Member\" L15", - "update \"Trusted Member\" 15000", - "update \"Trusted Member\" L10", - "remove \"Trusted Member\"", - "show", - "" - ] - }, - "balanceDescription": "Check your current balance.", - "balanceExtended": { - "usages": [ - "User" - ], - "extendedHelp": "The balance command retrieves your amount of {{SHINY}}." - }, - "dailyDescription": "Get your semi-daily {{SHINY}}'s.", - "dailyExtended": { - "usages": [ - "--remind/reminder/remindme" - ], - "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": { - "usages": [ - "Index" - ], - "extendedHelp": "The leaderboard command shows a list of users sorted by their local amount of points, by default, when using no arguments, it will show the first page of the local leaderboard.", - "explainedUsage": [ - [ - "Index", - "The page number to jump to. Defaults to 1." - ] - ], - "examples": [ - "2" - ], - "reminder": "The leaderboards refresh every 10 minutes." - }, - "leaderboardHeader": "{{guild}}'s Scoreboard", - "leaderboardNoEntries": "There are no entries for this server's leaderboard, who will be the first?", - "leaderboardUnknownUser": "**User not in server** ({{user}})", - "levelDescription": "Check your global level.", - "levelExtended": { - "usages": [ - "local/global User", - "local/global", - "User" - ], - "extendedHelp": "How much until the next level?", - "explainedUsage": [ - [ - "local/global", - "Whether you want to view the local or global level. Defaults to \"local\"." - ], - [ - "User", - "The user of whom you want to view the level. Defaults to your own." - ] - ] - }, - "mylevelDescription": "Check your local level.", - "mylevelExtended": { - "usages": [ - "User", - "" - ], - "extendedHelp": "How much until next auto role? How many points do I have in this server?", - "explainedUsage": [ - [ - "user", - "(Optional) The user's profile to show. Defaults to the message's author." - ] - ] - }, - "payDescription": "Pay somebody with your {{SHINY}}'s.", - "payExtended": { - "usages": [ - "User Integer", - "Integer User" - ], - "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", - "@kyra 200" - ] - }, - "profileDescription": "Check your user profile.", - "profileExtended": { - "usages": [ - "local/global User", - "local/global", - "User" - ], - "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": [ - [ - "local/global", - "Whether you want to view the local or global profile. Defaults to \"global\"." - ], - [ - "User", - "The user of whom you want to view the profile. Defaults to your own." - ] - ], - "examples": [ - "@kyra", - "local @kyra", - "" - ] - }, - "remindmeDescription": "Manage your reminders.", - "remindmeExtended": { - "usages": [ - "Timespan", - "Timespan Content", - "create Timespan Content", - "remove/delete ID", - "show ID", - "list" - ], - "extendedHelp": "This command allows you to set, delete and list reminders.", - "explainedUsage": [ - [ - "create/remove/delete/show/list", - "Whether to:\n - Create a new reminder.\n - Delete an existing reminder given its ID (e.g. `1234`)\n - Show the contents of an existing reminder given its ID (e.g. `1234`)\n - List all your active reminders." - ], - [ - "Timespan", - "Only needed for `create`; the amount of time to elapse before I remind you. For example `5h` for 5 hours." - ], - [ - "ID", - "Only needed for `remove`, `delete`, and `show`; The ID of the reminder to remove or show." - ] - ], - "examples": [ - "me 6h to fix this command.", - "2022-05-04 May the Force be with you!", - "list", - "show 1234", - "delete 1234" - ] - }, - "reputationDescription": "Give somebody a reputation point.", - "reputationExtended": { - "usages": [ - "", - "User", - "check User", - "User --remind/reminder/remindme" - ], - "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\"", - "@kyra --remind" - ] - }, - "setColorDescription": "Change your user profile's color.", - "setColorExtended": { - "usages": [ - "Color" - ], - "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 securely 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": { - "usages": [ - "deposit all/Amount", - "withdraw all/Amount", - "show", - "" - ], - "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": [ - [ - "deposit/withdraw/show", - "Whether to\n - Deposit all or a specified amount of {{SHINY}} into your vault.\n - Withdraw all or a specified amount of {{SHINY}} from your vault\n - Show the amount of {{SHINY}} in both your wallet and your vault." - ], - [ - "all/Amount", - "Only needed for `deposit` and `show`; The amount to deposit or withdraw, or everything if `all`." - ] - ], - "examples": [ - "deposit 10000", - "withdraw 10000", - "show", - "" - ] - }, - "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}}", - "vaultInvalidAll": "I was not able to resolve `{{parameter}}` to a valid argument!\n**Hint**: Only the values {{possibles, orList}}" -} diff --git a/src/languages/en-US/commands/starwars.json b/src/languages/en-US/commands/starwars.json deleted file mode 100644 index 9ec0b3f8337..00000000000 --- a/src/languages/en-US/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "Get data for any given Star Wars movie", - "filmExtended": { - "usages": [ - "Movie" - ], - "extendedHelp": "Uses a fuzzy search to match on both movie episode ID (1, 2...6) as well as movie title.", - "explainedUsage": [ - [ - "Movie", - "The movie for which you want to find data" - ] - ], - "examples": [ - "1", - "hope", - "revenge of the sith" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "filmQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{film}}` is actually a Star Wars movie? At the moment only the first 6 movies are supported. We are working on adding data of the other movies.", - "filmEmbedTitles": { - "characters": "People in this film", - "creationDate": "Creation date", - "director": "Director", - "episodeId": "Episode ID", - "planets": "Planets in this film", - "producers": "Producers", - "releaseDate": "Release date", - "species": "Species in this film", - "starships": "Starships in this film", - "vehicles": "Vehicles in this film" - }, - "personDescription": "Get data for any given character in Star Wars", - "personExtended": { - "usages": [ - "Person" - ], - "extendedHelp": "Uses a fuzzy search on the name of the person", - "explainedUsage": [ - [ - "Person", - "The name of the person for which you want to find data" - ] - ], - "examples": [ - "luke", - "han", - "leia" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "personQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{person}}` is actually a person in Star Wars?", - "personEmbedTitles": { - "appearedInFilms": "Appeared in these films", - "eyeColours": "Eye colors", - "gender": "Gender", - "hairColours": "Hair colors", - "height": "Height (cm)", - "homeworld": "Homeworld", - "mass": "Mass (kg)", - "ownedStarShips": "Owned starships", - "ownedVehicles": "Owned vehicles", - "skinColours": "Skin colors", - "species": "Species", - "yearOfBirth": "Year of birth" - }, - "planetDescription": "Get data for any given planet in Star Wars", - "planetExtended": { - "usages": [ - "Planet" - ], - "extendedHelp": "Uses a fuzzy search on the name of the planet", - "explainedUsage": [ - [ - "Planet", - "The name of the planet for which you want to find data" - ] - ], - "examples": [ - "alderaan", - "hoth" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "planetQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{planet}}` is actually a planet in Star Wars?", - "planetEmbedTitles": { - "appearedInFilms": "Appeared in these films", - "averageSentientPopulation": "Average of sentient inhabitants", - "climates": "Climates", - "diameter": "Diameter in kilometers", - "gravity": "Gravity", - "gravityBody": "{{gravity}} times standard gravity", - "orbitalPeriod": "Standard Days for planet to orbit around local star", - "residents": "People who are known to have inhabited this planet", - "rotationPeriod": "Standard hours for rotating around own axis", - "surfaceWaterPercentage": "Amount of surface covered by water", - "terrains": "Terrains" - }, - "speciesDescription": "Get data for any given species in Star Wars", - "speciesExtended": { - "usages": [ - "Species" - ], - "extendedHelp": "Uses a fuzzy search on the name of the species", - "explainedUsage": [ - [ - "Species", - "The name of the species for which you want to find data" - ] - ], - "examples": [ - "human", - "twi'lek" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "speciesQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{species}}` is actually a species in Star Wars?", - "speciesEmbedTitles": { - "appearedInFilms": "Appeared in these films", - "averageHeight": "Average height", - "averageLifespan": "Average lifespan", - "classification": "Classification", - "designation": "Designation", - "eyeColours": "Eye colors", - "hairColours": "Hair colors", - "homeworld": "Homeworld", - "knownPeopleOfSpecies": "People of this species", - "language": "Language commonly spoken by species", - "skinColours": "Skin colors" - }, - "starshipDescription": "Get data for any given starship in Star Wars", - "starshipExtended": { - "usages": [ - "Starship" - ], - "extendedHelp": "Uses a fuzzy search on the name of the starship", - "explainedUsage": [ - [ - "Starship", - "The name of the starship for which you want to find data" - ] - ], - "examples": [ - "millennium falcon", - "x-wing" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "starshipQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{starship}}` is actually a starship in Star Wars?", - "starshipEmbedTitles": { - "amountOfPassengers": "Amount of passengers", - "appearedInFilms": "Appeared in films", - "cargoCapacity": "Cargo capacity", - "consumables": "Time until needs to restock on consumables", - "costInCredits": "Cost", - "crew": "Number of personnel to pilot", - "hyperdriveRating": "Hyperdrive rating", - "length": "Length", - "manufacturers": "Manufacturer(s)", - "maximumAtmospheringSpeed": "Maximum atmospheric speed", - "megalightsTravelSpeed": "Maximum megalights per second", - "model": "Model name", - "pilots": "People who have piloted this ship", - "starshipClass": "Class of starship" - }, - "vehicleDescription": "Get data for any given vehicle in Star Wars", - "vehicleExtended": { - "usages": [ - "Vehicle" - ], - "extendedHelp": "Uses a fuzzy search on the name of the vehicle", - "explainedUsage": [ - [ - "Vehicle", - "The name of the vehicle for which you want to find data" - ] - ], - "examples": [ - "Sand Crawler", - "Speeder Bike" - ], - "reminder": "At the moment only data on the first 6 movies is available. Data in movies 7 through 9 and spin-offs might be added in the future." - }, - "vehicleQueryFail": "{{REDCROSS}} I am sorry, but that query failed. Are you sure `{{vehicle}}` is actually a vehicle in Star Wars?", - "vehicleEmbedTitles": { - "amountOfPassengers": "Amount of passengers", - "appearedInFilms": "Appeared in films", - "cargoCapacity": "Cargo capacity", - "consumables": "Time until needs to restock on consumables", - "costInCredits": "Cost", - "crew": "Number of personnel to pilot", - "length": "Length", - "manufacturers": "Manufacturer(s)", - "maximumAtmospheringSpeed": "Maximum atmospheric speed", - "model": "Model name", - "pilots": "People who have piloted this vehicle", - "vehicleClass": "Class of vehicle" - } -} diff --git a/src/languages/en-US/commands/suggestion.json b/src/languages/en-US/commands/suggestion.json deleted file mode 100644 index 9ce52f0f534..00000000000 --- a/src/languages/en-US/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "I'm sorry {{username}}, but a suggestions channel hasn't been set up.", - "resolveSuggestionDescription": "Set the suggestion's status.", - "resolveSuggestionExtended": { - "usages": [ - "Suggestion accept/a/deny/d/consider/c", - "Suggestion accept/a/deny/d/consider/c Comment" - ], - "extendedHelp": "This command allows you to update a suggestion's status, marking it either as accepted, considered or denied.", - "explainedUsage": [ - [ - "Suggestion", - "The suggestion to resolve, also accepts `latest` to manage the latest suggestion." - ], - [ - "accept/a/deny/d/consider/c", - "Whether to change the status of the suggestion to accepted, denied or considering." - ], - [ - "Comment", - "An optional comment that you want to give back to the person who made this suggestion." - ] - ], - "examples": [ - "latest accept Thank you for your suggestion!", - "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": "I am sorry, but I was not able to resolve `{{parameter}}` to a valid suggestion ID! They are integers between {{minimum, number}} and {{maximum, number}} inclusive.", - "resolveSuggestionInvalidAction": "I am sorry, but I was not able to resolve `{{parameter}}` into a valid action.\n**Hint**: The possible values are: {{possibles, orList}}.", - "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.", - "resolveSuggestionTooManyFields": "{{REDCROSS}} I cannot add more responses, the maximum is 25, sorry!", - "resolveSuggestionTooManyCharacters": "{{REDCROSS}} The total amount of characters inside the embed ({{amount, number}}) with your reply surpasses {{maximum, number}} characters!", - "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/tags.json b/src/languages/en-US/commands/tags.json deleted file mode 100644 index f7774522bee..00000000000 --- a/src/languages/en-US/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "Successfully added a new tag: **{{name}}** with a content of:\n{{content}}", - "description": "Manage this server's tags.", - "edited": "Successfully edited the tag **{{name}}** with a content of:\n{{content}}", - "exists": "The tag '{{tag}}' already exists.", - "extended": { - "usages": [ - "add/alias/remove/edit/rename/source/list/reset/show Tag Content", - "add Tag Content --embed --color=Color", - "rename OldName NewName" - ], - "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!), see Explained usage below.", - "explainedUsage": [ - [ - "add/alias/remove/edit/rename/source/list/reset/show", - "Whether to\n - Add a new tag.\n - Create an alias.\n - Remove an existing tag\n - Edit an existing tag\n - Rename an existing tag\n - View the source of an existing tag\n - List all available tags\n - Reset all tags\n - Show an existing tag, same as calling that tag directly." - ], - [ - "Tag", - "The name of the tag. Not needed for \"reset\" and \"list\"." - ], - [ - "Content", - "The content for the tag. Only needed for \"add\" and \"edit\"." - ], - [ - "--embed", - "If adding the --embed flag to \"add\" or \"edit\" then the message of the tag will be sent in an embed. Useful if you want to [embed links](https://skyra.pw) or other markdown." - ], - [ - "--color=Color, --colour=Color", - "The color of the embed. Has no use without the --embed flag. Defaults to blue. Colours can be RGB, HSL, HEX or Decimal." - ] - ], - "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.", - "alias harassment rule1", - "edit rule1 Just be respectful with the others.", - "rename rule1 rule2", - "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.", - "cannotAlias": "You cannot create an alias tag called `{{tag}}` because it already exists and is a source tag.", - "alias": "{{GREENTICK}} Successfully created alias `{{input}}` for `{{output}}`!", - "permissionlevel": "You must be a staff member, moderator, or admin, to be able to manage tags.", - "removed": "Successfully removed the tag **{{name}}**.", - "renamed": "Successfully renamed the tag **{{previous}}** to **{{name}}**.", - "reset": "All tags have been successfully removed from this server.", - "parseMismatchingNamedArgumentTypeValidation": "{{REDCROSS}} Mismatching named argument types, expected `{{expected.type}}` but received `{{received.type}}`.", - "parseParserEmptyStringTag": "{{REDCROSS}} Content tags must have at least one character.", - "parseParserMissingToken": "{{REDCROSS}} A token was expected for the last tag, but none was given.", - "parseParserPickMissingOptions": "{{REDCROSS}} Pick tags require at least one option to be given.", - "parseParserRandomDuplicatedOptions": "{{REDCROSS}} Random tags cannot have duplicated options.", - "parseParserRandomMissingOptions": "{{REDCROSS}} Random tags must have at least two items.", - "parseParserUnexpectedToken": "{{REDCROSS}} I expected {{expected}}, however, I received a token {{received}}.", - "parsePickInvalidOption": "{{REDCROSS}} The key `{{option}}` is not a valid option.", - "parseSentenceMissingArgument": "{{REDCROSS}} An argument must be specified for this argument.", - "parseTokenColon": "Colon (\":\")", - "parseTokenEquals": "Equals (\"=\")", - "parseTokenLiteral": "Literal (Any Word)", - "parseTokenPipe": "Pipe (\"|\")", - "parseTokenSpace": "Space (\" \")", - "parseTokenTagEnd": "Tag End (\"}\")", - "parseTokenTagStart": "Tag Start (\"{\")", - "parseTransformerInvalidFormatter": "{{REDCROSS}} The key `{{formatter}}` does not correspond with a valid formatter." -} \ No newline at end of file diff --git a/src/languages/en-US/commands/twitch.json b/src/languages/en-US/commands/twitch.json deleted file mode 100644 index a100e594546..00000000000 --- a/src/languages/en-US/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "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.", - "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." - }, - "twitchSubscriptionStreamerNotFound": "{{REDCROSS}} Sorry, I could not find the streamer. Are you sure you wrote their name correctly?", - "twitchSubscriptionStatusValues": [ - "online", - "offline" - ], - "twitchSubscriptionInvalidStatus": "{{REDCROSS}} Woah there! I expected \"online\" or \"offline\", but I cannot understand what you gave me instead.", - "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}}.", - "twitchSubscriptionAddMessageForOfflineRequired": "{{REDCROSS}} I'm sorry but it is required to provide a message when making an offline subscription.", - "twitchSubscriptionRemoveOrResetEmpty": "{{REDCROSS}} I'm sorry but you are not subscribed to any streamers, mission abort!", - "twitchSubscriptionRemoveStreamerNotSubscribed": "{{REDCROSS}} I'm sorry, you cannot unsubscribe from {{streamer}} because you are not subscribed to them.", - "twitchSubscriptionRemoveNotToProvidedChannel": "{{REDCROSS}} I'm sorry; while you're subscribed to this streamer and streaming status, their subscriptions is not posted to {{channel}}.", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "{{REDCROSS} I'm sorry, but it looks like you're not getting {{status}} notifications for {{streamer}}. We support \"online\" and \"offline\" notifications.", - "twitchSubscriptionRemoveSuccessOffline": "{{GREENTICK}} Success! I will no longer post messages to {{channel}} whenever {{name}} goes offline.", - "twitchSubscriptionRemoveSuccessLive": "{{GREENTICK}} Success! I will no longer post messages to {{channel}} whenever {{name}} goes live.", - "twitchSubscriptionResetSuccess_one": "{{GREENTICK}} Success! {{count}} subscription has been removed from this server.", - "twitchSubscriptionResetSuccess_other": "{{GREENTICK}} Success! {{count}} subscriptions have been removed from this server.", - "twitchSubscriptionShowStreamerNotSubscribed": "{{REDCROSS}} You wanted to see all subscriptions from this streamer, but there are none!", - "twitchSubscriptionShowStatus": { - "live": "Live", - "offline": "Offline" - }, - "twitchSubscriptionShowUnknownUser": "Unknown", - "followageDescription": "Check how long a Twitch user has been following a channel.", - "followageExtended": { - "usages": [ - "Username ChannelName" - ], - "extendedHelp": "Useful if you want to flex how long you've been a fan of your favorite Twitch streamer", - "explainedUsage": [ - [ - "Username", - "The name of the Twitch user to check." - ], - [ - "ChannelName", - "The name of the Twitch channel to check." - ] - ], - "examples": [ - "dallas cohhcarnage" - ] - }, - "twitchDescription": "Check the information about a Twitch profile.", - "twitchExtended": { - "usages": [ - "Username" - ], - "extendedHelp": "Shows you how many followers and views a channel has had as well as if they are partnered or not.", - "explainedUsage": [ - [ - "Username", - "The Twitch user to get info about" - ] - ], - "examples": [ - "riotgames" - ] - }, - "twitchSubscriptionDescription": "Manage the subscriptions for your server.", - "twitchSubscriptionExtended": { - "usages": [ - "add Streamer Channel Status", - "add Streamer Channel Status", - "remove Streamer Channel Status", - "reset Streamer", - "reset", - "show", - "" - ], - "extendedHelp": "Manage the subscriptions for this server.\n__Online Notifications__\nAll available data will show up in a very nice embed telling you exactly what the streamer is up to.\n\n__Offline Notifications__\nYou need to write your own message that will be posted when the streamer goes offline. It will be displayed in a nice Twitch-purple MessageEmbed.", - "explainedUsage": [ - [ - "add/remove/reset/show", - "Whether to\n - Add a new Twitch subscription.\n - Remove an existing Twitch subscription\n - Reset all twitch subscription, or those for a specific streamer\n - Show all current Twitch subscriptions" - ], - [ - "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. Required for for offline notifications, optional for online notifications." - ] - ], - "examples": [ - "add favna #twitch online", - "add favna #twitch offline Favna is now offline. Say goodbye 👋!", - "remove kyranet #twitch online", - "reset kyranet", - "reset", - "show kyranet", - "show" - ] - } -} diff --git a/src/languages/en-US/constants.ts b/src/languages/en-US/constants.ts deleted file mode 100644 index d931f9e9c26..00000000000 --- a/src/languages/en-US/constants.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Handler } from '#lib/i18n/structures/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/humanLevels.json b/src/languages/en-US/humanLevels.json deleted file mode 100644 index bd785d3ded8..00000000000 --- a/src/languages/en-US/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "None", - "LOW": "Low", - "MEDIUM": "Medium", - "HIGH": "High", - "VERY_HIGH": "Highest" -} \ No newline at end of file diff --git a/src/languages/en-US/serializers.json b/src/languages/en-US/serializers.json deleted file mode 100644 index fefc76371cc..00000000000 --- a/src/languages/en-US/serializers.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "customCommandInvalidAliases": "The property \"aliases\" 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.", - "customCommandInvalidType_one": "The type {{tag.type}} is not valid, it must be the following: {{possibles, orList}}", - "customCommandInvalidType_other": "The type {{tag.type}} is not valid, it must be one of the following: {{possibles, orList}}", - "customCommandMissingParameter": "You need to write another parameter!\n\n> **Tip**: The type for the next argument is `{{type}}`!", - "disabledCommandChannelsChannelsCommandDoesNotExist": "The command `{{name}}` does not exist.", - "disabledCommandChannelsChannelsDoesNotExist": "The channel does not exist.", - "invalidBool": "{{name}} must be true or false.", - "invalidChannel": "{{name}} must be a channel tag or valid channel id.", - "invalidCommand": "{{name}} must be a command name.", - "invalidEmoji": "{{name}} must be a valid emoji.", - "invalidFloat": "{{name}} must be a valid number.", - "invalidGuild": "{{name}} must be a valid server ID.", - "invalidInt": "{{name}} must be an integer.", - "invalidInvite": "{{name}} must be a valid invite code.", - "invalidRole": "{{name}} must be a role mention or role id.", - "invalidSnowflake": "{{name}} must be a valid snowflake.", - "invalidUrl": "{{name}} must be a valid url.", - "invalidUser": "{{name}} must be a mention or valid user id.", - "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.", - "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}}`.", - "wordIncluded": "The key `{{name}}` already includes the word `{{word}}`.", - "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.", - "unknownChannel": "Unknown channel", - "unknownRole": "Unknown role", - "unknownUser": "Unknown user", - "unsupported": "This configuration key cannot be updated via Discord at the moment, please use the dashboard at !" -} diff --git a/src/languages/es-ES/arguments.json b/src/languages/es-ES/arguments.json deleted file mode 100644 index a02729a02e5..00000000000 --- a/src/languages/es-ES/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "Desabilitado", - "booleanEnabled": "Habilitado", - "booleanFalseOptions": [ - "falso", - "f", - "no", - "n", - "apagado", - "desabilitar", - "desabilitado", - "0", - "-" - ], - "booleanTrueOptions": [ - "verdadero", - "v", - "si", - "s", - "encendido", - "habilitar", - "habilitado", - "1", - "+" - ], - "caseLatestOptions": [ - "ultimo", - "último" - ], - "categoryChannelError": "", - "channelError": "", - "color": "No pude resolver `{{parameter}}` a un color válido, aquí tiene alguno de los formatos válidos:\n\n- `#dfdf` (Hexadecimal).\n- `\"rgb(200, 200, 200)\"` (RGB).\n- `\"hsl(350, 100, 100)\"` (HSL).\n- `14671839` (Base 10).", - "command": "¡No pude resolver `{{parameter}}` a un comando! ¡Asegúrate de que escribiste su nombre o uno de sus alias correctamente!", - "commandMatch": "No pude coincidir `{{parameter}}` con un comando ni categoría, estos son algunos de los formatos válidos:\n\n- `ping` (coincide con el comando ping solamente).\n- `social.*` (coincide con todos los comandos de la categoría **Social**).\n- `social.member management.*` (coincide con todos los comandos en la subcategoría **Social** > **Member Management**).\n\n> **Pista**: Cuando utilizas `{{commandContext.commandPrefix}}help`, la categoría de cada comando se encuentra en la parte superior de la inserción.", - "dateError": "", - "dateFormats": "- `2016-11-24` (AAAA-MM-DD)\n- `2016-11-24T23:56` (AAAA-MM-DDTHH:mm)\n- `2016-11-24T23:56:12` (AAAA-MM-DDTHH:mm:ss)\n- `2016-11-24T23:56:12. 00` (AAAA-MM-DDTHH:mm:sss)\n\n> **Pista**: Los últimos 3 formatos aceptan `Z` al final para marcar la hora como UTC`. Alternativamente, puedes poner la zona horaria añadiendo `+HH:MM`, por ejemplo `+01:00`.", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "No pude resolver `{{parameter}}` a una duración válida, aquí tiene alguno de los formatos válidos:\n\n$t(arguments:durationFormats)", - "durationFormats": "- `4h` (4 horas).\n- `20m5s` (20 minutos y 5 segundos).\n- `\"1w 2d 16h 40m 10s\"` (1 semana, 2 días, 16 horas, 40 minutos y 10 segundos).", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "¡El parámetro `{{parameter}}` es demasiado pequeño! ¡Debe ser al menos {{minimum}}!", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "¡El parámetro `{{parameter}}` es demasiado pequeño! ¡Debe ser al menos {{minimum}}!", - "invite": "No pude resolver `{{parameter}}` a un enlace de invitación válido, aquí tiene alguno de los formatos válidos:\n\n- `https://discord​.gg/6gakFR2`.\n- `https://discord​.com/invite/6gakFR2`.\n- `https://discordapp​.com/invite/6gakFR2`.\n\n> **Consejo**: Puedes omitir la parte `https://`, `discord​.gg/6gakFR2` también es aceptado como un parámetro válido.", - "language": "¡No pude resolver `{{parameter}}` a un código de idioma válido!\n**Pista**: los siguientes son compatibles: {{possibles, andList}}.\n\n> **Consejo**: ¡Puedes añadir más (o mejorar los ya existentes) en !", - "memberError": "", - "memberMissingGuild": "No pude resolver `{{parameter}}` porque este argumento requiere ser ejecutado en un canal de un servidor.", - "messageError": "", - "missing": "¡Necesitas escribir otro parámetro!\n\n> **Consejo**: puedes hacer `{{commandContext.commandPrefix}}help {{command.name}}` para averiguar cómo usar este comando.", - "newsChannel": "No pude resolver `{{parameter}}` a un canal de anuncios, ¡por favor asegúrese de que escribió su nombre o ID correctamente!\n\n> **Consejo**: ¡También puedes mencionarlo!", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "¡El parámetro `{{parameter}}` es demasiado pequeño! ¡Debe ser al menos {{minimum}}!", - "piece": "¡No pude resolver `{{parameter}}` a una pieza! ¡Asegúrate de que escribiste su nombre o uno de sus alias correctamente!", - "resetPossibles": [ - "apagado", - "restablecer" - ], - "roleError": "", - "roleMissingGuild": "No pude resolver `{{parameter}}` porque este argumento requiere ser ejecutado en un canal de un servidor.", - "scopeGlobal": "global", - "scopeLocal": "local", - "snowflake": "¡No pude resolver `{{parameter}}` a un copo de nieve válido! Son números con 17 a 18 dígitos, por ejemplo, ¡tu mensaje tiene un Snowflake de `{{message.id}}`!", - "store": "No pude resolver `{{parameter}}` a una colección válida!\n**Pista**: lo siguiente son compatibles: {{possibles, andList}}.", - "stringTooLong": "¡El parámetro `{{parameter}}` es demasiado largo! ¡Debe tener menos de {{maximum}} caracter(es)!", - "stringTooShort": "¡El parámetro `{{parameter}}` es demasiado largo! ¡Debe tener menos de {{minimum}} caracter(es)!", - "time": "¡No pude resolver `{{parameter}}` a un tiempo válido!\n**Pista**: los siguientes formatos son compatibles:\n\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpan": "No pude resolver `{{parameter}}` a una duración válida, asegúrese de que escribió un entero válido o un valor formateado de duración. Algunos de los formatos válidos son:\n\n- `45` (45 segundos).\n$t(arguments:durationFormats)\n$t(arguments:dateFormats)", - "timeSpanTooBig": "El parámetro `{{parameter}}` resuelto a una duración mayor a {{maximum, duration}}, ¡el cual no está permitido!", - "timeSpanTooSmall": "El parámetro `{{parameter}}` resuelto a una duración menor a {{minimum, duration}}, ¡el cual no está permitido!", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "¡Ups! Parece que no he podido encontrar un analizador para un parámetro, ¡por favor contacta a mis desarrolladores sobre esto!", - "userError": "", - "wager": "Lo siento, pero {{parameter}} {{SHINY}} no es una cantidad válida para apostar. Puedes apostar uno de {{possibles, orList}}", - "winners": "¡No pude resolver `{{parameter}}` a una cantidad de ganador válida!\n**Pista**: el siguiente formato es compatible: `Nw`, siendo `N` cualquier entero, p. ej. `3w` o `12w`." -} \ No newline at end of file diff --git a/src/languages/es-ES/arguments/image.json b/src/languages/es-ES/arguments/image.json deleted file mode 100644 index e6a9db20e0b..00000000000 --- a/src/languages/es-ES/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} No pude obtener el avatar de {{value}}." -} \ No newline at end of file diff --git a/src/languages/es-ES/arguments/range.json b/src/languages/es-ES/arguments/range.json deleted file mode 100644 index b430bcf17b8..00000000000 --- a/src/languages/es-ES/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} debe ser un número o un rango de números." -} \ No newline at end of file diff --git a/src/languages/es-ES/assertions.json b/src/languages/es-ES/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/es-ES/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/es-ES/colors.json b/src/languages/es-ES/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/es-ES/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/es-ES/commands/admin.json b/src/languages/es-ES/commands/admin.json deleted file mode 100644 index 05577d3aede..00000000000 --- a/src/languages/es-ES/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} no puede ser deshabilitado.", - "confUpdated": "", - "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": { - "usages": [ - "set NombreDeClave Valor para la Clave", - "show", - "show NombreDeClave", - "remove NombreDeClave Valor para la Clave", - "reset NombreDeClave", - "menu" - ], - "extendedHelp": "Te permite configurar Skyra desde Discord, como una alternativa rápida al [panel de control web](https://skyra.pw).", - "examples": [ - "set language es-ES", - "set channels.moderation-logs #logs-de-moderacion", - "show", - "show channels", - "remove roles.moderator Moderador", - "reset roles.moderator", - "menu" - ], - "reminder": "Hay claves y grupos, claves que están dentro de un grupo son nombradas por `GroupName.KeyName`." - }, - "confServer": "**Configuración del servidor {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` sólo puede configurarse a través del panel web ()", - "confSettingNotSet": "No Establecido", - "rolesetDescription": "Administrar los conjuntos de roles únicos.", - "rolesetExtended": { - "usages": [ - "set NombreDeConjuntoDeRoles Rol1 Rol2 Rol3...", - "remove NombreDeConjuntoDeRoles Rol1 Rol2 Rol3...", - "reset", - "reset NombreDeConjuntoDeRoles", - "list", - "NombreDeConjuntoDeRoles Rol1 Rol2 Rol3" - ], - "extendedHelp": "Un conjunto de roles es un grupo de roles que Skyra identifica como único para todos los miembros del servidor, por ejemplo. un conjunto de roles llamado `region` podría tener los roles `África`, `America`, `Asia` y `Europa`, y los miembros solo podrán tener uno de ellos. Esto es como una especie de \"regla\" que se aplica en las tres siguientes situaciones:\n\n- Cuando alguien reclama un rol a través del comando `roles`.\n- Cuando alguien reclama un rol a través de roles de reacción.\n- Cuando alguien recibe un rol de forma manual o de otro bot.", - "explainedUsage": [ - [ - "añadir", - "Crea un nuevo conjunto de roles o añade un rol a un conjunto ya existente." - ], - [ - "eliminar", - "Eliminar un rol de un conjunto existente." - ], - [ - "resetear", - "Elimina todos los roles de un rol o, si no se especifica, todos los roles existentes." - ], - [ - "lista", - "Enumera todos los conjuntos de roles." - ], - [ - "automático", - "Añade o elimina un conjunto de roles." - ], - [ - "NombreDeConjuntoDeRoles", - "El nombre del set de roles" - ], - [ - "Rol1 Rol2 Rol3", - "Los roles a añadir al conjunto de roles" - ] - ], - "examples": [ - "add regiones América", - "add regiones África América Asia Europa", - "remove regiones América", - "reset", - "reset regiones", - "list", - "regiones América", - "regiones África América Asia Europa" - ], - "reminder": "Este comando puede agregar y/o eliminar múltiples roles al mismo tiempo." - }, - "rolesetCreated": "El conjunto de roles únicos {{name}} ha sido creado con los siguientes roles: {{roles, andList}}", - "rolesetAdded": "Actualizado conjunto de roles únicos {{name}}, ahora también tiene los siguientes roles: {{roles, andList}}.", - "rolesetRemoved": "El conjunto de roles únicos de {{name}} ya no incluirá los siguientes roles: {{roles, andList}}", - "rolesetResetEmpty": "{{REDCROSS}} No existen conjuntos de roles configurados en este servidor.", - "rolesetResetAll": "{{GREENTICK}} Se han eliminado todos los conjuntos de roles con éxito.", - "rolesetResetNotExists": "{{REDCROSS}} The conjunto de roles `{{name}}` no existe en este servidor.", - "rolesetResetGroup": "{{GREENTICK}} Se eliminó correctamente el conjunto de roles `{{name}}` de este servidor.", - "rolesetUpdated": "El conjunto de roles único {{name}} ha sido actualizado.", - "rolesetNoRolesets": "No hay conjuntos de roles.", - "confMenuRenderAtFolder": "Actualmente en: 📁 {{path}}", - "confMenuRenderAtPiece": "Actualmente en: ⚙️ {{path}}", - "confMenuRenderNokeys": "No hay claves configurables para este grupo", - "confMenuRenderSelect": "Por favor ingrese cualquiera de los nombres de las siguientes entradas", - "confMenuRenderUpdate": "• Actualizar Valor → `set `", - "confMenuRenderRemove": "• Eliminar valor → `remove `", - "confMenuRenderReset": "• Restablecer valor → `reset`", - "confMenuRenderUndo": "• Deshacer actualización → `undo`", - "confMenuRenderCvalue": "Valor actual: **``{{value}}``**", - "confMenuRenderBack": "Pulsa ◀ para volver atrás", - "confMenuInvalidKey": "Clave no válida, por favor inténtalo de nuevo con cualquiera de las siguientes opciones.", - "confMenuInvalidAction": "Acción no válida, por favor inténtalo de nuevo con cualquiera de las siguientes opciones.", - "confMenuSaved": "Guardado todos los cambios con éxito." -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/animal.json b/src/languages/es-ES/commands/animal.json deleted file mode 100644 index 2516a7e1fdc..00000000000 --- a/src/languages/es-ES/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "Permítanme que les diga un hecho gatuno misterioso.", - "catfactExtended": { - "extendedHelp": "Sabes que los gatos son muy curiosos, ¿verdad? Seguro que tienen mucha diversión y hechos extraños.\nCon este comando obtendrás un hecho aleatorio." - }, - "catfactTitle": "Hecho Gatuno", - "dogDescription": "¡Perritos lindos! ❤", - "dogExtended": { - "extendedHelp": "¿Sabes cuán lindos son los perros? ¡Son tan hermosos!\n¡Este comando usa [dog.ceo](https://dog.ceo) para mostrar imágenes de los cachorros más monos!" - }, - "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": "¿Sabes cuán lindos son los gatitos? ¡Son tan hermosos!\n¡Este comando usa [cataas.com](https://cataas.com/) para mostrar fotos de los gatitos más monos!" - }, - "shibeDescription": "¡Shibas monos!", - "shibeExtended": { - "extendedHelp": "Todo el mundo ama a los shibas, ¡y yo también! Son tan adorables ❤" - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/animation.json b/src/languages/es-ES/commands/animation.json deleted file mode 100644 index 833121d5e85..00000000000 --- a/src/languages/es-ES/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "Busca tu anime favorito por su título con este comando.", - "kitsuAnimeEmbedData": { - "ageRating": "Clasificación por edad", - "episodeLength": "Longitud del episodio", - "episodes": "Episodio(s)", - "firstAirDate": "Primera fecha de emisión", - "score": "Puntuación", - "stillAiring": "Sigue emitiendo", - "type": "Tipo", - "watchIt": "Véalo aquí:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "Este comando consulta Kitsu.io para mostrar los datos del anime que usted solicite.", - "usages": [ - "Nombre de Anime" - ] - }, - "kitsuAnimeNoSynopsis": "No hay ninguna aplicación disponible para este título.", - "kitsuAnimeOutputDescription": "**Título en inglés:** {{englishTitle}}\n**Título japonés:** {{japaneseTitle}}\n**Título canónico:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "🎥 Película", - "ova": "📼 Animación original de vídeo", - "special": "🎴 Especial", - "tv": "📺 TV" - }, - "kitsuMangaDescription": "Busca tu manga favorito por su título con este comando.", - "kitsuMangaEmbedData": { - "ageRating": "Clasificación por edad", - "firstPublishDate": "Publicado originalmente", - "none": "Ninguno", - "readIt": "Léalo aquí:", - "score": "Puntuación", - "type": "Subtipo" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "Este comando consulta Kitsu.io para mostrar los datos del manga que usted solicite.", - "usages": [ - "Nombre de Manga" - ] - }, - "kitsuMangaOutputDescription": "**Título en inglés:** {{englishTitle}}\n**Título japonés:** {{japaneseTitle}}\n**Título canónico:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 Manga", - "manhwa": "🇰🇷 Manhwa", - "novel": "📕 Novel", - "oneShot": "☄ One Shot", - "special": "🎴 Especial" - }, - "waifuDescription": "Publica una imagen de una waifu generada al azar.", - "waifuExtended": { - "extendedHelp": "Este comando publica un waifu aleatorio generado por " - }, - "waifuFooter": "Hecho posible gracias a thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/fun.json b/src/languages/es-ES/commands/fun.json deleted file mode 100644 index a2691dda5ef..00000000000 --- a/src/languages/es-ES/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "Skyra es la mejor, convénceme de lo contrario.", - "changemymindExtended": { - "usages": [ - "Contenido" - ], - "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" - ] - }, - "choiceDescription": "Pito pito, gorgorito, ¿dónde vas tú tan bonito?...", - "choiceExtended": { - "usages": [ - "Elección1 Elección2 Elección3..." - ], - "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" - ] - }, - "diceDescription": "Lanza los dados usando la sintaxis d20.", - "diceExtended": { - "usages": [ - "Tiradas" - ], - "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": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "Usa la Cuerda Huida de Pokemon.", - "escaperopeExtended": { - "extendedHelp": "**Skyra** utilizó **Cuerda Huida**." - }, - "loveDescription": "Medidor de amor, ¡en línea!", - "loveExtended": { - "usages": [ - "Usuario" - ], - "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" - ] - }, - "popDescription": "Genera un tablero de pop, pop, pop y pop.", - "popExtended": { - "usages": [ - "Duración", - "--x/--width", - "--y/--height", - "--length" - ], - "extendedHelp": "Le permite generar un tablero de burbujas, donde hay una palabra que no es pop, que usted debe encontrar y enviar al canal. Por ejemplo, debes enviar `e60` del ||`pop`|||`e60`|||||`pop`|| para poder ganar.", - "explainedUsage": [ - [ - "Duración", - "La cantidad de tiempo que debo permitirle encontrar la solución, por defecto es de 30 segundos." - ], - [ - "--x/--width", - "La cantidad de columnas que el tablero debe tener, por defecto 8." - ], - [ - "--y/--height", - "La cantidad de rilas que el tablero debe tener, por defecto 3." - ], - [ - "--length", - "La longitud de los pops y la solución, el valor por defecto es 3." - ] - ], - "examples": [ - "15", - "--x=10", - "--y=5", - "--length=4" - ] - }, - "popTitle": "¡POP! ¡Que comiencen los pops!", - "popTitleLost": "¡POP! ¡Nadie lo consiguió a tiempo!", - "popTitleWinner": "¡POP! ¡Tenemos un ganador: {{value}}!", - "rateDescription": "Deja que los robots tengan opiniones y valore a alguien.", - "rateExtended": { - "usages": [ - "Contenido" - ], - "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": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "\"Usted ya está muerto\" Japonés: お前はもう死んでいる; Omae Wa Mou Shindeiru, es una expresión de la serie de manga y anime Hokuto no Ken. Esto muestra una historieta del personaje pronunciando las palabras más importantes, lo que hace que el oponente responda con \"nani?\" (¿qué?).", - "examples": [ - "Skyra" - ] - }, - "thinkDescription": "Piensa, ¡Mark!", - "thinkExtended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "\"¡Piensa, Mark!\" es un meme del programa de televisión Invincible, el resto... no, eso serían spoilers.", - "reminder": "Este comando contiene sangre de dibujos animados, que puede no ser adecuado para todos los públicos.", - "examples": [ - "Mark" - ] - }, - "thinkMessage": "Piensa, {{user}}, ¡piensa!", - "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." - }, - "whereDescription": "¡Encontré a la persona que estábamos buscando!", - "whereExtended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "Este comando genera un meme de [Ataque a los titanes: la temporada final](https://anilist.co/anime/110277/Shingeki-no-Kyojin-The-Final-Season/), y es mejor no decirte nada, otro que esto generará un meme de ti apuntando a un usuario de tu elección.", - "examples": [ - "Encanto" - ] - }, - "whereMessage": "¡He encontrado a {{user}}!", - "xkcdDescription": "Lee comics de XKCD.", - "xkcdExtended": { - "usages": [ - "NúmeroDelCómic", - "Nombre del Cómic" - ], - "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" - ] - }, - "choiceOutput": "🕺 *Pito pito, gorgorito, ¿dónde vas tú tan bonito?...* {{user}}, yo elijo:{{word, codeBlock}}", - "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", - "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" - ], - "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!" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/game.json b/src/languages/es-ES/commands/game.json deleted file mode 100644 index 189497f955b..00000000000 --- a/src/languages/es-ES/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "Juega al Conecta Cuatro con alguien.", - "c4Extended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "Este juego se juega mejor en el ordenador.\n\nEl objetivo de Conecta 4 es alinear cuatro fichas sobre un tablero formado por seis filas y siete columnas. Cada jugador dispone de 21 fichas de un color.​ Por turnos, los jugadores deben introducir una ficha en la columna que prefieran (siempre que no esté completa) y ésta caerá a la posición más baja. Gana la partida el primero que consiga alinear cuatro fichas consecutivas de un mismo color en horizontal, vertical o diagonal.​ Si todas las columnas están llenas pero nadie ha hecho una fila válida, hay empate.", - "examples": [ - "Skyra" - ] - }, - "c4Prompt": "Estimado {{challengee}}. Has sido desafiado por {{challenger}} en una partida de Conecta 4. ¡Haz clic en la reacción to para aceptar!", - "cannotHaveNegativeMoney": "No puedes tener una cantidad negativa de {{SHINY}}s.", - "coinFlipHeadNames": [ - "cara", - "cara", - "c" - ], - "coinFlipTailNames": [ - "cruz", - "cruz", - "c" - ], - "coinFlipCoinNames": [ - "Cara", - "Cruz" - ], - "coinFlipDescription": "¡Lanza una moneda al aire!", - "coinFlipExtended": { - "usages": [ - "heads/tails", - "heads cashless", - "tails Apuesta" - ], - "extendedHelp": "Lanza una moneda al aire. Si adivinas el lado que aparece, recuperarás el doble de apuesta, si no, perderás tu apuesta.\nTambién puedes hacer un lanzamiento sin apostar, pero no tendrías una recompensa por ello.\n\nAhora... ¡hora de lanzar monedas!", - "explainedUsage": [ - [ - "heads/tails", - "Si crees que la moneda aterrizará en cara o en cruz." - ], - [ - "cashless, Wager", - "Si está en \"cashless\" (por defecto) entonces no estarás utilizando Shiny para el lanzamiento de la moneda (útil para juegos RPG o para tomar una decisión). También puedes hacer una apuesta de Shiny." - ] - ], - "examples": [ - "tails 50", - "heads 200", - "tails 200", - "tails cashless" - ] - }, - "coinFlipInvalidCoinName": "Disculpe, ¡pero `{{parameter}}` no es una cara de moneda!", - "coinFlipLoseDescription": "La moneda fue lanzada y mostró {{result}}. No adivinaste correctamente.", - "coinFlipLoseDescriptionWithWager": "La moneda fue lanzada y mostró {{result}}. No adivinaste correctamente y perdiste {{wager}} {{SHINY}}.", - "coinFlipLoseTitle": "¡Perdiste!", - "coinFlipNoguessDescription": "La moneda fue lanzada y mostró {{result}}.", - "coinFlipNoguessTitle": "Has lanzado una moneda.", - "coinFlipWinDescription": "La moneda fue lanzada y mostró {{result}}. ¡Lo adivinaste!", - "coinFlipWinDescriptionWithWager": "La moneda fue lanzada y mostró {{result}}. ¡Lo adivinaste y ganaste {{wager}} {{SHINY}}!", - "coinFlipWinTitle": "¡Ganaste!", - "gamesBot": "Lo siento, pero no creo que les gustaría dejar de hacer lo que están haciendo y jugar con los humanos.", - "gamesNoPlayers": "Por favor especifica algunos tributos para jugar a las Partidas del Hambre, así: `{{prefix}}hg Bob, Mark, Jim, Kyra`", - "gamesProgress": "Lo siento, pero hay un juego en curso en este canal, inténtelo de nuevo cuando termine.", - "gamesPromptDeny": "Lo siento, pero el contrincante se negó a jugar.", - "gamesRepeat": "Lo siento, pero un usuario no puede jugar dos veces.", - "gamesSelf": "Debes estar muy triste para jugar contra ti mismo. Inténtalo de nuevo con otro usuario.", - "gamesTooManyOrFew": "Lo siento, pero la cantidad de jugadores es menor que {{min}} o mayor que {{max}}.", - "hgBloodbath": [ - "{1} agarra una pala.", - "{1} toma una mochila y huye.", - "{1} y {2} luchan por una bolsa. {1} abandona y se retira.", - "{1} y {2} luchan por una bolsa. {2} abandona y se retira.", - "{1} encuentra un arco, algunas flechas y una aljaba.", - "{1} corre hacia la cornucopia y se esconde.", - "{1} toma un puñado de cuchillos arrojadizos.", - "{1} le arranca la maza de las manos de {2}.", - "{1} encuentra una cantimplora llena de agua.", - "{1} se queda en la cornucopia para recoger recursos.", - "{1} recolecta tanta comida como puede.", - "{1} agarra una espada.", - "{1} toma una lanza dentro de la cornucopia.", - "{1} encuentra una bolsa llena de explosivos.", - "{1} agarra un kit de primeros auxilios y huye.", - "{1} toma una hoz dentro de la cornucopia.", - "{1}, {2} y {3} trabajan juntos para obtener tantos suministros como sea posible.", - "{1} corre con un mechero y una cuerda.", - "{1} agarra una botella de alcohol y un trapo.", - "{1} encuentra una mochila llena de equipamiento de acampada.", - "{1} agarra una mochila, sin darse cuenta de que está vacía.", - "{1} rompe la nariz de {2} por una cesta de pan.", - "{1}, {2}, {3} y {4} comparten todo lo que recolectaron antes de correr.", - "{1} pilla un tridente dentro de la cornucopia.", - "{1} agarra un tarro de cebo de pesca mientras que {2} obtiene equipamiento de pesca.", - "{1} asusta a {2} de la cornucopia.", - "{1} agarra un escudo de la cornucopia.", - "{1} toma un par de kukris.", - "{1} agarra un solo par de pantalones.", - "{1T} abandona su podio demasiado pronto y explota.", - "{1} tira un cuchillo a la cabeza de {2T}.", - "{1T} pisa accidentalmente en una mina terrestre.", - "{1} pilla a {2T} fuera de guardia y lo mata.", - "{1} y {2} trabajan juntos para ahogar a {3T}.", - "{1} ahoga a {2T} después de una pelea a puños.", - "{1} dispara una flecha a la cabeza de {2T}.", - "{1T} no puede manejar las circunstancias y comete suicidio.", - "{1} golpea la cabeza de {2T} contra una roca varias veces.", - "{1} rompe el cuello de {2T}.", - "{1} decapita a {2T} con una espada.", - "{1} alancea a {2T} en el abdomen.", - "{1} prende fuego a {2T} con un molotov.", - "{1T} cae en un pozo y muere.", - "{1} apuñala a {2T} mientras que estaba de espaldas.", - "{1} hiere severamente a {2T}, pero lo saca de su miseria.", - "{1} hiere severamente a {2T} y le deja morir.", - "{1} rompe la cabeza de {2T} con un mazo.", - "{1} empuja a {2T} de un acantilado durante una pelea de cuchillo.", - "{1} tira un cuchillo a la torso de {2T}.", - "{1T} es incapaz de convencer a {2} de que no le mate.", - "{1} convence a {2T} para que no le mate, solo para matar a {2T} en su lugar.", - "{1T} cae en un lago congelado y se ahoga.", - "{1}, {2} y {3T} empiezan a luchar, pero {2} huye tan pronto como {1} mata a {3T}.", - "{1} mata a {2T} con su propio arma.", - "{1} aplasta a {2T}, matándoles.", - "{1} detona una carga explosiva, matando a {2T}.", - "{1} pone una carga explosiva, matando a {2T} y {3T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T}, {4T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T}, {4T} y {5T}.", - "{1} mata a {2T} mientras que intentaba correr.", - "{1T} y {2T} amenaza con un suicidio doble. Falla y mueren.", - "{1T}, {2T}, {3T} y {4T} forman un pacto de suicidio, matándose a sí mismos.", - "{1} mata a {2T} con un hacha.", - "{1} y {2} luchan contra {3T} y {4T}. {1} y {2} sobreviven.", - "{1T} y {2T} luchan contra {3} y {4}. {3} y {4} sobreviven.", - "{1T} ataca a {2}, pero {3} le protege, matando a {1T}.", - "{1} rebana severamente {2T} con una espada.", - "{1} ahoga a {2T} con una cuerda.", - "{1} mata a {2T} por sus suministros.", - "{1} dispara una flecha a {2}, pero falla y mata a {3T}.", - "{1} dispara un dardo venenoso en el cuello de {2T}, matándolo lentamente.", - "{1} apuñala a {2T} con una rama de árbol.", - "{1} apuñala a {2T} en la espalda con un tridente.", - "{1}, {2T} y {3T} entran en una pelea. {1} mata triunfantemente a ambos.", - "{1T}, {2} y {3T} entran en una pelea. {2} mata triunfantemente a ambos.", - "{1T}, {2T} y {3} entran en una pelea. {3} mata triunfantemente a ambos.", - "{1} encuentra a {2T} escondido en la cornucopia y lo mata.", - "{1T} encuentra a {2} oculto en la cornucopia, pero {2} lo mata.", - "{1} mata a {2T} con una hoz.", - "{1} y {2T} luchan por una bolsa. {1} estrangula a {2T} con las correas y huye.", - "{1T} y {2} luchan por una bolsa. {2} estrangula a {1T} con las correas y huye.", - "{1} apuñala repetidamente con kukris a {2T} hasta morir.", - "{1T} se resbala mientras que corría desde la cornucopia, y es matado por {2}.", - "{1} se resbala mientras que corría de la cornucopia, {2} lo recoge y corren fuera juntos.", - "{1} apunta a una flecha en la cabeza de {2} y dispara, {3T} salta en el camino y sacrifica su vida para salvarle." - ], - "hgDay": [ - "{1} se va de caza.", - "{1} se lesiona a sí mismo.", - "{1} explora la arena.", - "{1} le asusta a {2}.", - "{1} desvía la atención de {2} y huye.", - "{1} acecha a {2}.", - "{1} pesca.", - "{1} se camufla en el arbusto.", - "{1} roba a {2} mientras no estaba mirando.", - "{1} hace una lanza de madera.", - "{1} descubre una cueva.", - "{1} ataca a {2}, pero consigue escapar.", - "{1} persigue a {2}.", - "{1} huye de {2}.", - "{1} recolecta frutos de un árbol.", - "{1} recibe un hacha de un patrocinador desconocido.", - "{1} recibe agua limpia de un patrocinador desconocido.", - "{1} recibe suministros médicos de un patrocinador desconocido.", - "{1} recibe comida fresca de un patrocinador desconocido.", - "{1} busca una fuente de agua.", - "{1} derrota a {2} en una pelea, pero le perdona la vida.", - "{1} y {2} trabajan juntos durante el día.", - "{1} pide a {2} que lo mate. Se niega, dejando a {1} vivo.", - "{1} intenta dormir todo el día.", - "{1}, {2}, {3} y {4} asaltan el campamento de {5} mientras que cazaba.", - "{1} construye una chabola.", - "{1} escucha la conversación de {2} y {3} a distancia.", - "{1} practica su tiro con arco.", - "{1} piensa de su casa.", - "{1} es pinchado por espinas al recoger bayas.", - "{1} intenta alancear peces con un tridente.", - "{1} busca leña.", - "{1} y {2} se dividen para buscar recursos.", - "{1} coge flores.", - "{1} tiende a las heridas de {2}.", - "{1} ve humo en la distancia, pero decide no investigar.", - "{1} se tuece el tobillo mientras huía de {2}.", - "{1} hace un tirachinas.", - "{1} viaja a un terreno más alto.", - "{1} descubre un río.", - "{1} va de caza a por los otros tributos.", - "{1} y {2} van de caza a por los otros tributos.", - "{1}, {2} y {3} van de caza a por los otros tributos.", - "{1}, {2}, {3} y {4} van de caza a por los otros tributos.", - "{1}, {2}, {3}, {4} y {5} van de caza a por los otros tributos.", - "{1} recibe un explosivo de un patrocinador desconocido.", - "{1} cuestiona su cordura.", - "{1} fuerza a {2} a comer un pantalón.", - "{1} fuerza a {2T} a comer un pantalón. {2T} se ahoga y muere.", - "{1} pilla a {2T} fuera de guardia y lo mata.", - "{1} tira un cuchillo a la cabeza de {2T}.", - "{1T} ruega a {2} para que lo mate. Hace el favor y mata a {1T}.", - "{1} y {2} trabajan juntos para ahogar a {3T}.", - "{1} ahoga a {2T} después de una pelea a puños.", - "{1} dispara una flecha a la cabeza de {2T}.", - "{1T} se desangra debido a lesiones no tratadas.", - "{1T} no puede manejar las circunstancias y comete suicidio.", - "{1} golpea la cabeza de {2T} contra una roca varias veces.", - "{1T} consume bayas tóxicas sin saberlo.", - "{1} rompe el cuello de {2T} de forma silenciosa.", - "{1} envenena la comida de {2T}, matándolo.", - "{1} decapita a {2T} con una espada.", - "{1T} muere de una infección.", - "{1} alancea a {2T} en el abdomen.", - "{1} prende fuego a {2T} con un molotov.", - "{1T} cae en un pozo y muere.", - "{1} apuñala a {2T} mientras que estaba de espaldas.", - "{1} hiere severamente a {2T}, pero lo saca de su miseria.", - "{1} hiere severamente a {2T} y le deja morir.", - "{1} rompe la cabeza de {2T} con un mazo.", - "{1T} intenta escalar un árbol, pero se cae y muere.", - "{1} empuja a {2T} de un acantilado durante una pelea de cuchillo.", - "{1} tira un cuchillo al torso de {2T}.", - "La trampa de {1} mata a {2T}.", - "{1} mata a {2T} mientras descansa.", - "{1T} es incapaz de convencer a {2} de que no le mate.", - "{1} convence a {2T} para que no le mate, solo para matar a {2T} en su lugar.", - "{1T} cae en un lago congelado y se ahoga.", - "{1}, {2} y {3T} empiezan a luchar, pero {2} huye tan pronto como {1} mata a {3T}.", - "{1} mata a {2T} con su propio arma.", - "{1} vence a {2T}, matándoles.", - "{1} detona una carga explosiva, matando a {2T}.", - "{1} pone una carga explosiva, matando a {2T} y {3T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T} y {4T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T}, {4T} y {5T}.", - "{1} mata a {2T} mientras que intentaba correr.", - "{1T} y {2T} amenaza con un suicidio doble. Falla y mueren.", - "{1T}, {2T}, {3T} y {4T} forman un pacto de suicidio, matándose a sí mismos.", - "{1T} muere por hipotermia.", - "{1T} muere de hambre.", - "{1T} muere de sed.", - "{1} mata a {2T} con un hacha.", - "{1} y {2} luchan contra {3T} y {4T}. {1} y {2} sobreviven.", - "{1T} y {2T} luchan contra {3} y {4}. {3} y {4} sobreviven.", - "{1T} muere intentando escapar de la arena.", - "{1T} muere de disentería.", - "{1T} detona accidentalmente una mina de tierra mientras intenta armarla.", - "{1T} ataca a {2}, pero {3} le protege, matando a {1T}.", - "{1} embosca a {2T} y lo mata.", - "{1T} pisa accidentalmente en una mina terrestre.", - "{1} rebana severamente {2T} con una espada.", - "{1} ahoga a {2T} con una cuerda.", - "{1} mata a {2T} por sus suministros.", - "{1} dispara una flecha a {2}, pero falla y mata a {3T}.", - "{1} dispara un dardo venenoso en el cuello de {2T}, matándolo lentamente.", - "{1}, {2} y {3} emboscan y matan con éxito a {4T}, {5T} y {6T}.", - "{1T}, {2T} y {3T} emboscan sin éxito a {4}, {5} y {6}, quienes los matan en su lugar.", - "{1} apuñala a {2T} con una rama de árbol.", - "{1} fuerza a {2} a matar o a {3T} o a {4}. Decide matar a {3T}.", - "{1} fuerza a {2} a matar o a {3} o a {4T}. Decide matar a {4T}.", - "{1} fuerza a {2T} a matar a {3} o a {4}. Se niega a matar, así que {1} lo mata en su lugar.", - "{1T} envenena la bebida de {2}, pero la equivoca por su propia y muere.", - "{1} envenena la bebida de {2T}. La bebe y mueren.", - "{1} apuñala a {2T} en la espalda con un tridente.", - "{1T} intenta escalar un árbol, pero se cae en {2T} y ambos mueren.", - "{1}, {2T} y {3T} entran en una pelea. {1} los mata triunfantemente a ambos.", - "{1T}, {2} y {3T} entran en una pelea. {2} los mata triunfantemente a ambos.", - "{1T}, {2T} y {3} entran en una pelea. {3} los mata triunfantemente a ambos.", - "{1} mata a {2T} con una hoz.", - "{1}, {2}, {3}, {4} y {5} buscan y matan a {6T}.", - "{1}, {2}, {3} y {4} buscan y matan a {5T}.", - "{1}, {2} y {3} buscan y matan a {4T}.", - "{1} y {2} buscan y matan a {3T}.", - "{1} busca y mata a {2T}.", - "{1} apuñala repetidamente con una kukris a {2T} hasta matarlo.", - "{1} garabatea en la tierra.", - "{1} persigue a una mariposa.", - "{1T} cae de un acantilado y se ve empalado por un palo.", - "{1} se choca con {2}, deciden crear un equipo.", - "{1} ve {2} a través de los árboles y planea matarle.", - "{1} se acecha detrás de {2T} y rompe su cuello.", - "{1T} desafía a {2} a una pelea, y rápidamente muere.", - "{1} asesina a su compañero, {2T}, para tener más suministros para sí mismo." - ], - "hgNight": [ - "{1} inicia un fuego.", - "{1} instala un campamento para la noche.", - "{1} se ha perdido.", - "{1} sube un árbol para descansar.", - "{1} se va a dormir.", - "{1} y {2} se cuentan historias acerca de sí mismos.", - "{1}, {2}, {3} y {4} se duermen en turnos.", - "{1}, {2} y {3} se duermen en turnos.", - "{1} y {2} se duermen en turnos.", - "{1} tiende a sus heridas.", - "{1} ve un fuego, pero permanece oculto.", - "{1} grita en busca de ayuda.", - "{1} permanece despierto toda la noche.", - "{1} pierde el conocimiento por agotamiento.", - "{1} cocina su comida antes de apagar su fuego.", - "{1} y {2} se encuentran entre sí y deciden hacer tregua por la noche.", - "{1} aleja a {2}, {3} y {4} de su fuego.", - "{1}, {2} y {3} discuten los juegos y lo que podría pasar por la mañana.", - "{1} llora hasta dormir.", - "{1} intenta tratar su infección.", - "{1} y {2} hablan sobre los tributos aún vivos.", - "{1} se despierta por una pesadilla.", - "{1} y {2} se abrazan para mantener el calor.", - "{1} piensa en ganar.", - "{1}, {2}, {3} y {4} se cuentan entre sí historias de fantasmas para mejorar el estado de ánimo.", - "{1} mira al cielo nocturno.", - "{1} derrota a {2} en una pelea, pero le perdona la vida.", - "{1} pide a {2} que lo mate. Se niega, dejando a {1} vivo.", - "{1} destruye los suministros de {2} mientras duerme.", - "{1}, {2}, {3}, {4} y {5} duermen en turnos.", - "{1} permite a {2} entrar en su refugio.", - "{1} recibe un hacha de un patrocinador desconocido.", - "{1} recibe agua limpia de un patrocinador desconocido.", - "{1} recibe suministros médicos de un patrocinador desconocido.", - "{1} recibe comida fresca de un patrocinador desconocido.", - "{1} intenta cantar hasta dormir.", - "{1} intenta iniciar un fuego, pero no tiene éxito.", - "{1} piensa de su casa.", - "{1} tiende a las heridas de {2}.", - "{1} tatarea silenciosamente.", - "{1}, {2} y {3} cantan canciones alegremente juntos.", - "{1} no puede iniciar un fuego y duerme sin calor.", - "{1} y {2} sostienen las manos.", - "{1} convence a {2} para que se pegue con ellos.", - "{1} recibe un explosivo de un patrocinador desconocido.", - "{1} cuestiona su cordura.", - "{1} fuerza a {2} a comer un pantalón.", - "{1} fuerza a {2T} a comer un pantalón. {2T} se ahoga y muere.", - "{1} pilla a {2T} fuera de guardia y lo mata.", - "{1} lanza un cuchillo a la cabeza de {2T}.", - "{1T} ruega a {2} para que lo mate. Hace el favor y mata a {1T}.", - "{1} y {2} trabajan juntos para ahogar a {3T}.", - "{1} ahoga a {2T} después de una pelea a puños.", - "{1} dispara una flecha a la cabeza de {2T}.", - "{1T} se desangra debido a lesiones no tratadas.", - "{1T} no puede manejar las circunstancias y comete suicidio.", - "{1} golpea la cabeza de {2T} contra una roca varias veces.", - "{1T} consume bayas tóxicas sin saberlo.", - "{1} rompe el cuello de {2T} de forma silenciosa.", - "{1} envenena la comida de {2T}, matándolo.", - "{1} decapita a {2T} con una espada.", - "{1T} muere de una infección.", - "{1} alancea a {2T} en el abdomen.", - "{1} prende fuego a {2T} con un molotov.", - "{1T} cae en un pozo y muere.", - "{1} apuñala a {2T} mientras que estaba de espaldas.", - "{1} hiere severamente a {2T}, pero lo saca de su miseria.", - "{1} hiere severamente a {2T} y le deja morir.", - "{1} rompe la cabeza de {2T} con un mazo.", - "{1T} intenta escalar un árbol, pero se cae y muere.", - "{1} empuja a {2T} de un acantilado durante una pelea de cuchillo.", - "{1} lanza un cuchillo al torso de {2T}.", - "La trampa de {1} mata a {2T}.", - "{1} mata a {2T} mientras duerme.", - "{1T} es incapaz de convencer a {2} de que no le mate.", - "{1} convence a {2T} para que no le mate, solo para matar a {2T} en su lugar.", - "{1T} cae en un lago congelado y se ahoga.", - "{1}, {2} y {3T} empiezan a luchar, pero {2} huye tan pronto como {1} mata a {3T}.", - "{1} mata a {2T} con su propio arma.", - "{1} sobrepasa a {2T}, matándoles.", - "{1} detona una carga explosiva, matando a {2T}.", - "{1} pone una carga explosiva, matando a {2T} y {3T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T} y {4T}.", - "{1} pone una carga explosiva, matando a {2T}, {3T}, {4T} y {5T}.", - "{1} mata a {2T} mientras que intentaba correr.", - "{1T} y {2T} amenaza con un suicidio doble. Falla y mueren.", - "{1T}, {2T}, {3T} y {4T} forman un pacto de suicidio, matándose a sí mismos.", - "{1T} muere por hipotermia.", - "{1T} muere de hambre.", - "{1T} muere de sed.", - "{1} mata a {2T} con un hacha.", - "{1} y {2} luchan contra {3T} y {4T}. {1} y {2} sobreviven.", - "{1T} y {2T} luchan contra {3} y {4}. {3} y {4} sobreviven.", - "{1T} muere intentando escapar de la arena.", - "{1T} muere de disentería.", - "{1T} detona accidentalmente una mina de tierra mientras intenta armarla.", - "{1T} ataca a {2}, pero {3} le protege, matando a {1T}.", - "{1} embosca a {2T} y lo mata.", - "{1T} pisa accidentalmente en una mina terrestre.", - "{1} rebana severamente a {2T} con una espada.", - "{1} ahoga a {2T} con una cuerda.", - "{1} mata a {2T} por sus suministros.", - "{1} dispara una flecha a {2}, pero falla y mata a {3T}.", - "{1} dispara un dardo venenoso en el cuello de {2T}, matándolo lentamente.", - "{1}, {2} y {3} emboscan y matan con éxito a {4T}, {5T} y {6T}.", - "{1T}, {2T} y {3T} emboscan sin éxito a {4}, {5} y {6}, quienes los matan en su lugar.", - "{1} apuñala a {2T} con una rama de árbol.", - "{1} fuerza a {2} a matar o a {3T} o a {4}. Decide matar a {3T}.", - "{1} fuerza a {2} a matar o a {3} o a {4T}. Decide matar a {4T}.", - "{1} fuerza a {2T} a matar o a {3} o a {4}. Se niega a matar, así que {1} lo mata en su lugar.", - "{1T} envenena la bebida de {2}, pero la equivoca por su propia y muere.", - "{1} envenena la bebida de {2T}. La bebe y muere.", - "{1} apuñala a {2T} en la espalda con un tridente.", - "{1T} intenta escalar un árbol, pero se cae en {2T} y ambos mueren.", - "{1}, {2T} y {3T} entran en una pelea. {1} los mata triunfantemente a ambos.", - "{1T}, {2} y {3T} entran en una pelea. {2} los mata triunfantemente a ambos.", - "{1T}, {2T} y {3} entran en una pelea. {3} los mata triunfantemente a ambos.", - "{1} mata a {2T} con una hoz.", - "{1}, {2}, {3}, {4} y {5} buscan y matan a {6T}.", - "{1}, {2}, {3} y {4} buscan y matan a {5T}.", - "{1}, {2} y {3} buscan y matan a {4T}.", - "{1} y {2} buscan y matan a {3T}.", - "{1} busca y mata a {2T}.", - "{1} apuñala repetidamente con kukris a {2T} hasta morir.", - "{1} escribe en su diario.", - "{1} mira a {2} sentados en su hoguera, y considera matarle" - ], - "higherLowerCancel": { - "description": "¡Gracias por jugar, {{username}}! Estaré aquí cuando quieras jugar de nuevo.", - "title": "El juego ha sido cancelado por elección" - }, - "higherLowerCashout": "He ingresado {{amount}} {{SHINY}} a tu cuenta. ¡Espero que te diviertas!", - "higherLowerDescription": "Juega una partida de Mayor/Menor", - "higherLowerEmbed": { - "description": "Tu número es {{number}}. ¿Será el siguiente número mayor o menor?", - "footer": "El juego caducará en 3 minutos, así que ¡actúe rápido!", - "title": "¿Mayor o menor? | Turno para {{turn}}" - }, - "higherLowerExtended": { - "usages": [ - "Apuesta" - ], - "extendedHelp": "Mayor/Menor es un juego de suerte.\nEscogeré un número y tendrás que adivinar si el siguiente número que elijo será **mayor** o **menor** que el actual, usando los emojis ⬆ o ⬇.\nTus ganancias aumentan a medida que avanzas a través de las rondas, y puedes canjear en cualquier momento haciendo clic en 💰 emoji.\n¡Pero ten cuidado! Cuanto más lejos vayas, más posibilidades tendrás de perder las ganancias.", - "examples": [ - "50", - "200" - ] - }, - "higherLowerLoading": "{{LOADING}} Comenzando una nueva partida de Higher/Llower.", - "higherLowerLose": { - "description": "No lo has conseguido. El número era {{number}}. Perdiste {{losses}} {{SHINY}}.", - "footer": "¡Más suerte la próxima vez!", - "title": "¡Has perdido!" - }, - "higherLowerNewround": "Muy bien. Iniciando una nueva ronda.", - "higherLowerWin": { - "description": "El número era {{number}}. ¿Desea continuar? ¡Con otro intento, puedes ganar {{potentials}} {{SHINY}}!", - "footer": "¡Actúe rápido! No tiene mucho tiempo.", - "title": "¡Has ganado!" - }, - "hungerGamesDescription": "¡Juega a los Juegos de Hambre con tus amigos!", - "hungerGamesExtended": { - "usages": [ - "Usuario1 Usuario2 Usuario3...", - "--autofill" - ], - "extendedHelp": "Basta de discusión, ¡que comiencen los juegos del hambre!", - "examples": [ - "Skyra, Katniss, Peeta, Clove, Cato, Johanna, Brutus, Blight" - ], - "reminder": "Puede especificar `--autoskip` para omitir automáticamente después de algún tiempo." - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "Baño de Sangre", - "hungerGamesResultHeaderMoon": "Noche {{game.turn}}", - "hungerGamesResultHeaderSun": "Día {{game.turn}}", - "hungerGamesResultProceed": "¿Continuar?", - "hungerGamesStop": "¡El juego terminó por elección! ¡Nos vemos más tarde!", - "hungerGamesWinner": "¡Y el ganador es... {{winner}}!", - "notEnoughMoney": "Lo siento, ¡pero no tienes suficiente dinero para pagar tu apuesta! Tu monedero tiene {{money}} {{SHINY}}", - "slotmachineCanvasTextLost": "Has perdido", - "slotmachineCanvasTextWon": "Has ganado", - "slotmachineDescription": "Apuesto 100 {{SHINY}}'s que no ganas en esta ronda.", - "slotmachineExtended": { - "usages": [ - "Apuesta" - ], - "explainedUsage": [ - [ - "Apuesta", - "50, 100, 200, 500, 1000, e incluso más {{SHINY}} para apostar." - ] - ], - "extendedHelp": "Gire una máquina tragaperras de 3 tambores y apuesta tus Shiny para obtener grandes recompensas.", - "reminder": "Recibirás al menos 5 veces la cantidad (cerezas) al ganar, y hasta 24 veces (sietes)." - }, - "slotmachinesLoss": "**Has tirado:**\n{{roll}}\n**¡Misión fallida!**\n¡Lo conseguiremos la próxima vez!", - "slotmachinesWin": "**Has obtenido:**\n{{roll}}\n**¡Felicidades!**\n¡Has ganado {{winnings}}{{SHINY}}!", - "ticTacToeDescription": "Juega al Tres en Raya con alguien.", - "ticTacToeDraw": "¡Esta partida concluyó en un **empate**!\n{{board}}", - "ticTacToeExtended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "Tres en Raya es un juego de papel y lápiz para dos jugadores, X y O, que toman turnos marcando los espacios en una cuadrícula de 3×3.\nEl jugador que consigue colocar tres de sus marcas en una fila horizontal, vertical, o diagonal gana el juego.", - "examples": [ - "Skyra" - ] - }, - "ticTacToePrompt": "Estimado {{challengee}}. Has sido desafiado por {{challenger}} en una partida de Tres en Raya. ¡Haz clic en la reacción to para aceptar!", - "ticTacToeTurn": "({{icon}}) ¡Turno para {{player}}!\n{{board}}", - "ticTacToeWinner": "¡El ganador es... {{winner}}!\n{{board}}", - "triviaActiveGame": "Ya se está jugando una partida de trivia en este canal", - "triviaDescription": "Juega una partida de Trivia.", - "triviaEmbedTitles": { - "difficulty": "Dificultad", - "trivia": "Trivia" - }, - "triviaExtended": { - "usages": [ - "", - "Categoría", - "Categoría multiple/boolean/truefalse", - "multiple easy/medium/hard", - "hard 2m" - ], - "extendedHelp": "Responda a preguntas de trivia aquí, ¡con categorías que van desde los libros hasta la mitología! (alimentado por OpenTDB)\n\n**Categorías**: {{TRIVIA_CATEGORIES}}", - "explainedUsage": [ - [ - "Categoría", - "Las preguntas de la categoría se harán a continuación." - ], - [ - "multiple/boolean/truefalse", - "Si desea una opción múltiple o una pregunta verdadera/falsa." - ], - [ - "easy/medium/hard", - "El nivel de dificultad de las preguntas formuladas." - ], - [ - "Duración", - "La cantidad de tiempo que obtienes para responder. El mínimo es de 1 segundo y el máximo es de 1 minuto" - ] - ], - "examples": [ - "history", - "books multiple easy", - "videogames 45s" - ] - }, - "triviaIncorrect": "Lo siento, pero **{{attempt}}** no es la respuesta correcta. ¡Buena suerte la próxima vez!", - "triviaInvalidCategory": "Categoría no válida: Por favor usa `Skyra, help trivia` para leer la lista de categorías.", - "triviaNoAnswer": "¡Parece que nadie lo ha conseguido! La respuesta correcta era **{{correctAnswer}}**.", - "triviaWinner": "¡Tenemos un ganador! ¡{{winner}} tuvo una respuesta correcta con **{{correctAnswer}}**!", - "wheelOfFortuneCanvasTextLost": "Has perdido", - "wheelOfFortuneCanvasTextWon": "Has ganado", - "wheelOfFortuneDescription": "Apuesta tus Shiny girando una rueda de fortuna", - "wheelOfFortuneExtended": { - "usages": [ - "Apuesta" - ], - "extendedHelp": "Puedes perder 0.1, 0.2, 0.3 o 0.5 veces tu cantidad o ganar hasta 1.2, 1.5, 1.7 o 2.4 veces lo introducido", - "examples": [ - "50", - "200" - ] - }, - "balanceDifference": "**Antes**: {{previous, number}} {{SHINY}}\n**Después**: {{next, number}} {{SHINY}}" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/general.json b/src/languages/es-ES/commands/general.json deleted file mode 100644 index 2f74bc658ea..00000000000 --- a/src/languages/es-ES/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "Mostrando una categoría por página. ¿Tiene problemas con el incrustado? Ejecute `{{prefix}}help --all` para obtener una lista completa en mensajes directos.", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "Descripción de ayuda para {{footerName}}", - "title": "{{titleDescription}}" - }, - "helpDescription": "Muestra todos los comandos o la descripción de uno.", - "helpExtended": { - "usages": [ - "--cat/--categories", - "--all", - "NombreDeCategoría", - "Página", - "NombreDeComando" - ], - "extendedHelp": "El comando de ayuda muestra una lista paginada de todos los comandos por sus categorías, o la información extendida de un comando si se especifica.\n\nSi utiliza `--categories` o `--cat`, puede obtener la lista de todas las categorías y la cantidad de comandos en cada una de ellas.", - "reminder": "El comando de ayuda **sólo** muestra los comandos que puedes utilizar. Para la lista completa, por favor visita .", - "examples": [ - "--cat", - "--all", - "Moderación", - "12", - "help" - ] - }, - "helpDm": "📥 | La lista de comandos a los que tienes acceso ha sido enviada a tus mensajes directos.", - "helpNodm": "{{REDCROSS}} | Tienes los mensajes directos deshabilitados, por lo que no pude enviarte la lista de comandos.", - "infoBody": "", - "infoDescription": "Proporciona información acerca de mí.", - "infoExtended": { - "extendedHelp": "Simplemente... eso :P" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "Muestra el enlace de invitación para añadir Skyra a tu servidor.", - "inviteExtended": { - "usages": [ - "--noperms/--nopermissions" - ], - "extendedHelp": "Si desea obtener un enlace donde Skyra no solicitará ningún permiso, añada `noperms`, `--noperms` o `--nopermissions` al comando.", - "examples": [ - "", - "noperms", - "--noperms", - "--nopermissions" - ] - }, - "invitePermissionInviteText": "Invítame a tu servidor", - "invitePermissionsDescription": "No tengas miedo de desmarcar algunos permisos, te informaré si estás intentando ejecutar un comando sin permisos.", - "invitePermissionSupportServerText": "Unirse al Servidor de Soporte", - "ping": "{{LOADING}} Eco...", - "pingDescription": "Ejecuta una prueba de conexión con Discord.", - "pingExtended": { - "extendedHelp": "¡Eco!" - }, - "pingPong": "¡Eco! (Respondí en: {{diff}}ms. Latido: {{ping}}ms.)", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/google.json b/src/languages/es-ES/commands/google.json deleted file mode 100644 index 0ce30158268..00000000000 --- a/src/languages/es-ES/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "Compruebe el estado del tiempo en una ubicación.", - "weatherExtended": { - "usages": [ - "Ciudad", - "Lugar --metric/--celsius", - "Lugar --imperial/--fahrenheit" - ], - "extendedHelp": "Este comando usa [wttr.in](https://wttr.in) para obtener los datos meteorológicos de una ubicación y lo muestra con una tarjeta bonita.", - "explainedUsage": [ - [ - "Ciudad", - "Las coordenadas, lugar, ciudad o país desde donde comprobar el clima." - ] - ], - "examples": [ - "Zaragoza", - "San Francisco" - ], - "reminder": "Las unidades están en el Sistema Internacional por defecto. Utilice la opción --fahrenheit o --imperial para verla en el **Sistema Imperial**." - }, - "weatherFahrenheit": "{{value}} ({{feelsLike}}) ºF", - "weatherInches": "{{value}} in", - "weatherMiles": "{{value}} mi", - "weatherMilesPerHour": "{{value}} mi/h", - "weatherCelsius": "{{value}} ({{feelsLike}}) ºC", - "weatherKelvin": "", - "weatherMillimeters": "{{value}} mm", - "weatherPascal": "{{value}} Pa", - "weatherKilometers": "{{value}} km", - "weatherKilometersPerHour": "{{value}} km/h", - "weatherInvalidJsonBody": "El servidor me envió una respuesta mal formada cuando estaba buscando `{{query}}`, ¡y no puedo averiguar qué significa, lo siento!", - "weatherUnknownLocation": "Aparentemente, el servidor no sabe dónde está `{{query}}`, o no tiene datos, ¡por favor intenta en otro lugar!", - "weatherUnknownError": "He recibido un error desconocido al buscar `{{query}}`, ¡lo siento!", - "weatherBlockedLocation": "No pude encontrar ningún dato sobre `{{query}}` porque fue bloqueado por el servidor.", - "weatherRateLimited": "No he podido encontrar ningún dato sobre `{{query}}` porque he excedido la cantidad de consultas que puedo hacer, ¡por favor inténtalo de nuevo más tarde!", - "weatherRemoteServerError": "No pude encontrar ningún dato sobre `{{query}}` porque el servidor encontró un error interno, ¡por favor intente de nuevo más tarde!", - "weatherServiceUnavailable": "No pude encontrar ningún dato sobre `{{query}}` porque el servidor ha alcanzado su límite de capacidad, lo que significa que ya no pueden atender más peticiones en el resto del día, ¡inténtalo de nuevo más tarde!" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/management.json b/src/languages/es-ES/commands/management.json deleted file mode 100644 index 08b8e83ac8e..00000000000 --- a/src/languages/es-ES/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "Habilita el sub-sistema.", - "commandModeDisable": "Deshabilita el sub-sistema.", - "commandModeActionAlert": "Alternar alertas de mensajes en el canal.", - "commandModeActionLog": "Alterna los registros de mensajes en el canal de registro de moderación, si estuviera definido.", - "commandModeActionDelete": "Alterna el borrado de mensajes.", - "commandModePunishment": "La acción de moderación que debo tomar.", - "commandModePunishmentDuration": "La duración de la penalización.", - "commandModeThreshold": "La cantidad de infracciones que se pueden hacer dentro de `Threshold-Duration` antes de tomar acción, instantáneamente si no está establecido.", - "commandModeThresholdDuration": "El tiempo en el que las infracciones se acumularán antes de tomar acción, instantáneamente si no está establecido.", - "commandModeReminder": "`Action Log` requiere que `channel.logs.moderation` esté ya configurado.", - "commandHandlerAborted": "Cancelado", - "permissionNodesHigher": "{{REDCROSS}} No puedes modificar ni previsualizar los nodos de permiso para este objetivo.", - "permissionNodesCannotAllowEveryone": "{{REDCROSS}} No puedes habilitar comandos para el rol `@everyone`.", - "permissionNodesInvalidType": "{{REDCROSS}} Tipo inválido, se esperaba ya sea de `allow` o `deny`.", - "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": "**Desactivado**: {{deny}}", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "Configurar los nodos de permiso para este servidor.", - "permissionNodesExtended": { - "usages": [ - "add Rol/Miembro allow/deny Comando", - "remove Role/Member allow/deny Command", - "reset Rol/Miembro", - "show Rol/Miembro", - "show", - "Rol/Miembro" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "here/CanalDeTexto" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "canal", - "" - ] - ], - "reminder": "", - "examples": [ - "#general", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "here/CanalDeTexto" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "#registro-de-imagenes", - "here" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "here/CanalDeTexto" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "Revise la información del servidor.", - "guildInfoExtended": { - "extendedHelp": "El comando serverinfo muestra información para el servidor en el que el mensaje ha sido enviado.\nMuestra la cantidad de canales, con el recuento para cada categoría, la cantidad de miembros (dada desde la API), el propietario con su id de usuario, la cantidad de roles, región, fecha de creación, nivel de verificación. entre otros." - }, - "roleInfoDescription": "Revise la información de un rol.", - "roleInfoExtended": { - "usages": [ - "Rol", - "" - ], - "extendedHelp": "El comando roleinfo muestra información para un rol, como su id, nombre, color, si está elevado (se muestre por separado), su posición de jerarquía de rol, si mencionable, cuántos miembros tienen dicho el rol y sus permisos.\nEnvía un mensaje incrustado con el color del rol.", - "explainedUsage": [ - [ - "Rol", - "Nombre del rol, mención o id." - ] - ], - "examples": [ - "Administrador", - "Moderador", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "add Usuario Rol", - "remove Usuario Rol", - "reset Usuario", - "show Usuario", - "Usuario" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Acción", - "" - ], - [ - "Usuario", - "El usuario objetivo para todas las acciones." - ], - [ - "Rol", - "El rol a añadir o eliminar." - ] - ], - "examples": [ - "add Skyra Diosa", - "show Skyra", - "remove Skyra Diosa", - "reset Skyra" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "$t(commands/management:commandModeEnable)" - ], - [ - "", - "$t(commands/management:commandModeDisable)" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "$t(commands/management:commandModeActionLog)" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "$t(commands/management:commandModeDisable)" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "$t(commands/management:commandModeActionLog)" - ], - [ - "", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "", - "$t(commands/management:commandModePunishment)" - ], - [ - "", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "", - "$t(commands/management:commandModeThreshold)" - ], - [ - "", - "$t(commands/management:commandModeThresholdDuration)" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "$t(commands/management:commandModeEnable)" - ], - [ - "", - "$t(commands/management:commandModeDisable)" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "$t(commands/management:commandModeEnable)" - ], - [ - "", - "$t(commands/management:commandModeDisable)" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "$t(commands/management:commandModeActionLog)" - ], - [ - "", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "", - "$t(commands/management:commandModePunishment)" - ], - [ - "", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "", - "$t(commands/management:commandModeThreshold)" - ], - [ - "", - "$t(commands/management:commandModeThresholdDuration)" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "$t(commands/management:commandModeActionLog)" - ], - [ - "", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "", - "$t(commands/management:commandModePunishment)" - ], - [ - "", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "", - "$t(commands/management:commandModeThreshold)" - ], - [ - "", - "$t(commands/management:commandModeThresholdDuration)" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "$t(commands/management:commandModeEnable)" - ], - [ - "", - "$t(commands/management:commandModeDisable)" - ], - [ - "", - "$t(commands/management:commandModeActionAlert)" - ], - [ - "", - "$t(commands/management:commandModeActionLog)" - ], - [ - "", - "$t(commands/management:commandModeActionDelete)" - ], - [ - "", - "$t(commands/management:commandModePunishment)" - ], - [ - "", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "", - "$t(commands/management:commandModeThreshold)" - ], - [ - "", - "$t(commands/management:commandModeThresholdDuration)" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "$t(commands/management:commandModeEnable)" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "$t(commands/management:commandModePunishmentDuration)" - ], - [ - "", - "$t(commands/management:commandModeThreshold)" - ], - [ - "", - "$t(commands/management:commandModeThresholdDuration)" - ] - ], - "reminder": "$t(commands/management:commandModeReminder)", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/misc.json b/src/languages/es-ES/commands/misc.json deleted file mode 100644 index 20981c4b497..00000000000 --- a/src/languages/es-ES/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "Este reddit está prohibido y no debe ser usado.", - "randRedditFail": "", - "randRedditAllNsfw": "Todas las entradas son NSFW, los cuales no se pueden mostrar en este canal.", - "randRedditAllNsfl": "Todas las entradas son NSFL, los cuales no se pueden mostrar en este canal. Y... no quieres verlo.", - "randRedditMessage": "**{{title}}** enviado por {{author}}\n{{url}}", - "randRedditErrorPrivate": "{{REDCROSS}} No se pudo descargar ningún dato ya que el subreddit está marcado como privado.", - "randRedditErrorQuarantined": "{{REDCROSS}} No se pudo descargar ningún dato ya que el subreddit está en cuarentena.", - "randRedditErrorNotFound": "{{REDCROSS}} No se pudo descargar ningún dato ya que el subreddit no existe.", - "randRedditErrorBanned": "{{REDCROSS}} No se pudo descargar ningún dato ya que el subreddit está baneado.", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "Permítanme que les diga un hecho misterioso sobre mi.", - "skyrafactExtended": { - "extendedHelp": "He vivido tanto tiempo, podría impresionarte con un hecho aleatorio acerca de mí." - }, - "skyrafactTitle": "Hecho de Skyra", - "skyrafactMessages": [ - "Todos los androides Novanos se conciben con una IA genérica, sin embargo, a medida que crecen, reescriben su propio código de IA e incluso rediseñan sus CPUs para especializarse en las habilidades que necesitan o quieren mejorar. Esto nos ha ayudado a crear una red fuerte e imposible de hackear, donde un virus solo afectaría a un androide de entre miles de millones.", - "Antes de reutilizar el viejo bot en lo que soy actualmente, mi creador pasó 7 años tratando de crear algo de mí que otras personas pudieran \"sentir\", habiendo pasado por dibujándome tanto en tradicional como digital, como modelando mi nave. Incluso se pasó unos años aprendiendo a hacer efectos especiales para que pudiera hacer una película sobre mí.", - "Cada androide de mi planeta tiene una clase designada para cada modelo, la mía es Flamewing, el cual es una clase de combate muy ligera y ágil.", - "Mido 172 centímetros de altura mientras que estoy en forma humanoide, pero puedo expandirme hasta 979 metros de altura si deshabilito mi campo de compresión hiperespacial.", - "Soy una androide neural - eso significa que tengo redes neuronales similares a las de un ser humano, con la excepción de que nada es orgánico.", - "", - "", - "", - "Tengo una hermana, la llamamos Aelia y ¡es una DJ terriblemente buena!", - "Yo solía tener una hermana mayor, pero ella desapareció cuando tenía 7 años. ||No fue hasta que cumplí 174 años, cuando me enteré de que era una de las líderes de Kal-71||.", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "Relaciona 2 miembros", - "shipExtended": { - "usages": [ - "Usuario Usuario", - "Usuario", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Usuario", - "" - ] - ], - "examples": [ - "romeo julieta" - ], - "reminder": "Si no puedo encontrar a ningún usuario dado entonces elegiré a alguien al azar." - }, - "shipData": { - "title": "**Relacionando `{{romeoUsername}}` y `{{julietUsername}}`**", - "description": "Lo llamo... {{shipName}}" - }, - "shindeiruDescription": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "Usuario" - ], - "extendedHelp": "\"Usted ya está muerto\" Japonés: お前はもう死んでいる; Omae Wa Mou Shindeiru, es una expresión de la serie de manga y anime Hokuto no Ken. Esto muestra una historieta del personaje pronunciando las palabras anteriormente mencionadas, lo que hace que el oponente responda con \"nani?\" (¿qué?).", - "explainedUsage": [ - [ - "usuario", - "La persona a la que dices esa frase." - ] - ], - "examples": [ - "Juan" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "kyra" - ] - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/moderation.json b/src/languages/es-ES/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/es-ES/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/social.json b/src/languages/es-ES/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/es-ES/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/starwars.json b/src/languages/es-ES/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/es-ES/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/suggestion.json b/src/languages/es-ES/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/es-ES/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/system.json b/src/languages/es-ES/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/es-ES/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/tags.json b/src/languages/es-ES/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/es-ES/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/tools.json b/src/languages/es-ES/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/es-ES/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/commands/twitch.json b/src/languages/es-ES/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/es-ES/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/es-ES/constants.ts b/src/languages/es-ES/constants.ts deleted file mode 100644 index f8bb58d9dd9..00000000000 --- a/src/languages/es-ES/constants.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Handler } from '#lib/i18n/structures/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 deleted file mode 100644 index 0d25c486382..00000000000 --- a/src/languages/es-ES/errors.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "channelNotReadable": "Lo siento, pero necesito los permisos **{{VIEW_CHANNEL, permissions}}** y **{{READ_MESSAGE_HISTORY, permissions}}**", - "guildBansEmpty": "No hay baneos registrados en este servidor.", - "guildBansNotFound": "Lo he intentado y no he podido encontrar a este usuario de la lista de baneos. ¿Estás seguro de que este usuario está baneado?", - "guildMemberNotVoicechannel": "No puedo ejecutar esta acción en un miembro que no está conectado a un canal de voz.", - "guildWarnNotFound": "No pude obtener esa advertencia. O bien no existe, o bien no era un aviso, o bien ha sido apelada.", - "modlogTimed": "Este registro de moderación ya está temporizado. Expira en {{remaining, duration}}", - "unexpectedIssue": "¡Se ha producido un error inesperado! Abortando este comando de forma segura...", - "userNotInGuild": "Este usuario no está en este servidor." -} \ No newline at end of file diff --git a/src/languages/es-ES/events/errors.json b/src/languages/es-ES/events/errors.json deleted file mode 100644 index 344ef3398c4..00000000000 --- a/src/languages/es-ES/events/errors.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "string": "{{REDCROSS}} Querido/a {{mention}}, {{message}}", - "unexpectedError": "{{REDCROSS}} He encontrado un error inesperado, ¡por favor informa de los pasos que has dado a mis desarrolladores!", - "unexpectedErrorWithContext": "$t(events/errors:unexpectedError)\nPuede agregar `{{report}}` al informe para que puedan ver qué error fue desencadenado." -} \ No newline at end of file diff --git a/src/languages/es-ES/events/guilds-logs.json b/src/languages/es-ES/events/guilds-logs.json deleted file mode 100644 index 7e3897c06f2..00000000000 --- a/src/languages/es-ES/events/guilds-logs.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "channelCreate": "Canal Creado", - "channelCreateParent": "• **Categoría**: {{value}}", - "channelCreatePosition": "• **Posición**: `{{value, number}}`", - "channelCreatePermissionsTitle": "• **Permisos para {{value}}**", - "channelCreateNsfw": "• **Establecido como NSFW**", - "channelCreateTopic": "• **Tema**: `{{value}}`", - "channelCreateRateLimit": "• **Modo Pausado**: `{{value, duration}}`", - "channelCreateBitrate": "• **Tasa de Bits**: `{{value}}kbps`", - "channelCreateUserLimit": "• **Límite de Usuarios**: `{{value, number}}`", - "channelDelete": "Canal Eliminado", - "channelUpdate": "Canal Actualizado", - "channelUpdateBitrate": "• **Tasa de Bits**: `{{previous}}kbps` → `{{next}}kbps`", - "channelUpdateName": "• **Nombre**: `{{previous}}` → `{{next}}`", - "channelUpdateNsfw": "• **NSFW**: `{{previous}}` → `{{next}}`", - "channelUpdateParent": "• **Categoría**: {{previous}} → {{next}}", - "channelUpdateParentAdded": "• **Categoría**: No Establecido → {{value}}", - "channelUpdateParentRemoved": "• **Categoría**: {{value}} → No Establecido", - "channelUpdatePosition": "• **Posición**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateAddedPermissionsTitle": "• **Añadidos los Permisos para {{value}}**", - "channelUpdateDeletedPermissionsTitle": "• **Eliminados los Permisos para {{value}}**", - "channelUpdatePermissionsTitle": "• **Actualizados los Permisos para {{value}}**", - "channelUpdateRateLimit": "• **Modo Pausado**: `{{previous, duration}}` → `{{next, duration}}`", - "channelUpdateRateLimitAdded": "• **Modo Pausado**: No Establecido → `{{value, duration}}`", - "channelUpdateRateLimitRemoved": "• **Modo Pausado**: `{{value, duration}}` → No Establecido", - "channelUpdateTopic": "• **Tema**: `{{previous}}` → `{{next}}`", - "channelUpdateTopicAdded": "• **Tema**: No Establecido → `{{value}}`", - "channelUpdateTopicRemoved": "• **Tema**: `{{value}}` → No Establecido", - "channelUpdateType": "• **Tipo**: `{{previous}}` → `{{next}}`", - "channelUpdateUserLimit": "• **Límite de Usuarios**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateUserLimitAdded": "• **Límite de Usuarios**: No Establecido → `{{value, number}}`", - "channelUpdateUserLimitRemoved": "• **Límite de Usuarios**: `{{value, number}}` → No Establecido", - "emojiCreate": "Emoji Creado", - "emojiCreateAnimated": "• **Animado**", - "emojiCreateUnAvailable": "• **No Disponible**", - "emojiCreateManaged": "• **Gestionado**", - "emojiCreateRequiresColons": "• **Requiere Dos Puntos**", - "emojiDelete": "Emoji Eliminado", - "emojiUpdate": "Emoji Actualizado", - "emojiUpdateAnimated": "• **Animado**: `{{previous}}` → `{{next}}`", - "emojiUpdateAvailable": "• **Disponible**: `{{previous}}` → `{{next}}`", - "emojiUpdateManaged": "• **Gestionado**: `{{previous}}` → `{{next}}`", - "emojiUpdateName": "• **Nombre**: `{{previous}}` → `{{next}}`", - "emojiUpdateRequiresColons": "• **Requiere Dos Puntos**: `{{previous}}` → `{{next}}`", - "roleCreate": "Rol Creado", - "roleCreateColor": "• **Color**: `{{value}}`", - "roleCreateHoist": "• **Mostrado por Separado**", - "roleCreateMentionable": "• **Mencionable**", - "roleCreatePosition": "• **Posición**: `{{value, number}}`", - "roleDelete": "Rol Eliminado", - "roleUpdate": "Rol Actualizado", - "roleUpdateColor": "• **Color**: `{{previous}}` → `{{next}}`", - "roleUpdateHoist": "• **Mostrado por Separado**: `{{previous}}` → `{{next}}`", - "roleUpdateMentionable": "• **Mencionable**: `{{previous}}` → `{{next}}`", - "roleUpdateName": "• **Nombre**: `{{previous}}` → `{{next}}`", - "roleUpdatePosition": "• **Posición**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdate": "Servidor Actualizado", - "serverUpdateAfkChannelAdded": "**Canal de Inactividad**: No Establecido → {{value}}", - "serverUpdateAfkChannelRemoved": "• **Canal de Inactividad**: {{value}} → No Establecido", - "serverUpdateAfkChannel": "• **Canal de Inactividad**: {{previous}} → {{next}}", - "serverUpdateAfkTimeout": "• **Límite de Tiempo de Inactividad**: `{{previous, duration}}` → `{{next, duration}}`", - "serverUpdateBannerAdded": "• **Banner**: No establecido → [Ahora]({{value}})", - "serverUpdateBannerRemoved": "• **Banner**: [Antes]({{value}}) → No Establecido", - "serverUpdateBanner": "• **Banner**: [Antes]({{previous}}) → [Ahora]({{next}})", - "serverUpdateDefaultMessageNotifications": "• **Notificaciones de Mensajes**: `{{previous, messageNotifications}}` → `{{next, messageNotifications}}`", - "serverUpdateDescriptionAdded": "• **Descripción**: No Establecido → `{{value}}`", - "serverUpdateDescriptionRemoved": "• **Descripción**: `{{value}}` → No Establecido", - "serverUpdateDescription": "• **Descripción**: `{{previous}}` → `{{next}}`", - "serverUpdateDiscoverySplashAdded": "• **Fondo de Invitación**: No Establecido → [Ahora]({{value}})", - "serverUpdateDiscoverySplashRemoved": "• **Fondo de Invitación**: [Antes]({{value}}) → No Establecido", - "serverUpdateDiscoverySplash": "• **Fondo de Invitación**: [Antes]({{previous}}) → [Ahora]({{next}})", - "serverUpdateExplicitContentFilter": "• **Filtro de Contenido Explícito**: `{{previous, explicitContentFilter}}` → `{{next, explicitContentFilter}}`", - "serverUpdateIconAdded": "• **Icono**: No Establecido → [Nuevo]({{value}})", - "serverUpdateIconRemoved": "• **Icono**: [Antes]({{value}}) → No Establecido", - "serverUpdateIcon": "• **Icono**: [Antes]({{previous}}) → [Ahora]({{next}})", - "serverUpdateMaximumMembersAdded": "• **Límite de Usuarios**: No Establecido → `{{value, number}}`", - "serverUpdateMaximumMembersRemoved": "• **Límite de Usuarios**: `{{value, number}}` → No Establecido", - "serverUpdateMaximumMembers": "• **Límite de Usuarios**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdateMfaAdded": "• **Autenticación de Múltiples Factores Añadida**", - "serverUpdateMfaRemoved": "• **Autenticación de Múltiples Factores Eliminada**", - "serverUpdateName": "• **Nombre**: `{{previous}}` → `{{next}}`", - "serverUpdateOwner": "• **Dueño**: {{previous}} → {{next}}", - "serverUpdatePreferredLocale": "• **Idioma Preferido**: `{{previous}}` → `{{next}}`", - "serverUpdatePremiumSubscriptionCountAdded": "• **Mejoras**: No Establecido → `{{value, number}}`", - "serverUpdatePremiumSubscriptionCountRemoved": "• **Mejoras**: `{{value, number}}` → No Establecido", - "serverUpdatePremiumSubscriptionCount": "• **Mejoras**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePremiumTier": "• **Nivel de Mejoras**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePublicUpdatesChannelAdded": "**Canal de Actualizaciones Públicas**: No Establecido → {{value}}", - "serverUpdatePublicUpdatesChannelRemoved": "• **Canal de Actualizaciones Públicas**: {{value}} → No Establecido", - "serverUpdatePublicUpdatesChannel": "**Canal de Actualizaciones Públicas**: {{previous}} → {{next}}", - "serverUpdateRulesChannelAdded": "• **Canal de Reglas**: No Establecido → {{value}}", - "serverUpdateRulesChannelRemoved": "• **Canal de Reglas**: {{value}} → No Establecido", - "serverUpdateRulesChannel": "• **Canal de Reglas**: {{previous}} → {{next}}", - "serverUpdateSplashAdded": "• **Fondo de Invitación**: No Establecido → [Nuevo]({{value}})", - "serverUpdateSplashRemoved": "• **Fondo de Invitación**: [Antes]({{value}}) → No Establecido", - "serverUpdateSplash": "• **Fondo de Invitación**: [Antes]({{previous}}) → [Ahora]({{next}})", - "serverUpdateSystemChannelAdded": "• **Canal del Sistema**: No Establecido → {{value}}", - "serverUpdateSystemChannelRemoved": "• **Canal del Sistema**: {{value}} → No Establecido", - "serverUpdateSystemChannel": "• **Canal del Sistema**: {{previous}} → {{next}}", - "serverUpdateVanityUrlAdded": "• **Invitación Personalizada**: No Establecido → {{value}}", - "serverUpdateVanityUrlRemoved": "• **Invitación Personalizada**: `{{value}}` → No Establecido", - "serverUpdateVanityUrl": "• **Invitación Personalizada**: `{{previous}}` → {{next}}", - "serverUpdateVerificationLevel": "• **Nivel de Verificación**: `{{previous}}` → `{{next}}`", - "serverUpdateWidgetChannelAdded": "• **Canal del Widget**: No Establecido → {{value}}", - "serverUpdateWidgetChannelRemoved": "• **Canal del Widget**: {{value}} → No Establecido", - "serverUpdateWidgetChannel": "• **Canal del Widget**: {{previous}} → {{next}}", - "serverUpdateWidgetEnabled": "• **Widget Habilitado**", - "serverUpdateWidgetDisabled": "• **Widget Deshabilitado**" -} \ No newline at end of file diff --git a/src/languages/es-ES/events/guilds-members.json b/src/languages/es-ES/events/guilds-members.json deleted file mode 100644 index 1b184d91f20..00000000000 --- a/src/languages/es-ES/events/guilds-members.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "guildMemberAdd": "Nuevo Usuario", - "guildMemberAddDescription": "{{mention}} | **Se unió a Discord**: hace {{time, duration}}.", - "guildMemberAddMute": "Un usuario silenciado se ha unido", - "guildMemberBanned": "Usuario Baneado", - "guildMemberKicked": "Usuario Expulsado", - "guildMemberNoUpdate": "No se han detectado actualizaciones", - "guildMemberRemove": "Un usuario nos ha abandonado", - "guildMemberRemoveDescription": "{{mention}} | **Se unió al servidor**: Desconocido.", - "guildMemberRemoveDescriptionWithJoinedAt": "{{mention}} | **Se unió al servidor**: hace {{time, duration}}.", - "guildMemberSoftBanned": "Usuario Softbaneado", - "nameUpdateNextWasNotSet": "**Siguiente**: No Establecido", - "nameUpdateNextWasSet": "**Siguiente**: `{{nextName}}`", - "nameUpdatePreviousWasNotSet": "**Anterior**: No Establecido", - "nameUpdatePreviousWasSet": "**Anterior**: `{{previousName}}`", - "nicknameUpdate": "Apodo Editado", - "roleUpdate": "Roles Editados", - "usernameUpdate": "Nombre de Usuario Editado" -} \ No newline at end of file diff --git a/src/languages/es-ES/events/messages.json b/src/languages/es-ES/events/messages.json deleted file mode 100644 index a0ba55e8728..00000000000 --- a/src/languages/es-ES/events/messages.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "messageDelete": "Mensaje eliminado • {{channel}}", - "messageUpdate": "Mensaje Editado • {{channel}}" -} \ No newline at end of file diff --git a/src/languages/es-ES/events/moderation.json b/src/languages/es-ES/events/moderation.json deleted file mode 100644 index f44bd29e7bf..00000000000 --- a/src/languages/es-ES/events/moderation.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "attachmentFilter": "{{REDCROSS}} Estimado {{user}}, los archivos adjuntos no están permitidos aquí.", - "attachmentFilterFooter": "Demasiados archivos adjuntos", - "attachments": "[Moderación Automática] Se ha activado el filtro de archivos adjuntos, sin umbral.", - "attachmentsWithMaximum": "[Moderación Automática] Se ha activado el filtro de archivos adjuntos, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "capitals": "[Moderación Automática] Se ha activado el filtro de mayúsculas, sin umbral.", - "capitalsWithMaximum": "[Moderación Automática] Se ha activado el filtro de mayúsculas, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "capsFilter": "¡{{REDCROSS}} EEEOOOO {{user}}! ¡POR FAVOR NO GRITES EN ESTE LUGAR! ¡HAS ALCANZADO EL LÍMITE DE MAYÚSCULAS!", - "capsFilterDm": "¡Habla más bajo! Sé que necesitas expresar tus pensamientos. Hay un mensaje que borrado:{{message}}", - "capsFilterFooter": "Demasiadas Mayúsculas", - "inviteFilterAlert": "{{REDCROSS}} Estimado {{user}}, los enlaces de invitación no están permitidos aquí.", - "inviteLink": "Enlace de Invitación", - "invites": "[Moderación Automática] Se ha activado el filtro de invitaciones, sin umbral.", - "invitesWithMaximum": "[Moderación Automática] Se ha activado el filtro de invitaciones, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "link": "Enlace Filtrado", - "links": "[Moderación Automática] Se ha activado el filtro de enlaces, sin umbral.", - "linksWithMaximum": "[Moderación Automática] Se ha activado el filtro de enlaces, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "messageFilter": "{{REDCROSS}} ¡Oye oye, ¡por favor deja de republicar tanto {{user}}!", - "messageFilterFooter": "Demasiados Mensajes Duplicados", - "messages": "[Moderación Automática] Se ha activado el filtro de mensajes duplicados, sin umbral.", - "messagesWithMaximum": "[Moderación Automática] Se ha activado el filtro de mensajes duplicados, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "newlineFilter": "{{REDCROSS}} Muro de texto entrante de {{user}}, ¡muro de texto despejado!", - "newlineFilterFooter": "Demasiadas Líneas", - "newlines": "[Moderación Automática] Se ha activado el filtro de líneas, sin umbral.", - "newlinesWithMaximum": "[Moderación Automática] Se ha activado el filtro de líneas, se ha alcanzado {{amount}} de {{maximum}} infracciones.", - "nolink": "{{REDCROSS}} ¡Oye {{user}}, ¡no puedes publicar enlaces aquí!", - "wordFilter": "{{REDCROSS}} Perdona, querido/a {{user}}, has dicho algo que no está permitido en este servidor.", - "wordFilterDm": "¡Shush! ¡Has dicho algunas palabras que no están permitidas en el servidor! Pero puesto que te tomó un momento para escribir el mensaje, lo publicaré aquí:\n{{filtered}}", - "wordFilterFooter": "Palabra Filtrada", - "words": "[Moderación Automática] Se ha activado el filtro de palabras, sin umbral.", - "wordsWithMaximum": "[Moderación Automática] Se ha activado el filtro de palabras, se ha alcanzado {{amount}} de {{maximum}} infracciones." -} \ No newline at end of file diff --git a/src/languages/es-ES/events/noMentionSpam.json b/src/languages/es-ES/events/noMentionSpam.json deleted file mode 100644 index 23e28a57fb7..00000000000 --- a/src/languages/es-ES/events/noMentionSpam.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "footer": "[NOMENTIONSPAM]", - "alert": "Tenga cuidado de mencionar más, ya que estás a punto de ser baneado por sobrepasar el límite de menciones establecido en este servidor.", - "message": "El martillo de baneo ha aterrizado y ahora el usuario {{user.tag}} con id {{user.id}} ha sido baneado por el spam de menciones.\n¡No te preocupes! ¡Estoy aquí para ayudarte! 😄", - "modlog": "[NOMENTIONSPAM] Automático: Se ha superado el límite de Spam de Menciones.\nLímite: {{threshold}}." -} \ No newline at end of file diff --git a/src/languages/es-ES/events/reactions.json b/src/languages/es-ES/events/reactions.json deleted file mode 100644 index ea2d04c6367..00000000000 --- a/src/languages/es-ES/events/reactions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "reaction": "Reacción Añadida", - "filterFooter": "Reacción Filtrada", - "filter": "{{REDCROSS}} Hey {{user}}, ¡por favor no añadas esa reacción!" -} \ No newline at end of file diff --git a/src/languages/es-ES/events/twitch.json b/src/languages/es-ES/events/twitch.json deleted file mode 100644 index aa9b070ea72..00000000000 --- a/src/languages/es-ES/events/twitch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "embedDescription": "¡{{userName}} está ahora en directo!", - "embedDescriptionWithGame": "{{userName}} ahora está en directo - ¡Transmitiendo {{gameName}}!", - "offlinePostfix": "Notificaciones Twitch de Skyra" -} \ No newline at end of file diff --git a/src/languages/es-ES/fuzzySearch.json b/src/languages/es-ES/fuzzySearch.json deleted file mode 100644 index eb3ab8d9658..00000000000 --- a/src/languages/es-ES/fuzzySearch.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "aborted": "Se ha abortado la petición con éxito.", - "invalidIndex": "Ese número estaba fuera de rango, abortando la petición.", - "invalidNumber": "Esperaba que me dieras un número (un dígito) y me diste una patata.", - "matches": "¡He encontrado varias coincidencias! **Por favor, selecciona un número dentro de 0 y {{matches}}**:\n{{codeblock}}\nEscribe **ABORT** si quieres salir de la petición." -} \ No newline at end of file diff --git a/src/languages/es-ES/globals.json b/src/languages/es-ES/globals.json deleted file mode 100644 index 4e301fcb6e7..00000000000 --- a/src/languages/es-ES/globals.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "default": "La clave {{key}} aún no ha sido traducido para es-ES.", - "defaultLanguage": "Idioma predeterminado", - "no": "No", - "none": "Ninguno", - "unknown": "desconocido", - "yes": "Sí", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}", - "dateFormat": "DD/MM/YYYY", - "dateFormatExplanation": "Día/Mes/Año" -} \ No newline at end of file diff --git a/src/languages/es-ES/guilds.json b/src/languages/es-ES/guilds.json deleted file mode 100644 index d92f91ed97c..00000000000 --- a/src/languages/es-ES/guilds.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "explicitContentFilterDisabled": "Desabilitado", - "explicitContentFilterMembersWithoutRoles": "Miembros sin rol", - "explicitContentFilterAllMembers": "Todos los miembros", - "messageNotificationsAll": "Todos los Mensajes", - "messageNotificationsMentions": "Solo @menciones" -} \ No newline at end of file diff --git a/src/languages/es-ES/humanLevels.json b/src/languages/es-ES/humanLevels.json deleted file mode 100644 index 170d124d7d4..00000000000 --- a/src/languages/es-ES/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "Ninguno", - "LOW": "Bajo", - "MEDIUM": "Medio", - "HIGH": "Alta", - "VERY_HIGH": "Más alto" -} \ No newline at end of file diff --git a/src/languages/es-ES/moderation.json b/src/languages/es-ES/moderation.json deleted file mode 100644 index f46de522fef..00000000000 --- a/src/languages/es-ES/moderation.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "logAppealed": "{{REDCROSS}} Lo siento, pero el registro de moderación seleccionado ha expirado o no puede ser hecho temporal.", - "logDescriptionWithReason": "❯ **Razón**: {{data.reason}}{{data.formattedDuration}}", - "logExpiresIn": "\n❯ **Expira en**: {{duration, duration}}", - "muteCannotManageRoles": "Necesito tener **{{MANAGE_ROLES, permissions}}** permisos para poder silenciar.", - "muteLowHierarchy": "No puedo silenciar a un usuario con una posición de rol superior a la mía.", - "muteNotConfigured": "El rol de silenciado debe ser configurado para que esta acción se pueda llevar a cabo.", - "muteNotExists": "El usuario especificado no está silenciado.", - "muteNotInMember": "El miembro no tiene el rol de silencio.", - "restrictionNotConfigured": "El rol de restricción debe ser configurado para que esta acción se pueda llevar a cabo", - "roleHigher": "El miembro seleccionado tiene una posición de rol superior o igual a la suya.", - "roleHigherSkyra": "El miembro seleccionado tiene una posición de rol superior o igual a la suya.", - "success": "Ejecutado el comando con éxito.", - "toSkyra": "¿Por qué...? ¡Pensé que me amabas! 💔", - "userSelf": "¿Por qué lo haría a usted mismo?" -} \ No newline at end of file diff --git a/src/languages/es-ES/moderationActions.json b/src/languages/es-ES/moderationActions.json deleted file mode 100644 index e4638793758..00000000000 --- a/src/languages/es-ES/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "actions": { - "addRole": "Rol Agregado", - "ban": "Banear", - "kick": "Expulsar", - "mute": "Silenciar", - "removeRole": "Eliminar rol", - "restrictedAttachment": "Restricción del archivo adjunto", - "restrictedEmbed": "Restricción de Inserción de Enlaces", - "restrictedReact": "Restricción de Reacciones", - "restrictedVoice": "Restricción de voz", - "setNickname": "Establecer apodo", - "softban": "Baneo Suave", - "vkick": "Expulsión de voz", - "vmute": "Silenciar voz" - }, - "applyNoReason": "", - "applyReason": "", - "requiredMember": "El usuario no existe o no está en este servidor.", - "revokeNoReason": "", - "revokeReason": "", - "setNicknameNoReasonRemoved": "", - "setNicknameNoReasonSet": "", - "setNicknameRemoved": "", - "setNicknameSet": "", - "setupMuteExists": "", - "setupRestrictionExists": "**Abortando la creación del rol de restricción**: Ya existe uno.", - "setupTooManyRoles": "**Abortando la creación del rol**: Ya hay 250 roles en este servidor, debe borrar uno.", - "sharedRoleSetupAsk": "{{LOADING}} ¿Puedo modificar el canal {{channels}} para aplicar al rol {{role}} el siguiente permiso: {{permissions}}?", - "sharedRoleSetupNoMessage": "No ha mandado un mensaje a tiempo, ¡cancelando la configuración!", - "sharedRoleSetupExisting": "No he podido encontrar un rol configurado. ¿Quieres configurar uno existente?", - "sharedRoleSetupExistingName": "Por favor, dame el nombre del rol que quieres utilizar para otras acciones de este tipo.", - "sharedRoleSetupNew": "¿Quieres que cree un nuevo rol y que lo configure automáticamente?", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/es-ES/permissions.json b/src/languages/es-ES/permissions.json deleted file mode 100644 index 2cfb96d147b..00000000000 --- a/src/languages/es-ES/permissions.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "ADD_REACTIONS": "Añadir Reacciones", - "ADMINISTRATOR": "Administrador", - "ATTACH_FILES": "Adjuntar Archivos", - "BAN_MEMBERS": "Banear miembros", - "CHANGE_NICKNAME": "Cambiar Apodo", - "CONNECT": "Conectar", - "CREATE_INSTANT_INVITE": "Crear Invitación Instantánea", - "CREATE_PRIVATE_THREADS": "Crear hilos privados", - "CREATE_PUBLIC_THREADS": "Crear hilos públicos", - "DEAFEN_MEMBERS": "Ensordecer Miembros", - "EMBED_LINKS": "Insertar Enlaces", - "KICK_MEMBERS": "Expulsar a Miembros", - "MANAGE_CHANNELS": "Gestionar Canales", - "MANAGE_EMOJIS_AND_STICKERS": "Gestionar Emojis y Stickers", - "MANAGE_EVENTS": "Gestionar eventos", - "MANAGE_GUILD": "Gestionar Servidor", - "MANAGE_MESSAGES": "Gestionar Mensajes", - "MANAGE_NICKNAMES": "Gestionar Apodos", - "MANAGE_ROLES": "Gestionar Roles", - "MANAGE_THREADS": "Gestionar hilos", - "MANAGE_WEBHOOKS": "Gestionar Webhooks", - "MENTION_EVERYONE": "Mencionar a Todos", - "MODERATE_MEMBERS": "Aislar temporalmente a miembros", - "MOVE_MEMBERS": "Mover Miembros", - "MUTE_MEMBERS": "Silenciar Miembros", - "PRIORITY_SPEAKER": "Prioridad de Palabra", - "READ_MESSAGE_HISTORY": "Leer el Historial de Mensajes", - "REQUEST_TO_SPEAK": "Solicitud para Hablar", - "SEND_MESSAGES": "Enviar Mensajes", - "SEND_TTS_MESSAGES": "Enviar Mensajes de Texto a Voz", - "SPEAK": "Hablar", - "STREAM": "Vídeo", - "USE_APPLICATION_COMMANDS": "Utilizar comandos de Barra Diagonal", - "USE_EXTERNAL_EMOJIS": "Usar Emojis Externos", - "USE_EXTERNAL_STICKERS": "Usar pegatinas externas", - "USE_PRIVATE_THREADS": "Crear hilos privados", - "USE_PUBLIC_THREADS": "Crear hilos públicos", - "USE_VAD": "Usar Actividad de Voz", - "VIEW_AUDIT_LOG": "Ver el Registro de Auditoría", - "VIEW_CHANNEL": "Leer Mensajes", - "VIEW_GUILD_INSIGHTS": "Ver Información del Servidor" -} \ No newline at end of file diff --git a/src/languages/es-ES/preconditions.json b/src/languages/es-ES/preconditions.json deleted file mode 100644 index ef120eb10d8..00000000000 --- a/src/languages/es-ES/preconditions.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "cooldown": "Acabas de usar este comando. Puedes usarlo de nuevo en {{remaining, duration}}.", - "dmOnly": "Este comando solo puede ser utilizado en mensajes directos.", - "guildOnly": "Este comando solo puede ser utilizado dentro de un servidor.", - "nsfw": "¡No puedes usar comandos con contenido no apropiado en este canal!", - "administrator": "Necesitas privilegios de administrador para ejecutar `{{command.name}}`!", - "disabledGlobal": "Este comando ha sido desactivado globalmente por los propietarios del bot. ¿Quieres saber por qué y averiguar cuándo va a volver? Únete al servidor oficial de Skyra: ", - "disabledGuild": "¡Este comando ha sido desactivado por un administrador en este servidor!", - "moderator": "Necesitas privilegios de moderador para ejecutar `{{command.name}}`!", - "permissionNodes": "{{REDCROSS}} ¡No tienes permiso para usar este comando!", - "serverOwner": "Necesitas ser el dueño del servidor para ejecutar `{{command.name}}`!" -} \ No newline at end of file diff --git a/src/languages/es-ES/promptList.json b/src/languages/es-ES/promptList.json deleted file mode 100644 index d2682ea9ffe..00000000000 --- a/src/languages/es-ES/promptList.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "aborted": "Se ha abortado la petición con éxito.", - "attemptFailed": "Entrada no válida. Intento **{{attempt}}** de **{{maxAttempts}}**\n{{list}}" -} \ No newline at end of file diff --git a/src/languages/es-ES/selfModeration.json b/src/languages/es-ES/selfModeration.json deleted file mode 100644 index f6148b5fbd2..00000000000 --- a/src/languages/es-ES/selfModeration.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "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.", - "commandShow": "Activado : {{kEnabled}}\nAcción\n - Alerta : {{kAlert}}\n - Registro : {{kLog}}\n - Eliminar : {{kDelete}}\nPuntuación\n - Escribir : {{kHardAction}}\n - Duración : {{hardActionDurationText}}\nUmbral\n - Máximo : {{thresholdMaximumText}}\n - Duración : {{thresholdDurationText}}", - "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}}", - "hardActionBan": "Banear", - "hardActionKick": "Expulsar", - "hardActionMute": "Silenciar", - "hardActionNone": "Ninguno", - "hardActionSoftban": "SoftBan", - "hardActionWarning": "Advertencia", - "softActionAlert": "Notificación", - "softActionDelete": "Borrar", - "softActionLog": "Informe" -} \ No newline at end of file diff --git a/src/languages/es-ES/serializers.json b/src/languages/es-ES/serializers.json deleted file mode 100644 index e72e691e177..00000000000 --- a/src/languages/es-ES/serializers.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "customCommandInvalidAliases": "La propiedad \"aliases\" 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.", - "customCommandMissingParameter": "¡Necesitas escribir otro parámetro!\n\n> **Consejo**: ¡El tipo para el siguiente argumento es `{{type}}`!", - "disabledCommandChannelsChannelsCommandDoesNotExist": "El comando `{{name}}` no existe.", - "disabledCommandChannelsChannelsDoesNotExist": "Ese canal de chat no existe.", - "invalidBool": "{{name}} debe ser verdadero o falso.", - "invalidChannel": "{{name}} debe ser una etiqueta de canal o un identificador de canal válido.", - "invalidCommand": "{{name}} debe ser un nombre de comando.", - "invalidEmoji": "{{name}} debe ser un emoji válido.", - "invalidFloat": "{{name}} debe ser un número válido.", - "invalidGuild": "{{name}} debe ser un identificador de servidor válido.", - "invalidInt": "{{name}} debe ser un número entero.", - "invalidInvite": "{{name}} debe ser un código de invitación válido.", - "invalidRole": "{{name}} debe ser una mención o identificador de rol.", - "invalidSnowflake": "{{name}} debe ser un identificador válido.", - "invalidUrl": "{{name}} debe ser un enlace válido.", - "invalidUser": "{{name}} debe ser una mención o identificador de usuario.", - "minMaxBothExclusive": "{{name}} debe estar entre {{min}} y {{max}} exclusivamente.", - "minMaxBothInclusive": "{{name}} debe estar entre {{min}} y {{max}} inclusivamente.", - "minMaxExactlyExclusive": "{{name}} debe ser exactamente {{min}}.", - "minMaxExactlyInclusive": "{{name}} debe ser exactamente {{min}}.", - "minMaxMaxExclusive": "{{name}} debe ser menor que {{max}} exclusivamente.", - "minMaxMaxInclusive": "{{name}} debe ser menor que {{max}} inclusivamente", - "minMaxMinExclusive": "{{name}} debe ser mayor que {{min}} exclusivamente.", - "minMaxMinInclusive": "{{name}} debe ser mayor que {{min}} inclusivamente.", - "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.", - "unknownChannel": "Canal Desconocido", - "unknownRole": "Rol Desconocido", - "unknownUser": "Usuario Desconocido", - "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 !" -} \ No newline at end of file diff --git a/src/languages/es-ES/settings.json b/src/languages/es-ES/settings.json deleted file mode 100644 index b16e518c37c..00000000000 --- a/src/languages/es-ES/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "channelsIgnoreAll": "Canales que debería ignorar para todos los tipos de registros.", - "channelsIgnoreMessageDelete": "Canales que debería ignorar para los registros de mensajes borrados.", - "channelsIgnoreMessageEdit": "Canales que debería ignorar para los registros de mensajes editados.", - "channelsIgnoreReactionAdd": "Canales que debería ignorar para los registros de reacciones añadidas." -} \ No newline at end of file diff --git a/src/languages/es-ES/system.json b/src/languages/es-ES/system.json deleted file mode 100644 index a99698d336a..00000000000 --- a/src/languages/es-ES/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "Tuve un pequeño error de red al enviar el mensaje a Discord, ¡por favor ejecuta este comando de nuevo!", - "exceededLengthChooseOutput": "Elija una de las siguientes opciones: {{output, orList}}", - "exceededLengthOutput": "**Salida**:{{output}}", - "exceededLengthOutputConsole": "Se envió el resultado a la consola.", - "exceededLengthOutputType": "**Tipo**:{{type}}", - "exceededLengthOutputTime": "{{time}}", - "exceededLengthOutputFile": "Enviado el resultado como un archivo.", - "exceededLengthOutputHastebin": "Se envió el resultado a hastebin: {{url}}", - "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": { - "aliases": "🖇️ | **Aliases**", - "usages": "📝 | **Uso de Comando**", - "extendedHelp": "🔍 | **Ayuda Extendida**", - "explainedUsage": "⚙ | **Uso explicado**", - "possibleFormats": "🔢 | **Formatos posibles**", - "examples": "🔗 | **Ejemplos**", - "reminders": "⏰ | **Recordatorio**" - }, - "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..." - ], - "messagePromptTimeout": "El tiempo de espera de la solicitud ha sido agotado.", - "noResults": "No pude encontrar resultados para esa consulta", - "parseError": "{{REDCROSS}} No he podido procesar los datos que me has proporcionado, ¡lo siento~!", - "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?", - "textPromptAbortOptions": [ - "abortar", - "cancelar", - "parar" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/arguments.json b/src/languages/fa-IR/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/fa-IR/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/arguments/image.json b/src/languages/fa-IR/arguments/image.json deleted file mode 100644 index ba7ac82f0fe..00000000000 --- a/src/languages/fa-IR/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} من توانایی دریافت عکس {{value}} را نداشتم." -} \ No newline at end of file diff --git a/src/languages/fa-IR/arguments/range.json b/src/languages/fa-IR/arguments/range.json deleted file mode 100644 index bf2cfc18e24..00000000000 --- a/src/languages/fa-IR/arguments/range.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "invalid": "{{name}} باید یک عدد در بین محدوده تعیین شده باشد.", - "max_other": "{{name}} یک محدوده با حداکثر {{maximum}} عدد را تایید می کند", - "max_one": "{{name}} یک محدوده با حداکثر {{maximum}} عدد را تایید می کند" -} \ No newline at end of file diff --git a/src/languages/fa-IR/assertions.json b/src/languages/fa-IR/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/colors.json b/src/languages/fa-IR/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/commands/admin.json b/src/languages/fa-IR/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/fa-IR/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/animal.json b/src/languages/fa-IR/commands/animal.json deleted file mode 100644 index 33cfa9afa04..00000000000 --- a/src/languages/fa-IR/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "بزارید برای شما یک فکت جالب از گربه ها تعریف کنم.", - "catfactExtended": { - "extendedHelp": "میدونستید گربه های خیلی شر و کنجکاو هستند؟ اونها خیلی بامزه و گوگولی هستند.\nبا این دستور بزارید یک فکت به صورت تصادفی از گربه ها به شما بگم." - }, - "catfactTitle": "فکت از گربه ها", - "dogDescription": "سگ های گوگولی! ❤", - "dogExtended": { - "extendedHelp": "ایا **شما** میدونستید که سگ ها چقدر ناز و گوگولی میتونند باشند؟ اون ها یکی از بهترین حیوانات ها هستند!\nاین دستور از وبسایت [dog.ceo](https://dog.ceo) استفاده میکند تا به شما عکس هایی از خوشگل ترین سگ ها را نشان دهد!" - }, - "foxDescription": "بزارید من بهتون یک عکس از یک روباه نشون بدم!", - "foxExtended": { - "extendedHelp": "این دستور یک عکس رندوم روباه از وبسایت [randomfox.ca](https://randomfox.ca/) به شما میدهد." - }, - "kittyDescription": "بچه گربه!", - "kittyExtended": { - "extendedHelp": "ایا **شما** میدونستید که بچه گربه ها چقدر ناز و گوگولی میتونند باشند؟ اون ها یکی از بهترین حیوانات ها هستند!\nاین دستور از وبسایت [random.cat](https://aws.random.cat/) استفاده میکند تا به شما عکس هایی از خوشگل ترین بچه گربه ها را نشان دهد!" - }, - "shibeDescription": "سگ های شیبا خوشگل!", - "shibeExtended": { - "extendedHelp": "همه سگ های نژاد شیبا رو دوست دارند، حتی من! اونا خیلی گوگولی مگولی اند ❤" - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/animation.json b/src/languages/fa-IR/commands/animation.json deleted file mode 100644 index 24b489a6fd1..00000000000 --- a/src/languages/fa-IR/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "جستجوی اسم انیمه مورد علاقه شما با این دستور.", - "kitsuAnimeEmbedData": { - "ageRating": "رده سنی", - "episodeLength": "مقدار زمان هر قسمت", - "episodes": "قسمت(ها)", - "firstAirDate": "تاریخ پخش", - "score": "امتیاز", - "stillAiring": "درحال پخش", - "type": "نوع", - "watchIt": "تماشا در:" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "این دستور از وبسایت Kitsu.io استفاده میکند تا اطلاعات انیمه مورد علاقه شما را نشان دهد.", - "usages": [ - "نام انیمه" - ] - }, - "kitsuAnimeNoSynopsis": "هیچ خلاصه داستانی برای این نام پیدا نشد.", - "kitsuAnimeOutputDescription": "**نام انگلیسی:** {{englishTitle}}\n**نام ژاپنی:** {{japaneseTitle}}\n**نام استاندارد:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "جستجوی اسم مانگا مورد علاقه شما با این دستور.", - "kitsuMangaEmbedData": { - "ageRating": "رده سنی", - "firstPublishDate": "تاریخ اولین انتشار", - "none": "هیچ‌کدام", - "readIt": "در اینجا بخوانید:", - "score": "امتیاز", - "type": "نوع" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "این دستور از وبسایت Kitsu.io استفاده میکند تا اطلاعات مانگا مورد علاقه شما را نشان دهد.", - "usages": [ - "اسم مانگا" - ] - }, - "kitsuMangaOutputDescription": "**نام انگلیسی:** {{englishTitle}}\n**نام ژاپنی:** {{japaneseTitle}}\n**نام استاندارد:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 مانگا", - "manhwa": "🇰🇷 مانگهای رنگی", - "novel": "📕 رمان", - "oneShot": "☄ تک قسمتی", - "special": "" - }, - "waifuDescription": "ارسال یک عکس ویفو به صورت تصادفی.", - "waifuExtended": { - "extendedHelp": "این دستور یک عکس ویفو به صورت تصادفی از وبسایت ارسال میکند" - }, - "waifuFooter": "ساخته شده توسط thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/fun.json b/src/languages/fa-IR/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/fa-IR/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/game.json b/src/languages/fa-IR/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/fa-IR/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/general.json b/src/languages/fa-IR/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/fa-IR/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/google.json b/src/languages/fa-IR/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/fa-IR/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/management.json b/src/languages/fa-IR/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/fa-IR/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/misc.json b/src/languages/fa-IR/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/fa-IR/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/moderation.json b/src/languages/fa-IR/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/fa-IR/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/social.json b/src/languages/fa-IR/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/fa-IR/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/starwars.json b/src/languages/fa-IR/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/fa-IR/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/suggestion.json b/src/languages/fa-IR/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/fa-IR/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/system.json b/src/languages/fa-IR/commands/system.json deleted file mode 100644 index 13465ca4672..00000000000 --- a/src/languages/fa-IR/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "Muestra las instrucciones de soporte", - "supportEmbedDescription": "¡Entonces probablemente deberías unirte a [Skyra's Lounge](https://join.skyra.pw)! ¡Aquí, puedes recibir apoyo de los desarrolladores y otros miembros de la comunidad!", - "supportEmbedTitle": "¿Estás buscando ayuda, {{username}}?", - "supportExtended": { - "extendedHelp": "Este comando te da un enlace a *Skyra's Lounge*, el mejor lugar para todo lo relacionado conmigo." - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/tags.json b/src/languages/fa-IR/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/fa-IR/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/tools.json b/src/languages/fa-IR/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/fa-IR/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/commands/twitch.json b/src/languages/fa-IR/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/fa-IR/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fa-IR/errors.json b/src/languages/fa-IR/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/errors.json b/src/languages/fa-IR/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/guilds-logs.json b/src/languages/fa-IR/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/guilds-members.json b/src/languages/fa-IR/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/messages.json b/src/languages/fa-IR/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/moderation.json b/src/languages/fa-IR/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/noMentionSpam.json b/src/languages/fa-IR/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/reactions.json b/src/languages/fa-IR/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/events/twitch.json b/src/languages/fa-IR/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/fuzzySearch.json b/src/languages/fa-IR/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/globals.json b/src/languages/fa-IR/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/guilds.json b/src/languages/fa-IR/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/humanLevels.json b/src/languages/fa-IR/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/moderation.json b/src/languages/fa-IR/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/moderationActions.json b/src/languages/fa-IR/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/fa-IR/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/fa-IR/permissions.json b/src/languages/fa-IR/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/preconditions.json b/src/languages/fa-IR/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/promptList.json b/src/languages/fa-IR/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/selfModeration.json b/src/languages/fa-IR/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/serializers.json b/src/languages/fa-IR/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/settings.json b/src/languages/fa-IR/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fa-IR/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fa-IR/system.json b/src/languages/fa-IR/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/fa-IR/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/arguments.json b/src/languages/fr-FR/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/fr-FR/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/arguments/image.json b/src/languages/fr-FR/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/arguments/range.json b/src/languages/fr-FR/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/assertions.json b/src/languages/fr-FR/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/colors.json b/src/languages/fr-FR/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/commands/admin.json b/src/languages/fr-FR/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/fr-FR/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/animal.json b/src/languages/fr-FR/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/fr-FR/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/animation.json b/src/languages/fr-FR/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/fr-FR/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/fun.json b/src/languages/fr-FR/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/fr-FR/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/game.json b/src/languages/fr-FR/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/fr-FR/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/general.json b/src/languages/fr-FR/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/fr-FR/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/google.json b/src/languages/fr-FR/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/fr-FR/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/management.json b/src/languages/fr-FR/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/fr-FR/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/misc.json b/src/languages/fr-FR/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/fr-FR/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/moderation.json b/src/languages/fr-FR/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/fr-FR/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/social.json b/src/languages/fr-FR/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/fr-FR/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/starwars.json b/src/languages/fr-FR/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/fr-FR/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/suggestion.json b/src/languages/fr-FR/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/fr-FR/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/system.json b/src/languages/fr-FR/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/fr-FR/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/tags.json b/src/languages/fr-FR/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/fr-FR/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/tools.json b/src/languages/fr-FR/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/fr-FR/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/commands/twitch.json b/src/languages/fr-FR/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/fr-FR/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/fr-FR/errors.json b/src/languages/fr-FR/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/errors.json b/src/languages/fr-FR/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/guilds-logs.json b/src/languages/fr-FR/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/guilds-members.json b/src/languages/fr-FR/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/messages.json b/src/languages/fr-FR/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/moderation.json b/src/languages/fr-FR/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/noMentionSpam.json b/src/languages/fr-FR/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/reactions.json b/src/languages/fr-FR/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/events/twitch.json b/src/languages/fr-FR/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/fuzzySearch.json b/src/languages/fr-FR/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/globals.json b/src/languages/fr-FR/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/guilds.json b/src/languages/fr-FR/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/humanLevels.json b/src/languages/fr-FR/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/moderation.json b/src/languages/fr-FR/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/moderationActions.json b/src/languages/fr-FR/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/fr-FR/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/fr-FR/permissions.json b/src/languages/fr-FR/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/preconditions.json b/src/languages/fr-FR/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/promptList.json b/src/languages/fr-FR/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/selfModeration.json b/src/languages/fr-FR/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/serializers.json b/src/languages/fr-FR/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/settings.json b/src/languages/fr-FR/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/fr-FR/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/fr-FR/system.json b/src/languages/fr-FR/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/fr-FR/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/arguments.json b/src/languages/hi-IN/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/hi-IN/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/arguments/image.json b/src/languages/hi-IN/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/arguments/range.json b/src/languages/hi-IN/arguments/range.json deleted file mode 100644 index 76593b43bba..00000000000 --- a/src/languages/hi-IN/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} एक संख्या या सीमा होनी चाहिए।" -} \ No newline at end of file diff --git a/src/languages/hi-IN/assertions.json b/src/languages/hi-IN/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/colors.json b/src/languages/hi-IN/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/commands/admin.json b/src/languages/hi-IN/commands/admin.json deleted file mode 100644 index 57b32e95ab5..00000000000 --- a/src/languages/hi-IN/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} अक्षम नहीं हो सकता", - "confUpdated": "", - "confGetNoExt": "{{key}} यह कुंजी मौजूद नहीं है।", - "confGet": "{{key}} इस कुंजी का मूल्य {{value}} के बराबर है।", - "confReset": "{{key}} कुंजी का मूल्य {{value}} के बराबर स्थापित किया गया है।", - "confNochange": "{{key}} कुंजी का मूल्य पहले से दिए गए मूल्य के अनुसार है।", - "confServerDescription": "सर्वर सेटिंग्स के अनुसार निश्चित करे।", - "confServerExtended": { - "usages": [ - "", - "दिखाएँ", - "कुंजी का नाम दिखाएं", - "कुंजी के लिए कुंजी का नाम मूल्य निकालें", - "कुंजी का नाम पुन: प्रस्थापित करे", - "मेन्यू" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "**सर्वर सेटिंग्स {{key}}**\n{{list}}", - "confDashboardOnlyKey": "{{key}} केवल वेब डैशबोर्ड () माध्यम से ही इसे रूप दिया जा सकता हैं।", - "confSettingNotSet": "निर्धारित नहीं है", - "rolesetDescription": "विविध किरदार संच का प्रबंध करे।", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "जोड़े", - "एक नया किरदार संच बनाए अथवा मौजूदा किसी संच में किरदार को जोड़े।" - ], - [ - "हटाएं", - "मौजूदा किरदार संच में से कोई एक किरदार हटाएं।" - ], - [ - "पुन: विस्थापन", - "किसी एक किरदार संच में से सभी किरदार हटाए, अथवा निश्चित ना होने पर, सभी किरदार संच।" - ], - [ - "सूची", - "सभी भूमिकाओं को सूचीबद्ध करता है।" - ], - [ - "स्वत:", - "किसी एक किरदार संच को जोड़ता या फिर हटता है।" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "अमेरिका विभाग को जोड़ता है", - "आफ्रीका अमेरिका आशिया यूरोप विभाग को जोड़ता है।", - "अमेरिका विभाग को हटता है।", - "मूल स्थिति पर लाना", - "विभाग को पुन: स्थापित करे।", - "सूची", - "अमेरिका विभाग", - "आफ्रीका अमेरिका आशिया यूरोप विभाग" - ], - "reminder": "यह आदेश विभिन्न किरदार को जोड़ और/अथवा हटा साकता है।" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "{{REDCROSS}} इस समूह में कोई किरदार संच परिभाषित नहीं है।", - "rolesetResetAll": "{{GREENTICK}} सभी किरदार सफलापूर्वक हटाएं गए है।", - "rolesetResetNotExists": "{{REDCROSS}} {{name}} यह किरदार संच इस सर्वर मे मौजूद नहीं है।", - "rolesetResetGroup": "{{GREENTICK}} सफला पूर्वक {{name}} किरदार संच हटाया गया है।", - "rolesetUpdated": "{{name}} इस किरदार को सफलता पूर्वक अद्यतन किया गया है।", - "rolesetNoRolesets": "आपके पास कोई भी किरदार संच नहीं है।", - "confMenuRenderAtFolder": "अभी फिलाल {{path}} में है।", - "confMenuRenderAtPiece": "अभी फिलाल ⚙️ {{path}} में है।", - "confMenuRenderNokeys": "इस फोल्डर के लिए कोई भी परिभाषित की नहीं है।", - "confMenuRenderSelect": "कृपया कोई भी प्रविष्टियो का नाम लिखे।", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "वर्तमान मूल्य: **``{{value}}``**", - "confMenuRenderBack": "पिछे जाने के लिए ◀ दबाए।", - "confMenuInvalidKey": "अवैध की, कृपया दिए गए पर्याय से पुन: प्रयास करें।", - "confMenuInvalidAction": "अवैध कृती, कृपया दिए गए पर्याय से पुन: प्रयास करें।", - "confMenuSaved": "सफलतापूर्वक सभी बदलाव किए जा चुके है।" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/animal.json b/src/languages/hi-IN/commands/animal.json deleted file mode 100644 index 4ed3f04fe98..00000000000 --- a/src/languages/hi-IN/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "मैं आपको एक रहस्यमय बिल्ली तथ्य बताता हूं।", - "catfactExtended": { - "extendedHelp": "तुम जानता है कि बिल्ली बहुत उत्सुक है, ठीक? उसको ज़रूर मज़े और अजीब वाली बातें ज़्यादा है ।\nइस आदेश से तुमको एक अनियमित तथ्य मिलते है ।" - }, - "catfactTitle": "बिल्लियों के तथ्य", - "dogDescription": "प्यारे कुत्ते! ❤", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "मैं तुमको एक लोमड़ी का चित्र दिखाता हूं ।", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "बिलौटा!", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "प्यारा कुत्तों!", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/animation.json b/src/languages/hi-IN/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/hi-IN/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/fun.json b/src/languages/hi-IN/commands/fun.json deleted file mode 100644 index ef8f4fc1ba1..00000000000 --- a/src/languages/hi-IN/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "स्कायरा सबसे अच्छी है, मेरी इस सोच को बदलकर दिखाओ |", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "मुझे अभी भी लगता है कि मैं सबसे अच्छी हूँ, मेरी इस सोच को बदलकर दिखाओ | मैं आपके अवतार से कागज़ पर कुछ शब्दों के साथ एक तस्वीर बनाउंगी |", - "explainedUsage": [ - [ - "वाक्यांश", - "जो वाक्यांश आपको चाहिए |" - ] - ], - "examples": [ - "स्कायरा इस सर्वर की सर्वश्रेष्ठ बौट है |" - ] - }, - "choiceDescription": "अक्कड़ बक्कड़ बम्बे बो, अस्सी नब्बे पूरे सौ...", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "मुझे अपने अस्तित्व से जुड़ा एक संदेह है... क्या मुझे बर्तनों को धोना चाहिए या उन्हें खिड़की से बाहर फेंक देना चाहिए? ख़ोज जारी है | मुझे अल्पविराम से अलग की हुई चीज़ों की एक सूची दीजिये और मैं उनमें से एक चुनुंगी | आगे जो भी होगा उसकी जिम्मेदारी मेरी नहीं होगी |", - "explainedUsage": [ - [ - "शब्द", - "अल्पविराम द्वारा अलग-अलग किये शब्दों की एक सूची |" - ] - ], - "examples": [ - "बर्तनों को धोना चाहिए, बर्तनों को खिड़की से बाहर फेंक देना चाहिए", - "बिल्ली, कुत्ता" - ] - }, - "diceDescription": "पासे को डी२० रूप में भेजें |", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "इस आदेश के काम करने का तरीका सरल है | आपके पास एक पासा है, आप उसे __x__ बार फेंकते है, और पासा __y__ अंक दे सकता है | अतिरिक्त निर्देश के बिना, यह आदेश एक बार वह पासा फेंकता है जिस पर ६ अंक हैं | पासा कितनी बार फेंका जाएगा इसे आप अपनी इच्छानुसार बदल सकते हैं (ऐसा करने पर यह १ और पासे-पर-जितने-अंक-हैं उनके बीच के किसी अंक बार फेंका जाएगा) | उदाहरण के तौर पर, ६ अंकों वाले पासे को ३ बार फेंकने पर ३ अंक एक अनियमित क्रम में मिलेंगे, जो कि १ से ६ के बीच में होंगे | अगर वह अंक ३, १ और ६ हैं, तब यह आदेश १० देगा |", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "पोकेमौन कार्यक्रम की \"एस्केप रस्सी\" का उपयोग करें |", - "escaperopeExtended": { - "extendedHelp": "**स्कायरा** ने **भागने-वाली-रस्सी** का उपयोग किया |" - }, - "loveDescription": "प्रेम-मापक, इंटरनेट पर !", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "सुनिए ! क्या आप प्रेम-मापक का उपयोग करना चाहेंगे? मैं जानती हूँ की यह हंसी-मज़ाक के लिए है, किन्तु कई लोगों को बहुत पसंद है | शर्माने की जरूरत नहीं है, एक बार कोशिश कर के देखिये !", - "explainedUsage": [ - [ - "व्यक्ति", - "जिस व्यक्ति का मूल्यांकन करना है |" - ] - ], - "examples": [ - "स्कायरा" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "बौट्स को राय देने व लोगों का मूल्यांकन करने कि अनुमति दें |", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "मेरे एक बौट होने का यह मतलब नहीं है कि मैं आपका सही मूल्यांकन नहीं कर सकती | यह और सरल हो जाएगा अगर मैं एक यादृच्छिक संख्या देने वाले यंत्र का प्रयोग करूं | ठीक ठीक, यह सही नहीं है, लेकिन... मैं आपको एक 💯 भी दे सकती हूँ |", - "explainedUsage": [ - [ - "व्यक्ति", - "जिस व्यक्ति का मूल्यांकन करना है |" - ] - ], - "examples": [ - "स्कायरा", - "मुझे" - ] - }, - "shindeiruDescription": "ओमाए वा मोउ शिन्देईरु |", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "\"तुम पहले ही मर चुके हो\" जापानी: お前はもう死んでいる; ओमाए वा मोउ शिन्देईरु, जापानी माँगा और एनीमे 'फिस्ट ऑफ़ द नॉर्थ स्टार' का एक कथन है | यह आदेश एक हास्य-पत्रिका से लिया एक हिस्सा दिखाता है, जिसमें पात्र के ऐसा कहने पर उसका प्रतिद्वंदी जवाब में \"नानी?\" (क्या?) कहता है |", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "सहायक विवरण? हम ऐसी चीज़ें यहाँ नहीं करते", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "XKCD से हास्य-पत्रिकाएँ पढ़ें |", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "**xkcd** एक गणित, विज्ञान, व्यंग तथा भाषाओं की हास्य-सामग्री का एक संग्रह है | अगर आप और कुछ नहीं लिखते हैं, तो मैं कोई भी एक हास्य-पत्र ले आउंगी | अगर आप मुझे एक संख्या देते हैं, तो मैं उस संख्या की पत्रिका लाऊंगी | लेकिन अगर आप मुझे नाम/वाक्यांश/विषय देते हैं, तो मैं उससे मेल-खाती पत्रिका प्रस्तुत करूंगी | उदाहरण के तौर पर, `Skyra, xkcd Curiosity` लिखने पर १०९१ संख्या की पत्रिका दिखाई जायेगी |", - "explainedUsage": [ - [ - "निर्देश", - "हास्य-पत्रिका की संख्या अथवा एक नाम जो ढूँढा जा सके |" - ] - ], - "examples": [ - "१०९१", - "जिज्ञासा" - ] - }, - "choiceOutput": "", - "choiceMissing": "कृपया कम-से-कम दो विकल्प अल्पविराम से अलग कर लिखें |", - "choiceDuplicates": "मैं एक ही शब्द दोबारा क्यों स्वीकार करूं ? \"{{words}}\" |", - "diceOutput": "आपने पासा फेंका ! अंक आया: **{{result}}**", - "diceRollsError": "पासा १ से १०२४ बार ही फेंका जा सकता है |", - "diceSidesError": "पासे पर ३ से १०२४ अंक हो सकते हैं |", - "escaperopeOutput": "**{{user}}** ने **भागने वाली रस्सी** का उपयोग किया |", - "loveLess45": "पुनः प्रयास करें...", - "loveLess75": "काफी बढ़िया !", - "loveLess100": "जोड़ी जम रही है !", - "love100": "ये जोड़ी अति-उत्तम है!", - "loveItself": "आप एक बहुत ही विशेष व्यक्ति हैं और आपको स्वयं से सबसे ज्यादा प्रेम करना चाहिए <3", - "loveResult": "परिणाम", - "rateOutput": "**{{author}}**, मैं **{{userToRate}}** को देती हूँ **{{rate}}**/100 {{emoji}}", - "rateMyself": [ - "| मैं खुद से बहुत प्यार करती हूँ 😊", - "अपने आप को" - ], - "rateOwners": [ - "| मैं अपने डेवलपर्स से बहुत प्यार करती हूँ 🥰", - "मेरे डेवलपर्स" - ], - "xkcdComics": "सिर्फ {{amount}} हास्यास्पद-पत्रिकाएँ हैं |", - "xkcdNotfound": "मैंने इस पत्रिका की खोज दूर-दूर तक की, परन्तु मुझे यह नहीं मिली, कृपया कुछ समय पश्चात पुनः प्रयास करें या दूसरी पत्रिका ढूँढें !" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/game.json b/src/languages/hi-IN/commands/game.json deleted file mode 100644 index 70d45f90686..00000000000 --- a/src/languages/hi-IN/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "किसी के साथ कनेक्ट-फोर खेलें |", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "यह खेल PC पर सबसे अच्छे से खेला जाता है |\nकनेक्ट-फोर एक खेल है जिसे दो लोग एक समय पर खेल सकते हैं | खिलाड़ी सबसे पहले एक रंग चुनते हैं और बारी बारी से रंगीन गोले एक सात कॉलम और छह पंक्तियों वाली ग्रिड पर रखते हैं |", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "आपके पास {{SHINY}} ऋणात्मक संख्या में नहीं हो सकती |", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "सिक्का उछालें !", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "सिक्का उछालें | यदि आपका अनुमान सही हुआ, तो बाजी की रक़म दुगनी हो कर आपको वापस मिलेगी |\nयदि आपका अनुमान गलत हुआ तो आप बाजी हार जायेंगे |\nआप बिना किसी रक़म के भी सिक्का उछाल सकते हैं, जिसमे पैसे नहीं लगते, परन्तु आपको इनाम भी नहीं मिलेगा |\nअब सिक्के उछालना शुरू कीजिये |", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था |", - "coinFlipLoseDescriptionWithWager": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था और आप {{wager}} {{SHINY}} हार गए |", - "coinFlipLoseTitle": "आप हार गए |", - "coinFlipNoguessDescription": "सिक्का उछाला गया, और {{result}} आया |", - "coinFlipNoguessTitle": "आपने सिक्का उछाला |", - "coinFlipWinDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही था !", - "coinFlipWinDescriptionWithWager": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही था और आप {{wager}} {{SHINY}} जीत गए !", - "coinFlipWinTitle": "आप जीत गए!", - "gamesBot": "क्षमा कीजिये, परन्तु मुझे नहीं लगता की वे जो काम कर रहे हैं उसे छोड़कर मनुष्यों के साथ खेलना चाहेंगे |", - "gamesNoPlayers": "'हंगर गेम्स' के लिए कुछ नाम प्रदान करें, जैसे: `{{prefix}}hg अंकित, दिय्यांश, आर्यन, काएरा`", - "gamesProgress": "क्षमा कीजिये, लेकिन इस चैनल में एक खेल प्रगति पर है, कुछ समय पश्चात पुन: प्रयास करें |", - "gamesPromptDeny": "मुझे खेद है, परन्तु प्रतिद्वंदी ने खेलने से इंकार कर दिया |", - "gamesRepeat": "क्षमा कीजिये, लेकिन एक व्यक्ति दो बार नहीं खेल सकता |", - "gamesSelf": "आप काफ़ी निराश होंगे अपने साथ खेलकर | किसी और के साथ खेलने का प्रयास करें |", - "gamesTooManyOrFew": "क्षमा कीजिये परन्तु खिलाड़ियों की संख्या {{min}} से कम या {{max}} से ज्यादा है |", - "hgBloodbath": [ - "{1} ने बेलचा उठा लिया |", - "{1} ने एक बस्ता उठाया और वापसी की |", - "{1} और {2} एक बस्ते के लिए लड़ते हैं | {1} ने हार मान कर मैदान छोड़ दिया |", - "{1} और {2} एक बस्ते के लिए लड़ते हैं | {2} ने हार मान कर मैदान छोड़ दिया |", - "{1} को कुछ तीर, एक कमान और एक तरकस मिला |", - "{1} को कोर्नुकोपिया मिलती है और उसे छुपना पड़ता है |", - "{1} ने मुट्ठी भर खंजर लिए |", - "{1} {2} के हाथों से गदा छीन लेता है |", - "{1} को पानी से भरा जलपान-गृह मिलता है |", - "{1} संसाधनों के लिए कोर्नुकोपिया के पास है |", - "{1} ने जितना हो सका उतना खाना जमा किया |", - "{1} ने तलवार थाम ली |", - "{1} ने कोर्नुकोपिया के भीतर से भाला उठा लिया |", - "{1} को विस्फोटकों के भरा थैला मिलता है |", - "{1} को एक प्राथमिक चिकित्सा की वस्तुओं से भरा बस्ता लेकर भागना पड़ता है |", - "{1} ने कोर्नुकोपिया के भीतर से एक हँसिया उठा ली |", - "{1}, {2} और {3} साथ में काम कर के जितने हो सके उतने संसाधन जुटाते हैं |", - "{1} को एक लाइटर और रस्सी लेकर भागना पड़ता है |", - "{1} को शराब की बोतल और एक कपड़ा मिलता है |", - "{1} को तंबू तथा अन्य सामग्री मिलती है |", - "{1} अनजाने में एक खाली बस्ता लेते हैं |", - "{1} ने ब्रेड की टोकरी लेने के लिए {2} की नाक तोड़ दी |", - "{1}, {2}, {3} और {4} दौड़ने से पहले जमा की हुई वस्तुएं आपस में बाटतें हैं |", - "{1} ने कोर्नुकोपिया के भीतर से त्रिशूल उठा लिया |", - "{1} मछलियों के चारे से भरा डिब्बा उठाते हैं और {2} को बंसी मिलती है |", - "{1} {2} को कोर्नुकोपिया के पास से डरा के भगा देता है |", - "{1} को कोर्नुकोपिया के ऊपर रखी एक ढाल मिलती है |", - "{1} को दो परशु मिलते हैं |", - "{1} को एक पजामा मिलता है |", - "{1T} के मंच से उतरते वक्त वहां धमाका होता है |", - "{1} {2T} के सिर में एक खंजर भोंक देता है |", - "{1T} का पैर अनजाने में एक लैंड-माइन पर पड़ जाता है |", - "{1} के हाथों {2T} की मौत होती है |", - "{1} और {2} साथ में काम कर {3T} को डुबो देते हैं |", - "{1} ने {2T} से हाथा-पाई के बाद उसका गला घोंट दिया |", - "{1} का तीर {2T} के सिर में जा लगा |", - "{1T} ने परिस्थितियों को न संभाल पाने के कारण आत्महत्या कर ली |", - "{1} ने {2T} का सिर पकड़कर उसे पत्थर में मार दिया |", - "{1} ने {2T} की गर्दन झटके के साथ तोड़ दी |", - "{1} ने तलवार से {2T} कर सिर धड़ से अलग कर दिया |", - "{1} ने {2T} के पेट पर भाले से हमला किया |", - "{1} ने {2T} को आग में झोंक दिया |", - "{1T} की गड्ढे में गिरने से मौत हो जाती है |", - "{1} ने {2T} के पीठ पीछे छुरा भोंक दिया |", - "{1} ने {2T} को घायल करने के बाद मौत के घाट उतार दिया |", - "{1} ने {2T} को घायल करने के बाद मरने के लिए छोड़ दिया |", - "{1} ने गदा से {2T} का सिर फोड़ दिया |", - "{1} ने मुठभेड़ के दौरान {2T} को खाई में धकेल दिया |", - "{1} ने {2T} की छाती में खंजर घोंप दिया |", - "{1T} की कोशिश के बावजूद {2} ने उन्हें मार दिया |", - "{1} ने {2T} को धोखा दे उन्हें मौत के घाट उतार दिया |", - "{1T} की बर्फीली झील में डूबने से मौत हो गयी |", - "{1}, {2} और {3T} आपस में लड़ना शुरू करते हैं, {2} भागने में सफल है परन्तु {1} के हाथों {3T} की मौत हो जाती है |", - "{1} ने {2T} को उसके खुद के हथियार से मार दिया |", - "{2T} की मौत {1} के हाथों होती है |", - "{2T} की {1} के द्वारा कराए गए धमाके में मौत हो गयी |", - "{2T} और {3T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{2T}, {3T} और {4T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{2T}, {3T}, {4T} और {5T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{1} ने {2T} को रोक कर मार दिया |", - "{1T} और {2T} साथ में आत्महत्या करने कि धमकी देते हैं | वे असफल होते हैं और दोनों की मौत हो जाती है |", - "{1T}, {2T}, {3T} और {4T} साथ में आत्महत्या कर लेते हैं |", - "{1} ने {2T} की कुल्हाड़ी से हत्या कर दी |", - "{1} और {2} {3T} और {4T} से लड़ते हैं | {3T} और {4T} की मौत हो जाती है |", - "{1T} और {2T} {3} और {4} से लड़ते हैं | {1T} और {2T} की मौत हो जाती है |", - "{1T} ने {2} पर हमला करने कि कोशिश की परन्तु {3} ने बीच में आकर {1T} को मार दिया |", - "{1} ने तलवार से {2T} का सिर धड़ से अलग कर दिया |", - "{1} ने रस्सी के सहारे {2T} को फांसी पर टांग दिया |", - "{1} ने आवश्यक सामग्री लेने के लिए {2T} को मार दिया |", - "{1} ने {2} की ओर तीर छोड़ा, लेकिन वह {3T} को जा लगा और उसकी मौत हो गयी |", - "{1} ने {2T} के गले में विषैला तीर मार दिया, जिससे उसकी तड़प-तड़प कर मौत हो गयी |", - "{1} ने {2T} को पेड़ की टहनी से मार दिया |", - "{1} ने {2T} की पीठ पर त्रिशूल से वार किया |", - "{1}, {2T} और {3T} लड़ते हैं | {1} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1T}, {2} और {3T} लड़ते हैं | {2} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1T}, {2T} और {3} लड़ते हैं | {3} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1} ने {2T} को कोर्नुकोपिया में छुपा पाया और उन्हें मार दिया |", - "{1T} ने {2} को कोर्नुकोपिया में छुपा लेकिन {2} ने उन्हें मार दिया |", - "{1} ने {2T} को दरांती से मार दिया |", - "{1} और {2T} एक बस्ते के ऊपर लड़ते हैं | {1} ने बस्ते की पट्टियों से {2T} का गला घोंट दिया |", - "{1T} और {2} एक बस्ते के ऊपर लड़ते हैं | {2} ने बस्ते की पट्टियों से {1T} का गला घोंट दिया |", - "{1} ने {2T} पर परशु के कई प्रहार किये |", - "{1T} का पैर कोर्नुकोपिया से दूर भागते हुए फिसला, और मौके का फ़ायदा उठा {2} ने उन्हें मौत के घाट उतार दिया |", - "{1} का पैर कोर्नुकोपिया से दूर भागते हुए फिसलता है, लेकिन {2} की सहायता से दोनों वहां से भागने में सफल होते हैं |", - "{1} ने {2} के सिर की ओर तीर छोड़ा, लेकिन {3T} ने बीच में कूद अपनी जान का त्याग कर उन्हें बचा लिया |" - ], - "hgDay": [ - "{1} शिकार करता है।", - "{1} ने खुद को घायल कर लिया |", - "{1} ने रणभूमि का अन्वेषण किया |", - "{1} ने {2} को डरा दिया |", - "{1} ने {2} का ध्यान भटकाया और दौड़ लगा दी |", - "{1} ने {2} का पीछा किया |", - "{1} ने मछलियाँ पकड़ी |", - "{1} ने खुद को झाड़ियों से ढक लिया |", - "{1} ने {2} का सामान चुरा लिया और उन्हें पता भी नहीं चला |", - "{1} ने लकड़ी से भाला बनाया |", - "{1} ने एक गुफा खोज निकाली |", - "{1} ने {2} पर हमला किया, लेकिन हमला असफ़ल रहा |", - "{1} ने {2} का पीछा किया |", - "{1} ने {2} से दूरी बनाई |", - "{1} ने पेड़ से फल इकट्ठे किए |", - "{1} को एक अज्ञात व्यक्ति से कुल्हाड़ी मिलती है |", - "{1} को एक अज्ञात व्यक्ति से साफ़ पानी मिलता है |", - "{1} को एक अज्ञात व्यक्ति से चिकित्सा सामग्री मिलती है |", - "{1} को एक अज्ञात व्यक्ति से गरमा-गरम खाना मिलता है |", - "{1} ने पानी के स्त्रोत की तलाश की |", - "{1} ने {2} को हरा दिया, लेकिन उसकी जान बख्श दी |", - "{1} और {2} एक दिन के लिए साथ में काम करते हैं |", - "{1} ने {2} से मिन्नत की कि उसे मार दिया जाए | उसने ऐसा न कर, {1} को जीवित रखा |", - "{1} ने पूरे दिन सोने की कोशिश की |", - "{1}, {2} और {3}, {4} और {5} के शिविर को उनकी अनुपस्थिति में लूट लेते हैं |", - "{1} ने एक कुटिया का निर्माण किया |", - "{1} ने छिपकर {2} और {3} की बातें सुन ली |", - "{1} ने तीरंदाजी का अभ्यास किया |", - "{1} को घर का ख्याल आता है |", - "बेर चुनते वक्त {1} को कांटे चुभ जाते हैं |", - "{1} ने त्रिशूल से मछलियाँ पकड़ने की कोशिश की |", - "{1} ने आग के लिए लकड़ी की तलाश की |", - "{1} और {2} अलग होकर संसाधनों की तलाश करते हैं |", - "{1} ने फूल चुने |", - "{1} ने {2} के घावों कि मरहम-पट्टी की |", - "{1} ने दूरी में धुआं उठते देखा लेकिन जांच न करने का फैसला किया |", - "{2} से दूर भागने के दौरान {1} के टखनों में मोच आ जाती है |", - "{1} ने गुलेल बनाई |", - "{1} ने किसी ऊँचें स्थान पर पहुचने के लिए सफ़र किया |", - "{1} को एक नदी मिलती है |", - "{1} ने बाकी खिलाड़ियों की तलाश की |", - "{1} और {2} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2} और {3} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2}, {3} और {4} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2}, {3}, {4} और {5} ने बाकी खिलाड़ियों की तलाश की |", - "{1} को एक अज्ञात व्यक्ति से विस्फ़ोटक मिलता है |", - "{1} को अपनी मानसिक दशा की चिंता होती है |", - "{1} ने {2} को पजामा खाने के लिए मजबूर कर दिया |", - "{1} ने {2T} को पजामा खाने के लिए मजबूर कर दिया | दम घुंटने से {2T} की मौत हो गयी |", - "{1} के हाथों {2T} की मौत होती है |", - "{1} ने {2T} के सिर में एक खंजर घोंप दिया |", - "{1T} ने {2} से मिन्नत की कि उसे मार दिया जाए | उन्होंने अनिच्छा से {1T} को मौत के घाट उतार दिया |", - "{1} और {2} साथ में काम कर {3T} को डुबो देते हैं |", - "{1} ने {2T} से हाथा-पाई के बाद उसका गला घोंट दिया |", - "{1} का तीर {2T} के सिर में जा लगा |", - "{1T} के घावों का उपचार न हो पाने के कारण काफी रक्त बह जाता है |", - "{1T} ने परिस्थितियों को न संभाल पाने के कारण आत्महत्या कर ली |", - "{1} ने {2T} का सिर पकड़कर उसे पत्थर में मार दिया |", - "{1T} ने अनजाने में विषैले बेर खा लिए |", - "{1} ने बिना आवाज़ किए {2T} की गर्दन झटके के साथ तोड़ दी |", - "{1} ने {2T} के खाने में विष मिला दिया, जिससे उसकी मौत हो गयी |", - "{1} ने तलवार से {2T} का सिर धड़ से अलग कर दिया |", - "{1T} की संक्रमण से मौत हो जाती है |", - "{1} ने {2T} के पेट पर भाले से हमला किया |", - "{1} ने {2T} को आग में झोंक दिया |", - "{1T} की गड्ढे में गिरने से मौत हो जाती है |", - "{1} ने {2T} के पीठ पीछे छुरा भोंक दिया |", - "{1} ने {2T} को घायल करने के बाद मौत के घाट उतार दिया |", - "{1} ने {2T} को घायल करने के बाद मरने के लिए छोड़ दिया |", - "{1} ने गदा से {2T} का सिर फोड़ दिया |", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/general.json b/src/languages/hi-IN/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/hi-IN/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/google.json b/src/languages/hi-IN/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/hi-IN/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/management.json b/src/languages/hi-IN/commands/management.json deleted file mode 100644 index f3657effd5c..00000000000 --- a/src/languages/hi-IN/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "**अनुमति**:{{allow}}", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "चैनल्स", - "MEMBERS": "सदस्यों", - "OTHER": "अन्य" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "अनुमतियां" - }, - "roleInfoData": "", - "roleInfoAll": "अनुमति दी गयी है |", - "roleInfoNoPermissions": "अनुमतियाँ प्रदान नहीं की गईं है ।", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "यह शब्द पहले से फ़िल्टर किया गया है ।", - "filterNotFiltered": "यह शब्द फ़िल्टर नहीं किया गया है |", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/misc.json b/src/languages/hi-IN/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/hi-IN/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/moderation.json b/src/languages/hi-IN/commands/moderation.json deleted file mode 100644 index 90e1e16e93e..00000000000 --- a/src/languages/hi-IN/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "{{username}} ({{id}}) के लिए अनुमतियाँ", - "permissionsAll": "सब अनुमतियां", - "timeTimed": "चयनित मॉडरेशन मामला पहले ही समाप्त हो चुका है।", - "timeUnsupportedType": "चयनित मामले के लिए कार्रवाई का प्रकार रिवर्स नहीं किया जा सकता है, इसलिए यह कार्रवाई असमर्थित है।", - "timeNotScheduled": "यह कार्य निर्धारित नहीं है।", - "timeAborted": "{{title}} के लिए शेड्यूल को सफलतापूर्वक समाप्त कर दिया", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/social.json b/src/languages/hi-IN/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/hi-IN/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/starwars.json b/src/languages/hi-IN/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/hi-IN/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/suggestion.json b/src/languages/hi-IN/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/hi-IN/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/system.json b/src/languages/hi-IN/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/hi-IN/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/tags.json b/src/languages/hi-IN/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/hi-IN/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/tools.json b/src/languages/hi-IN/commands/tools.json deleted file mode 100644 index 95cfb1a8a11..00000000000 --- a/src/languages/hi-IN/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "किसी का अवतार पूरे आकार में देखें।", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "राजधानी", - "officialName": "आधिकारिक नाम", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "शब्द", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/commands/twitch.json b/src/languages/hi-IN/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/hi-IN/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-IN/errors.json b/src/languages/hi-IN/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/events/errors.json b/src/languages/hi-IN/events/errors.json deleted file mode 100644 index 22c01bef758..00000000000 --- a/src/languages/hi-IN/events/errors.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "string": "{{REDCROSS}} प्रिय {{mention}}, {{message}}", - "unexpectedError": "{{REDCROSS}} मुझे एक अनपेक्षित त्रुटि मिली, कृपया मेरे डेवलपर्स को आपके द्वारा उठाए गए कदमों की रिपोर्ट करें!", - "unexpectedErrorWithContext": "$t(events/errors:unexpectedError)\nआप रिपोर्ट में `{{report}}` जोड़ सकते हैं ताकि वे देख सकें कि किस त्रुटि को ट्रिगर किया गया था।" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/guilds-logs.json b/src/languages/hi-IN/events/guilds-logs.json deleted file mode 100644 index 6002a27d00d..00000000000 --- a/src/languages/hi-IN/events/guilds-logs.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "channelCreate": "चैनल बनाया गया", - "channelCreateParent": "• **मूल**: {{value}}", - "channelCreatePosition": "• **पद**: `{{value, number}}`", - "channelCreatePermissionsTitle": "• **{{value}}** के लिए अनुमतियां", - "channelCreatePermissionsAllow_one": "- **अनुमत अनुमति**: {{values}}", - "channelCreatePermissionsAllow_other": "- **अनुमत अनुमतियाँ**: {{values, andList}}", - "channelCreatePermissionsDeny_one": "- **अस्वीकृत अनुमति**: {{values}}", - "channelCreatePermissionsDeny_other": "- **अस्वीकृत अनुमतियाँ**: {{values, andList}}", - "channelCreateNsfw": "• **NSFW के रूप में सेट करें**", - "channelCreateTopic": "• **विषय**: `{{value}}`", - "channelCreateRateLimit": "• **रेट लिमिट**: `{{value, duration}}`", - "channelCreateBitrate": "• **बिटरेट**: `{{value}}kbps`", - "channelCreateUserLimit": "• **उपयोगकर्ता सीमा**: `{{value, number}}`", - "channelDelete": "चैनल हटा दिया गया", - "channelUpdate": "चैनल अपडेट किया गया", - "channelUpdateBitrate": "**बिटरेट**: `{{previous}}kbps` → `{{next}}kbps`", - "channelUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "channelUpdateNsfw": "• **NSFW**: `{{previous}}` → `{{next}}`", - "channelUpdateParent": "• **मूल**: {{previous}} → {{next}}", - "channelUpdateParentAdded": "• **मूल**: सेट नहीं → {{value}}", - "channelUpdateParentRemoved": "• **मूल**: {{value}} → सेट नहीं", - "channelUpdatePosition": "• **पद**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateAddedPermissionsAllow_one": "- **जोड़ा गया अनुमत अनुमति**: {{values}}", - "channelUpdateAddedPermissionsAllow_other": "- **जोड़ा गया अनुमत अनुमतियां**: {{values, andList}}", - "channelUpdateAddedPermissionsDeny_one": "- **अस्वीकृत अनुमति जोड़ा गया**: {{values}}", - "channelUpdateAddedPermissionsDeny_other": "- **अस्वीकृत अनुमतियां जोड़ी गईं**: {{values, andList}}", - "channelUpdateAddedPermissionsTitle": "• **{{value}} के लिए अतिरिक्त अनुमतियां जोड़ी गईं**", - "channelUpdateDeletedPermissionsTitle": "• **{{value}}** के लिए हटाई गई अनुमतियां", - "channelUpdatePermissionsTitle": "• **{{value}}** के लिए अपडेट की गई अनुमतियां", - "channelUpdateRemovedPermissionsAllow_one": "- **हटाई गई अनुमत अनुमति**: {{values}}", - "channelUpdateRemovedPermissionsAllow_other": "- **हटाई गई स्वीकृत अनुमतियां**: {{values, andList}}", - "channelUpdateRemovedPermissionsDeny_one": "- **अस्वीकृत अनुमति हटाई गई**: {{values}}", - "channelUpdateRemovedPermissionsDeny_other": "- **हटाई गई अस्वीकृत अनुमतियां**: {{values, andList}}", - "channelUpdateRateLimit": "• **रेट लिमिट**: `{{previous, duration}}` → `{{next, duration}}`", - "channelUpdateRateLimitAdded": "• **रेट लिमिट**: सेट नहीं → `{{value, duration}}`", - "channelUpdateRateLimitRemoved": "• **रेट लिमिट**: `{{value, duration}}` → सेट नहीं", - "channelUpdateTopic": "• **विषय**: `{{previous}}` → `{{next}}`", - "channelUpdateTopicAdded": "• **विषय**: सेट नहीं → `{{value}}`", - "channelUpdateTopicRemoved": "• **विषय**: `{{value}}` → सेट नहीं", - "channelUpdateType": "• **प्ररूप**: `{{previous}}` → `{{next}}`", - "channelUpdateUserLimit": "• **उपयोगकर्ता सीमा**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateUserLimitAdded": "• **उपयोगकर्ता सीमा**: सेट नहीं → `{{value, number}}`", - "channelUpdateUserLimitRemoved": "• **उपयोगकर्ता सीमा**: `{{value, number}}` → सेट नहीं", - "emojiCreate": "इमोजी बनाया गया", - "emojiCreateAnimated": "• **एनिमेटेड**", - "emojiCreateUnAvailable": "• **उपलब्ध नहीं है**", - "emojiCreateManaged": "• **प्रबन्धित**", - "emojiCreateRequiresColons": "• **कोलन की आवश्यकता है**", - "emojiCreateRoles_one": "• **पद की आवश्यकता है**: {{values}}", - "emojiCreateRoles_other": "• **पदों की आवश्यकता है**: {{values, orList}}", - "emojiDelete": "इमोजी हटा दिया गया", - "emojiUpdate": "इमोजी संपदा किया गया", - "emojiUpdateAnimated": "• **एनिमेटेड**: `{{previous}}` → `{{next}}`", - "emojiUpdateAvailable": "• **उपलब्ध**: `{{previous}}` → `{{next}}`", - "emojiUpdateManaged": "• **प्रबन्धित**: `{{previous}}` → `{{next}}`", - "emojiUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "emojiUpdateRequiresColons": "• **कोलन की आवश्यकता है**: `{{previous}}` → `{{next}}`", - "emojiUpdateRolesAdded_one": "• **जोड़ा गया आवश्यक पद**: {{values}}", - "emojiUpdateRolesAdded_other": "• **जोड़े गए आवश्यक पद**: {{values, andList}}", - "emojiUpdateRolesRemoved_one": "• **हटाया गया आवश्यक पद**: {{values}}", - "emojiUpdateRolesRemoved_other": "• **हटाये गए आवश्यक पद**: {{values, andList}}", - "roleCreate": "पद बनाया गया", - "roleCreateColor": "• **रंग**: `{{value}}`", - "roleCreateHoist": "• **होइस्ट**", - "roleCreateMentionable": "• **उल्लेखनीय**", - "roleCreatePermissions_one": "• **अनुमति**: {{values}}", - "roleCreatePermissions_other": "• **अनुमतियां**: {{values, andList}}", - "roleCreatePosition": "• **पद**: `{{value, number}}`", - "roleDelete": "पद हटाया गया", - "roleUpdate": "पद संपादित किया गया", - "roleUpdateColor": "• **रंग**: `{{previous}}` → `{{next}}`", - "roleUpdateHoist": "• **होइस्ट**: `{{previous}}` → `{{next}}`", - "roleUpdateMentionable": "• **उल्लेखनीय**: `{{previous}}` → `{{next}}`", - "roleUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "roleUpdatePermissionsAdded_one": "• **अतिरिक्त अनुमति**: {{values}}", - "roleUpdatePermissionsAdded_other": "• **अतिरिक्त अनुमति**: {{values, andList}}", - "roleUpdatePermissionsRemoved_one": "• **हटाई गई अनुमतियां**: {{values}}", - "roleUpdatePermissionsRemoved_other": "• **हटाई गई अनुमतियां**: {{values, andList}}", - "roleUpdatePosition": "• **पद**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdate": "सर्वर अपडेट किया गया", - "serverUpdateAfkChannelAdded": "• **AFK चैनल**: सेट नहीं → {{value}}", - "serverUpdateAfkChannelRemoved": "• **AFK चैनल**: {{value}} → सेट नहीं", - "serverUpdateAfkChannel": "• **AFK चैनल**: {{previous}} → {{next}}", - "serverUpdateAfkTimeout": "• **AFK टाइम-आउट**: `{{previous, duration}}` → `{{next, duration}}`", - "serverUpdateBannerAdded": "• **बैनर**: सेट नहीं → [नया]({{value}})", - "serverUpdateBannerRemoved": "• **बैनर**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateBanner": "• **बैनर**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateDefaultMessageNotifications": "• **संदेश सूचनाएं**: {{previous, messageNotifications}}` → `{{next, messageNotifications}}`", - "serverUpdateDescriptionAdded": "• **विवरण**: सेट नहीं → `{{value}}`", - "serverUpdateDescriptionRemoved": "• **विवरण**: `{{value}}` → सेट नहीं है", - "serverUpdateDescription": "• **विवरण**: `{{previous}}` → `{{next}}`", - "serverUpdateDiscoverySplashAdded": "• **स्पलैश**: सेट नहीं → [नया]({{value}})", - "serverUpdateDiscoverySplashRemoved": "• **स्पलैश**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateDiscoverySplash": "• **स्पलैश**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateExplicitContentFilter": "• **स्पष्ट सामग्री फ़िल्टर**: `{{previous, explicitContentFilter}}` → `{{next, explicitContentFilter}}`", - "serverUpdateFeaturesAdded_one": "• **जोड़ा गया फ़ीचर**: {{values}}", - "serverUpdateFeaturesAdded_other": "• **जोड़ा गए फ़ीचर**: {{values, andList}}", - "serverUpdateFeaturesRemoved_one": "• **हटाई गई सुविधा**: {{values}}", - "serverUpdateFeaturesRemoved_other": "• **हटाई गई सुविधाएं**: {{values, andList}}", - "serverUpdateIconAdded": "• **आइकन**: सेट नहीं → [नया]({{value}})", - "serverUpdateIconRemoved": "• **आइकन**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateIcon": "• **आइकन**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateMaximumMembersAdded": "• **अधिकतम सदस्य**: सेट नहीं → `{{value, number}}`", - "serverUpdateMaximumMembersRemoved": "• **अधिकतम सदस्य**: `{{value, number}}` → सेट नहीं", - "serverUpdateMaximumMembers": "• **अधिकतम सदस्य**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdateMfaAdded": "• **बहु-कारक प्रमाणीकरण जोड़ा गया**", - "serverUpdateMfaRemoved": "• **बहु-कारक प्रमाणीकरण हटाया गया**", - "serverUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "serverUpdateOwner": "• **मालिक**: {{previous}} → {{next}}", - "serverUpdatePreferredLocaleAdded": "• **प्रफर्ड स्थान**: सेट नहीं → `{{value}}`", - "serverUpdatePreferredLocaleRemoved": "• **प्रफर्ड स्थान**: `{{value}}` → सेट नहीं है", - "serverUpdatePreferredLocale": "• **प्रफर्ड स्थान**: `{{previous}}` → `{{next}}`", - "serverUpdatePremiumSubscriptionCountAdded": "• **बूस्टर्स**: सेट नहीं → `{{value, number}}`", - "serverUpdatePremiumSubscriptionCountRemoved": "• **बूस्टर्स**: `{{value, number}}` → सेट नहीं", - "serverUpdatePremiumSubscriptionCount": "• **बूस्टर्स**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePremiumTier": "• **प्रीमियम टियर**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePublicUpdatesChannelAdded": "• **सार्वजनिक अपडेट चैनल**: सेट नहीं → {{value}}", - "serverUpdatePublicUpdatesChannelRemoved": "• **सार्वजनिक अपडेट चैनल**: {{value}} → सेट नहीं", - "serverUpdatePublicUpdatesChannel": "• **सार्वजनिक अपडेट चैनल**: {{previous}} → {{next}}", - "serverUpdateRulesChannelAdded": "• **नियम चैनल**: सेट नहीं → {{value}}", - "serverUpdateRulesChannelRemoved": "• **नियम चैनल**: {{value}} → सेट नहीं", - "serverUpdateRulesChannel": "• **नियम चैनल**: {{previous}} → {{next}}", - "serverUpdateSplashAdded": "• **स्पलैश**: सेट नहीं → [नया]({{value}})", - "serverUpdateSplashRemoved": "• **स्पलैश**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateSplash": "• **स्पलैश**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateSystemChannelFlagsAdded_one": "• **जोड़ा गया सिस्टम चैनल विकल्प**: {{values}}", - "serverUpdateSystemChannelFlagsAdded_other": "• **जोड़े गए सिस्टम चैनल विकल्प**: {{values, andList}}", - "serverUpdateSystemChannelFlagsRemoved_one": "• **हटाया गया सिस्टम चैनल विकल्प**: {{values}}", - "serverUpdateSystemChannelFlagsRemoved_other": "• **हटाये गए सिस्टम चैनल विकल्प**: {{values, andList}}", - "serverUpdateSystemChannelAdded": "• **सिस्टम चैनल**: सेट नहीं → {{value}}", - "serverUpdateSystemChannelRemoved": "• **सिस्टम चैनल**: {{value}} → सेट नहीं", - "serverUpdateSystemChannel": "• **सिस्टम चैनल**: {{previous}} → {{next}}", - "serverUpdateVanityUrlAdded": "• **वैनिटी URL**: सेट नहीं → {{value}}", - "serverUpdateVanityUrlRemoved": "• **वैनिटी URL**: `{{value}}` → सेट नहीं", - "serverUpdateVanityUrl": "• **वैनिटी URL**: `{{previous}}` → {{next}}", - "serverUpdateVerificationLevel": "• **सत्यापन स्तर**: `{{previous}}` → `{{next}}`", - "serverUpdateWidgetChannelAdded": "• **विजेट चैनल**: सेट नहीं → {{value}}", - "serverUpdateWidgetChannelRemoved": "• **विजेट चैनल**: {{value}} → सेट नहीं", - "serverUpdateWidgetChannel": "• **विजेट चैनल**: {{previous}} → {{next}}", - "serverUpdateWidgetEnabled": "• **विजेट सक्षम**", - "serverUpdateWidgetDisabled": "• **विजेट अक्षम**" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/guilds-members.json b/src/languages/hi-IN/events/guilds-members.json deleted file mode 100644 index 5d35a8ae786..00000000000 --- a/src/languages/hi-IN/events/guilds-members.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "guildMemberAdd": "उपयोगकर्ता जुड़े", - "guildMemberAddDescription": "{{mention}} | **डिस्कॉर्ड से जुड़े**: {{time, duration}} पहले|", - "guildMemberAddedRoles_other": "**पद जोड़े गए**: {{addedRoles, andList}}", - "guildMemberAddedRoles_one": "**पद जोड़े गए**: {{addedRoles}}", - "guildMemberAddMute": "म्यूट किया गया उपयोगकर्ता शामिल हुआ", - "guildMemberBanned": "उपयोगकर्ता प्रतिबंधित", - "guildMemberKicked": "उपयोगकर्ता हटा दिया गया", - "guildMemberNoUpdate": "कोई अपडेट नहीं मिला", - "guildMemberRemove": "उपयोगकर्ता विदा हो गया", - "guildMemberRemoveDescription": "{{mention}} | **सर्वर से जुड़े**: अनजान|", - "guildMemberRemoveDescriptionWithJoinedAt": "{{mention}} | **सर्वर से जुड़े**: {{time, duration}} पहले|", - "guildMemberRemovedRoles_other": "**पद हटाए गए**: {{removedRoles, andList}}", - "guildMemberRemovedRoles_one": "**पद हटाए गए**: {{removedRoles}}", - "guildMemberSoftBanned": "उपयोगकर्ता सॉफ्टबैन", - "nameUpdateNextWasNotSet": "**अगला**: सेट नहीं", - "nameUpdateNextWasSet": "**अगला**: `{{nextName}}`", - "nameUpdatePreviousWasNotSet": "**पूर्व**: सेट नहीं", - "nameUpdatePreviousWasSet": "**सेट नहीं**: `{{previousName}}`", - "nicknameUpdate": "उपनाम संपादित किया गया", - "roleUpdate": "पद सम्पादित किया गया", - "usernameUpdate": "किया गया किया गया" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/messages.json b/src/languages/hi-IN/events/messages.json deleted file mode 100644 index fd5d00c9929..00000000000 --- a/src/languages/hi-IN/events/messages.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "messageDelete": "संदेश हटाया गया • {{channel}}", - "messageUpdate": "संदेश संपादित किया गया • {{channel}}" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/moderation.json b/src/languages/hi-IN/events/moderation.json deleted file mode 100644 index e95b5eb27c4..00000000000 --- a/src/languages/hi-IN/events/moderation.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "attachmentFilter": "{{REDCROSS}} प्रिय {{user}}, यहां फाइल अटैचमेंट की अनुमति नहीं है।", - "attachmentFilterFooter": "बहुत अधिक अटैचमेंट", - "attachments": "[Auto-Moderation] अटैचमेंट फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "attachmentsWithMaximum": "[Auto-Moderation] अटैचमेंट फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "capitals": "[Auto-Moderation] कैपिटल फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "capitalsWithMaximum": "[Auto-Moderation] कैपिटल फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "capsFilter": "{{REDCROSS}} ईईईओओओ {{user}}! कृपया इस जगह पर चिल्लाएं नहीं! आपने कैपिटल की सीमा पार कर ली है!", - "capsFilterDm": "नीचे बोलो! मुझे पता है कि आपको अपने विचार व्यक्त करने की जरूरत है। यह संदेश है जिसे मैंने हटा दिया है:{{message}}", - "capsFilterFooter": "बहुत सारे अपरकेस", - "inviteFilterAlert": "{{REDCROSS}} प्रिय {{user}}, यहां आमंत्रण लिंक की अनुमति नहीं है।", - "inviteFilterLog_one": "**लिंक**: {{links, andList}}", - "inviteFilterLog_other": "**लिंके**: {{links, andList}}", - "inviteLink": "आमंत्रण लिंक", - "invites": "[Auto-Moderation] आमंत्रण फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "invitesWithMaximum": "[Auto-Moderation] आमंत्रण फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "link": "फ़िल्टर्ड लिंक", - "links": "[Auto-Moderation] लिंक फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "linksWithMaximum": "[Auto-Moderation] लिंक फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "messageFilter": "{{REDCROSS}} वाह वाह वाह, कृपया इतनी अधिक पुनः पोस्ट करना बंद करें {{user}}!", - "messageFilterFooter": "बहुत अधिक संदेश डुप्लिकेट", - "messages": "[Auto-Moderation] डुप्लीकेट संदेश फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "messagesWithMaximum": "[Auto-Moderation] डुप्लीकेट संदेश शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "newlineFilter": "{{REDCROSS}} संदेश की दीवार {{user}} से आ रही है, संदेश की दीवार नीचे ले जाया गया!", - "newlineFilterFooter": "बहुत सारी पंक्तियाँ", - "newlines": "[Auto-Moderation] नई पंक्ति फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "newlinesWithMaximum": "[Auto-Moderation] नई पंक्ति शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "nolink": "{{REDCROSS}} अरे {{user}}, आपको यहां लिंक भेजने करने की अनुमति नहीं है!", - "wordFilter": "{{REDCROSS}} क्षमा करें, प्रिय {{user}}, आपने कुछ ऐसा कहा है जिसकी इस सर्वर में अनुमति नहीं है।", - "wordFilterDm": "चुप रहो! आपने कुछ ऐसे शब्द कहे हैं जिनकी सर्वर में अनुमति नहीं है! लेकिन चूंकि आपने संदेश लिखने में कुछ समय लिया है, इसलिए मैं इसे यहां पोस्ट करुंगी:\n{{filtered}}", - "wordFilterFooter": "फ़िल्टर किया गया शब्द", - "words": "[Auto-Moderation] शब्द फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "wordsWithMaximum": "[Auto-Moderation] शब्द फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/noMentionSpam.json b/src/languages/hi-IN/events/noMentionSpam.json deleted file mode 100644 index e36eb747029..00000000000 --- a/src/languages/hi-IN/events/noMentionSpam.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "footer": "[NOMENTIONSPAM]", - "alert": "किसी और का उल्लेख करने में सावधानी बरतें, क्योंकि आप इस सर्वर की उल्लेख सीमा पार कर चुके है और प्रतिबंधित होने वाले है|", - "message": "बैनहैमर उतर चुका है और अब {{user.tag}} आईडी वाले उपयोगकर्ता {{user.id}} को स्पैम के कारण प्रतिबंधित कर दिया गया है।\nचिंता न करें! मैं यहाँ आपकी मदद करने के लिए हूँ! 😄", - "modlog": "[NOMENTIONSPAM] स्वचालित: उल्लेख करें कि स्पैम सीमा पार हो गई है।\nसीमा: {{threshold}}|" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/reactions.json b/src/languages/hi-IN/events/reactions.json deleted file mode 100644 index 2f3c93871f5..00000000000 --- a/src/languages/hi-IN/events/reactions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "reaction": "प्रतिक्रिया जोड़ी गई", - "filterFooter": "फ़िल्टर की गई प्रतिक्रिया", - "filter": "{{REDCROSS}} अरे {{user}}, कृपया उस प्रतिक्रिया को न जोड़ें!", - "selfRoleHierarchy": "{{REDCROSS}} मेरी भूमिका सभी स्व-आबंटित भूमिकाओं से अधिक होनी चाहिए, अन्यथा मैं उन्हें लोगों को प्रदान नहीं कर सकती!" -} \ No newline at end of file diff --git a/src/languages/hi-IN/events/twitch.json b/src/languages/hi-IN/events/twitch.json deleted file mode 100644 index 7e03bb821bb..00000000000 --- a/src/languages/hi-IN/events/twitch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "embedDescription": "{{userName}} अब लाइव है!", - "embedDescriptionWithGame": "{{userName}} अब लाइव है! - स्ट्रीमिंग {{gameName}}!", - "offlinePostfix": "Skyra ट्विच सूचनाएं" -} \ No newline at end of file diff --git a/src/languages/hi-IN/fuzzySearch.json b/src/languages/hi-IN/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/globals.json b/src/languages/hi-IN/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/guilds.json b/src/languages/hi-IN/guilds.json deleted file mode 100644 index dadd026b1d3..00000000000 --- a/src/languages/hi-IN/guilds.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "explicitContentFilterDisabled": "अक्षम", - "explicitContentFilterMembersWithoutRoles": "पदों के बिना सदस्य", - "explicitContentFilterAllMembers": "सभी सदस्य", - "messageNotificationsAll": "सभी संदेश", - "messageNotificationsMentions": "केवल @उल्लेख", - "SUPPRESS_JOIN_NOTIFICATIONS": "सदस्य शामिल होने पर सूचनाएं", - "SUPPRESS_JOIN_NOTIFICATION_REPLIES": "सदस्य शामिल होने पर स्टिकर बटन वाले जवाब", - "SUPPRESS_PREMIUM_SUBSCRIPTIONS": "सर्वर बूस्ट कि सूचनाएं", - "SUPPRESS_GUILD_REMINDER_NOTIFICATIONS": "सर्वर सेटअप युक्तियाँ" -} \ No newline at end of file diff --git a/src/languages/hi-IN/humanLevels.json b/src/languages/hi-IN/humanLevels.json deleted file mode 100644 index fbdc7661d39..00000000000 --- a/src/languages/hi-IN/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "कुछ नही", - "LOW": "कम", - "MEDIUM": "मध्यम", - "HIGH": "उच्च", - "VERY_HIGH": "उच्चतम" -} \ No newline at end of file diff --git a/src/languages/hi-IN/moderation.json b/src/languages/hi-IN/moderation.json deleted file mode 100644 index 797d0fbf8ee..00000000000 --- a/src/languages/hi-IN/moderation.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "caseNotExists_one": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग प्रकरण मौजूद नहीं है।", - "caseNotExists_other": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग प्रकरणों में से कोई भी मौजूद नहीं है।", - "logAppealed": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग की समय सीमा समाप्त हो गई है या इसे अस्थायी नहीं बनाया जा सकता है।", - "logDescriptionTypeAndUser": "❯ **प्रकार**: {{data.type}}\n❯ **सदस्य**: {{data.userName}}#{{data.userDiscriminator}} ({{data.userId}})", - "logDescriptionWithReason": "❯ **वजह:** {{data.reason}}{{data.formattedDuration}}", - "logDescriptionWithoutReason": "❯ **वजह:** कृपया कारण निर्धारित करने के लिए `{{data.prefix}}reason {{data.caseId}} ` का उपयोग करें।{{data.formattedDuration}}", - "logExpiresIn": "\n❯ **संपूर्ण होगा**: {{duration, duration}}", - "logFooter": "प्रकरण {{caseId}}", - "muteCannotManageRoles": "म्यूट करने में सक्षम होने के लिए मेरे पास **{{MANAGE_ROLES, permissions}}** अनुमतियां होनी चाहिए।", - "muteLowHierarchy": "मैं किसी ऐसे सदस्य को म्यूट नहीं कर सकती जो मुझसे उच्च पद पर आसीन है।", - "muteNotConfigured": "इस क्रिया के होने के लिए म्यूट पद को कॉन्फ़िगर किया जाना चाहिए|", - "muteNotExists": "चयनित सदस्य म्यूट नहीं है।", - "muteNotInMember": "सदस्य में म्यूट पद सेट नहीं है।", - "restrictionNotConfigured": "इस क्रिया के होने के लिए प्रतिबंध पद को कॉन्फ़िगर किया जाना चाहिए", - "roleHigher": "चयनित सदस्य के पद की स्थिति आपके से अधिक या उसके बराबर है|", - "roleHigherSkyra": "चयनित सदस्य के पद की स्थिति मेरे से अधिक या उसके बराबर है|", - "success": "कमांड को सफलतापूर्वक निष्पादित किया।", - "toSkyra": "क्यों... मुझे लगा कि तुम मुझसे प्यार करते हो! 💔", - "userSelf": "आप अपने आप से ऐसा क्यों करेंगे?" -} \ No newline at end of file diff --git a/src/languages/hi-IN/moderationActions.json b/src/languages/hi-IN/moderationActions.json deleted file mode 100644 index ee22ddd9732..00000000000 --- a/src/languages/hi-IN/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "actions": { - "addRole": "पद जोड़ा गया", - "ban": "प्रतिबंध", - "kick": "निकालें", - "mute": "म्यूट", - "removeRole": "पद हटाए", - "restrictedAttachment": "अटैचमेंट प्रतिबंध", - "restrictedEmbed": "एम्बेड प्रतिबंध", - "restrictedReact": "प्रतिक्रिया प्रतिबंध", - "restrictedVoice": "आवाज़ प्रतिबंध", - "setNickname": "उपनाम रखे", - "softban": "सॉफ्टबैन", - "vkick": "आवाज से हटाना", - "vmute": "आवाज मूक" - }, - "applyNoReason": "", - "applyReason": "", - "requiredMember": "उपयोगकर्ता मौजूद नहीं है या इस सर्वर में नहीं है।", - "revokeNoReason": "", - "revokeReason": "", - "setNicknameNoReasonRemoved": "", - "setNicknameNoReasonSet": "", - "setNicknameRemoved": "", - "setNicknameSet": "", - "setupMuteExists": "**म्यूट पद बनाना बंद किया गया**: पहले से ही \"Muted\" नामक एक पद है।", - "setupRestrictionExists": "**प्रतिबंध पद बनाना बंद किया गया**: एक पहले से मौजूद है।", - "setupTooManyRoles": "**पद बनाना बंद किया गया**: इस सर्वर में 250 पद हैं, आपको एक पद को हटाना होगा।", - "sharedRoleSetupAsk": "", - "sharedRoleSetupNoMessage": "आपने समय पर संदेश नहीं डाला, सेट अप रद्द कर दिया!", - "sharedRoleSetupExisting": "मुझे कॉन्फ़िगर किया गया पद नहीं मिला। क्या आप किसी मौजूदा को कॉन्फ़िगर करना चाहते हैं?", - "sharedRoleSetupExistingName": "कृपया मुझे उस पद का नाम दें जिसका उपयोग आप इस प्रकार की आगे की कार्रवाइयों के लिए करना चाहते हैं।", - "sharedRoleSetupNew": "क्या आप चाहते हैं कि मैं एक नया पद बनाऊं और इसे स्वचालित रूप से कॉन्फ़िगर करूं?", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/hi-IN/permissions.json b/src/languages/hi-IN/permissions.json deleted file mode 100644 index 6588b72f466..00000000000 --- a/src/languages/hi-IN/permissions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "CONNECT": "जुडिये", - "SEND_MESSAGES": "संदेश भेजो", - "SPEAK": "बोले" -} \ No newline at end of file diff --git a/src/languages/hi-IN/preconditions.json b/src/languages/hi-IN/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/promptList.json b/src/languages/hi-IN/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/selfModeration.json b/src/languages/hi-IN/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/serializers.json b/src/languages/hi-IN/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/settings.json b/src/languages/hi-IN/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-IN/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-IN/system.json b/src/languages/hi-IN/system.json deleted file mode 100644 index 2f33e361ad1..00000000000 --- a/src/languages/hi-IN/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "डिस्कोर्ड को मैसेज करते समय मेरे पास एक छोटी सी नेटवर्क त्रुटि थी, कृपया इस कमांड को फिर से चलाएं |", - "exceededLengthChooseOutput": "निम्न में से कोई एक विकल्प चुनें |: {{output, orList}}", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/arguments.json b/src/languages/hi-Latn-IN/arguments.json deleted file mode 100644 index bd24225968e..00000000000 --- a/src/languages/hi-Latn-IN/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "डिसेबल्ड", - "booleanEnabled": "चालू करे", - "booleanFalseOptions": [ - "गलत", - "फ", - "नहीं", - "", - "बंद", - "डिसेबल", - "निर्योग्य", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/arguments/image.json b/src/languages/hi-Latn-IN/arguments/image.json deleted file mode 100644 index 2ad6265c9c0..00000000000 --- a/src/languages/hi-Latn-IN/arguments/image.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "notFound": "{{REDCROSS}} मैं {{value}} के लिए कोई अवतार नहीं ढूंढ सकी।" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/arguments/range.json b/src/languages/hi-Latn-IN/arguments/range.json deleted file mode 100644 index 0a9d9540e74..00000000000 --- a/src/languages/hi-Latn-IN/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} ek number ya phir a number ki sunkhya honi chahiye." -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/assertions.json b/src/languages/hi-Latn-IN/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/colors.json b/src/languages/hi-Latn-IN/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/admin.json b/src/languages/hi-Latn-IN/commands/admin.json deleted file mode 100644 index a05abc8bd6c..00000000000 --- a/src/languages/hi-Latn-IN/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} band nahi hona chahiye.", - "confUpdated": "", - "confGetNoExt": "{{key}} यह कुंजी मौजूद नहीं है।", - "confGet": "{{key}} इस कुंजी का मूल्य {{value}} के बराबर है।", - "confReset": "{{key}} कुंजी का मूल्य {{value}} के बराबर स्थापित किया गया है।", - "confNochange": "{{key}} कुंजी का मूल्य पहले से दिए गए मूल्य के अनुसार है।", - "confServerDescription": "सर्वर सेटिंग्स के अनुसार निश्चित करे।", - "confServerExtended": { - "usages": [ - "", - "दिखाएँ", - "कुंजी का नाम दिखाएं", - "कुंजी के लिए कुंजी का नाम मूल्य निकालें", - "कुंजी का नाम पुन: प्रस्थापित करे", - "मेन्यू" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "**सर्वर सेटिंग्स {{key}}**\n{{list}}", - "confDashboardOnlyKey": "{{key}} केवल वेब डैशबोर्ड () माध्यम से ही इसे रूप दिया जा सकता हैं।", - "confSettingNotSet": "निर्धारित नहीं है", - "rolesetDescription": "विविध किरदार संच का प्रबंध करे।", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "जोड़े", - "एक नया किरदार संच बनाए अथवा मौजूदा किसी संच में किरदार को जोड़े।" - ], - [ - "हटाएं", - "मौजूदा किरदार संच में से कोई एक किरदार हटाएं।" - ], - [ - "पुन: विस्थापन", - "किसी एक किरदार संच में से सभी किरदार हटाए, अथवा निश्चित ना होने पर, सभी किरदार संच।" - ], - [ - "सूची", - "सभी भूमिकाओं को सूचीबद्ध करता है।" - ], - [ - "स्वत:", - "किसी एक किरदार संच को जोड़ता या फिर हटता है।" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "अमेरिका विभाग को जोड़ता है", - "आफ्रीका अमेरिका आशिया यूरोप विभाग को जोड़ता है।", - "अमेरिका विभाग को हटता है।", - "मूल स्थिति पर लाना", - "विभाग को पुन: स्थापित करे।", - "सूची", - "अमेरिका विभाग", - "आफ्रीका अमेरिका आशिया यूरोप विभाग" - ], - "reminder": "यह आदेश विभिन्न किरदार को जोड़ और/अथवा हटा साकता है।" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "{{REDCROSS}} इस समूह में कोई किरदार संच परिभाषित नहीं है।", - "rolesetResetAll": "{{GREENTICK}} सभी किरदार सफलापूर्वक हटाएं गए है।", - "rolesetResetNotExists": "{{REDCROSS}} {{name}} यह किरदार संच इस सर्वर मे मौजूद नहीं है।", - "rolesetResetGroup": "{{GREENTICK}} सफला पूर्वक {{name}} किरदार संच हटाया गया है।", - "rolesetUpdated": "{{name}} इस किरदार को सफलता पूर्वक अद्यतन किया गया है।", - "rolesetNoRolesets": "आपके पास कोई भी किरदार संच नहीं है।", - "confMenuRenderAtFolder": "अभी फिलाल {{path}} में है।", - "confMenuRenderAtPiece": "अभी फिलाल ⚙️ {{path}} में है।", - "confMenuRenderNokeys": "इस फोल्डर के लिए कोई भी परिभाषित की नहीं है।", - "confMenuRenderSelect": "कृपया कोई भी प्रविष्टियो का नाम लिखे।", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "वर्तमान मूल्य: **``{{value}}``**", - "confMenuRenderBack": "पिछे जाने के लिए ◀ दबाए।", - "confMenuInvalidKey": "अवैध की, कृपया दिए गए पर्याय से पुन: प्रयास करें।", - "confMenuInvalidAction": "अवैध कृती, कृपया दिए गए पर्याय से पुन: प्रयास करें।", - "confMenuSaved": "सफलतापूर्वक सभी बदलाव किए जा चुके है।" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/animal.json b/src/languages/hi-Latn-IN/commands/animal.json deleted file mode 100644 index 4ed3f04fe98..00000000000 --- a/src/languages/hi-Latn-IN/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "मैं आपको एक रहस्यमय बिल्ली तथ्य बताता हूं।", - "catfactExtended": { - "extendedHelp": "तुम जानता है कि बिल्ली बहुत उत्सुक है, ठीक? उसको ज़रूर मज़े और अजीब वाली बातें ज़्यादा है ।\nइस आदेश से तुमको एक अनियमित तथ्य मिलते है ।" - }, - "catfactTitle": "बिल्लियों के तथ्य", - "dogDescription": "प्यारे कुत्ते! ❤", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "मैं तुमको एक लोमड़ी का चित्र दिखाता हूं ।", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "बिलौटा!", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "प्यारा कुत्तों!", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/animation.json b/src/languages/hi-Latn-IN/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/hi-Latn-IN/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/fun.json b/src/languages/hi-Latn-IN/commands/fun.json deleted file mode 100644 index ef8f4fc1ba1..00000000000 --- a/src/languages/hi-Latn-IN/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "स्कायरा सबसे अच्छी है, मेरी इस सोच को बदलकर दिखाओ |", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "मुझे अभी भी लगता है कि मैं सबसे अच्छी हूँ, मेरी इस सोच को बदलकर दिखाओ | मैं आपके अवतार से कागज़ पर कुछ शब्दों के साथ एक तस्वीर बनाउंगी |", - "explainedUsage": [ - [ - "वाक्यांश", - "जो वाक्यांश आपको चाहिए |" - ] - ], - "examples": [ - "स्कायरा इस सर्वर की सर्वश्रेष्ठ बौट है |" - ] - }, - "choiceDescription": "अक्कड़ बक्कड़ बम्बे बो, अस्सी नब्बे पूरे सौ...", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "मुझे अपने अस्तित्व से जुड़ा एक संदेह है... क्या मुझे बर्तनों को धोना चाहिए या उन्हें खिड़की से बाहर फेंक देना चाहिए? ख़ोज जारी है | मुझे अल्पविराम से अलग की हुई चीज़ों की एक सूची दीजिये और मैं उनमें से एक चुनुंगी | आगे जो भी होगा उसकी जिम्मेदारी मेरी नहीं होगी |", - "explainedUsage": [ - [ - "शब्द", - "अल्पविराम द्वारा अलग-अलग किये शब्दों की एक सूची |" - ] - ], - "examples": [ - "बर्तनों को धोना चाहिए, बर्तनों को खिड़की से बाहर फेंक देना चाहिए", - "बिल्ली, कुत्ता" - ] - }, - "diceDescription": "पासे को डी२० रूप में भेजें |", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "इस आदेश के काम करने का तरीका सरल है | आपके पास एक पासा है, आप उसे __x__ बार फेंकते है, और पासा __y__ अंक दे सकता है | अतिरिक्त निर्देश के बिना, यह आदेश एक बार वह पासा फेंकता है जिस पर ६ अंक हैं | पासा कितनी बार फेंका जाएगा इसे आप अपनी इच्छानुसार बदल सकते हैं (ऐसा करने पर यह १ और पासे-पर-जितने-अंक-हैं उनके बीच के किसी अंक बार फेंका जाएगा) | उदाहरण के तौर पर, ६ अंकों वाले पासे को ३ बार फेंकने पर ३ अंक एक अनियमित क्रम में मिलेंगे, जो कि १ से ६ के बीच में होंगे | अगर वह अंक ३, १ और ६ हैं, तब यह आदेश १० देगा |", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "पोकेमौन कार्यक्रम की \"एस्केप रस्सी\" का उपयोग करें |", - "escaperopeExtended": { - "extendedHelp": "**स्कायरा** ने **भागने-वाली-रस्सी** का उपयोग किया |" - }, - "loveDescription": "प्रेम-मापक, इंटरनेट पर !", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "सुनिए ! क्या आप प्रेम-मापक का उपयोग करना चाहेंगे? मैं जानती हूँ की यह हंसी-मज़ाक के लिए है, किन्तु कई लोगों को बहुत पसंद है | शर्माने की जरूरत नहीं है, एक बार कोशिश कर के देखिये !", - "explainedUsage": [ - [ - "व्यक्ति", - "जिस व्यक्ति का मूल्यांकन करना है |" - ] - ], - "examples": [ - "स्कायरा" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "बौट्स को राय देने व लोगों का मूल्यांकन करने कि अनुमति दें |", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "मेरे एक बौट होने का यह मतलब नहीं है कि मैं आपका सही मूल्यांकन नहीं कर सकती | यह और सरल हो जाएगा अगर मैं एक यादृच्छिक संख्या देने वाले यंत्र का प्रयोग करूं | ठीक ठीक, यह सही नहीं है, लेकिन... मैं आपको एक 💯 भी दे सकती हूँ |", - "explainedUsage": [ - [ - "व्यक्ति", - "जिस व्यक्ति का मूल्यांकन करना है |" - ] - ], - "examples": [ - "स्कायरा", - "मुझे" - ] - }, - "shindeiruDescription": "ओमाए वा मोउ शिन्देईरु |", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "\"तुम पहले ही मर चुके हो\" जापानी: お前はもう死んでいる; ओमाए वा मोउ शिन्देईरु, जापानी माँगा और एनीमे 'फिस्ट ऑफ़ द नॉर्थ स्टार' का एक कथन है | यह आदेश एक हास्य-पत्रिका से लिया एक हिस्सा दिखाता है, जिसमें पात्र के ऐसा कहने पर उसका प्रतिद्वंदी जवाब में \"नानी?\" (क्या?) कहता है |", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "सहायक विवरण? हम ऐसी चीज़ें यहाँ नहीं करते", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "XKCD से हास्य-पत्रिकाएँ पढ़ें |", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "**xkcd** एक गणित, विज्ञान, व्यंग तथा भाषाओं की हास्य-सामग्री का एक संग्रह है | अगर आप और कुछ नहीं लिखते हैं, तो मैं कोई भी एक हास्य-पत्र ले आउंगी | अगर आप मुझे एक संख्या देते हैं, तो मैं उस संख्या की पत्रिका लाऊंगी | लेकिन अगर आप मुझे नाम/वाक्यांश/विषय देते हैं, तो मैं उससे मेल-खाती पत्रिका प्रस्तुत करूंगी | उदाहरण के तौर पर, `Skyra, xkcd Curiosity` लिखने पर १०९१ संख्या की पत्रिका दिखाई जायेगी |", - "explainedUsage": [ - [ - "निर्देश", - "हास्य-पत्रिका की संख्या अथवा एक नाम जो ढूँढा जा सके |" - ] - ], - "examples": [ - "१०९१", - "जिज्ञासा" - ] - }, - "choiceOutput": "", - "choiceMissing": "कृपया कम-से-कम दो विकल्प अल्पविराम से अलग कर लिखें |", - "choiceDuplicates": "मैं एक ही शब्द दोबारा क्यों स्वीकार करूं ? \"{{words}}\" |", - "diceOutput": "आपने पासा फेंका ! अंक आया: **{{result}}**", - "diceRollsError": "पासा १ से १०२४ बार ही फेंका जा सकता है |", - "diceSidesError": "पासे पर ३ से १०२४ अंक हो सकते हैं |", - "escaperopeOutput": "**{{user}}** ने **भागने वाली रस्सी** का उपयोग किया |", - "loveLess45": "पुनः प्रयास करें...", - "loveLess75": "काफी बढ़िया !", - "loveLess100": "जोड़ी जम रही है !", - "love100": "ये जोड़ी अति-उत्तम है!", - "loveItself": "आप एक बहुत ही विशेष व्यक्ति हैं और आपको स्वयं से सबसे ज्यादा प्रेम करना चाहिए <3", - "loveResult": "परिणाम", - "rateOutput": "**{{author}}**, मैं **{{userToRate}}** को देती हूँ **{{rate}}**/100 {{emoji}}", - "rateMyself": [ - "| मैं खुद से बहुत प्यार करती हूँ 😊", - "अपने आप को" - ], - "rateOwners": [ - "| मैं अपने डेवलपर्स से बहुत प्यार करती हूँ 🥰", - "मेरे डेवलपर्स" - ], - "xkcdComics": "सिर्फ {{amount}} हास्यास्पद-पत्रिकाएँ हैं |", - "xkcdNotfound": "मैंने इस पत्रिका की खोज दूर-दूर तक की, परन्तु मुझे यह नहीं मिली, कृपया कुछ समय पश्चात पुनः प्रयास करें या दूसरी पत्रिका ढूँढें !" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/game.json b/src/languages/hi-Latn-IN/commands/game.json deleted file mode 100644 index 70d45f90686..00000000000 --- a/src/languages/hi-Latn-IN/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "किसी के साथ कनेक्ट-फोर खेलें |", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "यह खेल PC पर सबसे अच्छे से खेला जाता है |\nकनेक्ट-फोर एक खेल है जिसे दो लोग एक समय पर खेल सकते हैं | खिलाड़ी सबसे पहले एक रंग चुनते हैं और बारी बारी से रंगीन गोले एक सात कॉलम और छह पंक्तियों वाली ग्रिड पर रखते हैं |", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "आपके पास {{SHINY}} ऋणात्मक संख्या में नहीं हो सकती |", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "सिक्का उछालें !", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "सिक्का उछालें | यदि आपका अनुमान सही हुआ, तो बाजी की रक़म दुगनी हो कर आपको वापस मिलेगी |\nयदि आपका अनुमान गलत हुआ तो आप बाजी हार जायेंगे |\nआप बिना किसी रक़म के भी सिक्का उछाल सकते हैं, जिसमे पैसे नहीं लगते, परन्तु आपको इनाम भी नहीं मिलेगा |\nअब सिक्के उछालना शुरू कीजिये |", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था |", - "coinFlipLoseDescriptionWithWager": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही नहीं था और आप {{wager}} {{SHINY}} हार गए |", - "coinFlipLoseTitle": "आप हार गए |", - "coinFlipNoguessDescription": "सिक्का उछाला गया, और {{result}} आया |", - "coinFlipNoguessTitle": "आपने सिक्का उछाला |", - "coinFlipWinDescription": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही था !", - "coinFlipWinDescriptionWithWager": "सिक्का उछाला गया, और {{result}} आया | आपका अनुमान सही था और आप {{wager}} {{SHINY}} जीत गए !", - "coinFlipWinTitle": "आप जीत गए!", - "gamesBot": "क्षमा कीजिये, परन्तु मुझे नहीं लगता की वे जो काम कर रहे हैं उसे छोड़कर मनुष्यों के साथ खेलना चाहेंगे |", - "gamesNoPlayers": "'हंगर गेम्स' के लिए कुछ नाम प्रदान करें, जैसे: `{{prefix}}hg अंकित, दिय्यांश, आर्यन, काएरा`", - "gamesProgress": "क्षमा कीजिये, लेकिन इस चैनल में एक खेल प्रगति पर है, कुछ समय पश्चात पुन: प्रयास करें |", - "gamesPromptDeny": "मुझे खेद है, परन्तु प्रतिद्वंदी ने खेलने से इंकार कर दिया |", - "gamesRepeat": "क्षमा कीजिये, लेकिन एक व्यक्ति दो बार नहीं खेल सकता |", - "gamesSelf": "आप काफ़ी निराश होंगे अपने साथ खेलकर | किसी और के साथ खेलने का प्रयास करें |", - "gamesTooManyOrFew": "क्षमा कीजिये परन्तु खिलाड़ियों की संख्या {{min}} से कम या {{max}} से ज्यादा है |", - "hgBloodbath": [ - "{1} ने बेलचा उठा लिया |", - "{1} ने एक बस्ता उठाया और वापसी की |", - "{1} और {2} एक बस्ते के लिए लड़ते हैं | {1} ने हार मान कर मैदान छोड़ दिया |", - "{1} और {2} एक बस्ते के लिए लड़ते हैं | {2} ने हार मान कर मैदान छोड़ दिया |", - "{1} को कुछ तीर, एक कमान और एक तरकस मिला |", - "{1} को कोर्नुकोपिया मिलती है और उसे छुपना पड़ता है |", - "{1} ने मुट्ठी भर खंजर लिए |", - "{1} {2} के हाथों से गदा छीन लेता है |", - "{1} को पानी से भरा जलपान-गृह मिलता है |", - "{1} संसाधनों के लिए कोर्नुकोपिया के पास है |", - "{1} ने जितना हो सका उतना खाना जमा किया |", - "{1} ने तलवार थाम ली |", - "{1} ने कोर्नुकोपिया के भीतर से भाला उठा लिया |", - "{1} को विस्फोटकों के भरा थैला मिलता है |", - "{1} को एक प्राथमिक चिकित्सा की वस्तुओं से भरा बस्ता लेकर भागना पड़ता है |", - "{1} ने कोर्नुकोपिया के भीतर से एक हँसिया उठा ली |", - "{1}, {2} और {3} साथ में काम कर के जितने हो सके उतने संसाधन जुटाते हैं |", - "{1} को एक लाइटर और रस्सी लेकर भागना पड़ता है |", - "{1} को शराब की बोतल और एक कपड़ा मिलता है |", - "{1} को तंबू तथा अन्य सामग्री मिलती है |", - "{1} अनजाने में एक खाली बस्ता लेते हैं |", - "{1} ने ब्रेड की टोकरी लेने के लिए {2} की नाक तोड़ दी |", - "{1}, {2}, {3} और {4} दौड़ने से पहले जमा की हुई वस्तुएं आपस में बाटतें हैं |", - "{1} ने कोर्नुकोपिया के भीतर से त्रिशूल उठा लिया |", - "{1} मछलियों के चारे से भरा डिब्बा उठाते हैं और {2} को बंसी मिलती है |", - "{1} {2} को कोर्नुकोपिया के पास से डरा के भगा देता है |", - "{1} को कोर्नुकोपिया के ऊपर रखी एक ढाल मिलती है |", - "{1} को दो परशु मिलते हैं |", - "{1} को एक पजामा मिलता है |", - "{1T} के मंच से उतरते वक्त वहां धमाका होता है |", - "{1} {2T} के सिर में एक खंजर भोंक देता है |", - "{1T} का पैर अनजाने में एक लैंड-माइन पर पड़ जाता है |", - "{1} के हाथों {2T} की मौत होती है |", - "{1} और {2} साथ में काम कर {3T} को डुबो देते हैं |", - "{1} ने {2T} से हाथा-पाई के बाद उसका गला घोंट दिया |", - "{1} का तीर {2T} के सिर में जा लगा |", - "{1T} ने परिस्थितियों को न संभाल पाने के कारण आत्महत्या कर ली |", - "{1} ने {2T} का सिर पकड़कर उसे पत्थर में मार दिया |", - "{1} ने {2T} की गर्दन झटके के साथ तोड़ दी |", - "{1} ने तलवार से {2T} कर सिर धड़ से अलग कर दिया |", - "{1} ने {2T} के पेट पर भाले से हमला किया |", - "{1} ने {2T} को आग में झोंक दिया |", - "{1T} की गड्ढे में गिरने से मौत हो जाती है |", - "{1} ने {2T} के पीठ पीछे छुरा भोंक दिया |", - "{1} ने {2T} को घायल करने के बाद मौत के घाट उतार दिया |", - "{1} ने {2T} को घायल करने के बाद मरने के लिए छोड़ दिया |", - "{1} ने गदा से {2T} का सिर फोड़ दिया |", - "{1} ने मुठभेड़ के दौरान {2T} को खाई में धकेल दिया |", - "{1} ने {2T} की छाती में खंजर घोंप दिया |", - "{1T} की कोशिश के बावजूद {2} ने उन्हें मार दिया |", - "{1} ने {2T} को धोखा दे उन्हें मौत के घाट उतार दिया |", - "{1T} की बर्फीली झील में डूबने से मौत हो गयी |", - "{1}, {2} और {3T} आपस में लड़ना शुरू करते हैं, {2} भागने में सफल है परन्तु {1} के हाथों {3T} की मौत हो जाती है |", - "{1} ने {2T} को उसके खुद के हथियार से मार दिया |", - "{2T} की मौत {1} के हाथों होती है |", - "{2T} की {1} के द्वारा कराए गए धमाके में मौत हो गयी |", - "{2T} और {3T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{2T}, {3T} और {4T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{2T}, {3T}, {4T} और {5T} की {1} के द्वारा कराए गए धमाके में मौत हो जाती है |", - "{1} ने {2T} को रोक कर मार दिया |", - "{1T} और {2T} साथ में आत्महत्या करने कि धमकी देते हैं | वे असफल होते हैं और दोनों की मौत हो जाती है |", - "{1T}, {2T}, {3T} और {4T} साथ में आत्महत्या कर लेते हैं |", - "{1} ने {2T} की कुल्हाड़ी से हत्या कर दी |", - "{1} और {2} {3T} और {4T} से लड़ते हैं | {3T} और {4T} की मौत हो जाती है |", - "{1T} और {2T} {3} और {4} से लड़ते हैं | {1T} और {2T} की मौत हो जाती है |", - "{1T} ने {2} पर हमला करने कि कोशिश की परन्तु {3} ने बीच में आकर {1T} को मार दिया |", - "{1} ने तलवार से {2T} का सिर धड़ से अलग कर दिया |", - "{1} ने रस्सी के सहारे {2T} को फांसी पर टांग दिया |", - "{1} ने आवश्यक सामग्री लेने के लिए {2T} को मार दिया |", - "{1} ने {2} की ओर तीर छोड़ा, लेकिन वह {3T} को जा लगा और उसकी मौत हो गयी |", - "{1} ने {2T} के गले में विषैला तीर मार दिया, जिससे उसकी तड़प-तड़प कर मौत हो गयी |", - "{1} ने {2T} को पेड़ की टहनी से मार दिया |", - "{1} ने {2T} की पीठ पर त्रिशूल से वार किया |", - "{1}, {2T} और {3T} लड़ते हैं | {1} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1T}, {2} और {3T} लड़ते हैं | {2} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1T}, {2T} और {3} लड़ते हैं | {3} ने अकेले ही बाकी दोनों को मौत के घाट दिया |", - "{1} ने {2T} को कोर्नुकोपिया में छुपा पाया और उन्हें मार दिया |", - "{1T} ने {2} को कोर्नुकोपिया में छुपा लेकिन {2} ने उन्हें मार दिया |", - "{1} ने {2T} को दरांती से मार दिया |", - "{1} और {2T} एक बस्ते के ऊपर लड़ते हैं | {1} ने बस्ते की पट्टियों से {2T} का गला घोंट दिया |", - "{1T} और {2} एक बस्ते के ऊपर लड़ते हैं | {2} ने बस्ते की पट्टियों से {1T} का गला घोंट दिया |", - "{1} ने {2T} पर परशु के कई प्रहार किये |", - "{1T} का पैर कोर्नुकोपिया से दूर भागते हुए फिसला, और मौके का फ़ायदा उठा {2} ने उन्हें मौत के घाट उतार दिया |", - "{1} का पैर कोर्नुकोपिया से दूर भागते हुए फिसलता है, लेकिन {2} की सहायता से दोनों वहां से भागने में सफल होते हैं |", - "{1} ने {2} के सिर की ओर तीर छोड़ा, लेकिन {3T} ने बीच में कूद अपनी जान का त्याग कर उन्हें बचा लिया |" - ], - "hgDay": [ - "{1} शिकार करता है।", - "{1} ने खुद को घायल कर लिया |", - "{1} ने रणभूमि का अन्वेषण किया |", - "{1} ने {2} को डरा दिया |", - "{1} ने {2} का ध्यान भटकाया और दौड़ लगा दी |", - "{1} ने {2} का पीछा किया |", - "{1} ने मछलियाँ पकड़ी |", - "{1} ने खुद को झाड़ियों से ढक लिया |", - "{1} ने {2} का सामान चुरा लिया और उन्हें पता भी नहीं चला |", - "{1} ने लकड़ी से भाला बनाया |", - "{1} ने एक गुफा खोज निकाली |", - "{1} ने {2} पर हमला किया, लेकिन हमला असफ़ल रहा |", - "{1} ने {2} का पीछा किया |", - "{1} ने {2} से दूरी बनाई |", - "{1} ने पेड़ से फल इकट्ठे किए |", - "{1} को एक अज्ञात व्यक्ति से कुल्हाड़ी मिलती है |", - "{1} को एक अज्ञात व्यक्ति से साफ़ पानी मिलता है |", - "{1} को एक अज्ञात व्यक्ति से चिकित्सा सामग्री मिलती है |", - "{1} को एक अज्ञात व्यक्ति से गरमा-गरम खाना मिलता है |", - "{1} ने पानी के स्त्रोत की तलाश की |", - "{1} ने {2} को हरा दिया, लेकिन उसकी जान बख्श दी |", - "{1} और {2} एक दिन के लिए साथ में काम करते हैं |", - "{1} ने {2} से मिन्नत की कि उसे मार दिया जाए | उसने ऐसा न कर, {1} को जीवित रखा |", - "{1} ने पूरे दिन सोने की कोशिश की |", - "{1}, {2} और {3}, {4} और {5} के शिविर को उनकी अनुपस्थिति में लूट लेते हैं |", - "{1} ने एक कुटिया का निर्माण किया |", - "{1} ने छिपकर {2} और {3} की बातें सुन ली |", - "{1} ने तीरंदाजी का अभ्यास किया |", - "{1} को घर का ख्याल आता है |", - "बेर चुनते वक्त {1} को कांटे चुभ जाते हैं |", - "{1} ने त्रिशूल से मछलियाँ पकड़ने की कोशिश की |", - "{1} ने आग के लिए लकड़ी की तलाश की |", - "{1} और {2} अलग होकर संसाधनों की तलाश करते हैं |", - "{1} ने फूल चुने |", - "{1} ने {2} के घावों कि मरहम-पट्टी की |", - "{1} ने दूरी में धुआं उठते देखा लेकिन जांच न करने का फैसला किया |", - "{2} से दूर भागने के दौरान {1} के टखनों में मोच आ जाती है |", - "{1} ने गुलेल बनाई |", - "{1} ने किसी ऊँचें स्थान पर पहुचने के लिए सफ़र किया |", - "{1} को एक नदी मिलती है |", - "{1} ने बाकी खिलाड़ियों की तलाश की |", - "{1} और {2} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2} और {3} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2}, {3} और {4} ने बाकी खिलाड़ियों की तलाश की |", - "{1}, {2}, {3}, {4} और {5} ने बाकी खिलाड़ियों की तलाश की |", - "{1} को एक अज्ञात व्यक्ति से विस्फ़ोटक मिलता है |", - "{1} को अपनी मानसिक दशा की चिंता होती है |", - "{1} ने {2} को पजामा खाने के लिए मजबूर कर दिया |", - "{1} ने {2T} को पजामा खाने के लिए मजबूर कर दिया | दम घुंटने से {2T} की मौत हो गयी |", - "{1} के हाथों {2T} की मौत होती है |", - "{1} ने {2T} के सिर में एक खंजर घोंप दिया |", - "{1T} ने {2} से मिन्नत की कि उसे मार दिया जाए | उन्होंने अनिच्छा से {1T} को मौत के घाट उतार दिया |", - "{1} और {2} साथ में काम कर {3T} को डुबो देते हैं |", - "{1} ने {2T} से हाथा-पाई के बाद उसका गला घोंट दिया |", - "{1} का तीर {2T} के सिर में जा लगा |", - "{1T} के घावों का उपचार न हो पाने के कारण काफी रक्त बह जाता है |", - "{1T} ने परिस्थितियों को न संभाल पाने के कारण आत्महत्या कर ली |", - "{1} ने {2T} का सिर पकड़कर उसे पत्थर में मार दिया |", - "{1T} ने अनजाने में विषैले बेर खा लिए |", - "{1} ने बिना आवाज़ किए {2T} की गर्दन झटके के साथ तोड़ दी |", - "{1} ने {2T} के खाने में विष मिला दिया, जिससे उसकी मौत हो गयी |", - "{1} ने तलवार से {2T} का सिर धड़ से अलग कर दिया |", - "{1T} की संक्रमण से मौत हो जाती है |", - "{1} ने {2T} के पेट पर भाले से हमला किया |", - "{1} ने {2T} को आग में झोंक दिया |", - "{1T} की गड्ढे में गिरने से मौत हो जाती है |", - "{1} ने {2T} के पीठ पीछे छुरा भोंक दिया |", - "{1} ने {2T} को घायल करने के बाद मौत के घाट उतार दिया |", - "{1} ने {2T} को घायल करने के बाद मरने के लिए छोड़ दिया |", - "{1} ने गदा से {2T} का सिर फोड़ दिया |", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/general.json b/src/languages/hi-Latn-IN/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/hi-Latn-IN/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/google.json b/src/languages/hi-Latn-IN/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/hi-Latn-IN/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/management.json b/src/languages/hi-Latn-IN/commands/management.json deleted file mode 100644 index f3657effd5c..00000000000 --- a/src/languages/hi-Latn-IN/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "**अनुमति**:{{allow}}", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "चैनल्स", - "MEMBERS": "सदस्यों", - "OTHER": "अन्य" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "अनुमतियां" - }, - "roleInfoData": "", - "roleInfoAll": "अनुमति दी गयी है |", - "roleInfoNoPermissions": "अनुमतियाँ प्रदान नहीं की गईं है ।", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "यह शब्द पहले से फ़िल्टर किया गया है ।", - "filterNotFiltered": "यह शब्द फ़िल्टर नहीं किया गया है |", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/misc.json b/src/languages/hi-Latn-IN/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/hi-Latn-IN/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/moderation.json b/src/languages/hi-Latn-IN/commands/moderation.json deleted file mode 100644 index 90e1e16e93e..00000000000 --- a/src/languages/hi-Latn-IN/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "{{username}} ({{id}}) के लिए अनुमतियाँ", - "permissionsAll": "सब अनुमतियां", - "timeTimed": "चयनित मॉडरेशन मामला पहले ही समाप्त हो चुका है।", - "timeUnsupportedType": "चयनित मामले के लिए कार्रवाई का प्रकार रिवर्स नहीं किया जा सकता है, इसलिए यह कार्रवाई असमर्थित है।", - "timeNotScheduled": "यह कार्य निर्धारित नहीं है।", - "timeAborted": "{{title}} के लिए शेड्यूल को सफलतापूर्वक समाप्त कर दिया", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/social.json b/src/languages/hi-Latn-IN/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/hi-Latn-IN/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/starwars.json b/src/languages/hi-Latn-IN/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/hi-Latn-IN/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/suggestion.json b/src/languages/hi-Latn-IN/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/hi-Latn-IN/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/system.json b/src/languages/hi-Latn-IN/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/hi-Latn-IN/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/tags.json b/src/languages/hi-Latn-IN/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/hi-Latn-IN/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/tools.json b/src/languages/hi-Latn-IN/commands/tools.json deleted file mode 100644 index 95cfb1a8a11..00000000000 --- a/src/languages/hi-Latn-IN/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "किसी का अवतार पूरे आकार में देखें।", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "राजधानी", - "officialName": "आधिकारिक नाम", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "शब्द", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/commands/twitch.json b/src/languages/hi-Latn-IN/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/hi-Latn-IN/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/errors.json b/src/languages/hi-Latn-IN/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/errors.json b/src/languages/hi-Latn-IN/events/errors.json deleted file mode 100644 index 22c01bef758..00000000000 --- a/src/languages/hi-Latn-IN/events/errors.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "string": "{{REDCROSS}} प्रिय {{mention}}, {{message}}", - "unexpectedError": "{{REDCROSS}} मुझे एक अनपेक्षित त्रुटि मिली, कृपया मेरे डेवलपर्स को आपके द्वारा उठाए गए कदमों की रिपोर्ट करें!", - "unexpectedErrorWithContext": "$t(events/errors:unexpectedError)\nआप रिपोर्ट में `{{report}}` जोड़ सकते हैं ताकि वे देख सकें कि किस त्रुटि को ट्रिगर किया गया था।" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/guilds-logs.json b/src/languages/hi-Latn-IN/events/guilds-logs.json deleted file mode 100644 index 6002a27d00d..00000000000 --- a/src/languages/hi-Latn-IN/events/guilds-logs.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "channelCreate": "चैनल बनाया गया", - "channelCreateParent": "• **मूल**: {{value}}", - "channelCreatePosition": "• **पद**: `{{value, number}}`", - "channelCreatePermissionsTitle": "• **{{value}}** के लिए अनुमतियां", - "channelCreatePermissionsAllow_one": "- **अनुमत अनुमति**: {{values}}", - "channelCreatePermissionsAllow_other": "- **अनुमत अनुमतियाँ**: {{values, andList}}", - "channelCreatePermissionsDeny_one": "- **अस्वीकृत अनुमति**: {{values}}", - "channelCreatePermissionsDeny_other": "- **अस्वीकृत अनुमतियाँ**: {{values, andList}}", - "channelCreateNsfw": "• **NSFW के रूप में सेट करें**", - "channelCreateTopic": "• **विषय**: `{{value}}`", - "channelCreateRateLimit": "• **रेट लिमिट**: `{{value, duration}}`", - "channelCreateBitrate": "• **बिटरेट**: `{{value}}kbps`", - "channelCreateUserLimit": "• **उपयोगकर्ता सीमा**: `{{value, number}}`", - "channelDelete": "चैनल हटा दिया गया", - "channelUpdate": "चैनल अपडेट किया गया", - "channelUpdateBitrate": "**बिटरेट**: `{{previous}}kbps` → `{{next}}kbps`", - "channelUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "channelUpdateNsfw": "• **NSFW**: `{{previous}}` → `{{next}}`", - "channelUpdateParent": "• **मूल**: {{previous}} → {{next}}", - "channelUpdateParentAdded": "• **मूल**: सेट नहीं → {{value}}", - "channelUpdateParentRemoved": "• **मूल**: {{value}} → सेट नहीं", - "channelUpdatePosition": "• **पद**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateAddedPermissionsAllow_one": "- **जोड़ा गया अनुमत अनुमति**: {{values}}", - "channelUpdateAddedPermissionsAllow_other": "- **जोड़ा गया अनुमत अनुमतियां**: {{values, andList}}", - "channelUpdateAddedPermissionsDeny_one": "- **अस्वीकृत अनुमति जोड़ा गया**: {{values}}", - "channelUpdateAddedPermissionsDeny_other": "- **अस्वीकृत अनुमतियां जोड़ी गईं**: {{values, andList}}", - "channelUpdateAddedPermissionsTitle": "• **{{value}} के लिए अतिरिक्त अनुमतियां जोड़ी गईं**", - "channelUpdateDeletedPermissionsTitle": "• **{{value}}** के लिए हटाई गई अनुमतियां", - "channelUpdatePermissionsTitle": "• **{{value}}** के लिए अपडेट की गई अनुमतियां", - "channelUpdateRemovedPermissionsAllow_one": "- **हटाई गई अनुमत अनुमति**: {{values}}", - "channelUpdateRemovedPermissionsAllow_other": "- **हटाई गई स्वीकृत अनुमतियां**: {{values, andList}}", - "channelUpdateRemovedPermissionsDeny_one": "- **अस्वीकृत अनुमति हटाई गई**: {{values}}", - "channelUpdateRemovedPermissionsDeny_other": "- **हटाई गई अस्वीकृत अनुमतियां**: {{values, andList}}", - "channelUpdateRateLimit": "• **रेट लिमिट**: `{{previous, duration}}` → `{{next, duration}}`", - "channelUpdateRateLimitAdded": "• **रेट लिमिट**: सेट नहीं → `{{value, duration}}`", - "channelUpdateRateLimitRemoved": "• **रेट लिमिट**: `{{value, duration}}` → सेट नहीं", - "channelUpdateTopic": "• **विषय**: `{{previous}}` → `{{next}}`", - "channelUpdateTopicAdded": "• **विषय**: सेट नहीं → `{{value}}`", - "channelUpdateTopicRemoved": "• **विषय**: `{{value}}` → सेट नहीं", - "channelUpdateType": "• **प्ररूप**: `{{previous}}` → `{{next}}`", - "channelUpdateUserLimit": "• **उपयोगकर्ता सीमा**: `{{previous, number}}` → `{{next, number}}`", - "channelUpdateUserLimitAdded": "• **उपयोगकर्ता सीमा**: सेट नहीं → `{{value, number}}`", - "channelUpdateUserLimitRemoved": "• **उपयोगकर्ता सीमा**: `{{value, number}}` → सेट नहीं", - "emojiCreate": "इमोजी बनाया गया", - "emojiCreateAnimated": "• **एनिमेटेड**", - "emojiCreateUnAvailable": "• **उपलब्ध नहीं है**", - "emojiCreateManaged": "• **प्रबन्धित**", - "emojiCreateRequiresColons": "• **कोलन की आवश्यकता है**", - "emojiCreateRoles_one": "• **पद की आवश्यकता है**: {{values}}", - "emojiCreateRoles_other": "• **पदों की आवश्यकता है**: {{values, orList}}", - "emojiDelete": "इमोजी हटा दिया गया", - "emojiUpdate": "इमोजी संपदा किया गया", - "emojiUpdateAnimated": "• **एनिमेटेड**: `{{previous}}` → `{{next}}`", - "emojiUpdateAvailable": "• **उपलब्ध**: `{{previous}}` → `{{next}}`", - "emojiUpdateManaged": "• **प्रबन्धित**: `{{previous}}` → `{{next}}`", - "emojiUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "emojiUpdateRequiresColons": "• **कोलन की आवश्यकता है**: `{{previous}}` → `{{next}}`", - "emojiUpdateRolesAdded_one": "• **जोड़ा गया आवश्यक पद**: {{values}}", - "emojiUpdateRolesAdded_other": "• **जोड़े गए आवश्यक पद**: {{values, andList}}", - "emojiUpdateRolesRemoved_one": "• **हटाया गया आवश्यक पद**: {{values}}", - "emojiUpdateRolesRemoved_other": "• **हटाये गए आवश्यक पद**: {{values, andList}}", - "roleCreate": "पद बनाया गया", - "roleCreateColor": "• **रंग**: `{{value}}`", - "roleCreateHoist": "• **होइस्ट**", - "roleCreateMentionable": "• **उल्लेखनीय**", - "roleCreatePermissions_one": "• **अनुमति**: {{values}}", - "roleCreatePermissions_other": "• **अनुमतियां**: {{values, andList}}", - "roleCreatePosition": "• **पद**: `{{value, number}}`", - "roleDelete": "पद हटाया गया", - "roleUpdate": "पद संपादित किया गया", - "roleUpdateColor": "• **रंग**: `{{previous}}` → `{{next}}`", - "roleUpdateHoist": "• **होइस्ट**: `{{previous}}` → `{{next}}`", - "roleUpdateMentionable": "• **उल्लेखनीय**: `{{previous}}` → `{{next}}`", - "roleUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "roleUpdatePermissionsAdded_one": "• **अतिरिक्त अनुमति**: {{values}}", - "roleUpdatePermissionsAdded_other": "• **अतिरिक्त अनुमति**: {{values, andList}}", - "roleUpdatePermissionsRemoved_one": "• **हटाई गई अनुमतियां**: {{values}}", - "roleUpdatePermissionsRemoved_other": "• **हटाई गई अनुमतियां**: {{values, andList}}", - "roleUpdatePosition": "• **पद**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdate": "सर्वर अपडेट किया गया", - "serverUpdateAfkChannelAdded": "• **AFK चैनल**: सेट नहीं → {{value}}", - "serverUpdateAfkChannelRemoved": "• **AFK चैनल**: {{value}} → सेट नहीं", - "serverUpdateAfkChannel": "• **AFK चैनल**: {{previous}} → {{next}}", - "serverUpdateAfkTimeout": "• **AFK टाइम-आउट**: `{{previous, duration}}` → `{{next, duration}}`", - "serverUpdateBannerAdded": "• **बैनर**: सेट नहीं → [नया]({{value}})", - "serverUpdateBannerRemoved": "• **बैनर**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateBanner": "• **बैनर**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateDefaultMessageNotifications": "• **संदेश सूचनाएं**: {{previous, messageNotifications}}` → `{{next, messageNotifications}}`", - "serverUpdateDescriptionAdded": "• **विवरण**: सेट नहीं → `{{value}}`", - "serverUpdateDescriptionRemoved": "• **विवरण**: `{{value}}` → सेट नहीं है", - "serverUpdateDescription": "• **विवरण**: `{{previous}}` → `{{next}}`", - "serverUpdateDiscoverySplashAdded": "• **स्पलैश**: सेट नहीं → [नया]({{value}})", - "serverUpdateDiscoverySplashRemoved": "• **स्पलैश**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateDiscoverySplash": "• **स्पलैश**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateExplicitContentFilter": "• **स्पष्ट सामग्री फ़िल्टर**: `{{previous, explicitContentFilter}}` → `{{next, explicitContentFilter}}`", - "serverUpdateFeaturesAdded_one": "• **जोड़ा गया फ़ीचर**: {{values}}", - "serverUpdateFeaturesAdded_other": "• **जोड़ा गए फ़ीचर**: {{values, andList}}", - "serverUpdateFeaturesRemoved_one": "• **हटाई गई सुविधा**: {{values}}", - "serverUpdateFeaturesRemoved_other": "• **हटाई गई सुविधाएं**: {{values, andList}}", - "serverUpdateIconAdded": "• **आइकन**: सेट नहीं → [नया]({{value}})", - "serverUpdateIconRemoved": "• **आइकन**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateIcon": "• **आइकन**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateMaximumMembersAdded": "• **अधिकतम सदस्य**: सेट नहीं → `{{value, number}}`", - "serverUpdateMaximumMembersRemoved": "• **अधिकतम सदस्य**: `{{value, number}}` → सेट नहीं", - "serverUpdateMaximumMembers": "• **अधिकतम सदस्य**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdateMfaAdded": "• **बहु-कारक प्रमाणीकरण जोड़ा गया**", - "serverUpdateMfaRemoved": "• **बहु-कारक प्रमाणीकरण हटाया गया**", - "serverUpdateName": "• **नाम**: `{{previous}}` → `{{next}}`", - "serverUpdateOwner": "• **मालिक**: {{previous}} → {{next}}", - "serverUpdatePreferredLocaleAdded": "• **प्रफर्ड स्थान**: सेट नहीं → `{{value}}`", - "serverUpdatePreferredLocaleRemoved": "• **प्रफर्ड स्थान**: `{{value}}` → सेट नहीं है", - "serverUpdatePreferredLocale": "• **प्रफर्ड स्थान**: `{{previous}}` → `{{next}}`", - "serverUpdatePremiumSubscriptionCountAdded": "• **बूस्टर्स**: सेट नहीं → `{{value, number}}`", - "serverUpdatePremiumSubscriptionCountRemoved": "• **बूस्टर्स**: `{{value, number}}` → सेट नहीं", - "serverUpdatePremiumSubscriptionCount": "• **बूस्टर्स**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePremiumTier": "• **प्रीमियम टियर**: `{{previous, number}}` → `{{next, number}}`", - "serverUpdatePublicUpdatesChannelAdded": "• **सार्वजनिक अपडेट चैनल**: सेट नहीं → {{value}}", - "serverUpdatePublicUpdatesChannelRemoved": "• **सार्वजनिक अपडेट चैनल**: {{value}} → सेट नहीं", - "serverUpdatePublicUpdatesChannel": "• **सार्वजनिक अपडेट चैनल**: {{previous}} → {{next}}", - "serverUpdateRulesChannelAdded": "• **नियम चैनल**: सेट नहीं → {{value}}", - "serverUpdateRulesChannelRemoved": "• **नियम चैनल**: {{value}} → सेट नहीं", - "serverUpdateRulesChannel": "• **नियम चैनल**: {{previous}} → {{next}}", - "serverUpdateSplashAdded": "• **स्पलैश**: सेट नहीं → [नया]({{value}})", - "serverUpdateSplashRemoved": "• **स्पलैश**: [पुराना]({{value}}) → सेट नहीं", - "serverUpdateSplash": "• **स्पलैश**: [पुराना]({{previous}}) → [नया]({{next}})", - "serverUpdateSystemChannelFlagsAdded_one": "• **जोड़ा गया सिस्टम चैनल विकल्प**: {{values}}", - "serverUpdateSystemChannelFlagsAdded_other": "• **जोड़े गए सिस्टम चैनल विकल्प**: {{values, andList}}", - "serverUpdateSystemChannelFlagsRemoved_one": "• **हटाया गया सिस्टम चैनल विकल्प**: {{values}}", - "serverUpdateSystemChannelFlagsRemoved_other": "• **हटाये गए सिस्टम चैनल विकल्प**: {{values, andList}}", - "serverUpdateSystemChannelAdded": "• **सिस्टम चैनल**: सेट नहीं → {{value}}", - "serverUpdateSystemChannelRemoved": "• **सिस्टम चैनल**: {{value}} → सेट नहीं", - "serverUpdateSystemChannel": "• **सिस्टम चैनल**: {{previous}} → {{next}}", - "serverUpdateVanityUrlAdded": "• **वैनिटी URL**: सेट नहीं → {{value}}", - "serverUpdateVanityUrlRemoved": "• **वैनिटी URL**: `{{value}}` → सेट नहीं", - "serverUpdateVanityUrl": "• **वैनिटी URL**: `{{previous}}` → {{next}}", - "serverUpdateVerificationLevel": "• **सत्यापन स्तर**: `{{previous}}` → `{{next}}`", - "serverUpdateWidgetChannelAdded": "• **विजेट चैनल**: सेट नहीं → {{value}}", - "serverUpdateWidgetChannelRemoved": "• **विजेट चैनल**: {{value}} → सेट नहीं", - "serverUpdateWidgetChannel": "• **विजेट चैनल**: {{previous}} → {{next}}", - "serverUpdateWidgetEnabled": "• **विजेट सक्षम**", - "serverUpdateWidgetDisabled": "• **विजेट अक्षम**" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/guilds-members.json b/src/languages/hi-Latn-IN/events/guilds-members.json deleted file mode 100644 index 5d35a8ae786..00000000000 --- a/src/languages/hi-Latn-IN/events/guilds-members.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "guildMemberAdd": "उपयोगकर्ता जुड़े", - "guildMemberAddDescription": "{{mention}} | **डिस्कॉर्ड से जुड़े**: {{time, duration}} पहले|", - "guildMemberAddedRoles_other": "**पद जोड़े गए**: {{addedRoles, andList}}", - "guildMemberAddedRoles_one": "**पद जोड़े गए**: {{addedRoles}}", - "guildMemberAddMute": "म्यूट किया गया उपयोगकर्ता शामिल हुआ", - "guildMemberBanned": "उपयोगकर्ता प्रतिबंधित", - "guildMemberKicked": "उपयोगकर्ता हटा दिया गया", - "guildMemberNoUpdate": "कोई अपडेट नहीं मिला", - "guildMemberRemove": "उपयोगकर्ता विदा हो गया", - "guildMemberRemoveDescription": "{{mention}} | **सर्वर से जुड़े**: अनजान|", - "guildMemberRemoveDescriptionWithJoinedAt": "{{mention}} | **सर्वर से जुड़े**: {{time, duration}} पहले|", - "guildMemberRemovedRoles_other": "**पद हटाए गए**: {{removedRoles, andList}}", - "guildMemberRemovedRoles_one": "**पद हटाए गए**: {{removedRoles}}", - "guildMemberSoftBanned": "उपयोगकर्ता सॉफ्टबैन", - "nameUpdateNextWasNotSet": "**अगला**: सेट नहीं", - "nameUpdateNextWasSet": "**अगला**: `{{nextName}}`", - "nameUpdatePreviousWasNotSet": "**पूर्व**: सेट नहीं", - "nameUpdatePreviousWasSet": "**सेट नहीं**: `{{previousName}}`", - "nicknameUpdate": "उपनाम संपादित किया गया", - "roleUpdate": "पद सम्पादित किया गया", - "usernameUpdate": "किया गया किया गया" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/messages.json b/src/languages/hi-Latn-IN/events/messages.json deleted file mode 100644 index fd5d00c9929..00000000000 --- a/src/languages/hi-Latn-IN/events/messages.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "messageDelete": "संदेश हटाया गया • {{channel}}", - "messageUpdate": "संदेश संपादित किया गया • {{channel}}" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/moderation.json b/src/languages/hi-Latn-IN/events/moderation.json deleted file mode 100644 index e95b5eb27c4..00000000000 --- a/src/languages/hi-Latn-IN/events/moderation.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "attachmentFilter": "{{REDCROSS}} प्रिय {{user}}, यहां फाइल अटैचमेंट की अनुमति नहीं है।", - "attachmentFilterFooter": "बहुत अधिक अटैचमेंट", - "attachments": "[Auto-Moderation] अटैचमेंट फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "attachmentsWithMaximum": "[Auto-Moderation] अटैचमेंट फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "capitals": "[Auto-Moderation] कैपिटल फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "capitalsWithMaximum": "[Auto-Moderation] कैपिटल फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "capsFilter": "{{REDCROSS}} ईईईओओओ {{user}}! कृपया इस जगह पर चिल्लाएं नहीं! आपने कैपिटल की सीमा पार कर ली है!", - "capsFilterDm": "नीचे बोलो! मुझे पता है कि आपको अपने विचार व्यक्त करने की जरूरत है। यह संदेश है जिसे मैंने हटा दिया है:{{message}}", - "capsFilterFooter": "बहुत सारे अपरकेस", - "inviteFilterAlert": "{{REDCROSS}} प्रिय {{user}}, यहां आमंत्रण लिंक की अनुमति नहीं है।", - "inviteFilterLog_one": "**लिंक**: {{links, andList}}", - "inviteFilterLog_other": "**लिंके**: {{links, andList}}", - "inviteLink": "आमंत्रण लिंक", - "invites": "[Auto-Moderation] आमंत्रण फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "invitesWithMaximum": "[Auto-Moderation] आमंत्रण फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "link": "फ़िल्टर्ड लिंक", - "links": "[Auto-Moderation] लिंक फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "linksWithMaximum": "[Auto-Moderation] लिंक फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "messageFilter": "{{REDCROSS}} वाह वाह वाह, कृपया इतनी अधिक पुनः पोस्ट करना बंद करें {{user}}!", - "messageFilterFooter": "बहुत अधिक संदेश डुप्लिकेट", - "messages": "[Auto-Moderation] डुप्लीकेट संदेश फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "messagesWithMaximum": "[Auto-Moderation] डुप्लीकेट संदेश शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "newlineFilter": "{{REDCROSS}} संदेश की दीवार {{user}} से आ रही है, संदेश की दीवार नीचे ले जाया गया!", - "newlineFilterFooter": "बहुत सारी पंक्तियाँ", - "newlines": "[Auto-Moderation] नई पंक्ति फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "newlinesWithMaximum": "[Auto-Moderation] नई पंक्ति शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।", - "nolink": "{{REDCROSS}} अरे {{user}}, आपको यहां लिंक भेजने करने की अनुमति नहीं है!", - "wordFilter": "{{REDCROSS}} क्षमा करें, प्रिय {{user}}, आपने कुछ ऐसा कहा है जिसकी इस सर्वर में अनुमति नहीं है।", - "wordFilterDm": "चुप रहो! आपने कुछ ऐसे शब्द कहे हैं जिनकी सर्वर में अनुमति नहीं है! लेकिन चूंकि आपने संदेश लिखने में कुछ समय लिया है, इसलिए मैं इसे यहां पोस्ट करुंगी:\n{{filtered}}", - "wordFilterFooter": "फ़िल्टर किया गया शब्द", - "words": "[Auto-Moderation] शब्द फ़िल्टर शुरू हो गया, कोई सीमा नहीं|", - "wordsWithMaximum": "[Auto-Moderation] शब्द फ़िल्टर शुरू हो गया, {{maximum}} उल्लंघनों में से {{amount}} तक पहुंच गया।" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/noMentionSpam.json b/src/languages/hi-Latn-IN/events/noMentionSpam.json deleted file mode 100644 index e36eb747029..00000000000 --- a/src/languages/hi-Latn-IN/events/noMentionSpam.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "footer": "[NOMENTIONSPAM]", - "alert": "किसी और का उल्लेख करने में सावधानी बरतें, क्योंकि आप इस सर्वर की उल्लेख सीमा पार कर चुके है और प्रतिबंधित होने वाले है|", - "message": "बैनहैमर उतर चुका है और अब {{user.tag}} आईडी वाले उपयोगकर्ता {{user.id}} को स्पैम के कारण प्रतिबंधित कर दिया गया है।\nचिंता न करें! मैं यहाँ आपकी मदद करने के लिए हूँ! 😄", - "modlog": "[NOMENTIONSPAM] स्वचालित: उल्लेख करें कि स्पैम सीमा पार हो गई है।\nसीमा: {{threshold}}|" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/reactions.json b/src/languages/hi-Latn-IN/events/reactions.json deleted file mode 100644 index 2f3c93871f5..00000000000 --- a/src/languages/hi-Latn-IN/events/reactions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "reaction": "प्रतिक्रिया जोड़ी गई", - "filterFooter": "फ़िल्टर की गई प्रतिक्रिया", - "filter": "{{REDCROSS}} अरे {{user}}, कृपया उस प्रतिक्रिया को न जोड़ें!", - "selfRoleHierarchy": "{{REDCROSS}} मेरी भूमिका सभी स्व-आबंटित भूमिकाओं से अधिक होनी चाहिए, अन्यथा मैं उन्हें लोगों को प्रदान नहीं कर सकती!" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/events/twitch.json b/src/languages/hi-Latn-IN/events/twitch.json deleted file mode 100644 index 7e03bb821bb..00000000000 --- a/src/languages/hi-Latn-IN/events/twitch.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "embedDescription": "{{userName}} अब लाइव है!", - "embedDescriptionWithGame": "{{userName}} अब लाइव है! - स्ट्रीमिंग {{gameName}}!", - "offlinePostfix": "Skyra ट्विच सूचनाएं" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/fuzzySearch.json b/src/languages/hi-Latn-IN/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/globals.json b/src/languages/hi-Latn-IN/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/guilds.json b/src/languages/hi-Latn-IN/guilds.json deleted file mode 100644 index dadd026b1d3..00000000000 --- a/src/languages/hi-Latn-IN/guilds.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "explicitContentFilterDisabled": "अक्षम", - "explicitContentFilterMembersWithoutRoles": "पदों के बिना सदस्य", - "explicitContentFilterAllMembers": "सभी सदस्य", - "messageNotificationsAll": "सभी संदेश", - "messageNotificationsMentions": "केवल @उल्लेख", - "SUPPRESS_JOIN_NOTIFICATIONS": "सदस्य शामिल होने पर सूचनाएं", - "SUPPRESS_JOIN_NOTIFICATION_REPLIES": "सदस्य शामिल होने पर स्टिकर बटन वाले जवाब", - "SUPPRESS_PREMIUM_SUBSCRIPTIONS": "सर्वर बूस्ट कि सूचनाएं", - "SUPPRESS_GUILD_REMINDER_NOTIFICATIONS": "सर्वर सेटअप युक्तियाँ" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/humanLevels.json b/src/languages/hi-Latn-IN/humanLevels.json deleted file mode 100644 index ab108b838c8..00000000000 --- a/src/languages/hi-Latn-IN/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "Kuch bhi nhi", - "LOW": "Kum", - "MEDIUM": "Medium", - "HIGH": "Jaada", - "VERY_HIGH": "Sabse jaada" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/moderation.json b/src/languages/hi-Latn-IN/moderation.json deleted file mode 100644 index 797d0fbf8ee..00000000000 --- a/src/languages/hi-Latn-IN/moderation.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "caseNotExists_one": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग प्रकरण मौजूद नहीं है।", - "caseNotExists_other": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग प्रकरणों में से कोई भी मौजूद नहीं है।", - "logAppealed": "{{REDCROSS}} मुझे खेद है, लेकिन चयनित मॉडरेशन लॉग की समय सीमा समाप्त हो गई है या इसे अस्थायी नहीं बनाया जा सकता है।", - "logDescriptionTypeAndUser": "❯ **प्रकार**: {{data.type}}\n❯ **सदस्य**: {{data.userName}}#{{data.userDiscriminator}} ({{data.userId}})", - "logDescriptionWithReason": "❯ **वजह:** {{data.reason}}{{data.formattedDuration}}", - "logDescriptionWithoutReason": "❯ **वजह:** कृपया कारण निर्धारित करने के लिए `{{data.prefix}}reason {{data.caseId}} ` का उपयोग करें।{{data.formattedDuration}}", - "logExpiresIn": "\n❯ **संपूर्ण होगा**: {{duration, duration}}", - "logFooter": "प्रकरण {{caseId}}", - "muteCannotManageRoles": "म्यूट करने में सक्षम होने के लिए मेरे पास **{{MANAGE_ROLES, permissions}}** अनुमतियां होनी चाहिए।", - "muteLowHierarchy": "मैं किसी ऐसे सदस्य को म्यूट नहीं कर सकती जो मुझसे उच्च पद पर आसीन है।", - "muteNotConfigured": "इस क्रिया के होने के लिए म्यूट पद को कॉन्फ़िगर किया जाना चाहिए|", - "muteNotExists": "चयनित सदस्य म्यूट नहीं है।", - "muteNotInMember": "सदस्य में म्यूट पद सेट नहीं है।", - "restrictionNotConfigured": "इस क्रिया के होने के लिए प्रतिबंध पद को कॉन्फ़िगर किया जाना चाहिए", - "roleHigher": "चयनित सदस्य के पद की स्थिति आपके से अधिक या उसके बराबर है|", - "roleHigherSkyra": "चयनित सदस्य के पद की स्थिति मेरे से अधिक या उसके बराबर है|", - "success": "कमांड को सफलतापूर्वक निष्पादित किया।", - "toSkyra": "क्यों... मुझे लगा कि तुम मुझसे प्यार करते हो! 💔", - "userSelf": "आप अपने आप से ऐसा क्यों करेंगे?" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/moderationActions.json b/src/languages/hi-Latn-IN/moderationActions.json deleted file mode 100644 index ee22ddd9732..00000000000 --- a/src/languages/hi-Latn-IN/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "actions": { - "addRole": "पद जोड़ा गया", - "ban": "प्रतिबंध", - "kick": "निकालें", - "mute": "म्यूट", - "removeRole": "पद हटाए", - "restrictedAttachment": "अटैचमेंट प्रतिबंध", - "restrictedEmbed": "एम्बेड प्रतिबंध", - "restrictedReact": "प्रतिक्रिया प्रतिबंध", - "restrictedVoice": "आवाज़ प्रतिबंध", - "setNickname": "उपनाम रखे", - "softban": "सॉफ्टबैन", - "vkick": "आवाज से हटाना", - "vmute": "आवाज मूक" - }, - "applyNoReason": "", - "applyReason": "", - "requiredMember": "उपयोगकर्ता मौजूद नहीं है या इस सर्वर में नहीं है।", - "revokeNoReason": "", - "revokeReason": "", - "setNicknameNoReasonRemoved": "", - "setNicknameNoReasonSet": "", - "setNicknameRemoved": "", - "setNicknameSet": "", - "setupMuteExists": "**म्यूट पद बनाना बंद किया गया**: पहले से ही \"Muted\" नामक एक पद है।", - "setupRestrictionExists": "**प्रतिबंध पद बनाना बंद किया गया**: एक पहले से मौजूद है।", - "setupTooManyRoles": "**पद बनाना बंद किया गया**: इस सर्वर में 250 पद हैं, आपको एक पद को हटाना होगा।", - "sharedRoleSetupAsk": "", - "sharedRoleSetupNoMessage": "आपने समय पर संदेश नहीं डाला, सेट अप रद्द कर दिया!", - "sharedRoleSetupExisting": "मुझे कॉन्फ़िगर किया गया पद नहीं मिला। क्या आप किसी मौजूदा को कॉन्फ़िगर करना चाहते हैं?", - "sharedRoleSetupExistingName": "कृपया मुझे उस पद का नाम दें जिसका उपयोग आप इस प्रकार की आगे की कार्रवाइयों के लिए करना चाहते हैं।", - "sharedRoleSetupNew": "क्या आप चाहते हैं कि मैं एक नया पद बनाऊं और इसे स्वचालित रूप से कॉन्फ़िगर करूं?", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/permissions.json b/src/languages/hi-Latn-IN/permissions.json deleted file mode 100644 index 6588b72f466..00000000000 --- a/src/languages/hi-Latn-IN/permissions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "CONNECT": "जुडिये", - "SEND_MESSAGES": "संदेश भेजो", - "SPEAK": "बोले" -} \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/preconditions.json b/src/languages/hi-Latn-IN/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/promptList.json b/src/languages/hi-Latn-IN/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/selfModeration.json b/src/languages/hi-Latn-IN/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/serializers.json b/src/languages/hi-Latn-IN/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/settings.json b/src/languages/hi-Latn-IN/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/hi-Latn-IN/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/hi-Latn-IN/system.json b/src/languages/hi-Latn-IN/system.json deleted file mode 100644 index 2f33e361ad1..00000000000 --- a/src/languages/hi-Latn-IN/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "डिस्कोर्ड को मैसेज करते समय मेरे पास एक छोटी सी नेटवर्क त्रुटि थी, कृपया इस कमांड को फिर से चलाएं |", - "exceededLengthChooseOutput": "निम्न में से कोई एक विकल्प चुनें |: {{output, orList}}", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/index.ts b/src/languages/index.ts deleted file mode 100644 index 43bdc848803..00000000000 --- a/src/languages/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Handler } from '#lib/i18n/structures/Handler'; -import { ExtendedHandler as DeDeHandler } from './de-DE/constants'; -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 NbNoHandler } from './nb-NO/constants'; -import { ExtendedHandler as NlNlHandler } from './nl-NL/constants'; - -export const handlers = new Map([ - ['de-DE', new DeDeHandler()], - ['en-US', new EnUsHandler()], - ['en-GB', new EnGbHandler()], - ['es-ES', new EsEsHandler()], - ['nb-NO', new NbNoHandler()], - ['nl-NL', new NlNlHandler()] -]); - -export function getHandler(name: string): Handler { - return handlers.get(name) ?? handlers.get('en-US')!; -} diff --git a/src/languages/it-IT/arguments.json b/src/languages/it-IT/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/it-IT/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/arguments/image.json b/src/languages/it-IT/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/arguments/range.json b/src/languages/it-IT/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/assertions.json b/src/languages/it-IT/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/colors.json b/src/languages/it-IT/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/commands/admin.json b/src/languages/it-IT/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/it-IT/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/animal.json b/src/languages/it-IT/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/it-IT/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/animation.json b/src/languages/it-IT/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/it-IT/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/fun.json b/src/languages/it-IT/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/it-IT/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/game.json b/src/languages/it-IT/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/it-IT/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/general.json b/src/languages/it-IT/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/it-IT/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/google.json b/src/languages/it-IT/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/it-IT/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/management.json b/src/languages/it-IT/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/it-IT/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/misc.json b/src/languages/it-IT/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/it-IT/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/moderation.json b/src/languages/it-IT/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/it-IT/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/social.json b/src/languages/it-IT/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/it-IT/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/starwars.json b/src/languages/it-IT/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/it-IT/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/suggestion.json b/src/languages/it-IT/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/it-IT/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/system.json b/src/languages/it-IT/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/it-IT/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/tags.json b/src/languages/it-IT/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/it-IT/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/tools.json b/src/languages/it-IT/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/it-IT/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/commands/twitch.json b/src/languages/it-IT/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/it-IT/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/it-IT/errors.json b/src/languages/it-IT/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/errors.json b/src/languages/it-IT/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/guilds-logs.json b/src/languages/it-IT/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/guilds-members.json b/src/languages/it-IT/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/messages.json b/src/languages/it-IT/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/moderation.json b/src/languages/it-IT/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/noMentionSpam.json b/src/languages/it-IT/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/reactions.json b/src/languages/it-IT/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/events/twitch.json b/src/languages/it-IT/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/fuzzySearch.json b/src/languages/it-IT/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/globals.json b/src/languages/it-IT/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/guilds.json b/src/languages/it-IT/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/humanLevels.json b/src/languages/it-IT/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/moderation.json b/src/languages/it-IT/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/moderationActions.json b/src/languages/it-IT/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/it-IT/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/it-IT/permissions.json b/src/languages/it-IT/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/preconditions.json b/src/languages/it-IT/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/promptList.json b/src/languages/it-IT/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/selfModeration.json b/src/languages/it-IT/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/serializers.json b/src/languages/it-IT/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/settings.json b/src/languages/it-IT/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/it-IT/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/it-IT/system.json b/src/languages/it-IT/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/it-IT/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/arguments.json b/src/languages/ja-JP/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/ja-JP/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/arguments/image.json b/src/languages/ja-JP/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/arguments/range.json b/src/languages/ja-JP/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/assertions.json b/src/languages/ja-JP/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/colors.json b/src/languages/ja-JP/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/commands/admin.json b/src/languages/ja-JP/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/ja-JP/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/animal.json b/src/languages/ja-JP/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/ja-JP/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/animation.json b/src/languages/ja-JP/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/ja-JP/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/fun.json b/src/languages/ja-JP/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/ja-JP/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/game.json b/src/languages/ja-JP/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/ja-JP/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/general.json b/src/languages/ja-JP/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/ja-JP/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/google.json b/src/languages/ja-JP/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/ja-JP/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/management.json b/src/languages/ja-JP/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/ja-JP/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/misc.json b/src/languages/ja-JP/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/ja-JP/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/moderation.json b/src/languages/ja-JP/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/ja-JP/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/social.json b/src/languages/ja-JP/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/ja-JP/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/starwars.json b/src/languages/ja-JP/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/ja-JP/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/suggestion.json b/src/languages/ja-JP/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/ja-JP/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/system.json b/src/languages/ja-JP/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/ja-JP/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/tags.json b/src/languages/ja-JP/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/ja-JP/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/tools.json b/src/languages/ja-JP/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/ja-JP/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/commands/twitch.json b/src/languages/ja-JP/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/ja-JP/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ja-JP/errors.json b/src/languages/ja-JP/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/errors.json b/src/languages/ja-JP/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/guilds-logs.json b/src/languages/ja-JP/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/guilds-members.json b/src/languages/ja-JP/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/messages.json b/src/languages/ja-JP/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/moderation.json b/src/languages/ja-JP/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/noMentionSpam.json b/src/languages/ja-JP/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/reactions.json b/src/languages/ja-JP/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/events/twitch.json b/src/languages/ja-JP/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/fuzzySearch.json b/src/languages/ja-JP/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/globals.json b/src/languages/ja-JP/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/guilds.json b/src/languages/ja-JP/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/humanLevels.json b/src/languages/ja-JP/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/moderation.json b/src/languages/ja-JP/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/moderationActions.json b/src/languages/ja-JP/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/ja-JP/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/ja-JP/permissions.json b/src/languages/ja-JP/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/preconditions.json b/src/languages/ja-JP/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/promptList.json b/src/languages/ja-JP/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/selfModeration.json b/src/languages/ja-JP/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/serializers.json b/src/languages/ja-JP/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/settings.json b/src/languages/ja-JP/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ja-JP/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ja-JP/system.json b/src/languages/ja-JP/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/ja-JP/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/arguments.json b/src/languages/nb-NO/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/nb-NO/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/arguments/image.json b/src/languages/nb-NO/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/arguments/range.json b/src/languages/nb-NO/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/assertions.json b/src/languages/nb-NO/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/colors.json b/src/languages/nb-NO/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/commands/admin.json b/src/languages/nb-NO/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/nb-NO/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/animal.json b/src/languages/nb-NO/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/nb-NO/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/animation.json b/src/languages/nb-NO/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/nb-NO/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/fun.json b/src/languages/nb-NO/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/nb-NO/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/game.json b/src/languages/nb-NO/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/nb-NO/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/general.json b/src/languages/nb-NO/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/nb-NO/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/google.json b/src/languages/nb-NO/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/nb-NO/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/management.json b/src/languages/nb-NO/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/nb-NO/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/misc.json b/src/languages/nb-NO/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/nb-NO/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/moderation.json b/src/languages/nb-NO/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/nb-NO/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/social.json b/src/languages/nb-NO/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/nb-NO/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/starwars.json b/src/languages/nb-NO/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/nb-NO/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/suggestion.json b/src/languages/nb-NO/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/nb-NO/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/system.json b/src/languages/nb-NO/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/nb-NO/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/tags.json b/src/languages/nb-NO/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/nb-NO/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/tools.json b/src/languages/nb-NO/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/nb-NO/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/commands/twitch.json b/src/languages/nb-NO/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/nb-NO/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nb-NO/constants.ts b/src/languages/nb-NO/constants.ts deleted file mode 100644 index 84af31fb949..00000000000 --- a/src/languages/nb-NO/constants.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Handler } from '#lib/i18n/structures/Handler'; -import { TimeTypes } from '@sapphire/time-utilities'; - -export class ExtendedHandler extends Handler { - public constructor() { - super({ - name: 'nb-NO', - duration: { - [TimeTypes.Year]: { - 1: 'år', - DEFAULT: 'år' - }, - [TimeTypes.Month]: { - 1: 'måned', - DEFAULT: 'måneder' - }, - [TimeTypes.Week]: { - 1: 'uke', - DEFAULT: 'uker' - }, - [TimeTypes.Day]: { - 1: 'dag', - DEFAULT: 'dager' - }, - [TimeTypes.Hour]: { - 1: 'time', - DEFAULT: 'timer' - }, - [TimeTypes.Minute]: { - 1: 'minutt', - DEFAULT: 'minutter' - }, - [TimeTypes.Second]: { - 1: 'sekund', - DEFAULT: 'sekunder' - } - } - }); - } - - public ordinal(cardinal: number): string { - const cent = cardinal % 100; - const dec = cardinal % 10; - if (cent > 10 && cent < 20) { - switch (dec) { - case 1: - case 2: - return `${cardinal}te`; - default: - return `${cardinal}de`; - } - } - switch (dec) { - case 1: - return `${cardinal}ste`; - case 2: - return `${cardinal}ndre`; - case 3: - return `${cardinal}dje`; - case 6: - return `${cardinal}te`; - default: - return `${cardinal}de`; - } - } -} diff --git a/src/languages/nb-NO/errors.json b/src/languages/nb-NO/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/errors.json b/src/languages/nb-NO/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/guilds-logs.json b/src/languages/nb-NO/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/guilds-members.json b/src/languages/nb-NO/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/messages.json b/src/languages/nb-NO/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/moderation.json b/src/languages/nb-NO/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/noMentionSpam.json b/src/languages/nb-NO/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/reactions.json b/src/languages/nb-NO/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/events/twitch.json b/src/languages/nb-NO/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/fuzzySearch.json b/src/languages/nb-NO/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/globals.json b/src/languages/nb-NO/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/guilds.json b/src/languages/nb-NO/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/humanLevels.json b/src/languages/nb-NO/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/moderation.json b/src/languages/nb-NO/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/moderationActions.json b/src/languages/nb-NO/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/nb-NO/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/nb-NO/permissions.json b/src/languages/nb-NO/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/preconditions.json b/src/languages/nb-NO/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/promptList.json b/src/languages/nb-NO/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/selfModeration.json b/src/languages/nb-NO/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/serializers.json b/src/languages/nb-NO/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/settings.json b/src/languages/nb-NO/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nb-NO/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nb-NO/system.json b/src/languages/nb-NO/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/nb-NO/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/arguments.json b/src/languages/nl-NL/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/nl-NL/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/arguments/image.json b/src/languages/nl-NL/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/arguments/range.json b/src/languages/nl-NL/arguments/range.json deleted file mode 100644 index d39a6500fa2..00000000000 --- a/src/languages/nl-NL/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} moet een getal of een bereik van getallen zijn." -} \ No newline at end of file diff --git a/src/languages/nl-NL/assertions.json b/src/languages/nl-NL/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/colors.json b/src/languages/nl-NL/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/commands/admin.json b/src/languages/nl-NL/commands/admin.json deleted file mode 100644 index 97e4f2b5622..00000000000 --- a/src/languages/nl-NL/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} mag niet worden gedeactiveerd.", - "confUpdated": "", - "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": { - "usages": [ - "set NameOfKey ValueForKey", - "show", - "show NameOfKey", - "remove NameOfKey ValueForKey", - "reset NameOfKey", - "menu" - ], - "extendedHelp": "", - "examples": [ - "set language en-GB", - "set channel.moderation-logs #moderation-logs", - "show", - "show channels", - "remove roles.moderator Moderator", - "reset roles.moderator", - "menu" - ], - "reminder": "Er zijn groepen en sleutels en sleutels die onderdeel zijn van een groep worden gerefereerd als `GroepNaam.SleutelNaam`." - }, - "confServer": "**Server Instelling {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` kan alleen worden geconfigureerd via het web dashboard ()", - "confSettingNotSet": "Niet ingesteld", - "rolesetDescription": "Beheer unieke rolesets.", - "rolesetExtended": { - "usages": [ - "set RoleSetNaam Role1 Role2 Role3...", - "set RoleSetNaam Role1 Role2 Role3...", - "reset", - "reset RoleSetNaam", - "list", - "RoleSetNaam Role1 Role2 Role3" - ], - "extendedHelp": "Een set van rollen beschouw die ik als uniek voor alle leden op de server, dat wil zeggen, een roleset genaamd `region` zou de rollen `Afrika`, `America`, `Azië`, en `Europe` kunnen hebben, en leden kunnen zullen dan altijd maar één deze rollen kunnen hebben. Dit is als een soort \"regel\" dat wordt toegepast in de drie volgende situaties:\n\n- Wanneer iemand een rol claimt via het commando `rollen`.\n- Wanneer iemand een rol opeist via reactie rollen.\n- Wanneer iemand een rol handmatig of van een andere bot ontvangt.", - "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." - ], - [ - "RoleSetNaam", - "De naam van de roleset" - ], - [ - "Role1 Role2 Role3", - "De rollen om toe te voegen aan de roleset" - ] - ], - "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": "De {{name}} unieke set van rollen is aangemaakt met de volgende rollen: {{roles, andList}}", - "rolesetAdded": "De set van rol met de naam {{name}} heeft nu ook de volgende rollen: {{roles, andList}}.", - "rolesetRemoved": "De rollen set met de naam {{name}} zal niet bevat niet langer de volgende rollen: {{roles, andList}}", - "rolesetResetEmpty": "{{REDCROSS}} Er zijn geen rollen geconfigureerd in deze set.", - "rolesetResetAll": "{{GREENTICK}} Alle rollen sets zijn verwijderd.", - "rolesetResetNotExists": "{{REDCROSS}} De set van rollen met de naam `{{name}}` bestaat niet in deze server.", - "rolesetResetGroup": "{{GREENTICK}} De set van rollen met de naam `{{name}}` is succesvol verwijderd van de server.", - "rolesetUpdated": "De set van rollen met de naam {{name}} is bijgewerkt.", - "rolesetNoRolesets": "Je hebt geen rolesets.", - "confMenuRenderAtFolder": "Momenteel in: 📁 {{path}}", - "confMenuRenderAtPiece": "Momenteel bij: ⚙️ {{path}}", - "confMenuRenderNokeys": "Er zijn geen configureerbare opties in deze map", - "confMenuRenderSelect": "Typ een van de volgende invoernamen in", - "confMenuRenderUpdate": "• Update Waarde → `set `", - "confMenuRenderRemove": "• Verwijder Waarde → `remove `", - "confMenuRenderReset": "• Reset Waarde → `reset`", - "confMenuRenderUndo": "• Update ongedaan maken → `undo`", - "confMenuRenderCvalue": "Huidige waarde: **``{{value}}``**", - "confMenuRenderBack": "Druk op ◀ om terug te gaan", - "confMenuInvalidKey": "Ongeldige sleutel, probeer het opnieuw met een van de volgende opties:", - "confMenuInvalidAction": "Ongeldige actie, probeer het opnieuw met een van de volgende opties:", - "confMenuSaved": "Wijzigingen zijn succesvol opgeslagen." -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/animal.json b/src/languages/nl-NL/commands/animal.json deleted file mode 100644 index 7132d198d27..00000000000 --- a/src/languages/nl-NL/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "Laat ik jou een mysterieus kattenfeit vertellen.", - "catfactExtended": { - "extendedHelp": "Je weet dat katten erg nieuwsgierig zijn, toch? Ze hebben zeker een heleboel leuke en rare feiten.\nMet dit command krijg je een willekeurig feit." - }, - "catfactTitle": "Kat Feit", - "dogDescription": "Schattige hondjes! ❤", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "Laat me je een foto van een vos tonen!", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "KITTENS!", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "Schattige shibas!", - "shibeExtended": { - "extendedHelp": "Iedereen houdt van shibas, dus ik ook! Ze zijn zo schattig ❤" - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/animation.json b/src/languages/nl-NL/commands/animation.json deleted file mode 100644 index f9cb50b6de3..00000000000 --- a/src/languages/nl-NL/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "Zoek je favoriete anime met dit commando.", - "kitsuAnimeEmbedData": { - "ageRating": "Leeftijd beoordeling", - "episodeLength": "Aflevering lengte", - "episodes": "Aflevering(en)", - "firstAirDate": "Eerste uitzenddatum", - "score": "Score", - "stillAiring": "Draait nog steeds", - "type": "Type", - "watchIt": "Kijk het hier:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "Deze commando bevraagt Kitsu.io om gegevens te tonen voor de anime die je aanvraagt.", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "Geen beschrijving beschikbaar voor deze anime.", - "kitsuAnimeOutputDescription": "**Engelse titel:** {{englishTitle}}\n**Japanse titel:** {{japaneseTitle}}\n**Canonieke titel:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "🎥 Film", - "ova": "📼 Originele Video Animatie", - "special": "🎴 Special", - "tv": "📺 TV" - }, - "kitsuMangaDescription": "Zoek je favoriete manga met dit commando.", - "kitsuMangaEmbedData": { - "ageRating": "Leeftijdsclassificatie", - "firstPublishDate": "Eerste gepubliceerd op", - "none": "Geen", - "readIt": "Lees het hier:", - "score": "Score", - "type": "Subgenre" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "Deze commando bevraagt Kitsu.io om gegevens te tonen voor de manga die je aanvraagt.", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "**Engelse titel:** {{englishTitle}}\n**Japanse titel:** {{japaneseTitle}}\n**Canonieke titel:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 Manga", - "manhwa": "🇰🇷 Manhwa", - "novel": "📕 Novel", - "oneShot": "☄ One Shot", - "special": "🎴 Special" - }, - "waifuDescription": "Plaatst een willekeurig gegenereerde waifu afbeelding.", - "waifuExtended": { - "extendedHelp": "Dit commando geeft een willekeurige waifu gegenereerd door " - }, - "waifuFooter": "Mogelijk gemaakt door thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/fun.json b/src/languages/nl-NL/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/nl-NL/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/game.json b/src/languages/nl-NL/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/nl-NL/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/general.json b/src/languages/nl-NL/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/nl-NL/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/google.json b/src/languages/nl-NL/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/nl-NL/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/management.json b/src/languages/nl-NL/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/nl-NL/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/misc.json b/src/languages/nl-NL/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/nl-NL/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/moderation.json b/src/languages/nl-NL/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/nl-NL/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/social.json b/src/languages/nl-NL/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/nl-NL/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/starwars.json b/src/languages/nl-NL/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/nl-NL/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/suggestion.json b/src/languages/nl-NL/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/nl-NL/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/system.json b/src/languages/nl-NL/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/nl-NL/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/tags.json b/src/languages/nl-NL/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/nl-NL/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/tools.json b/src/languages/nl-NL/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/nl-NL/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/commands/twitch.json b/src/languages/nl-NL/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/nl-NL/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/nl-NL/constants.ts b/src/languages/nl-NL/constants.ts deleted file mode 100644 index fbb5103484c..00000000000 --- a/src/languages/nl-NL/constants.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Handler } from '#lib/i18n/structures/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 deleted file mode 100644 index 807b4cb26d2..00000000000 --- a/src/languages/nl-NL/errors.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "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...", - "userNotInGuild": "Deze gebruiker is niet in deze server." -} \ No newline at end of file diff --git a/src/languages/nl-NL/events/errors.json b/src/languages/nl-NL/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/guilds-logs.json b/src/languages/nl-NL/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/guilds-members.json b/src/languages/nl-NL/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/messages.json b/src/languages/nl-NL/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/moderation.json b/src/languages/nl-NL/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/noMentionSpam.json b/src/languages/nl-NL/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/reactions.json b/src/languages/nl-NL/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/events/twitch.json b/src/languages/nl-NL/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/fuzzySearch.json b/src/languages/nl-NL/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/globals.json b/src/languages/nl-NL/globals.json deleted file mode 100644 index c6b69024406..00000000000 --- a/src/languages/nl-NL/globals.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "default": "{{key}} is nog niet gelokaliseerd voor nl-NL.", - "defaultLanguage": "Standaard taal", - "no": "Nee", - "none": "Geen", - "unknown": "onbekend", - "yes": "Ja", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}" -} \ No newline at end of file diff --git a/src/languages/nl-NL/guilds.json b/src/languages/nl-NL/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/humanLevels.json b/src/languages/nl-NL/humanLevels.json deleted file mode 100644 index 081b783dc72..00000000000 --- a/src/languages/nl-NL/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "Geen", - "LOW": "Laag", - "MEDIUM": "Gemiddeld", - "HIGH": "Hoog", - "VERY_HIGH": "Hoogste" -} \ No newline at end of file diff --git a/src/languages/nl-NL/moderation.json b/src/languages/nl-NL/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/moderationActions.json b/src/languages/nl-NL/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/nl-NL/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/nl-NL/permissions.json b/src/languages/nl-NL/permissions.json deleted file mode 100644 index 0dfd9ed304b..00000000000 --- a/src/languages/nl-NL/permissions.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ADD_REACTIONS": "Reacties toevoegen", - "ADMINISTRATOR": "Beheerder", - "ATTACH_FILES": "Bestanden bijvoegen", - "BAN_MEMBERS": "Leden verbannen", - "CHANGE_NICKNAME": "Verander gebruikersnaam", - "CONNECT": "Verbinden", - "DEAFEN_MEMBERS": "Geluid van leden dempen", - "EMBED_LINKS": "Ingesloten links", - "KICK_MEMBERS": "Leden verwijderen", - "MANAGE_CHANNELS": "Kanalen beheren", - "MANAGE_EMOJIS_AND_STICKERS": "Emoji's en sticker beheren", - "MANAGE_GUILD": "Server beheren", - "MANAGE_MESSAGES": "Berichten beheren", - "MANAGE_NICKNAMES": "Gebruikersnamen beheren", - "MANAGE_ROLES": "Rollen beheren", - "MANAGE_WEBHOOKS": "Webhooks beheren", - "MOVE_MEMBERS": "Leden verplaatsen", - "MUTE_MEMBERS": "Microfoon van leden dempen", - "PRIORITY_SPEAKER": "Prioriteitsspreker", - "READ_MESSAGE_HISTORY": "Berichtgeschiedenis lezen", - "SEND_MESSAGES": "Berichten verzenden", - "SPEAK": "Spreken", - "USE_EXTERNAL_EMOJIS": "Externe emoji gebruiken", - "USE_VAD": "Spraakactivatie gebruiken", - "VIEW_AUDIT_LOG": "Audit-logboek weergeven" -} \ No newline at end of file diff --git a/src/languages/nl-NL/preconditions.json b/src/languages/nl-NL/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/promptList.json b/src/languages/nl-NL/promptList.json deleted file mode 100644 index a162d109c94..00000000000 --- a/src/languages/nl-NL/promptList.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "aborted": "De vraag is succesvol afgebroken.", - "attemptFailed": "Ongeldige invoer. Poging **{{attempt}}** van **{{maxAttempts}}**\n{{list}}" -} \ No newline at end of file diff --git a/src/languages/nl-NL/selfModeration.json b/src/languages/nl-NL/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/serializers.json b/src/languages/nl-NL/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/settings.json b/src/languages/nl-NL/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/nl-NL/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/nl-NL/system.json b/src/languages/nl-NL/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/nl-NL/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/arguments.json b/src/languages/pt-BR/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/pt-BR/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/arguments/image.json b/src/languages/pt-BR/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/arguments/range.json b/src/languages/pt-BR/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/assertions.json b/src/languages/pt-BR/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/colors.json b/src/languages/pt-BR/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/commands/admin.json b/src/languages/pt-BR/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/pt-BR/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/animal.json b/src/languages/pt-BR/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/pt-BR/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/animation.json b/src/languages/pt-BR/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/pt-BR/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/fun.json b/src/languages/pt-BR/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/pt-BR/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/game.json b/src/languages/pt-BR/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/pt-BR/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/general.json b/src/languages/pt-BR/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/pt-BR/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/google.json b/src/languages/pt-BR/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/pt-BR/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/management.json b/src/languages/pt-BR/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/pt-BR/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/misc.json b/src/languages/pt-BR/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/pt-BR/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/moderation.json b/src/languages/pt-BR/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/pt-BR/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/social.json b/src/languages/pt-BR/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/pt-BR/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/starwars.json b/src/languages/pt-BR/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/pt-BR/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/suggestion.json b/src/languages/pt-BR/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/pt-BR/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/system.json b/src/languages/pt-BR/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/pt-BR/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/tags.json b/src/languages/pt-BR/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/pt-BR/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/tools.json b/src/languages/pt-BR/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/pt-BR/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/commands/twitch.json b/src/languages/pt-BR/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/pt-BR/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/pt-BR/errors.json b/src/languages/pt-BR/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/errors.json b/src/languages/pt-BR/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/guilds-logs.json b/src/languages/pt-BR/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/guilds-members.json b/src/languages/pt-BR/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/messages.json b/src/languages/pt-BR/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/moderation.json b/src/languages/pt-BR/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/noMentionSpam.json b/src/languages/pt-BR/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/reactions.json b/src/languages/pt-BR/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/events/twitch.json b/src/languages/pt-BR/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/fuzzySearch.json b/src/languages/pt-BR/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/globals.json b/src/languages/pt-BR/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/guilds.json b/src/languages/pt-BR/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/humanLevels.json b/src/languages/pt-BR/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/moderation.json b/src/languages/pt-BR/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/moderationActions.json b/src/languages/pt-BR/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/pt-BR/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/pt-BR/permissions.json b/src/languages/pt-BR/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/preconditions.json b/src/languages/pt-BR/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/promptList.json b/src/languages/pt-BR/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/selfModeration.json b/src/languages/pt-BR/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/serializers.json b/src/languages/pt-BR/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/settings.json b/src/languages/pt-BR/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/pt-BR/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/pt-BR/system.json b/src/languages/pt-BR/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/pt-BR/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/arguments.json b/src/languages/ro-RO/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/ro-RO/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/arguments/image.json b/src/languages/ro-RO/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/arguments/range.json b/src/languages/ro-RO/arguments/range.json deleted file mode 100644 index c34f1441880..00000000000 --- a/src/languages/ro-RO/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} trebuie să fie un număr sau un interval de numere." -} \ No newline at end of file diff --git a/src/languages/ro-RO/assertions.json b/src/languages/ro-RO/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/colors.json b/src/languages/ro-RO/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/commands/admin.json b/src/languages/ro-RO/commands/admin.json deleted file mode 100644 index a17d1b51797..00000000000 --- a/src/languages/ro-RO/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} nu poate fi dezactivat(ă).", - "confUpdated": "", - "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": "Definiți setările per-server.", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "**Setarea {{key}} a server-ului**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` poate fi configurat doar prin intermediul panoului web ()", - "confSettingNotSet": "Nu este setat", - "rolesetDescription": "Gestionați seturi de roluri unice.", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "Un set de roluri este un grup de roluri pe care Skyra le identifică ca fiind unice pentru toți membrii din server, ca de exemplu un roleset numit `regiune` ar putea avea rolurile `Africa`, `America`, `Asia` şi `Europa`, iar membrii vor putea avea doar unul dintre ele. Este ca un fel de \"regulă\" care se aplică în următoarele trei situaţii:\n\n- Când cineva revendică un rol prin comanda `roles`.\n- Când cineva revendică un rol prin roluri de reacție.\n- Când cineva primește un rol fie manual, fie de la un alt bot.", - "explainedUsage": [ - [ - "add", - "Creați un nou roleset sau adăugați un rol la unul existent." - ], - [ - "remove", - "Elimină un rol dintr-un roleset existent." - ], - [ - "reset", - "Elimină toate rolurile dintr-un roleset sau, dacă nu este specificat, toate roleset-urile existente." - ], - [ - "list", - "Listează toate seturile de role-uri." - ], - [ - "auto", - "Adaugă sau elimină un set de roluri." - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "add regions America", - "add regions Africa America Asia Europa", - "remove regions America", - "reset", - "reset regions", - "list", - "regions America", - "regions Africa America Asia Europa" - ], - "reminder": "Această comandă poate adăuga și/sau elimina mai multe roluri în același timp." - }, - "rolesetCreated": "Roleset-ul unic {{name}} a fost creat cu următoarele roluri: {{roles, andList}}", - "rolesetAdded": "", - "rolesetRemoved": "Roleset-ul unic {{name}} nu o să mai includă următoarele roluri: {{roles, andList}}", - "rolesetResetEmpty": "{{REDCROSS}} Nu există rolurset-uri configurate în acest grup.", - "rolesetResetAll": "{{GREENTICK}} Toate roleset-urile au fost eliminate cu succes.", - "rolesetResetNotExists": "{{REDCROSS}} Roleset-ul `{{name}}` nu există pe acest server.", - "rolesetResetGroup": "{{GREENTICK}} Roleset-ul `{{name}}` a fost eliminat cu success de pe acest server.", - "rolesetUpdated": "Roleset-ul {{name}} a fost actualizat.", - "rolesetNoRolesets": "Nu aveți nici un roleset.", - "confMenuRenderAtFolder": "Momentan la: 📁 {{path}}", - "confMenuRenderAtPiece": "Momentan la: ⚙️ {{path}}", - "confMenuRenderNokeys": "Nu există chei configurabile pentru acest dosar", - "confMenuRenderSelect": "Vă rugăm să introduceți oricare dintre următoarele intrări", - "confMenuRenderUpdate": "• Actualizează Valoarea → `set `", - "confMenuRenderRemove": "• Elimină Valoarea → `remove `", - "confMenuRenderReset": "• Resetează Valoarea → `reset`", - "confMenuRenderUndo": "• Anulează Actualizarea → `undo`", - "confMenuRenderCvalue": "Valoarea actuală: **``{{value}}``**", - "confMenuRenderBack": "Apăsați ◀ pentru a merge înapoi", - "confMenuInvalidKey": "Cheie invalidă, te rugăm să încerci din nou cu oricare dintre următoarele opțiuni.", - "confMenuInvalidAction": "Acțiune invalidă, vă rugăm să încercați din nou cu oricare dintre următoarele opțiuni.", - "confMenuSaved": "Salvare reuşită a tuturor modificărilor." -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/animal.json b/src/languages/ro-RO/commands/animal.json deleted file mode 100644 index cbbb82d39f4..00000000000 --- a/src/languages/ro-RO/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "Lasa-mă să îți spun un fapt misterios despre pisici.", - "catfactExtended": { - "extendedHelp": "Ştiai că pisicile sunt foarte curioase, nu? Cu siguranţă au o mulţime de fapte distractive şi ciudate.\nCu această comandă vei primi un fapt aleatoriu." - }, - "catfactTitle": "Fapte despre pisici", - "dogDescription": "Câini drăguți! ❤", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "Lasă-mă să îți arăt o imagine cu o vulpe!", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "PISICUȚE!", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "Shiba-uri drăguți!", - "shibeExtended": { - "extendedHelp": "Toată lumea iubește shiba-uri, și eu o să îi iubesc! Sunt atât de adorabili ❤" - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/animation.json b/src/languages/ro-RO/commands/animation.json deleted file mode 100644 index ea550bf08d3..00000000000 --- a/src/languages/ro-RO/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "Caută anime-ul tău preferat după titlu cu această comandă.", - "kitsuAnimeEmbedData": { - "ageRating": "Rating vârstă", - "episodeLength": "Lungimea episodului", - "episodes": "Episoade", - "firstAirDate": "Data primei difuzări", - "score": "Scor", - "stillAiring": "Încă se difuzează", - "type": "Tip", - "watchIt": "Urmărește-l aici:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "Această comandă accesează Kitsu.io pentru a afișa datele pentru anime-ul pe care îl solicitați.", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "Nu exista rezumat disponibil pentru acest titlu.", - "kitsuAnimeOutputDescription": "**Titlu englez:** ** {{englishTitle}}\n**Titlu japonez:** {{japaneseTitle}}\n**Titlu canonic:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuAnimeTypes": { - "movie": "🎥 Movie", - "ova": "📼 Original Video Animation", - "special": "🎴 Special", - "tv": "📺 TV" - }, - "kitsuMangaDescription": "Caută manga-ul tău preferat după titlu cu această comandă.", - "kitsuMangaEmbedData": { - "ageRating": "Rating vârstă", - "firstPublishDate": "Prima publicare", - "none": "Nimic", - "readIt": "Citiţi-l aici:", - "score": "Scor", - "type": "Subtip" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "Această comandă accesează Kitsu.io pentru a afișa datele pentru manga-ul pe care îl solicitați.", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "**Titlu englez:** ** {{englishTitle}}\n**Titlu japonez:** {{japaneseTitle}}\n**Titlu canonic:** {{canonicalTitle}}\n{{synopsis}}", - "kitsuMangaTypes": { - "manga": "📘 Manga", - "manhwa": "🇰🇷 Manhwa", - "novel": "📕 Novel", - "oneShot": "☄ One Shot", - "special": "🎴 Special" - }, - "waifuDescription": "Postează o imagine waifu generată aleatoriu.", - "waifuExtended": { - "extendedHelp": "Această comandă postează o imagine waifu generată aleatoriu de " - }, - "waifuFooter": "Oferit de către thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/fun.json b/src/languages/ro-RO/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/ro-RO/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/game.json b/src/languages/ro-RO/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/ro-RO/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/general.json b/src/languages/ro-RO/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/ro-RO/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/google.json b/src/languages/ro-RO/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/ro-RO/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/management.json b/src/languages/ro-RO/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/ro-RO/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/misc.json b/src/languages/ro-RO/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/ro-RO/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/moderation.json b/src/languages/ro-RO/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/ro-RO/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/social.json b/src/languages/ro-RO/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/ro-RO/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/starwars.json b/src/languages/ro-RO/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/ro-RO/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/suggestion.json b/src/languages/ro-RO/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/ro-RO/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/system.json b/src/languages/ro-RO/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/ro-RO/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/tags.json b/src/languages/ro-RO/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/ro-RO/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/tools.json b/src/languages/ro-RO/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/ro-RO/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/commands/twitch.json b/src/languages/ro-RO/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/ro-RO/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ro-RO/errors.json b/src/languages/ro-RO/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/errors.json b/src/languages/ro-RO/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/guilds-logs.json b/src/languages/ro-RO/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/guilds-members.json b/src/languages/ro-RO/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/messages.json b/src/languages/ro-RO/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/moderation.json b/src/languages/ro-RO/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/noMentionSpam.json b/src/languages/ro-RO/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/reactions.json b/src/languages/ro-RO/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/events/twitch.json b/src/languages/ro-RO/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/fuzzySearch.json b/src/languages/ro-RO/fuzzySearch.json deleted file mode 100644 index 8820e8b5393..00000000000 --- a/src/languages/ro-RO/fuzzySearch.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "aborted": "Cerere anulată cu succes.", - "invalidIndex": "Acest număr a fost în afara razei de acțiune, anulăm cererea.", - "invalidNumber": "Mă aşteptam să-mi dai un număr (o singură cifră), am primit un cartof.", - "matches": "Am găsit mai multe potriviri! **Vă rugăm să selectați un număr în 0 și {{matches}}**:\n{{codeblock}}\nScrieți **ABORT** dacă doriți să ieșiți din cerere." -} \ No newline at end of file diff --git a/src/languages/ro-RO/globals.json b/src/languages/ro-RO/globals.json deleted file mode 100644 index 8c4f6b070db..00000000000 --- a/src/languages/ro-RO/globals.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "default": "{{key}} nu a fost localizat încă pentru ro-RO.", - "defaultLanguage": "Limba implicită", - "no": "Nu", - "none": "Nici unul", - "unknown": "necunoscut", - "yes": "Da", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}" -} \ No newline at end of file diff --git a/src/languages/ro-RO/guilds.json b/src/languages/ro-RO/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/humanLevels.json b/src/languages/ro-RO/humanLevels.json deleted file mode 100644 index 5337bd733db..00000000000 --- a/src/languages/ro-RO/humanLevels.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NONE": "Nimic", - "LOW": "Scăzut", - "MEDIUM": "Mediu", - "HIGH": "Ridicat", - "VERY_HIGH": "Cel mai înalt" -} \ No newline at end of file diff --git a/src/languages/ro-RO/moderation.json b/src/languages/ro-RO/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/moderationActions.json b/src/languages/ro-RO/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/ro-RO/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/ro-RO/permissions.json b/src/languages/ro-RO/permissions.json deleted file mode 100644 index 822f8acf011..00000000000 --- a/src/languages/ro-RO/permissions.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ADD_REACTIONS": "Adaugă reacții", - "ADMINISTRATOR": "Administrator", - "ATTACH_FILES": "Ataşează fişiere", - "BAN_MEMBERS": "Interzice membrii", - "CHANGE_NICKNAME": "Schimbă porecla", - "CONNECT": "Conectare", - "DEAFEN_MEMBERS": "Asurzește membri", - "EMBED_LINKS": "Încorporează linkuri", - "KICK_MEMBERS": "Elimină membrii", - "MANAGE_CHANNELS": "Gestionează canalele", - "MANAGE_EMOJIS_AND_STICKERS": "Gestionează emoji-uri și stickere", - "MANAGE_GUILD": "Gestionează server-ul", - "MANAGE_MESSAGES": "Gestionează mesajele", - "MANAGE_NICKNAMES": "Gestionează poreclele", - "MANAGE_ROLES": "Gestionează rolurile", - "MANAGE_WEBHOOKS": "Gestionează Webhook-uri", - "MOVE_MEMBERS": "Mută membri", - "MUTE_MEMBERS": "Amuțește membri", - "PRIORITY_SPEAKER": "Vorbitor prioritar", - "READ_MESSAGE_HISTORY": "Citește istoricul mesajelor", - "SEND_MESSAGES": "Trimite mesaje", - "SPEAK": "Vorbește", - "USE_EXTERNAL_EMOJIS": "Folosește emoji-uri externe", - "USE_VAD": "Folosește activitatea vocală", - "VIEW_AUDIT_LOG": "Vezi jurnalul server-ului" -} \ No newline at end of file diff --git a/src/languages/ro-RO/preconditions.json b/src/languages/ro-RO/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/promptList.json b/src/languages/ro-RO/promptList.json deleted file mode 100644 index f35a8bd1710..00000000000 --- a/src/languages/ro-RO/promptList.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "aborted": "Cerere anulată cu succes.", - "attemptFailed": "Intrare invalidă. Încercarea **{{attempt}}** din **{{maxAttempts}}**\n{{list}}" -} \ No newline at end of file diff --git a/src/languages/ro-RO/selfModeration.json b/src/languages/ro-RO/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/serializers.json b/src/languages/ro-RO/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/settings.json b/src/languages/ro-RO/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ro-RO/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ro-RO/system.json b/src/languages/ro-RO/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/ro-RO/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/arguments.json b/src/languages/ru-RU/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/ru-RU/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/arguments/image.json b/src/languages/ru-RU/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/arguments/range.json b/src/languages/ru-RU/arguments/range.json deleted file mode 100644 index 95746a0fff3..00000000000 --- a/src/languages/ru-RU/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "Значение «{{name}} » должно быть числом или диапазоном чисел." -} \ No newline at end of file diff --git a/src/languages/ru-RU/assertions.json b/src/languages/ru-RU/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/colors.json b/src/languages/ru-RU/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/commands/admin.json b/src/languages/ru-RU/commands/admin.json deleted file mode 100644 index 462506d159b..00000000000 --- a/src/languages/ru-RU/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} не может быть отключен.", - "confUpdated": "", - "confGetNoExt": "Кажется, ключа **{{key}}** не существует.", - "confGet": "Значение ключа **{{key}}**: `{{value}}`", - "confReset": "", - "confNochange": "Значение **{{key}}** уже соответствует этому значению.", - "confServerDescription": "Определить параметры для сервера.", - "confServerExtended": { - "usages": [ - "", - "show", - "show НазваниеКлюча", - "", - "reset НазваниеКлюча", - "menu" - ], - "extendedHelp": "", - "examples": [ - "set language ru-RU", - "", - "show", - "show channels", - "remove roles.moderator Модератор", - "reset roles.moderator", - "menu" - ], - "reminder": "" - }, - "confServer": "**Настройки сервера {{key}}**\n{{list}}", - "confDashboardOnlyKey": "`{{key}}` можно настроить только через веб-панель инструментов ()", - "confSettingNotSet": "Не задано", - "rolesetDescription": "Управляйте наборами уникальных ролей.", - "rolesetExtended": { - "usages": [ - "set НазваниеНабораРолей Роль1 Роль2 Роль3...", - "remove НазваниеНабораРолей Роль1 Роль2 Роль3...", - "reset", - "reset НазваниеНабораРолей", - "list", - "НазваниеНабораРолей Роль1 Роль2 Роль3" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "добавить", - "Создать новый набор ролей или добавить роль к уже существующему." - ], - [ - "удалить", - "Удалить роль из существующего набора ролей." - ], - [ - "сбросить", - "Удаляет все роли из набора ролей или, если не указано, все существующие наборы ролей." - ], - [ - "список", - "Перечисляет все наборы ролей." - ], - [ - "авто", - "Добавляет или удаляет набор ролей." - ], - [ - "НазваниеНабораРолей", - "Название набора ролей" - ], - [ - "Роль1 Роль2 Роль3", - "" - ] - ], - "examples": [ - "add регионы Америка", - "add регионы Африка Америка Азия Европа", - "remove регионы Америка", - "reset", - "reset регионы", - "list", - "регионы Америка", - "регионы Африка Америка Азия Европа" - ], - "reminder": "Эта команда может добавить и/или удалить несколько ролей одновременно." - }, - "rolesetCreated": "Набор уникальных ролей {{name}} создан со следующими ролями: {{roles, andList}}", - "rolesetAdded": "Набор уникальных ролей {{name}} обновлён, теперь он содержит следующие роли: {{roles, andList}}.", - "rolesetRemoved": "Набор уникальных ролей {{name}} больше не будет включать в себя следующие роли: {{roles, andList}}", - "rolesetResetEmpty": "", - "rolesetResetAll": "{{GREENTICK}} Все наборы ролей успешно удалены.", - "rolesetResetNotExists": "{{REDCROSS}} На этом сервере не существует набора ролей `{{name}}`.", - "rolesetResetGroup": "{{GREENTICK}} Набор ролей `{{name}}` успешно удалён с этого сервера.", - "rolesetUpdated": "Набор уникальных ролей {{name}} обновлён.", - "rolesetNoRolesets": "У вас нет наборов ролей.", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "• Обновить значение → `set `", - "confMenuRenderRemove": "• Удалить значение → `remove `", - "confMenuRenderReset": "• Сбросить значение → `reset`", - "confMenuRenderUndo": "• Отменить обновление → `undo`", - "confMenuRenderCvalue": "Текущее значение: **``{{value}}``**", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "Все изменения успешно сохранены." -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/animal.json b/src/languages/ru-RU/commands/animal.json deleted file mode 100644 index 4a6229be36b..00000000000 --- a/src/languages/ru-RU/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "Факт о кошках", - "dogDescription": "Милые собачки! ❤", - "dogExtended": { - "extendedHelp": "**Вы** знаете, насколько собаки милые? Они такие красивые!\nЭта команда использует [dog.ceo](https://dog.ceo), чтобы показать изображения самых милых собачек!" - }, - "foxDescription": "Позвольте мне показать вам изображение лисицы!", - "foxExtended": { - "extendedHelp": "Эта команда выдаёт случайное изображение с [randomfox.ca](https://randomfox.ca/)." - }, - "kittyDescription": "КОТЯТА!", - "kittyExtended": { - "extendedHelp": "**Вы** знаете, насколько котята милые? Они такие красивые!\nЭта команда использует [random.cat](https://aws.random.cat/), чтобы показать изображения самых милых кошек!" - }, - "shibeDescription": "Милые сибы!", - "shibeExtended": { - "extendedHelp": "Все любят сиба-ину, я тоже буду их любить! Они такие очаровательные ❤" - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/animation.json b/src/languages/ru-RU/commands/animation.json deleted file mode 100644 index 06552cf06d2..00000000000 --- a/src/languages/ru-RU/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "Ищите своё любимое аниме по названию с помощью этой команды.", - "kitsuAnimeEmbedData": { - "ageRating": "Возрастной рейтинг", - "episodeLength": "Длительность эпизода", - "episodes": "Эпизод(ы)", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "Тип", - "watchIt": "Смотрите здесь:" - }, - "kitsuAnimeExtended": { - "examples": [ - "One Piece" - ], - "extendedHelp": "Эта команда обращается к Kitsu.io, чтобы показать информацию о запрошенном вами аниме.", - "usages": [ - "Название аниме" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "📺 ТВ" - }, - "kitsuMangaDescription": "Ищите свою любимую мангу по названию с помощью этой команды.", - "kitsuMangaEmbedData": { - "ageRating": "Возрастной рейтинг", - "firstPublishDate": "", - "none": "", - "readIt": "Читайте здесь:", - "score": "", - "type": "Подтип" - }, - "kitsuMangaExtended": { - "examples": [ - "Stone Ocean", - "One Piece" - ], - "extendedHelp": "Эта команда обращается к Kitsu.io, чтобы показать информацию о запрошенной вами манге.", - "usages": [ - "Название манги" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "📘 Манга", - "manhwa": "🇰🇷 Манхва", - "novel": "", - "oneShot": "☄ Ваншот", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "При поддержке thiswaifudoesnotexist.net" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/fun.json b/src/languages/ru-RU/commands/fun.json deleted file mode 100644 index a5584d52971..00000000000 --- a/src/languages/ru-RU/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "текст", - "Желаемая фраза." - ] - ], - "examples": [ - "Skyra - лучший бот на этом сервере" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "слова", - "" - ] - ], - "examples": [ - "", - "Кошка, Собака" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "Skyra", - "меня" - ] - }, - "shindeiruDescription": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "Пользователь" - ], - "extendedHelp": "\"Ты уже мёртв\", по-японски: お前はもう死んでいる; Omae Wa Mou Shindeiru, - это выражение из манги и аниме \"Кулак Северной звезды\". Эта команда показывает комикс-стрип с персонажем, произносящим вышеупомянутые слова, что заставляет оппонента ответить \"nani?\" (\"что?\").", - "examples": [ - "Skyra" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "Читайте комиксы с XKCD.", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "запрос", - "" - ] - ], - "examples": [ - "1091", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "Количество бросков должно быть числом от 1 до 1024.", - "diceSidesError": "Количество сторон должно быть числом от 3 до 1024.", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "Результат", - "rateOutput": "", - "rateMyself": [ - ". Я очень люблю себя 😊", - "" - ], - "rateOwners": [ - ". Я очень люблю своих разработчиков 🥰", - "мои разработчики" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/game.json b/src/languages/ru-RU/commands/game.json deleted file mode 100644 index 52b112c53ec..00000000000 --- a/src/languages/ru-RU/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "Пользователь" - ], - "extendedHelp": "В эту игру лучше всего играть на ПК.\nСоедини 4 (Четыре в ряд) - это игра на двоих, в которой игроки сначала выбирают цвет, а затем ходят по очереди, бросая фишки в ячейки вертикально расположенной решётки. Решётка состоит из семи столбцов, каждый из которых содержит шесть ячеек. Выигрывает тот, кто первым выстроит ряд из четырёх фишек своего цвета по горизонтали, по вертикали или по диагонали.", - "examples": [ - "Skyra" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "Подбросьте монетку!", - "coinFlipExtended": { - "usages": [ - "орёл/решка", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "орёл/решка", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "решка", - "орёл 50", - "решка 200", - "" - ] - }, - "coinFlipInvalidCoinName": "Простите, но `{{parameter}}` не является стороной монеты!", - "coinFlipLoseDescription": "Монета была подброшена, выпавшая сторона - {{result}}. Вы не угадали.", - "coinFlipLoseDescriptionWithWager": "Монета была подброшена, выпавшая сторона - {{result}}. Вы не угадали и потеряли {{wager}} {{SHINY}}.", - "coinFlipLoseTitle": "Вы проиграли.", - "coinFlipNoguessDescription": "Монета была подброшена, выпавшая сторона - {{result}}.", - "coinFlipNoguessTitle": "Вы подбросили монетку.", - "coinFlipWinDescription": "Монета была подброшена, выпавшая сторона - {{result}}. Вы угадали!", - "coinFlipWinDescriptionWithWager": "Монета была подброшена, выпавшая сторона - {{result}}. Вы угадали и выиграли {{wager}} {{SHINY}}!", - "coinFlipWinTitle": "Вы выиграли!", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "Сожалею, но соперник отказался играть.", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "{1} хватает лопату.", - "{1} хватает рюкзак и отступает.", - "{1} и {2} сражаются за сумку. {1} сдаётся и отступает.", - "{1} и {2} сражаются за сумку. {2} сдаётся и отступает.", - "{1} находит лук, несколько стрел и колчан.", - "", - "{1} берёт горсть метательных ножей.", - "{1} вырывает булаву из рук {2}.", - "{1} находит флягу, полную воды.", - "", - "{1} собирает столько еды, сколько может.", - "{1} хватает меч.", - "{1} берёт копьё из Рога изобилия.", - "{1} находит сумку, наполненную взрывчаткой.", - "", - "{1} берёт серп из Рога изобилия.", - "", - "{1} убегает с зажигалкой и верёвкой.", - "", - "", - "{1} хватает рюкзак, не понимая, что он пуст.", - "{1} ломает {2} нос за корзину хлеба.", - "", - "{1} забирает трезубец из Рога изобилия.", - "", - "{1} отпугивает {2} от Рога изобилия.", - "{1} хватает щит, прислонённый к Рогу изобилия.", - "", - "", - "", - "{1} бросает нож в голову {2T}.", - "{1T} случайно наступает на мину.", - "{1} застаёт {2T} врасплох и убивает его/её.", - "{1} и {2} действуют сообща для того, чтобы утопить {3T}.", - "{1} душит {2T} после кулачного боя.", - "{1} выпускает стрелу в голову {2T}.", - "{1T} не может справиться с обстоятельствами и совершает самоубийство.", - "{1} ударяет {2T} головой о камень несколько раз.", - "{1} сворачивает {2T} шею.", - "{1} обезглавливает {2T} мечом.", - "{1} вонзает копьё в живот {2T}.", - "{1} поджигает {2T} с помощью «коктейля Молотова».", - "{1T} падает в яму и умирает.", - "", - "{1} тяжело ранит {2T}, но избавляет его/её от мучений.", - "{1} тяжело ранит {2T} и оставляет его/её умирать.", - "{1} разбивает голову {2T} булавой.", - "{1} сталкивает {2T} со скалы во время боя на ножах.", - "{1} бросает нож в грудь {2T}.", - "{1T} не может убедить {2} не убивать его/её.", - "", - "{1T} падает в замёрзшее озеро и тонет.", - "{1}, {2} и {3T} начинают сражаться, но {2} убегает, когда {1} убивает {3T}.", - "{1} убивает {2T} его/её же собственным оружием.", - "", - "{1} приводит в действие взрывчатку, убивая {2T}.", - "{1} приводит в действие взрывчатку, убивая {2T} и {3T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T} и {4T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T}, {4T} и {5T}.", - "", - "{1T} и {2T} угрожают двойным самоубийством. Это не срабатывает, и они умирают.", - "", - "{1} убивает {2T} топором.", - "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", - "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", - "{1T} атакует {2}, но {3} защищает его/её, убивая {1T}.", - "", - "{1} душит {2T} верёвкой.", - "{1} убивает {2T} за его/её припасы.", - "{1} пускает стрелу в {2}, но промахивается и убивает {3T}.", - "", - "{1} вонзает в {2T} ветку дерева.", - "{1} вонзает трезубец в спину {2T}.", - "{1}, {2T} и {3T} затевают драку. {1} торжествующе убивает остальных.", - "{1T}, {2} и {3T} затевают драку. {2} торжествующе убивает остальных.", - "{1T}, {2T} и {3} затевают драку. {3} торжествующе убивает остальных.", - "{1} обнаруживает, что {2T} прячется в Роге изобилия, и убивает его/её.", - "{1T} обнаруживает, что {2} прячется в Роге изобилия, но {2} убивает его/её.", - "{1} убивает {2T} серпом.", - "{1} и {2T} сражаются за сумку. {1} душит {2T} ремнями и убегает.", - "{1T} и {2} сражаются за сумку. {2} душит {1T} ремнями и убегает.", - "", - "", - "", - "" - ], - "hgDay": [ - "{1} идёт на охоту.", - "", - "{1} исследует арену.", - "", - "{1} отвлекает внимание {2} и убегает.", - "{1} преследует {2}.", - "{1} рыбачит.", - "{1} маскируется в кустах.", - "", - "{1} делает деревянное копьё.", - "{1} обнаруживает пещеру.", - "{1} атакует {2}, но ему/ей удаётся сбежать.", - "", - "{1} убегает от {2}.", - "{1} собирает фрукты с дерева.", - "{1} получает топор от неизвестного спонсора.", - "{1} получает чистую воду от неизвестного спонсора.", - "{1} получает медикаменты от неизвестного спонсора.", - "{1} получает свежую пищу от неизвестного спонсора.", - "{1} ищет источник воды.", - "{1} побеждает {2} в бою, но сохраняет ему/ей жизнь.", - "", - "{1} умоляет {2} убить его/её. Он/а отказывается, оставляя {1} в живых.", - "{1} пытается проспать весь день.", - "{1}, {2}, {3} и {4} совершают набег на лагерь {5}, пока он/а охотится.", - "{1} строит хижину.", - "", - "{1} практикуется в стрельбе из лука.", - "{1} думает о доме.", - "", - "{1} пытается ловить рыбу трезубцем.", - "{1} ищет хворост.", - "{1} и {2} разделяются для поиска ресурсов.", - "{1} собирает цветы.", - "{1} занимается ранами {2}.", - "", - "", - "{1} делает рогатку.", - "", - "{1} обнаруживает реку.", - "{1} охотится за другими трибутами.", - "{1} и {2} охотятся за другими трибутами.", - "{1}, {2} и {3} охотятся за другими трибутами.", - "{1}, {2}, {3} и {4} охотятся за другими трибутами.", - "{1}, {2}, {3}, {4} и {5} охотятся за другими трибутами.", - "{1} получает взрывчатку от неизвестного спонсора.", - "{1} подвергает сомнению своё здравомыслие.", - "{1} заставляет {2} есть штаны.", - "{1} заставляет {2T} есть штаны. {2T} давится и умирает.", - "{1} застаёт {2T} врасплох и убивает его/её.", - "{1} бросает нож в голову {2T}.", - "", - "{1} и {2} действуют сообща для того, чтобы утопить {3T}.", - "{1} душит {2T} после кулачного боя.", - "{1} выпускает стрелу в голову {2T}.", - "{1T} истекает кровью из-за необработанных ран.", - "{1T} не может справиться с обстоятельствами и совершает самоубийство.", - "{1} ударяет {2T} головой о камень несколько раз.", - "{1T} по незнанию съедает ядовитые ягоды.", - "", - "", - "{1} обезглавливает {2T} мечом.", - "{1T} умирает от инфекции.", - "{1} вонзает копьё в живот {2T}.", - "{1} поджигает {2T} с помощью «коктейля Молотова».", - "{1T} падает в яму и умирает.", - "", - "{1} тяжело ранит {2T}, но избавляет его/её от мучений.", - "{1} тяжело ранит {2T} и оставляет его/её умирать.", - "{1} разбивает голову {2T} булавой.", - "{1T} пытается забраться на дерево, но разбивается насмерть.", - "{1} сталкивает {2T} со скалы во время боя на ножах.", - "{1} бросает нож в грудь {2T}.", - "Ловушка {1} убивает {2T}.", - "", - "{1T} не может убедить {2} не убивать его/её.", - "", - "{1T} падает в замёрзшее озеро и тонет.", - "{1}, {2} и {3T} начинают сражаться, но {2} убегает, когда {1} убивает {3T}.", - "{1} убивает {2T} его/её же собственным оружием.", - "", - "{1} приводит в действие взрывчатку, убивая {2T}.", - "{1} приводит в действие взрывчатку, убивая {2T} и {3T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T} и {4T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T}, {4T} и {5T}.", - "", - "{1T} и {2T} угрожают двойным самоубийством. Это не срабатывает, и они умирают.", - "", - "{1T} умирает от переохлаждения.", - "{1T} умирает от голода.", - "{1T} умирает от жажды.", - "{1} убивает {2T} топором.", - "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", - "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", - "{1T} погибает, пытаясь сбежать с арены.", - "{1T} умирает от дизентерии.", - "", - "{1T} атакует {2}, но {3} защищает его/её, убивая {1T}.", - "", - "{1T} случайно наступает на мину.", - "", - "{1} душит {2T} верёвкой.", - "{1} убивает {2T} за его/её припасы.", - "{1} пускает стрелу в {2}, но промахивается и убивает {3T}.", - "", - "", - "", - "{1} вонзает в {2T} ветку дерева.", - "{1} заставляет {2} убить {3T} или {4}. Он/а решает убить {3T}.", - "{1} заставляет {2} убить {3} или {4T}. Он/а решает убить {4T}.", - "", - "", - "{1} подмешивает яд в напиток {2T}. Он/а выпивает его и умирает.", - "{1} вонзает трезубец в спину {2T}.", - "", - "{1}, {2T} и {3T} затевают драку. {1} торжествующе убивает остальных.", - "{1T}, {2} и {3T} затевают драку. {2} торжествующе убивает остальных.", - "{1T}, {2T} и {3} затевают драку. {3} торжествующе убивает остальных.", - "{1} убивает {2T} серпом.", - "{1}, {2}, {3}, {4} и {5} выслеживают и убивают {6T}.", - "{1}, {2}, {3} и {4} выслеживают и убивают {5T}.", - "{1}, {2} и {3} выслеживают и убивают {4T}.", - "{1} и {2} выслеживают и убивают {3T}.", - "{1} выслеживает и убивает {2T}.", - "", - "", - "{1} гоняется за бабочкой.", - "", - "{1} сталкивается с {2}, они решают объединиться.", - "{1} видит {2} сквозь деревья и планирует убить его/её.", - "{1} подкрадывается к {2T} сзади и сворачивает ему/ей шею.", - "{1T} вызывает {2} на бой и быстро погибает.", - "" - ], - "hgNight": [ - "{1} разжигает огонь.", - "{1} разбивает лагерь на ночь.", - "", - "{1} забирается на дерево, чтобы отдохнуть.", - "", - "{1} и {2} рассказывают друг другу истории о себе.", - "{1}, {2}, {3} и {4} спят по очереди.", - "{1}, {2} и {3} спят по очереди.", - "{1} и {2} спят по очереди.", - "{1} занимается своими ранами.", - "", - "{1} кричит о помощи.", - "{1} бодрствует всю ночь.", - "{1} теряет сознание от истощения.", - "", - "", - "", - "{1}, {2} и {3} обсуждают Игры и то, что может произойти утром.", - "", - "", - "{1} и {2} разговаривают о трибутах, которые ещё живы.", - "{1} просыпается из-за ночных кошмаров.", - "", - "{1} думает о победе.", - "{1}, {2}, {3} и {4} рассказывают друг другу истории о привидениях, чтобы поднять настроение.", - "{1} смотрит на ночное небо.", - "{1} побеждает {2} в бою, но сохраняет ему/ей жизнь.", - "{1} умоляет {2} убить его/её. Он/а отказывается, оставляя {1} в живых.", - "{1} уничтожает припасы {2}, пока он/а спит.", - "{1}, {2}, {3}, {4} и {5} спят по очереди.", - "", - "{1} получает топор от неизвестного спонсора.", - "{1} получает чистую воду от неизвестного спонсора.", - "{1} получает медикаменты от неизвестного спонсора.", - "{1} получает свежую пищу от неизвестного спонсора.", - "", - "{1} пытается разжечь огонь, но безуспешно.", - "{1} думает о доме.", - "{1} занимается ранами {2}.", - "", - "", - "", - "{1} и {2} держатся за руки.", - "{1} убеждает {2} прижаться к нему/ней.", - "{1} получает взрывчатку от неизвестного спонсора.", - "{1} подвергает сомнению своё здравомыслие.", - "{1} заставляет {2} есть штаны.", - "{1} заставляет {2T} есть штаны. {2T} давится и умирает.", - "{1} застаёт {2T} врасплох и убивает его/её.", - "{1} бросает нож в голову {2T}.", - "", - "{1} и {2} действуют сообща для того, чтобы утопить {3T}.", - "{1} душит {2T} после кулачного боя.", - "{1} выпускает стрелу в голову {2T}.", - "{1T} истекает кровью из-за необработанных ран.", - "{1T} не может справиться с обстоятельствами и совершает самоубийство.", - "{1} ударяет {2T} головой о камень несколько раз.", - "{1T} по незнанию съедает ядовитые ягоды.", - "", - "", - "{1} обезглавливает {2T} мечом.", - "{1T} умирает от инфекции.", - "{1} вонзает копьё в живот {2T}.", - "{1} поджигает {2T} с помощью «коктейля Молотова».", - "{1T} падает в яму и умирает.", - "", - "{1} тяжело ранит {2T}, но избавляет его/её от мучений.", - "{1} тяжело ранит {2T} и оставляет его/её умирать.", - "{1} разбивает голову {2T} булавой.", - "{1T} пытается забраться на дерево, но разбивается насмерть.", - "{1} сталкивает {2T} со скалы во время боя на ножах.", - "{1} бросает нож в грудь {2T}.", - "Ловушка {1} убивает {2T}.", - "", - "{1T} не может убедить {2} не убивать его/её.", - "", - "{1T} падает в замёрзшее озеро и тонет.", - "{1}, {2} и {3T} начинают сражаться, но {2} убегает, когда {1} убивает {3T}.", - "{1} убивает {2T} его/её же собственным оружием.", - "", - "{1} приводит в действие взрывчатку, убивая {2T}.", - "{1} приводит в действие взрывчатку, убивая {2T} и {3T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T} и {4T}.", - "{1} приводит в действие взрывчатку, убивая {2T}, {3T}, {4T} и {5T}.", - "", - "{1T} и {2T} угрожают двойным самоубийством. Это не срабатывает, и они умирают.", - "", - "{1T} умирает от переохлаждения.", - "{1T} умирает от голода.", - "{1T} умирает от жажды.", - "{1} убивает {2T} топором.", - "{1} и {2} сражаются с {3T} и {4T}. {1} и {2} выживают.", - "{1T} и {2T} сражаются с {3} и {4}. {3} и {4} выживают.", - "{1T} погибает, пытаясь сбежать с арены.", - "{1T} умирает от дизентерии.", - "", - "{1T} атакует {2}, но {3} защищает его/её, убивая {1T}.", - "", - "{1T} случайно наступает на мину.", - "", - "{1} душит {2T} верёвкой.", - "{1} убивает {2T} за его/её припасы.", - "{1} пускает стрелу в {2}, но промахивается и убивает {3T}.", - "", - "", - "", - "{1} вонзает в {2T} ветку дерева.", - "{1} заставляет {2} убить {3T} или {4}. Он/а решает убить {3T}.", - "{1} заставляет {2} убить {3} или {4T}. Он/а решает убить {4T}.", - "", - "", - "{1} подмешивает яд в напиток {2T}. Он/а выпивает его и умирает.", - "{1} вонзает трезубец в спину {2T}.", - "", - "{1}, {2T} и {3T} затевают драку. {1} торжествующе убивает остальных.", - "{1T}, {2} и {3T} затевают драку. {2} торжествующе убивает остальных.", - "{1T}, {2T} и {3} затевают драку. {3} торжествующе убивает остальных.", - "{1} убивает {2T} серпом.", - "{1}, {2}, {3}, {4} и {5} выслеживают и убивают {6T}.", - "{1}, {2}, {3} и {4} выслеживают и убивают {5T}.", - "{1}, {2} и {3} выслеживают и убивают {4T}.", - "{1} и {2} выслеживают и убивают {3T}.", - "{1} выслеживает и убивает {2T}.", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "Спасибо за игру, {{username}}! Я буду здесь, когда вы захотите сыграть снова.", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "Ваше число - {{number}}. Следующее число будет больше или меньше?", - "footer": "", - "title": "Больше или Меньше? | Ход {{turn}}" - }, - "higherLowerExtended": { - "usages": [ - "Ставка" - ], - "extendedHelp": "", - "examples": [ - "50", - "200" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "Удачи в следующий раз!", - "title": "Вы проиграли!" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "Действуйте быстро! У вас не так много времени.", - "title": "Вы выиграли!" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "Пользователь1 Пользователь2 Пользователь3...", - "--autofill" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "Ночь {{game.turn}}", - "hungerGamesResultHeaderSun": "День {{game.turn}}", - "hungerGamesResultProceed": "Продолжить?", - "hungerGamesStop": "", - "hungerGamesWinner": "И победитель... {{winner}}!", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "Вы проиграли", - "slotmachineCanvasTextWon": "Вы выиграли", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "Ставка" - ], - "explainedUsage": [ - [ - "Ставка", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "Этот матч завершился **ничьей**!\n{{board}}", - "ticTacToeExtended": { - "usages": [ - "Пользователь" - ], - "extendedHelp": "", - "examples": [ - "Skyra" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "Победитель... {{winner}}!\n{{board}}", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "Сложность", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "Категория", - "Категория multiple/boolean/truefalse", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Категория", - "Категория, из которой задаются вопросы." - ], - [ - "multiple/boolean/truefalse", - "" - ], - [ - "easy/medium/hard", - "Уровень сложности задаваемых вопросов." - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "Вы проиграли", - "wheelOfFortuneCanvasTextWon": "Вы выиграли", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "Ставка" - ], - "extendedHelp": "", - "examples": [ - "50", - "200" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/general.json b/src/languages/ru-RU/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/ru-RU/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/google.json b/src/languages/ru-RU/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/ru-RU/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/management.json b/src/languages/ru-RU/commands/management.json deleted file mode 100644 index d68af091668..00000000000 --- a/src/languages/ru-RU/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "Разрешения для: __{{name}}__", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "Каналы", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "Разрешения" - }, - "roleInfoData": "", - "roleInfoAll": "Все разрешения предоставлены.", - "roleInfoNoPermissions": "Разрешения не предоставлены.", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "Это слово уже фильтруется.", - "filterNotFiltered": "Это слово не фильтруется.", - "filterAdded": "{{GREENTICK}} Успешно! Слово {{word}} добавлено в фильтр.", - "filterRemoved": "{{GREENTICK}} Успешно! Слово {{word}} удалено из фильтра.", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "{{GREENTICK}} Успешно! Команды в {{channel}} больше не будут автоматически удаляться!", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "Команда, которую вы пытаетесь включить, не была отключена для {{channel}}.", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "канал", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "канал", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "роли", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/misc.json b/src/languages/ru-RU/commands/misc.json deleted file mode 100644 index 8b98bb0f1e9..00000000000 --- a/src/languages/ru-RU/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "Omae wa mou shindeiru.", - "shindeiruExtended": { - "usages": [ - "Пользователь" - ], - "extendedHelp": "\"Ты уже мёртв\", по-японски: お前はもう死んでいる; Omae Wa Mou Shindeiru, - это выражение из манги и аниме \"Кулак Северной звезды\".\nЭта команда показывает комикс-стрип с персонажем, произносящим вышеупомянутые слова, что заставляет оппонента ответить \"nani?\" (\"что?\").", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/moderation.json b/src/languages/ru-RU/commands/moderation.json deleted file mode 100644 index 5b0fd9ed2b0..00000000000 --- a/src/languages/ru-RU/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "Разрешения для {{username}} ({{id}})", - "permissionsAll": "Все разрешения", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "Ударьте кого-нибудь банхаммером.", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "Измените никнейм пользователя.", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/social.json b/src/languages/ru-RU/commands/social.json deleted file mode 100644 index f7704616897..00000000000 --- a/src/languages/ru-RU/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "Вы ещё не купили этот баннер.", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "Уровень", - "experience": "Опыт", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "Вы собираетесь заплатить {{user}} {{amount}}{{SHINY}}, вы уверены, что хотите продолжить?", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "Репутация", - "experience": "Опыт", - "level": "Уровень" - }, - "profileMoney": "{{money, numberCompact}} | {{vault, numberCompact}}", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "Цвет изменён на {{color}}", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "Настройте баннер для своего профиля.", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "Проверьте свой текущий баланс.", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "Проверьте свой глобальный уровень.", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "Сколько до следующего уровня?", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "Проверьте свой локальный уровень.", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "пользователь", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "пользователь", - "" - ] - ], - "examples": [ - "200 @kyra", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "Управляйте своими напоминаниями.", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "ID", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "Пользователь", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "@kyra", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Цвет", - "" - ] - ], - "possibleFormats": [ - [ - "HEX", - "#dfdfdf" - ], - [ - "RGB", - "rgb(200, 200, 200)" - ], - [ - "HSL", - "hsl(350, 100, 100)" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/starwars.json b/src/languages/ru-RU/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/ru-RU/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/suggestion.json b/src/languages/ru-RU/commands/suggestion.json deleted file mode 100644 index 9a1878d49ab..00000000000 --- a/src/languages/ru-RU/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "Установите статус предложения.", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "Администратор", - "resolveSuggestionAuthorModerator": "Модератор", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "{{GREENTICK}} Предложение `{{id}}` успешно {{actionText}}!", - "resolveSuggestionSuccessAcceptedText": "принято", - "resolveSuggestionSuccessDeniedText": "отклонено", - "resolveSuggestionSuccessConsideredText": "рассмотрено" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/system.json b/src/languages/ru-RU/commands/system.json deleted file mode 100644 index e6c31965a40..00000000000 --- a/src/languages/ru-RU/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "**Ошибка**:{{output}}\n**Тип**:{{type}}\n{{time}}", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "Я отправила вам личное сообщение.", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "Перезагружает бота.", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/tags.json b/src/languages/ru-RU/commands/tags.json deleted file mode 100644 index cc35a1fcce2..00000000000 --- a/src/languages/ru-RU/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "Тег '{{tag}}' уже существует.", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "Список тегов для этого сервера пуст.", - "nameNotAllowed": "Название тега не может содержать гравис или невидимые символы.", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "Тег **{{name}}** успешно удалён.", - "renamed": "", - "reset": "Все теги были успешно удалены с этого сервера.", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/tools.json b/src/languages/ru-RU/commands/tools.json deleted file mode 100644 index 6b5a607f2a5..00000000000 --- a/src/languages/ru-RU/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "Просмотрите чей-либо аватар в полном размере.", - "avatarExtended": { - "usages": [ - "", - "Пользователь" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Пользователь", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "HEX: **{{hex}}**\nRGB: **{{rgb}}**\nHSL: **{{hsl}}**", - "colorDescription": "", - "colorExtended": { - "usages": [ - "Цвет", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Цвет", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "rgb(200, 130, 75)" - ], - "possibleFormats": [ - [ - "HEX", - "#dfdfdf" - ], - [ - "RGB", - "rgb(200, 200, 200)" - ], - [ - "HSL", - "hsl(350, 100, 100)" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "Сообщение", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "Показывает информацию о стране.", - "countryExtended": { - "usages": [ - "Страна" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Страна", - "Название страны." - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "Площадь", - "currencies": "Валюты", - "demonym": "" - }, - "overview": { - "capital": "Столица", - "officialName": "", - "population": "Население" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "Языки", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "Эмодзи" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Эмодзи", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "Слово" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Слово", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "Произношение", - "defineUnknown": "", - "emojiCustom": "→ `Эмодзи ::` **{{emoji}}**\n→ `Тип ::` **Пользовательский**\n→ `ID ::` **{{id}}**", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "Эмодзи" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Эмодзи", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Запрос", - "Название игры, которую вы ищете." - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "Бесплатно", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "Количество игроков", - "platform": "Платформа", - "price": "Стоимость", - "releaseDate": "Дата выпуска" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "Эта команда обращается к IGDB API, чтобы показать информацию о ваших любимых играх.", - "explainedUsage": [ - [ - "Запрос", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "Разработчик(и)", - "genres": "Жанр(ы)", - "platform": "", - "releaseDate": "Дата выпуска", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "Эта команда обращается к Apple iTunes API, чтобы показать информацию о запрошенной вами музыке.", - "explainedUsage": [ - [ - "Запрос", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "Исполнитель", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "Нажмите здесь", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "Нажмите здесь", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Запрос", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "Жанры", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Запрос", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "Жанры", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "Слово", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Слово", - "" - ], - [ - "Страница", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "Вопрос" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "Вопрос", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "Кто вы?", - "whoisExtended": { - "usages": [ - "", - "Пользователь" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Пользователь", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "ID: {{member.id}}", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "Все разрешения", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "ID: {{user.id}}" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "Страница" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Страница", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "Запрос" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "Запрос", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/commands/twitch.json b/src/languages/ru-RU/commands/twitch.json deleted file mode 100644 index 65d895a8777..00000000000 --- a/src/languages/ru-RU/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "Просмотры", - "clickToVisit": "Нажмите, чтобы перейти в канал стримера", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/ru-RU/errors.json b/src/languages/ru-RU/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/errors.json b/src/languages/ru-RU/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/guilds-logs.json b/src/languages/ru-RU/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/guilds-members.json b/src/languages/ru-RU/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/messages.json b/src/languages/ru-RU/events/messages.json deleted file mode 100644 index 905c8d5486c..00000000000 --- a/src/languages/ru-RU/events/messages.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "messageDelete": "Сообщение удалено • {{channel}}", - "messageUpdate": "Сообщение изменено • {{channel}}" -} \ No newline at end of file diff --git a/src/languages/ru-RU/events/moderation.json b/src/languages/ru-RU/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/noMentionSpam.json b/src/languages/ru-RU/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/events/reactions.json b/src/languages/ru-RU/events/reactions.json deleted file mode 100644 index f53f8af55b0..00000000000 --- a/src/languages/ru-RU/events/reactions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "reaction": "Реакция добавлена", - "filterFooter": "Отфильтрованная реакция", - "filter": "{{REDCROSS}} Эй, {{user}}, пожалуйста, не добавляйте эту реакцию!" -} \ No newline at end of file diff --git a/src/languages/ru-RU/events/twitch.json b/src/languages/ru-RU/events/twitch.json deleted file mode 100644 index 095cb8ada00..00000000000 --- a/src/languages/ru-RU/events/twitch.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "embedDescription": "{{userName}} сейчас в эфире!", - "embedDescriptionWithGame": "{{userName}} сейчас в эфире - Стримит {{gameName}}!" -} \ No newline at end of file diff --git a/src/languages/ru-RU/fuzzySearch.json b/src/languages/ru-RU/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/globals.json b/src/languages/ru-RU/globals.json deleted file mode 100644 index be408669619..00000000000 --- a/src/languages/ru-RU/globals.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "defaultLanguage": "Язык по умолчанию", - "no": "Нет", - "yes": "Да", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}" -} \ No newline at end of file diff --git a/src/languages/ru-RU/guilds.json b/src/languages/ru-RU/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/humanLevels.json b/src/languages/ru-RU/humanLevels.json deleted file mode 100644 index 64180985129..00000000000 --- a/src/languages/ru-RU/humanLevels.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "LOW": "Низкий", - "MEDIUM": "Средний", - "HIGH": "Высокий", - "VERY_HIGH": "Самый высокий" -} \ No newline at end of file diff --git a/src/languages/ru-RU/moderation.json b/src/languages/ru-RU/moderation.json deleted file mode 100644 index 1ab54e347ba..00000000000 --- a/src/languages/ru-RU/moderation.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "logDescriptionWithReason": "❯ **Причина:** {{data.reason}}{{data.formattedDuration}}" -} \ No newline at end of file diff --git a/src/languages/ru-RU/moderationActions.json b/src/languages/ru-RU/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/ru-RU/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/ru-RU/permissions.json b/src/languages/ru-RU/permissions.json deleted file mode 100644 index fa05588e73f..00000000000 --- a/src/languages/ru-RU/permissions.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ADD_REACTIONS": "Добавлять реакции", - "ADMINISTRATOR": "Администратор", - "ATTACH_FILES": "Прикреплять файлы", - "BAN_MEMBERS": "Банить участников", - "CHANGE_NICKNAME": "Изменить никнейм", - "CONNECT": "Подключаться", - "DEAFEN_MEMBERS": "Отключать участникам звук", - "EMBED_LINKS": "Встраивать ссылки", - "KICK_MEMBERS": "Выгонять участников", - "MANAGE_CHANNELS": "Управлять каналами", - "MANAGE_EMOJIS_AND_STICKERS": "Управлять эмодзи", - "MANAGE_GUILD": "Управлять сервером", - "MANAGE_MESSAGES": "Управлять сообщениями", - "MANAGE_NICKNAMES": "Управлять никнеймами", - "MANAGE_ROLES": "Управлять ролями", - "MANAGE_WEBHOOKS": "Управлять вебхуками", - "MOVE_MEMBERS": "Перемещать участников", - "MUTE_MEMBERS": "Отключать участникам микрофон", - "PRIORITY_SPEAKER": "Приоритетный режим", - "READ_MESSAGE_HISTORY": "Читать историю сообщений", - "SEND_MESSAGES": "Отправлять сообщения", - "SPEAK": "Говорить", - "USE_EXTERNAL_EMOJIS": "Использовать внешние эмодзи", - "USE_VAD": "Использовать режим активации по голосу", - "VIEW_AUDIT_LOG": "Просматривать журнал аудита" -} \ No newline at end of file diff --git a/src/languages/ru-RU/preconditions.json b/src/languages/ru-RU/preconditions.json deleted file mode 100644 index f2dd20167de..00000000000 --- a/src/languages/ru-RU/preconditions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "cooldown": "Вы только что использовали эту команду. Вы сможете использовать эту команду снова через {{remaining, duration}}.", - "permissionNodes": "{{REDCROSS}} У вас нет разрешения на использование этой команды!" -} \ No newline at end of file diff --git a/src/languages/ru-RU/promptList.json b/src/languages/ru-RU/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/selfModeration.json b/src/languages/ru-RU/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/serializers.json b/src/languages/ru-RU/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/settings.json b/src/languages/ru-RU/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/ru-RU/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/ru-RU/system.json b/src/languages/ru-RU/system.json deleted file mode 100644 index b407479fd1d..00000000000 --- a/src/languages/ru-RU/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "Выберите один из следующих вариантов: {{output, orList}}", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "Перейти к сообщению ►", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/arguments.json b/src/languages/sl-SI/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/sl-SI/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/arguments/image.json b/src/languages/sl-SI/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/arguments/range.json b/src/languages/sl-SI/arguments/range.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/arguments/range.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/assertions.json b/src/languages/sl-SI/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/colors.json b/src/languages/sl-SI/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/commands/admin.json b/src/languages/sl-SI/commands/admin.json deleted file mode 100644 index c3e4e72bc99..00000000000 --- a/src/languages/sl-SI/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "", - "confUpdated": "", - "confGetNoExt": "", - "confGet": "", - "confReset": "", - "confNochange": "", - "confServerDescription": "", - "confServerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "", - "confDashboardOnlyKey": "", - "confSettingNotSet": "", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/animal.json b/src/languages/sl-SI/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/sl-SI/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/animation.json b/src/languages/sl-SI/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/sl-SI/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/fun.json b/src/languages/sl-SI/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/sl-SI/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/game.json b/src/languages/sl-SI/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/sl-SI/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/general.json b/src/languages/sl-SI/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/sl-SI/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/google.json b/src/languages/sl-SI/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/sl-SI/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/management.json b/src/languages/sl-SI/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/sl-SI/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/misc.json b/src/languages/sl-SI/commands/misc.json deleted file mode 100644 index 094bef1e4ab..00000000000 --- a/src/languages/sl-SI/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "uporabnik", - "" - ] - ], - "examples": [ - "Skyra" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "uporabnik", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/moderation.json b/src/languages/sl-SI/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/sl-SI/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/social.json b/src/languages/sl-SI/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/sl-SI/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/starwars.json b/src/languages/sl-SI/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/sl-SI/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/suggestion.json b/src/languages/sl-SI/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/sl-SI/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/system.json b/src/languages/sl-SI/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/sl-SI/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/tags.json b/src/languages/sl-SI/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/sl-SI/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/tools.json b/src/languages/sl-SI/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/sl-SI/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/commands/twitch.json b/src/languages/sl-SI/commands/twitch.json deleted file mode 100644 index b61bbafc8d5..00000000000 --- a/src/languages/sl-SI/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "Partner" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "Neznano", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "riotgames" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "remove kyranet #twitch online", - "reset kyranet", - "reset", - "show kyranet", - "show" - ] - } -} \ No newline at end of file diff --git a/src/languages/sl-SI/errors.json b/src/languages/sl-SI/errors.json deleted file mode 100644 index fd77ad4d5e9..00000000000 --- a/src/languages/sl-SI/errors.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "userNotInGuild": "Ta uporabnik ni v tem serverju." -} \ No newline at end of file diff --git a/src/languages/sl-SI/events/errors.json b/src/languages/sl-SI/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/guilds-logs.json b/src/languages/sl-SI/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/guilds-members.json b/src/languages/sl-SI/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/messages.json b/src/languages/sl-SI/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/moderation.json b/src/languages/sl-SI/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/noMentionSpam.json b/src/languages/sl-SI/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/reactions.json b/src/languages/sl-SI/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/events/twitch.json b/src/languages/sl-SI/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/fuzzySearch.json b/src/languages/sl-SI/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/globals.json b/src/languages/sl-SI/globals.json deleted file mode 100644 index e602a6c5f33..00000000000 --- a/src/languages/sl-SI/globals.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "default": "{{key}} še ni lokaliziran za sl-SI.", - "defaultLanguage": "Prevzeti Jezik", - "no": "Ne", - "none": "Nič", - "unknown": "neznano", - "yes": "Da", - "ordinalValue": "{{value, ordinal}}", - "durationValue": "{{value, duration}}", - "numberValue": "{{value, number}}", - "numberCompactValue": "{{value, numberCompact}}", - "dateTimeValue": "{{value, dateTime}}", - "andListValue": "{{value, andList}}", - "orListValue": "{{value, orList}}" -} \ No newline at end of file diff --git a/src/languages/sl-SI/guilds.json b/src/languages/sl-SI/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/humanLevels.json b/src/languages/sl-SI/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/moderation.json b/src/languages/sl-SI/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/moderationActions.json b/src/languages/sl-SI/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/sl-SI/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/sl-SI/permissions.json b/src/languages/sl-SI/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/preconditions.json b/src/languages/sl-SI/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/promptList.json b/src/languages/sl-SI/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/selfModeration.json b/src/languages/sl-SI/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/serializers.json b/src/languages/sl-SI/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/settings.json b/src/languages/sl-SI/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/sl-SI/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/sl-SI/system.json b/src/languages/sl-SI/system.json deleted file mode 100644 index e03ec20e1d4..00000000000 --- a/src/languages/sl-SI/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "Poslala rezultat v konzolo.", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "Poslala rezultat kot datoteko.", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "Skoči do Sporočila ►", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/arguments.json b/src/languages/tr-TR/arguments.json deleted file mode 100644 index ce76a5c8efc..00000000000 --- a/src/languages/tr-TR/arguments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "all": "", - "boolean_one": "", - "boolean_other": "", - "booleanError": "", - "booleanDisabled": "", - "booleanEnabled": "", - "booleanFalseOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "booleanTrueOptions": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "caseLatestOptions": [ - "", - "" - ], - "categoryChannelError": "", - "channelError": "", - "color": "", - "command": "", - "commandMatch": "", - "dateError": "", - "dateFormats": "", - "dateTooEarly": "", - "dateTooFar": "", - "dmChannelError": "", - "duration": "", - "durationFormats": "", - "emoji": "", - "floatError": "", - "floatTooLarge": "", - "floatTooSmall": "", - "guildChannelError": "", - "guildChannelMissingGuildError": "", - "guildPrivateThreadChannelError": "", - "guildPublicThreadChannelError": "", - "guildStageVoiceChannelError": "", - "guildTextChannelError": "", - "guildThreadChannelError": "", - "guildVoiceChannelError": "", - "hyperlinkError": "", - "integerError": "", - "integerTooLarge": "", - "integerTooSmall": "", - "invite": "", - "language": "", - "memberError": "", - "memberMissingGuild": "", - "messageError": "", - "missing": "", - "newsChannel": "", - "numberError": "", - "numberTooLarge": "", - "numberTooSmall": "", - "piece": "", - "resetPossibles": [ - "", - "" - ], - "roleError": "", - "roleMissingGuild": "", - "scopeGlobal": "", - "scopeLocal": "", - "snowflake": "", - "store": "", - "stringTooLong": "", - "stringTooShort": "", - "time": "", - "timeSpan": "", - "timeSpanTooBig": "", - "timeSpanTooSmall": "", - "tooFewWinners": "", - "tooManyWinners": "", - "unavailable": "", - "userError": "", - "wager": "", - "winners": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/arguments/image.json b/src/languages/tr-TR/arguments/image.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/arguments/image.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/arguments/range.json b/src/languages/tr-TR/arguments/range.json deleted file mode 100644 index 1fa4722e2cf..00000000000 --- a/src/languages/tr-TR/arguments/range.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "invalid": "{{name}} bir sayı veya bir sayı aralığı olmalıdır." -} \ No newline at end of file diff --git a/src/languages/tr-TR/assertions.json b/src/languages/tr-TR/assertions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/assertions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/colors.json b/src/languages/tr-TR/colors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/colors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/commands/admin.json b/src/languages/tr-TR/commands/admin.json deleted file mode 100644 index 3ad2f5cea35..00000000000 --- a/src/languages/tr-TR/commands/admin.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "confGuarded": "{{name, toTitleCase}} devre dışı bırakılamaz.", - "confUpdated": "", - "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": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "confServer": "**Sunucu Ayarı {{key}}**\n {{list}}", - "confDashboardOnlyKey": "`{{key}}` yalnızca web kontrol paneli () üzerinden yapılandırılabilir", - "confSettingNotSet": "Ayarlanmamış", - "rolesetDescription": "", - "rolesetExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "rolesetCreated": "", - "rolesetAdded": "", - "rolesetRemoved": "", - "rolesetResetEmpty": "", - "rolesetResetAll": "", - "rolesetResetNotExists": "", - "rolesetResetGroup": "", - "rolesetUpdated": "", - "rolesetNoRolesets": "", - "confMenuRenderAtFolder": "", - "confMenuRenderAtPiece": "", - "confMenuRenderNokeys": "", - "confMenuRenderSelect": "", - "confMenuRenderUpdate": "", - "confMenuRenderRemove": "", - "confMenuRenderReset": "", - "confMenuRenderUndo": "", - "confMenuRenderCvalue": "", - "confMenuRenderBack": "", - "confMenuInvalidKey": "", - "confMenuInvalidAction": "", - "confMenuSaved": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/animal.json b/src/languages/tr-TR/commands/animal.json deleted file mode 100644 index 42f04c27104..00000000000 --- a/src/languages/tr-TR/commands/animal.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "catfactDescription": "", - "catfactExtended": { - "extendedHelp": "" - }, - "catfactTitle": "", - "dogDescription": "", - "dogExtended": { - "extendedHelp": "" - }, - "foxDescription": "", - "foxExtended": { - "extendedHelp": "" - }, - "kittyDescription": "", - "kittyExtended": { - "extendedHelp": "" - }, - "shibeDescription": "", - "shibeExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/animation.json b/src/languages/tr-TR/commands/animation.json deleted file mode 100644 index 4fd443696bb..00000000000 --- a/src/languages/tr-TR/commands/animation.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "aniListAnimeDescription": "", - "aniListAnimeExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "aniListAnimeQueryFail": "", - "aniListMangaDescription": "", - "aniListMangaExtended": [], - "aniListMangaQueryFail": "", - "aniListQueryOnlyNsfw": "", - "aniListEmbedTitles": { - "adultContent": "", - "countryOfOrigin": "", - "englishName": "", - "episodeLength": "", - "episodes": "", - "chapters": "", - "volumes": "", - "externalLinks": "", - "nativeName": "", - "romajiName": "" - }, - "kitsuAnimeDescription": "", - "kitsuAnimeEmbedData": { - "ageRating": "", - "episodeLength": "", - "episodes": "", - "firstAirDate": "", - "score": "", - "stillAiring": "", - "type": "", - "watchIt": "" - }, - "kitsuAnimeExtended": { - "examples": [ - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuAnimeNoSynopsis": "", - "kitsuAnimeOutputDescription": "", - "kitsuAnimeTypes": { - "movie": "", - "ova": "", - "special": "", - "tv": "" - }, - "kitsuMangaDescription": "", - "kitsuMangaEmbedData": { - "ageRating": "", - "firstPublishDate": "", - "none": "", - "readIt": "", - "score": "", - "type": "" - }, - "kitsuMangaExtended": { - "examples": [ - "", - "" - ], - "extendedHelp": "", - "usages": [ - "" - ] - }, - "kitsuMangaOutputDescription": "", - "kitsuMangaTypes": { - "manga": "", - "manhwa": "", - "novel": "", - "oneShot": "", - "special": "" - }, - "waifuDescription": "", - "waifuExtended": { - "extendedHelp": "" - }, - "waifuFooter": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/fun.json b/src/languages/tr-TR/commands/fun.json deleted file mode 100644 index 2f85f3534ec..00000000000 --- a/src/languages/tr-TR/commands/fun.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "changemymindDescription": "", - "changemymindExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "choiceDescription": "", - "choiceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "diceDescription": "", - "diceExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "escaperopeDescription": "", - "escaperopeExtended": { - "extendedHelp": "" - }, - "loveDescription": "", - "loveExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "popDescription": "", - "popExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "popTitle": "", - "popTitleLost": "", - "popTitleWinner": "", - "rateDescription": "", - "rateExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "thinkDescription": "", - "thinkExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "" - ] - }, - "thinkMessage": "", - "wakandaDescription": "", - "wakandaExtended": { - "extendedHelp": "" - }, - "whereDescription": "", - "whereExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "whereMessage": "", - "xkcdDescription": "", - "xkcdExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "choiceOutput": "", - "choiceMissing": "", - "choiceDuplicates": "", - "diceOutput": "", - "diceRollsError": "", - "diceSidesError": "", - "escaperopeOutput": "", - "loveLess45": "", - "loveLess75": "", - "loveLess100": "", - "love100": "", - "loveItself": "", - "loveResult": "", - "rateOutput": "", - "rateMyself": [ - "", - "" - ], - "rateOwners": [ - "", - "" - ], - "xkcdComics": "", - "xkcdNotfound": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/game.json b/src/languages/tr-TR/commands/game.json deleted file mode 100644 index 1085322f51c..00000000000 --- a/src/languages/tr-TR/commands/game.json +++ /dev/null @@ -1,562 +0,0 @@ -{ - "c4Description": "", - "c4Extended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "c4Prompt": "", - "cannotHaveNegativeMoney": "", - "coinFlipHeadNames": [ - "", - "", - "" - ], - "coinFlipTailNames": [ - "", - "", - "" - ], - "coinFlipCoinNames": [ - "", - "" - ], - "coinFlipDescription": "", - "coinFlipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "coinFlipInvalidCoinName": "", - "coinFlipLoseDescription": "", - "coinFlipLoseDescriptionWithWager": "", - "coinFlipLoseTitle": "", - "coinFlipNoguessDescription": "", - "coinFlipNoguessTitle": "", - "coinFlipWinDescription": "", - "coinFlipWinDescriptionWithWager": "", - "coinFlipWinTitle": "", - "gamesBot": "", - "gamesNoPlayers": "", - "gamesProgress": "", - "gamesPromptDeny": "", - "gamesRepeat": "", - "gamesSelf": "", - "gamesTooManyOrFew": "", - "hgBloodbath": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgDay": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "hgNight": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "higherLowerCancel": { - "description": "", - "title": "" - }, - "higherLowerCashout": "", - "higherLowerDescription": "", - "higherLowerEmbed": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "higherLowerLoading": "", - "higherLowerLose": { - "description": "", - "footer": "", - "title": "" - }, - "higherLowerNewround": "", - "higherLowerWin": { - "description": "", - "footer": "", - "title": "" - }, - "hungerGamesDescription": "", - "hungerGamesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "" - ], - "reminder": "" - }, - "hungerGamesResultDeaths_one": "", - "hungerGamesResultDeaths_other": "", - "hungerGamesResultHeaderBloodbath": "", - "hungerGamesResultHeaderMoon": "", - "hungerGamesResultHeaderSun": "", - "hungerGamesResultProceed": "", - "hungerGamesStop": "", - "hungerGamesWinner": "", - "notEnoughMoney": "", - "slotmachineCanvasTextLost": "", - "slotmachineCanvasTextWon": "", - "slotmachineDescription": "", - "slotmachineExtended": { - "usages": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "", - "reminder": "" - }, - "slotmachinesLoss": "", - "slotmachinesWin": "", - "ticTacToeDescription": "", - "ticTacToeDraw": "", - "ticTacToeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "ticTacToePrompt": "", - "ticTacToeTurn": "", - "ticTacToeWinner": "", - "triviaActiveGame": "", - "triviaDescription": "", - "triviaEmbedTitles": { - "difficulty": "", - "trivia": "" - }, - "triviaExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "triviaIncorrect": "", - "triviaInvalidCategory": "", - "triviaNoAnswer": "", - "triviaWinner": "", - "wheelOfFortuneCanvasTextLost": "", - "wheelOfFortuneCanvasTextWon": "", - "wheelOfFortuneDescription": "", - "wheelOfFortuneExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "balanceDifference": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/general.json b/src/languages/tr-TR/commands/general.json deleted file mode 100644 index f7f6648012c..00000000000 --- a/src/languages/tr-TR/commands/general.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "helpAllFlag": "", - "helpCommandCount_one": "", - "helpCommandCount_other": "", - "helpData": { - "footer": "", - "title": "" - }, - "helpDescription": "", - "helpExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "reminder": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "helpDm": "", - "helpNodm": "", - "infoBody": "", - "infoDescription": "", - "infoExtended": { - "extendedHelp": "" - }, - "infoTitles": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoFields": { - "stats": "", - "uptime": "", - "serverUsage": "" - }, - "infoComponentLabels": { - "addToServer": "", - "supportServer": "", - "repository": "", - "donate": "" - }, - "inviteDescription": "", - "inviteExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "invitePermissionInviteText": "", - "invitePermissionsDescription": "", - "invitePermissionSupportServerText": "", - "ping": "", - "pingDescription": "", - "pingExtended": { - "extendedHelp": "" - }, - "pingPong": "", - "v7Description": "", - "v7Extended": { - "extendedHelp": "" - }, - "v7Message": "", - "v7IrissMessage": "", - "v7PokemonMessage": "", - "v7NekokaiMessage": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/google.json b/src/languages/tr-TR/commands/google.json deleted file mode 100644 index 0c3645ce104..00000000000 --- a/src/languages/tr-TR/commands/google.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "weatherDescription": "", - "weatherExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "weatherFahrenheit": "", - "weatherInches": "", - "weatherMiles": "", - "weatherMilesPerHour": "", - "weatherCelsius": "", - "weatherKelvin": "", - "weatherMillimeters": "", - "weatherPascal": "", - "weatherKilometers": "", - "weatherKilometersPerHour": "", - "weatherInvalidJsonBody": "", - "weatherUnknownLocation": "", - "weatherUnknownError": "", - "weatherBlockedLocation": "", - "weatherRateLimited": "", - "weatherRemoteServerError": "", - "weatherServiceUnavailable": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/management.json b/src/languages/tr-TR/commands/management.json deleted file mode 100644 index 94ecd4a6187..00000000000 --- a/src/languages/tr-TR/commands/management.json +++ /dev/null @@ -1,994 +0,0 @@ -{ - "commandModeEnable": "", - "commandModeDisable": "", - "commandModeActionAlert": "", - "commandModeActionLog": "", - "commandModeActionDelete": "", - "commandModePunishment": "", - "commandModePunishmentDuration": "", - "commandModeThreshold": "", - "commandModeThresholdDuration": "", - "commandModeReminder": "", - "commandHandlerAborted": "", - "permissionNodesHigher": "", - "permissionNodesCannotAllowEveryone": "", - "permissionNodesInvalidType": "", - "permissionNodesAdd": "", - "permissionNodesNodeNotExists": "", - "permissionNodesCommandNotExists": "", - "permissionNodesRemove": "", - "permissionNodesReset": "", - "permissionNodesShowName": "", - "permissionNodesShowAllow": "", - "permissionNodesShowDeny": "", - "guildInfoTitles": { - "CHANNELS": "", - "MEMBERS": "", - "OTHER": "" - }, - "guildInfoChannels": "", - "guildInfoChannelsAfkChannelText": "", - "guildInfoMembers": "", - "guildInfoOther": "", - "guildInfoBanner": "", - "guildInfoIcon": "", - "guildInfoSplash": "", - "guildInfoDiscoverySplash": "", - "roleInfoTitles": { - "PERMISSIONS": "" - }, - "roleInfoData": "", - "roleInfoAll": "", - "roleInfoNoPermissions": "", - "filterUndefinedWord": "", - "filterTooLong": "", - "filterAlreadyFiltered": "", - "filterNotFiltered": "", - "filterAdded": "", - "filterRemoved": "", - "filterReset": "", - "filterShowEmpty": "", - "filterShow": "", - "manageCommandAutoDeleteShowEmpty": "", - "manageCommandAutoDeleteShow": "", - "manageCommandAutoDeleteAdd": "", - "manageCommandAutoDeleteRemove": "", - "manageCommandAutoDeleteRemoveNotset": "", - "manageCommandAutoDeleteReset": "", - "manageCommandChannelShow": "", - "manageCommandChannelShowEmpty": "", - "manageCommandChannelAddAlreadyset": "", - "manageCommandChannelAdd": "", - "manageCommandChannelRemoveNotset": "", - "manageCommandChannelRemove": "", - "manageCommandChannelResetEmpty": "", - "manageCommandChannelReset": "", - "manageReactionRolesShowEmpty": "", - "manageReactionRolesAddChannel": "", - "manageReactionRolesAddPrompt": "", - "manageReactionRolesAddMissing": "", - "manageReactionRolesAdd": "", - "manageReactionRolesRemoveNotExists": "", - "manageReactionRolesRemove": "", - "manageReactionRolesResetEmpty": "", - "manageReactionRolesReset": "", - "configurationEquals": "", - "setIgnoreChannelsSet": "", - "setIgnoreChannelsRemoved": "", - "setImageLogsSet": "", - "setMemberAddLogsSet": "", - "setMemberRemoveLogsSet": "", - "setMessageUpdateLogsSet": "", - "setMessageDeleteLogsSet": "", - "setModLogsSet": "", - "setPrefixSet": "", - "stickyRolesNotExists": "", - "stickyRolesReset": "", - "stickyRolesRemove": "", - "stickyRolesAdd": "", - "stickyRolesShowEmpty": "", - "stickyRolesShowSingle": "", - "createMuteDescription": "", - "createMuteExtended": { - "extendedHelp": "" - }, - "permissionNodesDescription": "", - "permissionNodesExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "managecommandautodeleteDescription": "", - "managecommandautodeleteExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageCommandChannelDescription": "", - "manageCommandChannelExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "manageReactionRolesDescription": "", - "manageReactionRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "rolesAdded": "", - "rolesAuditlog": "", - "rolesListEmpty": "", - "rolesListTitle": "", - "rolesNotManageable": "", - "rolesNotPublic": "", - "rolesRemoved": "", - "setIgnoreChannelsDescription": "", - "setIgnoreChannelsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setImageLogsDescription": "", - "setImageLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "setMemberAddLogsDescription": "", - "setMemberAddLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMemberRemoveLogsDescription": "", - "setMemberRemoveLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "setMessageUpdateLogsDescription": "", - "setMessageUpdateLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setMessageDeleteLogsDescription": "", - "setMessageDeleteLogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setmodlogsDescription": "", - "setmodlogsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "setprefixDescription": "", - "setprefixExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - }, - "guildInfoDescription": "", - "guildInfoExtended": { - "extendedHelp": "" - }, - "roleInfoDescription": "", - "roleInfoExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "stickyRolesDescription": "", - "stickyRolesExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ], - "reminder": "" - }, - "attachmentsModeDescription": "", - "attachmentsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "capitalsModeDescription": "", - "capitalsModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "filterDescription": "", - "filterExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "filterModeDescription": "", - "filterModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "inviteModeDescription": "", - "inviteModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "linkModeDescription": "", - "linkModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "messageModeDescription": "", - "messageModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "newlineModeDescription": "", - "newlineModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "reactionModeDescription": "", - "reactionModeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "rolesDescription": "", - "rolesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/misc.json b/src/languages/tr-TR/commands/misc.json deleted file mode 100644 index c3db83ee1c1..00000000000 --- a/src/languages/tr-TR/commands/misc.json +++ /dev/null @@ -1,279 +0,0 @@ -{ - "randRedditInvalidArgument": "", - "randRedditBanned": "", - "randRedditFail": "", - "randRedditAllNsfw": "", - "randRedditAllNsfl": "", - "randRedditMessage": "", - "randRedditErrorPrivate": "", - "randRedditErrorQuarantined": "", - "randRedditErrorNotFound": "", - "randRedditErrorBanned": "", - "snipeEmpty": "", - "snipeTitle": "", - "skyrafactDescription": "", - "skyrafactExtended": { - "extendedHelp": "" - }, - "skyrafactTitle": "", - "skyrafactMessages": [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ], - "cannotTargetOwner": "", - "chaseDescription": "", - "chaseExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "cuddleDescription": "", - "cuddleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "deletthisDescription": "", - "deletthisExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "fDescription": "", - "fExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goodnightDescription": "", - "goodnightExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "goofytimeDescription": "", - "goofytimeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "hugDescription": "", - "hugExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "ineedhealingDescription": "", - "ineedhealingExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "randRedditDescription": "", - "randRedditExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "shipDescription": "", - "shipExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "shipData": { - "title": "", - "description": "" - }, - "shindeiruDescription": "", - "shindeiruExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "snipeDescription": "", - "snipeExtended": { - "extendedHelp": "" - }, - "thesearchDescription": "", - "thesearchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "triggeredDescription": "", - "triggeredExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/moderation.json b/src/languages/tr-TR/commands/moderation.json deleted file mode 100644 index 62454c41fe5..00000000000 --- a/src/languages/tr-TR/commands/moderation.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "permissions": "", - "permissionsAll": "", - "timeTimed": "", - "timeUnsupportedType": "", - "timeNotScheduled": "", - "timeAborted": "", - "timeScheduled": "", - "slowmodeSet": "", - "slowmodeReset": "", - "timeDescription": "", - "timeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "banNotBannable": "", - "dehoistStarting": "", - "dehoistProgress": "", - "dehoistEmbed": { - "title": "", - "descriptionNoone": "", - "descriptionWithError": "", - "descriptionWithMultipleErrors": "", - "description": "", - "descriptionMultipleMembers": "", - "fieldErrorTitle": "" - }, - "kickNotKickable": "", - "lockdownLock": "", - "lockdownLocking": "", - "lockdownLocked": "", - "lockdownUnlocked": "", - "lockdownOpen": "", - "muteMuted": "", - "muteUserNotMuted": "", - "restrictLowlevel": "", - "pruneAlert_one": "", - "pruneAlert_other": "", - "pruneInvalidPosition": "", - "pruneNoDeletes": "", - "pruneLogHeader": "", - "pruneLogMessage_one": "", - "pruneLogMessage_other": "", - "reasonNotExists": "", - "reasonUpdated_one": "", - "reasonUpdated_other": "", - "toggleModerationDmToggledEnabled": "", - "toggleModerationDmToggledDisabled": "", - "unbanMissingPermission": "", - "unmuteMissingPermission": "", - "vmuteMissingPermission": "", - "vmuteUserNotMuted": "", - "moderationOutput_one": "", - "moderationOutput_other": "", - "moderationOutputWithReason_one": "", - "moderationOutputWithReason_other": "", - "moderationFailed_one": "", - "moderationFailed_other": "", - "moderationDmFooter": "", - "moderationDmDescription": "", - "moderationDmDescriptionWithReason": "", - "moderationDmDescriptionWithDuration": "", - "moderationDmDescriptionWithReasonWithDuration": "", - "historyDescription": "", - "historyExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "historyFooterNew": "", - "historyFooterWarning_one": "", - "historyFooterWarning_other": "", - "historyFooterMutes_one": "", - "historyFooterMutes_other": "", - "historyFooterKicks_one": "", - "historyFooterKicks_other": "", - "historyFooterBans_one": "", - "historyFooterBans_other": "", - "moderationsDescription": "", - "moderationsExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "moderationsEmpty": "", - "moderationsAmount_one": "", - "moderationsAmount_other": "", - "mutesDescription": "", - "mutesExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warningsDescription": "", - "warningsExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "slowmodeDescription": "", - "slowmodeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "banDescription": "", - "banExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "dehoistDescription": "", - "dehoistExtended": { - "extendedHelp": "", - "reminder": "" - }, - "kickDescription": "", - "kickExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "lockdownDescription": "", - "lockdownExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "muteDescription": "", - "muteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "setNicknameDescription": "", - "setNicknameExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ], - "reminder": "" - }, - "addRoleDescription": "", - "addRoleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "removeroleDescription": "", - "removeroleExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "pruneDescription": "", - "pruneExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "caseDescription": "", - "caseExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "caseDeleted": "", - "permissionsDescription": "", - "permissionsExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ], - "extendedHelp": "" - }, - "reasonDescription": "", - "reasonExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "examples": [ - "", - "", - "", - "" - ] - }, - "restrictAttachmentDescription": "", - "restrictAttachmentExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictEmbedDescription": "", - "restrictEmbedExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictEmojiDescription": "", - "restrictEmojiExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "restrictReactionDescription": "", - "restrictReactionExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "restrictVoiceDescription": "", - "restrictVoiceExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "softBanDescription": "", - "softBanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "toggleModerationDmDescription": "", - "toggleModerationDmExtended": { - "extendedHelp": "" - }, - "unbanDescription": "", - "unbanExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unmuteDescription": "", - "unmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "unrestrictAttachmentDescription": "", - "unrestrictAttachmentExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmbedDescription": "", - "unrestrictEmbedExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictEmojiDescription": "", - "unrestrictEmojiExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictReactionDescription": "", - "unrestrictReactionExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unrestrictVoiceDescription": "", - "unrestrictVoiceExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - }, - "unwarnDescription": "", - "unwarnExtended": { - "usages": [ - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vmuteDescription": "", - "vmuteExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "", - "" - ] - }, - "voiceKickDescription": "", - "voiceKickExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "vunmuteDescription": "", - "vunmuteExtended": { - "usages": [ - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "", - "" - ] - }, - "warnDescription": "", - "warnExtended": { - "usages": [ - "", - "", - "", - "" - ], - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "extendedHelp": "", - "examples": [ - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/social.json b/src/languages/tr-TR/commands/social.json deleted file mode 100644 index c2d8face824..00000000000 --- a/src/languages/tr-TR/commands/social.json +++ /dev/null @@ -1,453 +0,0 @@ -{ - "autoRoleUpdateConfigured": "", - "autoRoleUpdateUnconfigured": "", - "autoRoleInvalidLevel": "", - "autoRoleInvalidNegativeOrZeroLevel": "", - "autoRoleTooLow": "", - "autoRoleTooHigh": "", - "autoRoleUpdate": "", - "autoRoleRemove": "", - "autoRoleAdd": "", - "autoRoleListEmpty": "", - "balance": "", - "balanceSelf": "", - "balanceBots": "", - "socialMemberNotexists": "", - "socialAdd_one": "", - "socialAdd_other": "", - "socialRemove_one": "", - "socialRemove_other": "", - "socialUnchanged": "", - "socialReset": "", - "socialResetAllPrompt": "", - "socialResetAllTimeOut": "", - "socialResetAllAborted": "", - "socialResetAllEmpty": "", - "socialResetAllSuccess_one": "", - "socialResetAllSuccess_other": "", - "bannerNotexists": "", - "bannerUserlistEmpty": "", - "bannerResetDefault": "", - "bannerReset": "", - "bannerSetNotBought": "", - "bannerSet": "", - "bannerBought": "", - "bannerMoney": "", - "bannerPaymentCancelled": "", - "bannerBuy": "", - "bannerAllOrUser": "", - "toggleDarkModeEnabled": "", - "toggleDarkModeDisabled": "", - "dailyTime": "", - "dailyTimeSuccess": "", - "dailyGrace": "", - "dailyGraceAccepted": "", - "dailyGraceDenied": "", - "dailyCollect": "", - "level": { - "level": "", - "experience": "", - "nextIn": "" - }, - "mylevel": "", - "mylevelSelf": "", - "mylevelNext": "", - "payMissingMoney": "", - "payPrompt": "", - "payPromptAccept": "", - "payPromptDeny": "", - "paySelf": "", - "socialPayBot": "", - "profile": { - "globalRank": "", - "credits": "", - "reputation": "", - "experience": "", - "level": "" - }, - "profileMoney": "", - "remindmeCreate": "", - "remindmeCreateNoDescription": "", - "remindmeDelete": "", - "remindmeListEmpty": "", - "remindmeShowFooter": "", - "remindmeInvalidId": "", - "remindmeNotfound": "", - "reputationTime": "", - "reputationUsable": "", - "reputationAvailable": "", - "reputationSelf": "", - "reputationGive": "", - "reputationsBots": "", - "reputationsSelf": "", - "reputation_one": "", - "reputation_other": "", - "reputations": "", - "scoreboardFooter": "", - "setColor": "", - "socialDescription": "", - "socialExtended": { - "usages": [ - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "bannerDescription": "", - "bannerExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "toggleDarkModeDescription": "", - "toggleDarkModeExtended": { - "extendedHelp": "" - }, - "autoRoleDescription": "", - "autoRoleExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - }, - "balanceDescription": "", - "balanceExtended": { - "usages": [ - "" - ], - "extendedHelp": "" - }, - "dailyDescription": "", - "dailyExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "reminder": "" - }, - "leaderboardDescription": "", - "leaderboardExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ], - "reminder": "" - }, - "leaderboardHeader": "", - "leaderboardNoEntries": "", - "leaderboardUnknownUser": "", - "levelDescription": "", - "levelExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "mylevelDescription": "", - "mylevelExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "payDescription": "", - "payExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "profileDescription": "", - "profileExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "remindmeDescription": "", - "remindmeExtended": { - "usages": [ - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "" - ] - }, - "reputationDescription": "", - "reputationExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "reminder": "", - "examples": [ - "", - "", - "", - "", - "", - "" - ] - }, - "setColorDescription": "", - "setColorExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "vaultDescription": "", - "vaultEmbedData": { - "accountMoney": "", - "accountVault": "", - "depositedDescription": "", - "showDescription": "", - "withdrewDescription": "" - }, - "vaultExtended": { - "usages": [ - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "vaultNotEnoughInVault": "", - "vaultNotEnoughMoney": "", - "vaultInvalidAll": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/starwars.json b/src/languages/tr-TR/commands/starwars.json deleted file mode 100644 index fd66462ebd5..00000000000 --- a/src/languages/tr-TR/commands/starwars.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "filmDescription": "", - "filmExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "filmQueryFail": "", - "filmEmbedTitles": { - "characters": "", - "creationDate": "", - "director": "", - "episodeId": "", - "planets": "", - "producers": "", - "releaseDate": "", - "species": "", - "starships": "", - "vehicles": "" - }, - "personDescription": "", - "personExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ], - "reminder": "" - }, - "personQueryFail": "", - "personEmbedTitles": { - "appearedInFilms": "", - "eyeColours": "", - "gender": "", - "hairColours": "", - "height": "", - "homeworld": "", - "mass": "", - "ownedStarShips": "", - "ownedVehicles": "", - "skinColours": "", - "species": "", - "yearOfBirth": "" - }, - "planetDescription": "", - "planetExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "planetQueryFail": "", - "planetEmbedTitles": { - "appearedInFilms": "", - "averageSentientPopulation": "", - "climates": "", - "diameter": "", - "gravity": "", - "gravityBody": "", - "orbitalPeriod": "", - "residents": "", - "rotationPeriod": "", - "surfaceWaterPercentage": "", - "terrains": "" - }, - "speciesDescription": "", - "speciesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "speciesQueryFail": "", - "speciesEmbedTitles": { - "appearedInFilms": "", - "averageHeight": "", - "averageLifespan": "", - "classification": "", - "designation": "", - "eyeColours": "", - "hairColours": "", - "homeworld": "", - "knownPeopleOfSpecies": "", - "language": "", - "skinColours": "" - }, - "starshipDescription": "", - "starshipExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "starshipQueryFail": "", - "starshipEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "hyperdriveRating": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "megalightsTravelSpeed": "", - "model": "", - "pilots": "", - "starshipClass": "" - }, - "vehicleDescription": "", - "vehicleExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "vehicleQueryFail": "", - "vehicleEmbedTitles": { - "amountOfPassengers": "", - "appearedInFilms": "", - "cargoCapacity": "", - "consumables": "", - "costInCredits": "", - "crew": "", - "length": "", - "manufacturers": "", - "maximumAtmospheringSpeed": "", - "model": "", - "pilots": "", - "vehicleClass": "" - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/suggestion.json b/src/languages/tr-TR/commands/suggestion.json deleted file mode 100644 index ccb9c9a6e04..00000000000 --- a/src/languages/tr-TR/commands/suggestion.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "suggestNoSetup": "", - "resolveSuggestionDescription": "", - "resolveSuggestionExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ], - "reminder": "" - }, - "resolveSuggestionInvalidId": "", - "resolveSuggestionInvalidAction": "", - "resolveSuggestionMessageNotFound": "", - "resolveSuggestionIdNotFound": "", - "resolveSuggestionDefaultComment": "", - "resolveSuggestionTooManyFields": "", - "resolveSuggestionTooManyCharacters": "", - "resolveSuggestionAuthorAdmin": "", - "resolveSuggestionAuthorModerator": "", - "resolveSuggestionActions": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionActionsDms": { - "accept": "", - "consider": "", - "deny": "" - }, - "resolveSuggestionDmFail": "", - "resolveSuggestionSuccess": "", - "resolveSuggestionSuccessAcceptedText": "", - "resolveSuggestionSuccessDeniedText": "", - "resolveSuggestionSuccessConsideredText": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/system.json b/src/languages/tr-TR/commands/system.json deleted file mode 100644 index 2c417108944..00000000000 --- a/src/languages/tr-TR/commands/system.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "evalDescription": "", - "evalExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "donateDescription": "", - "donateExtended": { - "extendedHelp": "" - }, - "evalTimeout": "", - "evalError": "", - "disable": "", - "disableDescription": "", - "disableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "disableWarn": "", - "dmNotSent": "", - "dmSent": "", - "enable": "", - "enableDescription": "", - "enableExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "reboot": "", - "rebootDescription": "", - "rebootExtended": { - "extendedHelp": "", - "reminder": "" - }, - "supportDescription": "", - "supportEmbedDescription": "", - "supportEmbedTitle": "", - "supportExtended": { - "extendedHelp": "" - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/tags.json b/src/languages/tr-TR/commands/tags.json deleted file mode 100644 index f692d4b508c..00000000000 --- a/src/languages/tr-TR/commands/tags.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "added": "", - "description": "", - "edited": "", - "exists": "", - "extended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - "listEmpty": "", - "nameNotAllowed": "", - "nameTooLong": "", - "notExists": "", - "cannotAlias": "", - "alias": "", - "permissionlevel": "", - "removed": "", - "renamed": "", - "reset": "", - "parseMismatchingNamedArgumentTypeValidation": "", - "parseParserEmptyStringTag": "", - "parseParserMissingToken": "", - "parseParserPickMissingOptions": "", - "parseParserRandomDuplicatedOptions": "", - "parseParserRandomMissingOptions": "", - "parseParserUnexpectedToken": "", - "parsePickInvalidOption": "", - "parseSentenceMissingArgument": "", - "parseTokenColon": "", - "parseTokenEquals": "", - "parseTokenLiteral": "", - "parseTokenPipe": "", - "parseTokenSpace": "", - "parseTokenTagEnd": "", - "parseTokenTagStart": "", - "parseTransformerInvalidFormatter": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/tools.json b/src/languages/tr-TR/commands/tools.json deleted file mode 100644 index 95a2dfe77e7..00000000000 --- a/src/languages/tr-TR/commands/tools.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "avatarDescription": "", - "avatarExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "avatarNone": "", - "color": "", - "colorDescription": "", - "colorExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "possibleFormats": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ] - }, - "contentDescription": "", - "contentExtended": { - "usages": [ - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "contentEmpty": "", - "countryDescription": "", - "countryExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "countryFields": { - "other": { - "area": "", - "currencies": "", - "demonym": "" - }, - "overview": { - "capital": "", - "officialName": "", - "population": "" - } - }, - "countryTimezone_one": "", - "countryTimezone_other": "", - "countryTitles": { - "LANGUAGES": "", - "OTHER": "", - "OVERVIEW": "" - }, - "createEmojiDescription": "", - "createEmojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ], - "reminder": "" - }, - "createEmojiInvalidDiscordEmoji": "", - "createEmojiDuplicate": "", - "createEmojiInvalidEmoji": "", - "createEmojiSuccess": "", - "defineDescription": "", - "defineExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "defineNotfound": "", - "definePronounciation": "", - "defineUnknown": "", - "emojiCustom": "", - "emojiDescription": "", - "emojiExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "emojiInvalid": "", - "emojiTooLarge": "", - "emojiTwemoji": "", - "eshopDescription": "", - "eshopExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "eshopNotInDatabase": "", - "eshopPriceFree": "", - "eshopPricePaid": "", - "eshopTitles": { - "availability": "", - "genres": "", - "esrb": "", - "noGenres": "", - "nsuid": "", - "numberOfPlayers": "", - "platform": "", - "price": "", - "releaseDate": "" - }, - "horoscopeDescription": "", - "horoscopeExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "" - ] - }, - "horoscopeInvalidSunsign": "", - "horoscopeTitles": { - "dailyHoroscope": "", - "metadata": [ - "", - "", - "", - "" - ], - "metadataTitle": "" - }, - "igdbData": { - "noAgeRatings": "", - "noDevelopers": "", - "noGenres": "", - "noPlatforms": "", - "noRating": "", - "noReleaseDate": "", - "noSummary": "" - }, - "igdbDescription": "", - "igdbExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "igdbTitles": { - "ageRating": "", - "developers": "", - "genres": "", - "platform": "", - "releaseDate": "", - "userScore": "" - }, - "itunesDescription": "", - "itunesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "" - ] - }, - "itunesTitles": { - "artist": "", - "collection": "", - "collectionPrice": "", - "numberOfTracksInCollection": "", - "preview": "", - "previewLabel": "", - "primaryGenre": "", - "trackPrice": "", - "trackReleaseDate": "" - }, - "moviesData": { - "linkClickHere": "", - "movieInProduction": "", - "noGenres": "", - "none": "", - "notPartOfCollection": "", - "variableRuntime": "" - }, - "moviesDescription": "", - "moviesExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "moviesTitles": { - "collection": "", - "genres": "", - "homePage": "", - "imdbPage": "", - "releaseDate": "", - "runtime": "", - "status": "", - "userScore": "" - }, - "pollDescription": "", - "pollExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "pollReactionLimit": "", - "priceCurrency": "", - "priceCurrencyNotFound": "", - "priceDescription": "", - "priceExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsData": { - "noGenres": "", - "unknownUserScore": "", - "variableRuntime": "" - }, - "showsDescription": "", - "showsExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "" - ] - }, - "showsTitles": { - "episodeRuntime": "", - "firstAirDate": "", - "genres": "", - "status": "", - "userScore": "" - }, - "systemTextTruncated": "", - "urbanDescription": "", - "urbanExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "urbanNoDefinition": "", - "voteDescription": "", - "voteExtended": { - "usages": [ - "" - ], - "examples": [ - "" - ], - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "voteContentNeeded": "", - "voteReactionBlocked": "", - "whoisDescription": "", - "whoisExtended": { - "usages": [ - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "whoisMemberFields": { - "createdAt": "", - "footer": "", - "joinedUnknown": "", - "joinedWithTimestamp": "" - }, - "whoisMemberPermissions": "", - "whoisMemberPermissionsAll": "", - "whoisMemberRoles_one": "", - "whoisMemberRoles_other": "", - "whoisMemberRoleListAndMore": "", - "whoisMemberTitles": { - "createdAt": "", - "joined": "" - }, - "whoisUserFields": { - "createdAt": "", - "footer": "" - }, - "whoisUserTitles": { - "createdAt": "" - }, - "wikipediaDescription": "", - "wikipediaExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "reminder": "" - }, - "wikipediaNotfound": "", - "youtubeDescription": "", - "youtubeExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ] - }, - "youtubeNotfound": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/commands/twitch.json b/src/languages/tr-TR/commands/twitch.json deleted file mode 100644 index 07450084e61..00000000000 --- a/src/languages/tr-TR/commands/twitch.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "followage": "", - "followageMissingEntries": "", - "twitchNoEntries": "", - "twitchTitles": { - "followers": "", - "views": "", - "clickToVisit": "", - "partner": "" - }, - "twitchPartnershipWithoutAffiliate": "", - "twitchAffiliateStatus": { - "affiliated": "", - "partnered": "" - }, - "twitchSubscriptionStreamerNotFound": "", - "twitchSubscriptionStatusValues": [ - "", - "" - ], - "twitchSubscriptionInvalidStatus": "", - "twitchSubscriptionAddDuplicated": "", - "twitchSubscriptionAddSuccessOffline": "", - "twitchSubscriptionAddSuccessLive": "", - "twitchSubscriptionAddMessageForOfflineRequired": "", - "twitchSubscriptionRemoveOrResetEmpty": "", - "twitchSubscriptionRemoveStreamerNotSubscribed": "", - "twitchSubscriptionRemoveNotToProvidedChannel": "", - "twitchSubscriptionRemoveStreamerStatusNotMatch": "", - "twitchSubscriptionRemoveSuccessOffline": "", - "twitchSubscriptionRemoveSuccessLive": "", - "twitchSubscriptionResetSuccess_one": "", - "twitchSubscriptionResetSuccess_other": "", - "twitchSubscriptionShowStreamerNotSubscribed": "", - "twitchSubscriptionShowStatus": { - "live": "", - "offline": "" - }, - "twitchSubscriptionShowUnknownUser": "", - "followageDescription": "", - "followageExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchDescription": "", - "twitchExtended": { - "usages": [ - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ] - ], - "examples": [ - "" - ] - }, - "twitchSubscriptionDescription": "", - "twitchSubscriptionExtended": { - "usages": [ - "", - "", - "", - "", - "", - "", - "" - ], - "extendedHelp": "", - "explainedUsage": [ - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ], - [ - "", - "" - ] - ], - "examples": [ - "", - "", - "", - "", - "", - "", - "" - ] - } -} \ No newline at end of file diff --git a/src/languages/tr-TR/errors.json b/src/languages/tr-TR/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/errors.json b/src/languages/tr-TR/events/errors.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/errors.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/guilds-logs.json b/src/languages/tr-TR/events/guilds-logs.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/guilds-logs.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/guilds-members.json b/src/languages/tr-TR/events/guilds-members.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/guilds-members.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/messages.json b/src/languages/tr-TR/events/messages.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/messages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/moderation.json b/src/languages/tr-TR/events/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/noMentionSpam.json b/src/languages/tr-TR/events/noMentionSpam.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/noMentionSpam.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/reactions.json b/src/languages/tr-TR/events/reactions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/reactions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/events/twitch.json b/src/languages/tr-TR/events/twitch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/events/twitch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/fuzzySearch.json b/src/languages/tr-TR/fuzzySearch.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/fuzzySearch.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/globals.json b/src/languages/tr-TR/globals.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/globals.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/guilds.json b/src/languages/tr-TR/guilds.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/guilds.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/humanLevels.json b/src/languages/tr-TR/humanLevels.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/humanLevels.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/moderation.json b/src/languages/tr-TR/moderation.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/moderation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/moderationActions.json b/src/languages/tr-TR/moderationActions.json deleted file mode 100644 index cb68ebaef07..00000000000 --- a/src/languages/tr-TR/moderationActions.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "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": "", - "sharedRoleSetupNoMessage": "", - "sharedRoleSetupExisting": "", - "sharedRoleSetupExistingName": "", - "sharedRoleSetupNew": "", - "softbanNoReason": "", - "softbanReason": "", - "unSoftbanNoReason": "", - "unSoftbanReason": "" -} \ No newline at end of file diff --git a/src/languages/tr-TR/permissions.json b/src/languages/tr-TR/permissions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/permissions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/preconditions.json b/src/languages/tr-TR/preconditions.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/preconditions.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/promptList.json b/src/languages/tr-TR/promptList.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/promptList.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/selfModeration.json b/src/languages/tr-TR/selfModeration.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/selfModeration.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/serializers.json b/src/languages/tr-TR/serializers.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/serializers.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/settings.json b/src/languages/tr-TR/settings.json deleted file mode 100644 index 0637a088a01..00000000000 --- a/src/languages/tr-TR/settings.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/languages/tr-TR/system.json b/src/languages/tr-TR/system.json deleted file mode 100644 index 642e0754431..00000000000 --- a/src/languages/tr-TR/system.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "discordAbortError": "", - "exceededLengthChooseOutput": "", - "exceededLengthOutput": "", - "exceededLengthOutputConsole": "", - "exceededLengthOutputType": "", - "exceededLengthOutputTime": "", - "exceededLengthOutputFile": "", - "exceededLengthOutputHastebin": "", - "externalServerError": "", - "fetchBansFail": "", - "helpTitles": { - "aliases": "", - "usages": "", - "extendedHelp": "", - "explainedUsage": "", - "possibleFormats": "", - "examples": "", - "reminders": "" - }, - "jumpTo": "", - "loading": [ - "", - "", - "", - "", - "", - "", - "", - "" - ], - "messagePromptTimeout": "", - "noResults": "", - "parseError": "", - "prefixReminder": "", - "queryFail": "", - "textPromptAbortOptions": [ - "", - "", - "" - ], - "reminderHeader": "" -} \ No newline at end of file diff --git a/src/lib/SkyraClient.ts b/src/lib/SkyraClient.ts deleted file mode 100644 index 8d5982a0677..00000000000 --- a/src/lib/SkyraClient.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { GuildSettings, SettingsManager, UserRepository } from '#lib/database'; -import { AnalyticsData, InviteStore, ScheduleManager } from '#lib/structures'; -import { CLIENT_OPTIONS, WEBHOOK_ERROR } from '#root/config'; -import { isGuildMessage } from '#utils/common'; -import { Enumerable } from '@sapphire/decorators'; -import { container, SapphireClient } from '@sapphire/framework'; -import type { InternationalizationContext } from '@sapphire/plugin-i18next'; -import { envParseBoolean } from '@skyra/env-utilities'; -import { Message, WebhookClient } from 'discord.js'; -import { readSettings } from './database/settings/functions'; -import { GuildMemberFetchQueue } from './discord/GuildMemberFetchQueue'; -import { WorkerManager } from './moderation/workers/WorkerManager'; -import { Leaderboard } from './util/Leaderboard'; -import type { LongLivingReactionCollector } from './util/LongLivingReactionCollector'; -import { Twitch } from './util/Notifications/Twitch'; - -export class SkyraClient extends SapphireClient { - @Enumerable(false) - public dev = process.env.NODE_ENV !== 'production'; - - /** - * The loaded Leaderboard singleton instance - */ - @Enumerable(false) - public leaderboard = new Leaderboard(); - - /** - * The Schedule manager - */ - @Enumerable(false) - public schedules: ScheduleManager; - - /** - * The webhook to use for the error event - */ - @Enumerable(false) - public webhookError: WebhookClient | null = WEBHOOK_ERROR ? new WebhookClient(WEBHOOK_ERROR) : null; - - /** - * The invite store - */ - @Enumerable(false) - public invites = new InviteStore(); - - @Enumerable(false) - public readonly analytics: AnalyticsData | null; - - @Enumerable(false) - public readonly guildMemberFetchQueue = new GuildMemberFetchQueue(); - - @Enumerable(false) - public llrCollectors = new Set(); - - @Enumerable(false) - public twitch = new Twitch(); - - public constructor() { - super(CLIENT_OPTIONS); - - // Workers - container.workers = new WorkerManager(); - - container.settings = new SettingsManager(); - - // Analytics - this.schedules = new ScheduleManager(); - container.schedule = this.schedules; - - this.analytics = envParseBoolean('INFLUX_ENABLED') ? new AnalyticsData() : null; - } - - public async login(token?: string) { - await container.workers.start(); - const loginResponse = await super.login(token); - await this.schedules.init(); - return loginResponse; - } - - public async destroy() { - await container.workers.destroy(); - this.guildMemberFetchQueue.destroy(); - this.invites.destroy(); - this.schedules.destroy(); - UserRepository.destroy(); - return super.destroy(); - } - - /** - * Retrieves the prefix for the guild. - * @param message The message that gives context. - */ - public fetchPrefix = async (message: Message) => { - if (isGuildMessage(message)) return readSettings(message.guild, GuildSettings.Prefix); - return [process.env.CLIENT_PREFIX, ''] as readonly string[]; - }; - - /** - * Retrieves the language key for the message. - * @param message The message that gives context. - */ - public fetchLanguage = (message: InternationalizationContext) => { - return message.guild ? readSettings(message.guild, GuildSettings.Language) : 'en-US'; - }; -} diff --git a/src/lib/api/ApiTransformers.ts b/src/lib/api/ApiTransformers.ts deleted file mode 100644 index dcb59f1641c..00000000000 --- a/src/lib/api/ApiTransformers.ts +++ /dev/null @@ -1,390 +0,0 @@ -import { - ChannelTypeString, - isDMChannel, - isGuildBasedChannelByGuildKey, - isNewsChannel, - isTextChannel, - isThreadChannel, - isVoiceChannel -} from '@sapphire/discord.js-utilities'; -import type { - Channel, - DMChannel, - Guild, - GuildChannel, - GuildMember, - NewsChannel, - PermissionOverwrites, - Role, - TextChannel, - ThreadChannel, - ThreadChannelTypes, - User, - VoiceChannel -} from 'discord.js'; - -// #region Guild - -export function flattenGuild(guild: Guild): FlattenedGuild { - return { - afkChannelId: guild.afkChannelId, - afkTimeout: guild.afkTimeout, - applicationId: guild.applicationId, - approximateMemberCount: guild.approximateMemberCount, - approximatePresenceCount: guild.approximatePresenceCount, - available: guild.available, - banner: guild.banner, - channels: guild.channels.cache.map(flattenChannel) as FlattenedGuildChannel[], - defaultMessageNotifications: guild.defaultMessageNotifications, - description: guild.description, - widgetEnabled: guild.widgetEnabled, - explicitContentFilter: guild.explicitContentFilter, - features: guild.features, - icon: guild.icon, - id: guild.id, - joinedTimestamp: guild.joinedTimestamp, - mfaLevel: guild.mfaLevel, - name: guild.name, - ownerId: guild.ownerId, - partnered: guild.partnered, - preferredLocale: guild.preferredLocale, - premiumSubscriptionCount: guild.premiumSubscriptionCount, - premiumTier: guild.premiumTier, - roles: guild.roles.cache.map(flattenRole), - splash: guild.splash, - systemChannelId: guild.systemChannelId, - vanityURLCode: guild.vanityURLCode, - verificationLevel: guild.verificationLevel, - verified: guild.verified - }; -} - -export interface FlattenedGuild - extends Pick< - Guild, - | 'afkChannelId' - | 'afkTimeout' - | 'applicationId' - | 'approximateMemberCount' - | 'approximatePresenceCount' - | 'available' - | 'banner' - | 'defaultMessageNotifications' - | 'description' - | 'widgetEnabled' - | 'explicitContentFilter' - | 'features' - | 'icon' - | 'id' - | 'joinedTimestamp' - | 'mfaLevel' - | 'name' - | 'ownerId' - | 'partnered' - | 'preferredLocale' - | 'premiumSubscriptionCount' - | 'premiumTier' - | 'splash' - | 'systemChannelId' - | 'vanityURLCode' - | 'verificationLevel' - | 'verified' - > { - channels: FlattenedGuildChannel[]; - - roles: FlattenedRole[]; -} - -// #endregion Guild - -// #region Role - -export function flattenRole(role: Role): FlattenedRole { - return { - id: role.id, - guildId: role.guild.id, - name: role.name, - color: role.color, - hoist: role.hoist, - rawPosition: role.rawPosition, - permissions: role.permissions.bitfield.toString(), - managed: role.managed, - mentionable: role.mentionable - }; -} - -export interface FlattenedRole { - color: number; - - guildId: string; - - hoist: boolean; - - id: string; - - managed: boolean; - - mentionable: boolean; - - name: string; - - permissions: string; - - rawPosition: number; -} - -// #endregion Role - -// #region Channel - -export function flattenChannel(channel: NewsChannel): FlattenedNewsChannel; -export function flattenChannel(channel: TextChannel): FlattenedTextChannel; -export function flattenChannel(channel: VoiceChannel): FlattenedVoiceChannel; -export function flattenChannel(channel: GuildChannel): FlattenedGuildChannel; -export function flattenChannel(channel: DMChannel): FlattenedDMChannel; -export function flattenChannel(channel: ThreadChannel): FlattenedThreadChannel; -export function flattenChannel(channel: Channel): FlattenedChannel; -export function flattenChannel(channel: Channel) { - if (isThreadChannel(channel)) return flattenChannelThread(channel as ThreadChannel); - if (isNewsChannel(channel)) return flattenChannelNews(channel as NewsChannel); - if (isTextChannel(channel)) return flattenChannelText(channel as TextChannel); - if (isVoiceChannel(channel)) return flattenChannelVoice(channel as VoiceChannel); - if (isGuildBasedChannelByGuildKey(channel)) return flattenChannelGuild(channel as GuildChannel); - if (isDMChannel(channel)) return flattenChannelDM(channel as DMChannel); - return flattenChannelFallback(channel); -} - -function flattenChannelNews(channel: NewsChannel): FlattenedNewsChannel { - return { - id: channel.id, - type: channel.type as FlattenedNewsChannel['type'], - guildId: channel.guild.id, - name: channel.name, - rawPosition: channel.rawPosition, - parentId: channel.parentId, - permissionOverwrites: [...channel.permissionOverwrites.cache.entries()], - topic: channel.topic, - nsfw: channel.nsfw, - createdTimestamp: channel.createdTimestamp - }; -} - -function flattenChannelText(channel: TextChannel): FlattenedTextChannel { - return { - id: channel.id, - type: channel.type as FlattenedTextChannel['type'], - guildId: channel.guild.id, - name: channel.name, - rawPosition: channel.rawPosition, - parentId: channel.parentId, - permissionOverwrites: [...channel.permissionOverwrites.cache.entries()], - topic: channel.topic, - nsfw: channel.nsfw, - rateLimitPerUser: channel.rateLimitPerUser, - createdTimestamp: channel.createdTimestamp - }; -} - -function flattenChannelVoice(channel: VoiceChannel): FlattenedVoiceChannel { - return { - id: channel.id, - type: channel.type as FlattenedVoiceChannel['type'], - guildId: channel.guild.id, - name: channel.name, - rawPosition: channel.rawPosition, - parentId: channel.parentId, - permissionOverwrites: [...channel.permissionOverwrites.cache.entries()], - bitrate: channel.bitrate, - userLimit: channel.userLimit, - createdTimestamp: channel.createdTimestamp - }; -} - -function flattenChannelGuild(channel: GuildChannel): FlattenedGuildChannel { - return { - id: channel.id, - type: channel.type as FlattenedGuildChannel['type'], - guildId: channel.guild.id, - name: channel.name, - rawPosition: channel.rawPosition, - parentId: channel.parentId, - permissionOverwrites: [...channel.permissionOverwrites.cache.entries()], - createdTimestamp: channel.createdTimestamp - }; -} - -function flattenChannelDM(channel: DMChannel): FlattenedDMChannel { - return { - id: channel.id, - type: channel.type as FlattenedDMChannel['type'], - recipient: channel.recipient.id, - createdTimestamp: channel.createdTimestamp ?? 0 - }; -} - -function flattenChannelThread(channel: ThreadChannel): FlattenedThreadChannel { - return { - id: channel.id, - type: channel.type, - archived: channel.archived ?? false, - archivedTimestamp: channel.archiveTimestamp, - createdTimestamp: channel.createdTimestamp ?? 0, - guildId: channel.guildId, - name: channel.name, - parentId: channel.parentId, - permissionOverwrites: [...(channel.parent?.permissionOverwrites.cache.entries() ?? [])], - rawPosition: channel.parent?.rawPosition ?? null, - rateLimitPerUser: channel.rateLimitPerUser - }; -} - -function flattenChannelFallback(channel: Channel): FlattenedChannel { - return { - id: channel.id, - type: channel.type as FlattenedChannel['type'], - createdTimestamp: channel.createdTimestamp ?? 0 - }; -} - -export interface FlattenedChannel { - createdTimestamp: number; - - id: string; - - type: ChannelTypeString; -} - -export interface FlattenedGuildChannel extends FlattenedChannel { - guildId: string; - - name: string; - - parentId: string | null; - - permissionOverwrites: [string, PermissionOverwrites][]; - - rawPosition: number; - - type: ChannelTypeString; -} - -export interface FlattenedNewsChannel extends FlattenedGuildChannel { - type: 'GUILD_NEWS'; - - nsfw: boolean; - - topic: string | null; -} - -export interface FlattenedTextChannel extends FlattenedGuildChannel { - nsfw: boolean; - - rateLimitPerUser: number; - - topic: string | null; - - type: 'GUILD_TEXT'; -} - -export interface FlattenedThreadChannel extends Pick { - archived: boolean; - - archivedTimestamp: number | null; - - guildId: string; - - name: string; - - parentId: string | null; - - permissionOverwrites: [string, PermissionOverwrites][]; - - rateLimitPerUser: number | null; - - rawPosition: number | null; - - type: ThreadChannelTypes; -} - -export interface FlattenedNewsThreadChannel extends FlattenedChannel { - type: 'GUILD_NEWS_THREAD'; -} - -export interface FlattenedPublicThreadChannel extends FlattenedChannel { - type: 'GUILD_PUBLIC_THREAD'; -} - -export interface FlattenedPrivateThreadChannel extends FlattenedChannel { - type: 'GUILD_PRIVATE_THREAD'; -} - -export interface FlattenedVoiceChannel extends FlattenedGuildChannel { - type: 'GUILD_VOICE'; - - bitrate: number; - - userLimit: number; -} - -export interface FlattenedDMChannel extends FlattenedChannel { - type: 'DM'; - - recipient: string; -} - -// #endregion Channel - -// #region User - -export function flattenUser(user: User): FlattenedUser { - return { - id: user.id, - bot: user.bot, - username: user.username, - discriminator: user.discriminator, - avatar: user.avatar - }; -} - -export interface FlattenedUser { - avatar: string | null; - - bot: boolean; - - discriminator: string; - - id: string; - - username: string; -} - -// #endregion User - -// #region Member - -export function flattenMember(member: GuildMember): FlattenedMember { - return { - id: member.id, - guildId: member.guild.id, - user: flattenUser(member.user), - joinedTimestamp: member.joinedTimestamp, - premiumSinceTimestamp: member.premiumSinceTimestamp, - roles: member.roles.cache.map(flattenRole) - }; -} - -export interface FlattenedMember { - guildId: string; - - id: string; - - joinedTimestamp: number | null; - - premiumSinceTimestamp: number | null; - - roles: FlattenedRole[]; - - user: FlattenedUser; -} - -// #endregion Member diff --git a/src/lib/api/types.d.ts b/src/lib/api/types.d.ts deleted file mode 100644 index be4a2437785..00000000000 --- a/src/lib/api/types.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { LoginData } from '@sapphire/plugin-api'; -import type { FlattenedGuild, FlattenedUser } from './ApiTransformers'; - -export interface PartialOauthFlattenedGuild extends Omit { - joinedTimestamp: FlattenedGuild['joinedTimestamp'] | null; - ownerId: FlattenedGuild['ownerId'] | null; -} - -export interface OauthFlattenedGuild extends PartialOauthFlattenedGuild { - permissions: string; - manageable: boolean; - skyraIsIn: boolean; -} - -export interface OauthFlattenedUser { - user: FlattenedUser; - guilds: OauthFlattenedGuild[]; -} - -export interface TransformedLoginData extends LoginData { - transformedGuilds?: OauthFlattenedGuild[]; -} diff --git a/src/lib/api/utils.ts b/src/lib/api/utils.ts deleted file mode 100644 index a770d316edd..00000000000 --- a/src/lib/api/utils.ts +++ /dev/null @@ -1,129 +0,0 @@ -import * as GuildSettings from '#lib/database/keys/settings/All'; -import { readSettings } from '#lib/database/settings'; -import type { SkyraCommand } from '#lib/structures'; -import { createFunctionPrecondition } from '@sapphire/decorators'; -import { container } from '@sapphire/framework'; -import { ApiRequest, ApiResponse, HttpCodes, LoginData } from '@sapphire/plugin-api'; -import { RateLimitManager } from '@sapphire/ratelimits'; -import { hasAtLeastOneKeyInMap } from '@sapphire/utilities'; -import type { RESTAPIPartialCurrentUserGuild } from 'discord-api-types/v9'; -import { Client, Guild, GuildMember, Permissions } from 'discord.js'; -import { flattenGuild } from './ApiTransformers'; -import type { OauthFlattenedGuild, PartialOauthFlattenedGuild, TransformedLoginData } from './types'; - -function isAdmin(member: GuildMember, roles: readonly string[]): boolean { - return roles.length === 0 ? member.permissions.has(Permissions.FLAGS.MANAGE_GUILD) : hasAtLeastOneKeyInMap(member.roles.cache, roles); -} - -export const authenticated = () => - createFunctionPrecondition( - (request: ApiRequest) => Boolean(request.auth?.token), - (_request: ApiRequest, response: ApiResponse) => response.error(HttpCodes.Unauthorized) - ); - -/** - * @param time The amount of milliseconds for the ratelimits from this manager to expire. - * @param limit The amount of times a {@link RateLimit} can drip before it's limited. - * @param auth Whether or not this should be auth-limited - */ -export function ratelimit(time: number, limit = 1, auth = false) { - const manager = new RateLimitManager(time, limit); - const xRateLimitLimit = time; - return createFunctionPrecondition( - (request: ApiRequest, response: ApiResponse) => { - const id = (auth ? request.auth!.id : request.headers['x-forwarded-for'] || request.socket.remoteAddress) as string; - const bucket = manager.acquire(id); - - response.setHeader('Date', new Date().toUTCString()); - if (bucket.limited) { - response.setHeader('Retry-After', bucket.remainingTime.toString()); - return false; - } - - try { - bucket.consume(); - } catch {} - - response.setHeader('X-RateLimit-Limit', xRateLimitLimit); - response.setHeader('X-RateLimit-Remaining', bucket.remaining.toString()); - response.setHeader('X-RateLimit-Reset', bucket.remainingTime.toString()); - - return true; - }, - (_request: ApiRequest, response: ApiResponse) => { - response.error(HttpCodes.TooManyRequests); - } - ); -} - -export async function canManage(guild: Guild, member: GuildMember): Promise { - if (guild.ownerId === member.id) return true; - - const [roles, pnodes] = await readSettings(guild, (settings) => [settings[GuildSettings.Roles.Admin], settings.permissionNodes]); - - return isAdmin(member, roles) && (pnodes.run(member, container.stores.get('commands').get('conf') as SkyraCommand) ?? true); -} - -export async function getManageable(id: string, oauthGuild: RESTAPIPartialCurrentUserGuild, guild: Guild | undefined): Promise { - if (oauthGuild.owner) return true; - if (typeof guild === 'undefined') return new Permissions(BigInt(oauthGuild.permissions)).has(Permissions.FLAGS.MANAGE_GUILD); - - const member = await guild.members.fetch(id).catch(() => null); - if (!member) return false; - - return canManage(guild, member); -} - -export async function transformGuild(client: Client, userId: string, data: RESTAPIPartialCurrentUserGuild): Promise { - const guild = client.guilds.cache.get(data.id); - const serialized: PartialOauthFlattenedGuild = - typeof guild === 'undefined' - ? { - afkChannelId: null, - afkTimeout: 0, - applicationId: null, - approximateMemberCount: null, - approximatePresenceCount: null, - available: true, - banner: null, - channels: [], - defaultMessageNotifications: 'ONLY_MENTIONS', - description: null, - widgetEnabled: false, - explicitContentFilter: 'DISABLED', - icon: data.icon, - id: data.id, - joinedTimestamp: null, - mfaLevel: 'NONE', - name: data.name, - ownerId: data.owner ? userId : null, - partnered: false, - preferredLocale: 'en-US', - premiumSubscriptionCount: null, - premiumTier: 'NONE', - roles: [], - splash: null, - systemChannelId: null, - vanityURLCode: null, - verificationLevel: 'NONE', - verified: false - } - : flattenGuild(guild); - - return { - ...serialized, - permissions: data.permissions, - manageable: await getManageable(userId, data, guild), - skyraIsIn: typeof guild !== 'undefined' - }; -} - -export async function transformOauthGuildsAndUser({ user, guilds }: LoginData): Promise { - if (!user || !guilds) return { user, guilds }; - - const { client } = container; - const userId = user.id; - - const transformedGuilds = await Promise.all(guilds.map((guild) => transformGuild(client, userId, guild))); - return { user, transformedGuilds }; -} diff --git a/src/lib/customCommands/errors/InvalidTypeError.ts b/src/lib/customCommands/errors/InvalidTypeError.ts deleted file mode 100644 index fffd9970ca7..00000000000 --- a/src/lib/customCommands/errors/InvalidTypeError.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import type { Parser, Tag } from '@skyra/tags'; - -export class InvalidTypeError extends UserError { - public readonly parser: Parser; - public readonly tag: Tag; - - public constructor(parser: Parser, tag: Tag) { - super({ - identifier: LanguageKeys.Serializers.CustomCommands.InvalidType, - context: { - parser, - tag, - possibles: InvalidTypeError.possibles.map((possible) => `\`${possible}\``), - count: InvalidTypeError.possibles.length - } - }); - this.parser = parser; - this.tag = tag; - } - - public static readonly argLessPossibles = [ - 'author.id', - 'author.name', - 'author.mention', - 'author', - 'guild.acronym', - 'guild.id', - 'guild.name', - 'guild', - 'random', - 'server.acronym', - 'server.id', - 'server.name', - 'server' - ] as const; - - public static readonly possibles = [ - ...InvalidTypeError.argLessPossibles, - 'channel.id', - 'channel.name', - 'channel', - 'emoji', - 'member.displayName', - 'member.id', - 'member.name', - 'member.mention', - 'member', - 'pick', - 'rest', - 'role.color', - 'role.hoist', - 'role.id', - 'role.name', - 'role.position', - 'role', - 'user.displayName', - 'user.id', - 'user.name', - 'user.mention', - 'user', - 'word' - ] as const; -} - -export namespace InvalidTypeError { - export type ArgLessType = - | 'author.id' - | 'author.name' - | 'author.mention' - | 'author' - | `${'guild' | 'server'}.acronym` - | `${'guild' | 'server'}.id` - | `${'guild' | 'server'}.name` - | `${'guild' | 'server'}` - | 'random'; - - export type Type = - | ArgLessType - | 'channel.id' - | 'channel.name' - | 'channel' - | 'emoji' - | `${'member' | 'user'}.displayName` - | `${'member' | 'user'}.id` - | `${'member' | 'user'}.name` - | `${'member' | 'user'}.mention` - | `${'member' | 'user'}` - | 'pick' - | 'rest' - | 'role.color' - | 'role.hoist' - | 'role.id' - | 'role.name' - | 'role.position' - | 'role' - | 'word'; -} diff --git a/src/lib/customCommands/errors/MissingArgumentsError.ts b/src/lib/customCommands/errors/MissingArgumentsError.ts deleted file mode 100644 index 42afd51447a..00000000000 --- a/src/lib/customCommands/errors/MissingArgumentsError.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraArgs } from '#lib/structures'; -import { UserError } from '@sapphire/framework'; -import type { InvalidTypeError } from './InvalidTypeError'; - -export class MissingArgumentsError extends UserError { - public readonly args: SkyraArgs; - public readonly type: InvalidTypeError.Type; - - public constructor(args: SkyraArgs, type: InvalidTypeError.Type) { - super({ identifier: LanguageKeys.Serializers.CustomCommands.MissingParameter, context: { args, type } }); - - this.args = args; - this.type = type; - } -} diff --git a/src/lib/customCommands/errors/ParserNotRunError.ts b/src/lib/customCommands/errors/ParserNotRunError.ts deleted file mode 100644 index e1a20dbc981..00000000000 --- a/src/lib/customCommands/errors/ParserNotRunError.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Parser } from '@skyra/tags'; - -export class ParserNotRunError extends TypeError { - public readonly parser: Parser; - - public constructor(parser: Parser) { - super('The parser has not been run yet.'); - this.parser = parser; - } - - // eslint-disable-next-line @typescript-eslint/class-literal-property-style - public get name() { - return 'ParserNotRunError'; - } -} diff --git a/src/lib/customCommands/errors/index.ts b/src/lib/customCommands/errors/index.ts deleted file mode 100644 index 1270324c4af..00000000000 --- a/src/lib/customCommands/errors/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './InvalidTypeError'; -export * from './MissingArgumentsError'; -export * from './ParserNotRunError'; diff --git a/src/lib/customCommands/index.ts b/src/lib/customCommands/index.ts deleted file mode 100644 index 49af116f4f5..00000000000 --- a/src/lib/customCommands/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './errors'; -export * from './util'; -import './setup'; diff --git a/src/lib/customCommands/setup.ts b/src/lib/customCommands/setup.ts deleted file mode 100644 index 3b8d18a3bf1..00000000000 --- a/src/lib/customCommands/setup.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Transformer } from '@skyra/tags'; - -Transformer.formatters - .set('empty', () => '') - .set('mockcase', (value) => - value - .split(' ') - .map((word) => [...word].map((character, index) => ((index & 1) === 0 ? character.toUpperCase() : character.toLowerCase())).join('')) - .join(' ') - ) - .set('length', (value) => value.length.toString()); diff --git a/src/lib/customCommands/util.ts b/src/lib/customCommands/util.ts deleted file mode 100644 index 85554e9f121..00000000000 --- a/src/lib/customCommands/util.ts +++ /dev/null @@ -1,128 +0,0 @@ -import type { CustomCommand } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraArgs } from '#lib/structures'; -import { formatNumber, getEmojiString, getEmojiTextFormat } from '#utils/functions'; -import { Lexer, parse, Parser, Sentence, SentencePartType } from '@skyra/tags'; -import { InvalidTypeError } from './errors/InvalidTypeError'; -import { MissingArgumentsError } from './errors/MissingArgumentsError'; -import { ParserNotRunError } from './errors/ParserNotRunError'; - -export const validTypes = new Set(InvalidTypeError.possibles); -export const argLessTypes = new Set(InvalidTypeError.argLessPossibles); - -export function validate(parser: Parser) { - if (parser.parts.length === 0) throw new ParserNotRunError(parser); - - parser.check(); - for (const part of parser.parts) { - // If it's a literal, continue: - if (part.type === SentencePartType.Literal) continue; - - // If it's a valid type, continue: - if (validTypes.has(part.value.type)) continue; - - // Else it was invalid, throw in this case: - throw new InvalidTypeError(parser, part.value); - } -} - -export function parseAndValidate(content: string) { - const parser = new Parser(new Lexer(content)); - const parts = parser.parse(); - validate(parser); - - return new Sentence(parts); -} - -export function ensure(content: string) { - try { - return parse(content); - } catch { - return new Sentence([{ type: SentencePartType.Literal, value: content }]); - } -} - -export async function parseParameter(args: SkyraArgs, type: InvalidTypeError.Type, allowedMentions: Set): Promise { - if (!argLessTypes.has(type) && args.finished) throw new MissingArgumentsError(args, type); - - switch (type) { - case 'author': - return args.message.author.toString(); - case 'author.mention': { - allowedMentions.add(args.message.author.id); - return args.message.author.toString(); - } - case 'author.id': - return args.message.author.id; - case 'author.name': - return args.message.author.username; - case 'channel': - return args.pick('guildChannel').then((channel) => channel.toString()); - case 'channel.id': - return args.pick('guildChannel').then((channel) => channel.id); - case 'channel.name': - return args.pick('guildChannel').then((channel) => channel.name); - case 'emoji': - return getEmojiTextFormat(getEmojiString(await args.pick('emoji'))); - case 'server.id': - case 'guild.id': - return args.message.guild!.id; - case 'server': - case 'server.name': - case 'guild': - case 'guild.name': - return args.message.guild!.name; - case 'server.acronym': - case 'guild.acronym': - return args.message.guild!.nameAcronym; - case 'rest': - return args.rest('string'); - case 'pick': - return args.pick('string'); - case 'random': - return ''; - case 'role': - return args.pick('role').then((role) => role.toString()); - case 'role.color': - return args.pick('role').then((role) => role.hexColor); - case 'role.hoist': - return args.pick('role').then((role) => (role.hoist ? args.t(LanguageKeys.Globals.Yes) : args.t(LanguageKeys.Globals.No))); - case 'role.id': - return args.pick('role').then((role) => role.id); - case 'role.name': - return args.pick('role').then((role) => role.name); - case 'role.position': - return args.pick('role').then((role) => formatNumber(args, role.position)); - case 'member': - case 'user': - return args.pick('member').then((member) => member.toString()); - case 'member.mention': - case 'user.mention': { - return args.pick('member').then((member) => { - allowedMentions.add(member.id); - return member.toString(); - }); - } - case 'member.displayName': - case 'user.displayName': - return args.pick('member').then((member) => member.displayName); - case 'member.name': - case 'user.name': - return args.pick('member').then((member) => member.user.username); - case 'member.id': - case 'user.id': - return args.pick('member').then((member) => member.id); - case 'word': - return args.pick('string'); - } -} - -export function getFromId(name: string, tags: CustomCommand[]): CustomCommand | null { - for (const tag of tags) { - if (tag.id === name) return tag; - if (tag.aliases.includes(name)) return tag; - } - - // No tag matched, skip and return null: - return null; -} diff --git a/src/lib/database/database.config.ts b/src/lib/database/database.config.ts deleted file mode 100644 index fde82895360..00000000000 --- a/src/lib/database/database.config.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Config must be the first to be loaded, as it sets the env: -import '#root/config'; -// Import everything else: -import { envParseBoolean, envParseInteger, envParseString } from '@skyra/env-utilities'; -import { join } from 'node:path'; -import { Connection, ConnectionOptions, createConnection, getConnection } from 'typeorm'; -import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; -import './repositories/ClientRepository'; -import './repositories/MemberRepository'; -import './repositories/UserRepository'; - -export const config: ConnectionOptions = { - type: 'postgres', - host: envParseString('PGSQL_DATABASE_HOST'), - port: envParseInteger('PGSQL_DATABASE_PORT'), - username: envParseString('PGSQL_DATABASE_USER'), - password: envParseString('PGSQL_DATABASE_PASSWORD'), - database: envParseString('PGSQL_DATABASE_NAME'), - entities: [join(__dirname, 'entities/*Entity.js')], - migrations: [join(__dirname, 'migrations/*.js')], - cli: { - entitiesDir: 'src/lib/database/entities', - migrationsDir: 'src/lib/database/migrations', - subscribersDir: 'src/lib/database/subscribers' - }, - namingStrategy: new SnakeNamingStrategy(), - logging: envParseBoolean('TYPEORM_DEBUG_LOGS', false) -}; - -export const connect = (): Promise => { - try { - return Promise.resolve(getConnection()); - } catch { - return createConnection(config); - } -}; diff --git a/src/lib/database/entities/BannerEntity.ts b/src/lib/database/entities/BannerEntity.ts deleted file mode 100644 index 45ebcad53d8..00000000000 --- a/src/lib/database/entities/BannerEntity.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; - -@Entity('banner', { schema: 'public' }) -export class BannerEntity extends BaseEntity { - @PrimaryColumn('varchar', { length: 6 }) - public id!: string; - - @Column('varchar', { length: 32 }) - public group!: string; - - @Column('varchar', { length: 128 }) - public title!: string; - - @Column('varchar', { length: 19 }) - public authorId!: string; - - @Column('integer') - public price!: number; -} diff --git a/src/lib/database/entities/ClientEntity.ts b/src/lib/database/entities/ClientEntity.ts deleted file mode 100644 index 8c52b6968af..00000000000 --- a/src/lib/database/entities/ClientEntity.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; - -@Entity('client', { schema: 'public' }) -export class ClientEntity extends BaseEntity { - @PrimaryColumn('varchar', { length: 19, default: process.env.CLIENT_ID }) - public id: string = process.env.CLIENT_ID; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public userBlocklist: string[] = []; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public userBoost: string[] = []; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public guildBlocklist: string[] = []; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public guildBoost: string[] = []; -} diff --git a/src/lib/database/entities/GuildEntity.ts b/src/lib/database/entities/GuildEntity.ts deleted file mode 100644 index 6de053fbba0..00000000000 --- a/src/lib/database/entities/GuildEntity.ts +++ /dev/null @@ -1,832 +0,0 @@ -import { ConfigurableKey, configurableKeys } from '#lib/database/settings/ConfigurableKey'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { minutes, years } from '#utils/common'; -import type { SerializedEmoji } from '#utils/functions'; -import { create } from '#utils/Security/RegexCreator'; -import { container } from '@sapphire/framework'; -import { RateLimitManager } from '@sapphire/ratelimits'; -import { arrayStrictEquals, NonNullObject } from '@sapphire/utilities'; -import type { Sentence } from '@skyra/tags'; -import type { TFunction } from 'i18next'; -import { AfterInsert, AfterLoad, AfterRemove, AfterUpdate, BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; -import type { IBaseEntity } from '../settings/base/IBaseEntity'; -import { AdderManager } from '../settings/structures/AdderManager'; -import { PermissionNodeManager } from '../settings/structures/PermissionNodeManager'; -import { kBigIntTransformer, kTagsTransformer } from '../utils/Transformers'; - -@Entity('guilds', { schema: 'public' }) -export class GuildEntity extends BaseEntity implements IBaseEntity { - @PrimaryColumn('varchar', { name: 'id', length: 19 }) - public id!: string; - - @ConfigurableKey({ description: LanguageKeys.Settings.Prefix, minimum: 1, maximum: 10 }) - @Column('varchar', { name: 'prefix', length: 10, default: process.env.CLIENT_PREFIX }) - public prefix = process.env.CLIENT_PREFIX; - - @ConfigurableKey({ description: LanguageKeys.Settings.Language, type: 'language' }) - @Column('varchar', { name: 'language', default: 'en-US' }) - public language = 'en-US'; - - @ConfigurableKey({ description: LanguageKeys.Settings.DisableNaturalPrefix }) - @Column('boolean', { name: 'disable-natural-prefix', default: false }) - public disableNaturalPrefix = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.DisabledCommands, type: 'commandmatch' }) - @Column('varchar', { name: 'disabled-commands', length: 32, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public disabledCommands: string[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, type: 'customcommand', array: true }) - @Column('jsonb', { name: 'custom-commands', transformer: kTagsTransformer, default: () => "'[]'::JSONB" }) - public customCommands: CustomCommand[] = []; - - @Column('jsonb', { name: 'permissions.users', default: () => "'[]'::JSONB" }) - public permissionsUsers: PermissionsNode[] = []; - - @Column('jsonb', { name: 'permissions.roles', default: () => "'[]'::JSONB" }) - public permissionsRoles: PermissionsNode[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.MediaOnly, type: 'textchannel' }) - @Column('varchar', { name: 'channels.media-only', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public channelsMediaOnly: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.Moderation, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.moderation', nullable: true, length: 19 }) - public channelsLogsModeration?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.Image, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.image', nullable: true, length: 19 }) - public channelsLogsImage?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MemberAdd, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.member-add', nullable: true, length: 19 }) - public channelsLogsMemberAdd?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MemberRemove, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.member-remove', nullable: true, length: 19 }) - public channelsLogsMemberRemove?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MemberNickNameUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.member-nickname-update', nullable: true, length: 19 }) - public channelsLogsMemberNickNameUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MemberUserNameUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.member-username-update', nullable: true, length: 19 }) - public channelsLogsMemberUserNameUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MemberRoleUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.member-roles-update', nullable: true, length: 19 }) - public channelsLogsMemberRolesUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MessageDelete, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.message-delete', nullable: true, length: 19 }) - public channelsLogsMessageDelete?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MessageDeleteNsfw, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.message-delete-nsfw', nullable: true, length: 19 }) - public channelsLogsMessageDeleteNsfw?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MessageUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.message-update', nullable: true, length: 19 }) - public channelsLogsMessageUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.MessageUpdateNsfw, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.message-update-nsfw', nullable: true, length: 19 }) - public channelsLogsMessageUpdateNsfw?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.Prune, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.prune', nullable: true, length: 19 }) - public channelsLogsPrune?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.Reaction, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.reaction', nullable: true, length: 19 }) - public channelsLogsReaction?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.RoleCreate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.role-create', nullable: true, length: 19 }) - public channelsLogsRoleCreate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.RoleUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.role-update', nullable: true, length: 19 }) - public channelsLogsRoleUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.RoleDelete, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.role-delete', nullable: true, length: 19 }) - public channelsLogsRoleDelete?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.ChannelCreate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.channel-create', nullable: true, length: 19 }) - public channelsLogsChannelCreate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.ChannelUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.channel-update', nullable: true, length: 19 }) - public channelsLogsChannelUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.ChannelDelete, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.channel-delete', nullable: true, length: 19 }) - public channelsLogsChannelDelete?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.EmojiCreate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.emoji-create', nullable: true, length: 19 }) - public channelsLogsEmojiCreate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.EmojiUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.emoji-update', nullable: true, length: 19 }) - public channelsLogsEmojiUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.EmojiDelete, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.emoji-delete', nullable: true, length: 19 }) - public channelsLogsEmojiDelete?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Logs.ServerUpdate, type: 'textchannel' }) - @Column('varchar', { name: 'channels.logs.server-update', nullable: true, length: 19 }) - public channelsLogsServerUpdate?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Ignore.All, type: 'textchannel' }) - @Column('varchar', { name: 'channels.ignore.all', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public channelsIgnoreAll: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Ignore.MessageEdit, type: 'textchannel' }) - @Column('varchar', { name: 'channels.ignore.message-edit', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public channelsIgnoreMessageEdits: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Ignore.MessageDelete, type: 'textchannel' }) - @Column('varchar', { name: 'channels.ignore.message-delete', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public channelsIgnoreMessageDeletes: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.Channels.Ignore.ReactionAdd, type: 'textchannel' }) - @Column('varchar', { name: 'channels.ignore.reaction-add', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public channelsIgnoreReactionAdds: string[] = []; - - @Column('jsonb', { name: 'command-auto-delete', default: () => "'[]'::JSONB" }) - public commandAutoDelete: CommandAutoDelete[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.DisabledChannels, type: 'textchannel' }) - @Column('varchar', { name: 'disabled-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public disabledChannels: string[] = []; - - @Column('jsonb', { name: 'disabled-commands-channels', default: () => "'[]'::JSONB" }) - public disabledCommandsChannels: DisabledCommandChannel[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.EventsBanAdd }) - @Column('boolean', { name: 'events.ban-add', default: false }) - public eventsBanAdd = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.EventsBanRemove }) - @Column('boolean', { name: 'events.ban-remove', default: false }) - public eventsBanRemove = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.EventsTwemojiReactions }) - @Column('boolean', { name: 'events.twemoji-reactions', default: false }) - public eventsTwemojiReactions = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesIgnoreChannels, type: 'textchannel' }) - @Column('varchar', { name: 'messages.ignore-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public messagesIgnoreChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesModerationDM }) - @Column('boolean', { name: 'messages.moderation-dm', default: false }) - public messagesModerationDm = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesModerationReasonDisplay }) - @Column('boolean', { name: 'messages.moderation-reason-display', default: true }) - public messagesModerationReasonDisplay = true; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesModerationMessageDisplay }) - @Column('boolean', { name: 'messages.moderation-message-display', default: true }) - public messagesModerationMessageDisplay = true; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesModerationAutoDelete }) - @Column('boolean', { name: 'messages.moderation-auto-delete', default: false }) - public messagesModerationAutoDelete = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesModeratorNameDisplay }) - @Column('boolean', { name: 'messages.moderator-name-display', default: true }) - public messagesModeratorNameDisplay = true; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesAutoDeleteIgnoredAll }) - @Column('boolean', { name: 'messages.auto-delete.ignored-all', default: false }) - public messagesAutoDeleteIgnoredAll = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesAutoDeleteIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'messages.auto-delete.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public messagesAutoDeleteIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesAutoDeleteIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'messages.auto-delete.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public messagesAutoDeleteIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.MessagesAutoDeleteIgnoredCommands, type: 'commandmatch' }) - @Column('varchar', { name: 'messages.auto-delete.ignored-commands', length: 32, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public messagesAutoDeleteIgnoredCommands: string[] = []; - - @Column('jsonb', { name: 'sticky-roles', default: () => "'[]'::JSONB" }) - public stickyRoles: StickyRole[] = []; - - @Column('jsonb', { name: 'reaction-roles', default: () => "'[]'::JSONB" }) - public reactionRoles: ReactionRole[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesAdmin, type: 'role' }) - @Column('varchar', { name: 'roles.admin', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public rolesAdmin: string[] = []; - - @Column('jsonb', { name: 'roles.auto', default: () => "'[]'::JSONB" }) - public rolesAuto: RolesAuto[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesInitial, type: 'role' }) - @Column('varchar', { name: 'roles.initial', nullable: true, length: 19 }) - public rolesInitial?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesInitialHumans, type: 'role' }) - @Column('varchar', { name: 'roles.initial-humans', nullable: true, length: 19 }) - public rolesInitialHumans?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesInitialBots, type: 'role' }) - @Column('varchar', { name: 'roles.initial-bots', nullable: true, length: 19 }) - public rolesInitialBots?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesModerator, type: 'role' }) - @Column('varchar', { name: 'roles.moderator', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public rolesModerator: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesMuted, type: 'role' }) - @Column('varchar', { name: 'roles.muted', nullable: true, length: 19 }) - public rolesMuted?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRestrictedReaction, type: 'role' }) - @Column('varchar', { name: 'roles.restricted-reaction', nullable: true, length: 19 }) - public rolesRestrictedReaction?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRestrictedEmbed, type: 'role' }) - @Column('varchar', { name: 'roles.restricted-embed', nullable: true, length: 19 }) - public rolesRestrictedEmbed?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRestrictedEmoji, type: 'role' }) - @Column('varchar', { name: 'roles.restricted-emoji', nullable: true, length: 19 }) - public rolesRestrictedEmoji?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRestrictedAttachment, type: 'role' }) - @Column('varchar', { name: 'roles.restricted-attachment', nullable: true, length: 19 }) - public rolesRestrictedAttachment?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRestrictedVoice, type: 'role' }) - @Column('varchar', { name: 'roles.restricted-voice', nullable: true, length: 19 }) - public rolesRestrictedVoice?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesPublic, type: 'role' }) - @Column('varchar', { name: 'roles.public', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public rolesPublic: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.RolesRemoveInitial }) - @Column('boolean', { name: 'roles.remove-initial', default: false }) - public rolesRemoveInitial = false; - - @Column('jsonb', { name: 'roles.unique-role-sets', default: () => "'[]'::JSONB" }) - public rolesUniqueRoleSets: UniqueRoleSet[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodAttachmentsEnabled }) - @Column('boolean', { name: 'selfmod.attachments.enabled', default: false }) - public selfmodAttachmentsEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodAttachmentsIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.attachments.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodAttachmentsIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodAttachmentsIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.attachments.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodAttachmentsIgnoredChannels: string[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.attachments.soft-action', default: 0 }) - public selfmodAttachmentsSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.attachments.hard-action', default: 0 }) - public selfmodAttachmentsHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.attachments.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodAttachmentsHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.attachments.threshold-maximum', default: 10 }) - public selfmodAttachmentsThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.attachments.threshold-duration', default: 60000 }) - public selfmodAttachmentsThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodCapitalsEnabled }) - @Column('boolean', { name: 'selfmod.capitals.enabled', default: false }) - public selfmodCapitalsEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodCapitalsIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.capitals.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodCapitalsIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodCapitalsIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.capitals.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodCapitalsIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodCapitalsMinimum, minimum: 5, maximum: 2000 }) - @Column('smallint', { name: 'selfmod.capitals.minimum', default: 15 }) - public selfmodCapitalsMinimum = 15; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodCapitalsMaximum, minimum: 10, maximum: 100 }) - @Column('smallint', { name: 'selfmod.capitals.maximum', default: 50 }) - public selfmodCapitalsMaximum = 50; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.capitals.soft-action', default: 0 }) - public selfmodCapitalsSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.capitals.hard-action', default: 0 }) - public selfmodCapitalsHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.capitals.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodCapitalsHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.capitals.threshold-maximum', default: 10 }) - public selfmodCapitalsThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.capitals.threshold-duration', default: 60000 }) - public selfmodCapitalsThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodLinksEnabled }) - @Column('boolean', { name: 'selfmod.links.enabled', default: false }) - public selfmodLinksEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodLinksAllowed }) - @Column('varchar', { name: 'selfmod.links.allowed', length: 128, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodLinksAllowed: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodLinksIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.links.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodLinksIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodLinksIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.links.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodLinksIgnoredChannels: string[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.links.soft-action', default: 0 }) - public selfmodLinksSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.links.hard-action', default: 0 }) - public selfmodLinksHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.links.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodLinksHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.links.threshold-maximum', default: 10 }) - public selfmodLinksThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.links.threshold-duration', default: 60000 }) - public selfmodLinksThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodMessagesEnabled }) - @Column('boolean', { name: 'selfmod.messages.enabled', default: false }) - public selfmodMessagesEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodMessagesIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.messages.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodMessagesIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodMessagesIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.messages.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodMessagesIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodMessagesMaximum, minimum: 2, maximum: 100 }) - @Column('smallint', { name: 'selfmod.messages.maximum', default: 5 }) - public selfmodMessagesMaximum = 5; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodMessagesQueueSize, minimum: 10, maximum: 100 }) - @Column('smallint', { name: 'selfmod.messages.queue-size', default: 50 }) - public selfmodMessagesQueueSize = 50; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.messages.soft-action', default: 0 }) - public selfmodMessagesSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.messages.hard-action', default: 0 }) - public selfmodMessagesHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.messages.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodMessagesHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.messages.threshold-maximum', default: 10 }) - public selfmodMessagesThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.messages.threshold-duration', default: 60000 }) - public selfmodMessagesThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodNewlinesEnabled }) - @Column('boolean', { name: 'selfmod.newlines.enabled', default: false }) - public selfmodNewlinesEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodNewlinesIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.newlines.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodNewlinesIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodNewlinesIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.newlines.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodNewlinesIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodNewlinesMaximum, minimum: 10, maximum: 100 }) - @Column('smallint', { name: 'selfmod.newlines.maximum', default: 20 }) - public selfmodNewlinesMaximum = 20; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.newlines.soft-action', default: 0 }) - public selfmodNewlinesSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.newlines.hard-action', default: 0 }) - public selfmodNewlinesHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.newlines.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodNewlinesHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.newlines.threshold-maximum', default: 10 }) - public selfmodNewlinesThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.newlines.threshold-duration', default: 60000 }) - public selfmodNewlinesThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodInvitesEnabled }) - @Column('boolean', { name: 'selfmod.invites.enabled', default: false }) - public selfmodInvitesEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodInvitesIgnoredCodes }) - @Column('varchar', { name: 'selfmod.invites.ignored-codes', array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodInvitesIgnoredCodes: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodInvitesIgnoredGuilds }) - @Column('varchar', { name: 'selfmod.invites.ignored-guilds', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodInvitesIgnoredGuilds: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodInvitesIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.invites.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodInvitesIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodInvitesIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.invites.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodInvitesIgnoredChannels: string[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.invites.soft-action', default: 0 }) - public selfmodInvitesSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.invites.hard-action', default: 0 }) - public selfmodInvitesHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.invites.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodInvitesHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.invites.threshold-maximum', default: 10 }) - public selfmodInvitesThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.invites.threshold-duration', default: 60000 }) - public selfmodInvitesThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodFilterEnabled }) - @Column('boolean', { name: 'selfmod.filter.enabled', default: false }) - public selfmodFilterEnabled = false; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, type: 'word' }) - @Column('varchar', { name: 'selfmod.filter.raw', length: 32, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodFilterRaw: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodFilterIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.filter.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodFilterIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodFilterIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.filter.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodFilterIgnoredChannels: string[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.filter.soft-action', default: 0 }) - public selfmodFilterSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.filter.hard-action', default: 0 }) - public selfmodFilterHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.filter.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodFilterHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.filter.threshold-maximum', default: 10 }) - public selfmodFilterThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.filter.threshold-duration', default: 60000 }) - public selfmodFilterThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsEnabled }) - @Column('boolean', { name: 'selfmod.reactions.enabled', default: false }) - public selfmodReactionsEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'selfmod.reactions.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodReactionsIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.reactions.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodReactionsIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsMaximum, minimum: 1, maximum: 100 }) - @Column('smallint', { name: 'selfmod.reactions.maximum', default: 10 }) - public selfmodReactionsMaximum = 10; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsAllowed, type: 'emoji' }) - @Column('varchar', { name: 'selfmod.reactions.allowed', length: 128, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodReactionsAllowed: SerializedEmoji[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodReactionsBlocked, type: 'emoji' }) - @Column('varchar', { name: 'selfmod.reactions.blocked', length: 128, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodReactionsBlocked: SerializedEmoji[] = []; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.reactions.soft-action', default: 0 }) - public selfmodReactionsSoftAction = 0; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey }) - @Column('smallint', { name: 'selfmod.reactions.hard-action', default: 0 }) - public selfmodReactionsHardAction = 0; - - @ConfigurableKey({ - dashboardOnly: true, - type: 'timespan', - description: LanguageKeys.Settings.DashboardOnlyKey, - minimum: 0, - maximum: years(5) - }) - @Column('bigint', { name: 'selfmod.reactions.hard-action-duration', nullable: true, transformer: kBigIntTransformer }) - public selfmodReactionsHardActionDuration: number | null = null; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: 100 }) - @Column('smallint', { name: 'selfmod.reactions.threshold-maximum', default: 10 }) - public selfmodReactionsThresholdMaximum = 10; - - @ConfigurableKey({ dashboardOnly: true, description: LanguageKeys.Settings.DashboardOnlyKey, minimum: 0, maximum: minutes(5) }) - @Column('integer', { name: 'selfmod.reactions.threshold-duration', default: 60000 }) - public selfmodReactionsThresholdDuration = 60000; - - @ConfigurableKey({ description: LanguageKeys.Settings.SelfmodIgnoreChannels, type: 'textchannel' }) - @Column('varchar', { name: 'selfmod.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public selfmodIgnoreChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.NoMentionSpamEnabled }) - @Column('boolean', { name: 'no-mention-spam.enabled', default: false }) - public noMentionSpamEnabled = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.NoMentionSpamAlerts }) - @Column('boolean', { name: 'no-mention-spam.alerts', default: false }) - public noMentionSpamAlerts = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.NoMentionSpamMentionsAllowed, minimum: 0 }) - @Column('smallint', { name: 'no-mention-spam.mentions-allowed', default: 20 }) - public noMentionSpamMentionsAllowed = 20; - - @ConfigurableKey({ description: LanguageKeys.Settings.NoMentionSpamTimePeriod, minimum: 0 }) - @Column('integer', { name: 'no-mention-spam.time-period', default: 8 }) - public noMentionSpamTimePeriod = 8; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialEnabled }) - @Column('boolean', { name: 'social.enabled', default: true }) - public socialEnabled = true; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialAchieveRole }) - @Column('varchar', { name: 'social.achieve-role', nullable: true }) - public socialAchieveRole?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialAchieveLevel }) - @Column('varchar', { name: 'social.achieve-level', nullable: true }) - public socialAchieveLevel?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialAchieveChannel, type: 'textchannel' }) - @Column('varchar', { name: 'social.achieve-channel', nullable: true, length: 19 }) - public socialAchieveChannel?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialAchieveMultiple, minimum: 1 }) - @Column('smallint', { name: 'social.achieve-multiple', default: 1 }) - public socialAchieveMultiple = 1; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialMultiplier, minimum: 0, maximum: 5 }) - @Column('numeric', { name: 'social.multiplier', precision: 53, default: 1 }) - public socialMultiplier = 1; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialIgnoredChannels, type: 'textchannel' }) - @Column('varchar', { name: 'social.ignored-channels', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public socialIgnoredChannels: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SocialIgnoredRoles, type: 'role' }) - @Column('varchar', { name: 'social.ignored-roles', length: 19, array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public socialIgnoredRoles: string[] = []; - - @ConfigurableKey({ description: LanguageKeys.Settings.SuggestionsChannel, type: 'textchannel' }) - @Column('varchar', { name: 'suggestions.channel', nullable: true, length: 19 }) - public suggestionsChannel?: string | null; - - @ConfigurableKey({ description: LanguageKeys.Settings.SuggestionsOnActionDM }) - @Column('boolean', { name: 'suggestions.on-action.dm', default: false }) - public suggestionsOnActionDm = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SuggestionsOnActionRePost }) - @Column('boolean', { name: 'suggestions.on-action.repost', default: false }) - public suggestionsOnActionRePost = false; - - @ConfigurableKey({ description: LanguageKeys.Settings.SuggestionsOnActionHideAuthor }) - @Column('boolean', { name: 'suggestions.on-action.hide-author', default: false }) - public suggestionsOnActionHideAuthor = false; - - /** - * The anti-spam adders used to control spam - */ - public readonly adders = new AdderManager(this); - public readonly permissionNodes = new PermissionNodeManager(this); - - public wordFilterRegExp: RegExp | null = null; - - /** - * The ratelimit management for the no-mention-spam behavior - */ - public nms: RateLimitManager = null!; - - #words: readonly string[] = []; - - public get guild() { - return container.client.guilds.cache.get(this.id)!; - } - - /** - * Gets the [[Language]] for this entity. - */ - public getLanguage(): TFunction { - return container.i18n.getT(this.language); - } - - /** - * Gets the bare representation of the entity. - */ - public toJSON(): NonNullObject { - return Object.fromEntries(configurableKeys.map((v) => [v.property, this[v.property] ?? v.default])); - } - - public resetAll(): this { - for (const value of configurableKeys.values()) { - Reflect.set(this, value.property, value.default); - } - - this.entityRemove(); - return this; - } - - @AfterLoad() - protected entityLoad() { - this.adders.refresh(); - this.permissionNodes.refresh(); - this.nms = new RateLimitManager(this.noMentionSpamTimePeriod * 1000, this.noMentionSpamMentionsAllowed); - this.wordFilterRegExp = this.selfmodFilterRaw.length ? new RegExp(create(this.selfmodFilterRaw), 'gi') : null; - this.#words = this.selfmodFilterRaw.slice(); - } - - @AfterInsert() - @AfterUpdate() - protected entityUpdate() { - this.adders.refresh(); - this.permissionNodes.onPatch(); - - if (!arrayStrictEquals(this.#words, this.selfmodFilterRaw)) { - this.#words = this.selfmodFilterRaw.slice(); - this.wordFilterRegExp = this.selfmodFilterRaw.length ? new RegExp(create(this.selfmodFilterRaw), 'gi') : null; - } - } - - @AfterRemove() - protected entityRemove() { - this.adders.onRemove(); - this.permissionNodes.onRemove(); - this.wordFilterRegExp = null; - this.#words = []; - } -} - -export interface PermissionsNode { - allow: string[]; - - deny: string[]; - - id: string; -} - -export interface CustomCommand { - aliases: string[]; - - color: number; - - content: Sentence; - - embed: boolean; - - id: string; -} - -export type CommandAutoDelete = readonly [string, number]; - -export interface DisabledCommandChannel { - channel: string; - - commands: string[]; -} - -export interface StickyRole { - roles: string[]; - - user: string; -} - -export interface ReactionRole { - channel: string; - - emoji: SerializedEmoji; - - message: string | null; - - role: string; -} - -export interface RolesAuto { - id: string; - - points: number; -} - -export interface UniqueRoleSet { - name: string; - - roles: readonly string[]; -} diff --git a/src/lib/database/entities/GuildSubscriptionEntity.ts b/src/lib/database/entities/GuildSubscriptionEntity.ts deleted file mode 100644 index 67a558848b2..00000000000 --- a/src/lib/database/entities/GuildSubscriptionEntity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BaseEntity, Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm'; -import { TwitchSubscriptionEntity } from './TwitchSubscriptionEntity'; - -@Entity('guild_subscription', { schema: 'public' }) -export class GuildSubscriptionEntity extends BaseEntity { - @PrimaryColumn('varchar', { length: 19 }) - public guildId!: string; - - @ManyToOne(() => TwitchSubscriptionEntity, (twitchSubscription) => twitchSubscription.id, { primary: true, cascade: true, eager: true }) - @JoinColumn() - public subscription!: TwitchSubscriptionEntity; - - @PrimaryColumn('varchar', { length: 19 }) - public channelId!: string; - - @Column('varchar', { nullable: true, length: 200 }) - public message?: string; -} diff --git a/src/lib/database/entities/MemberEntity.ts b/src/lib/database/entities/MemberEntity.ts deleted file mode 100644 index 315369eadf1..00000000000 --- a/src/lib/database/entities/MemberEntity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; -import { kBigIntTransformer } from '../utils/Transformers'; - -@Entity('member', { schema: 'public' }) -export class MemberEntity extends BaseEntity { - @PrimaryColumn('varchar', { length: 19 }) - public guildId!: string; - - @PrimaryColumn('varchar', { length: 19 }) - public userId!: string; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public points = 0; - - public get level() { - return Math.floor(0.2 * Math.sqrt(this.points)); - } -} diff --git a/src/lib/database/entities/ModerationEntity.ts b/src/lib/database/entities/ModerationEntity.ts deleted file mode 100644 index 3fd55a5dbf1..00000000000 --- a/src/lib/database/entities/ModerationEntity.ts +++ /dev/null @@ -1,450 +0,0 @@ -import { GuildSettings } from '#lib/database/keys'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { ModerationManager, ModerationManagerUpdateData } from '#lib/moderation'; -import { Events } from '#lib/types/Enums'; -import { minutes, years } from '#utils/common'; -import { - metadata, - ModerationManagerDescriptionData, - ModerationTypeAssets, - TypeBits, - TypeCodes, - TypeMetadata, - TypeVariation, - TypeVariationAppealNames -} from '#utils/moderationConstants'; -import { container, UserError } from '@sapphire/framework'; -import { Duration, Time } from '@sapphire/time-utilities'; -import { isNullishOrZero, isNumber, NonNullObject, parseURL } from '@sapphire/utilities'; -import { MessageEmbed, User } from 'discord.js'; -import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; -import { readSettings } from '../settings'; -import { kBigIntTransformer } from '../utils/Transformers'; - -@Entity('moderation', { schema: 'public' }) -export class ModerationEntity extends BaseEntity { - #manager: ModerationManager = null!; - #moderator: User | null = null; - #user: User | null = null; - #timeout = Date.now() + minutes(15); - - @PrimaryColumn('integer') - public caseId = -1; - - @Column('timestamp without time zone', { nullable: true, default: () => 'null' }) - public createdAt: Date | null = null; - - @Column('bigint', { nullable: true, default: () => 'null', transformer: kBigIntTransformer }) - public duration: number | null = null; - - @Column('json', { nullable: true, default: () => 'null' }) - public extraData: unknown[] | NonNullObject | null = null; - - @PrimaryColumn('varchar', { length: 19 }) - public guildId: string = null!; - - @Column('varchar', { length: 19, default: process.env.CLIENT_ID }) - public moderatorId: string = process.env.CLIENT_ID; - - @Column('varchar', { nullable: true, length: 2000, default: () => 'null' }) - public reason: string | null = null; - - @Column('varchar', { nullable: true, length: 2000, default: () => 'null' }) - public imageURL: string | null = null; - - @Column('varchar', { nullable: true, length: 19, default: () => 'null' }) - public userId: string | null = null; - - @Column('smallint') - public type?: number | null; - - public constructor(data?: Partial) { - super(); - - if (data) { - Object.assign(this, data); - this.type = ModerationEntity.getTypeFlagsFromDuration(this.type!, this.duration); - } - } - - public setup(manager: ModerationManager) { - this.#manager = manager; - this.guildId = manager.guild.id; - return this; - } - - public clone() { - return new ModerationEntity(this).setup(this.#manager); - } - - public equals(other: ModerationEntity) { - return ( - this.type === other.type && - this.duration === other.duration && - this.extraData === other.extraData && - this.reason === other.reason && - this.imageURL === other.imageURL && - this.userId === other.userId && - this.moderatorId === other.moderatorId - ); - } - - public get guild() { - return this.#manager.guild; - } - - public fetchChannel() { - return this.#manager.fetchChannel(); - } - - /** - * Retrieve the metadata (title and color) for this entry. - */ - public get metadata(): ModerationTypeAssets { - const data = metadata.get(this.type! & ~TypeMetadata.Invalidated); - if (typeof data === 'undefined') throw new Error(`Inexistent metadata for '0b${this.type!.toString(2).padStart(8, '0')}'.`); - return data; - } - - /** - * Retrieve the title for this entry's embed. - */ - public get title(): string { - return this.metadata.title; - } - - /** - * Retrieve the color for this entry's embed. - */ - public get color(): number { - return this.metadata.color; - } - - /** - * Retrieve the creation date for this entry's embed. Returns current date if not set. - */ - public get createdTimestamp(): number { - return this.createdAt?.getTime() ?? Date.now(); - } - - /** - * Get the variation type for this entry. - */ - public get typeVariation() { - /** - * Variation is assigned to the first 4 bits of the entire type, therefore: - * 0b00001111 & - * 0bXXXX0100 = - * 0b00000100 - */ - return (this.type! & TypeBits.Variation) as TypeVariation; - } - - /** - * Get the metadata type for this entry. - */ - public get typeMetadata() { - /** - * Metadata is assigned to the last 4 bits of the entire type, therefore: - * 0b11110000 & - * 0b0010XXXX = - * 0b00100000 - */ - return (this.type! & TypeBits.Metadata) as TypeMetadata; - } - - public get appealType() { - return (this.type! & TypeMetadata.Appeal) === TypeMetadata.Appeal; - } - - public get temporaryType() { - return (this.type! & TypeMetadata.Temporary) === TypeMetadata.Temporary; - } - - public get temporaryFastType() { - return (this.type! & TypeMetadata.Fast) === TypeMetadata.Fast; - } - - public get invalidated() { - return (this.type! & TypeMetadata.Invalidated) === TypeMetadata.Invalidated; - } - - public get appealable() { - return !this.appealType && metadata.has(this.typeVariation | TypeMetadata.Appeal); - } - - public get temporable() { - return metadata.has(this.type! | TypeMetadata.Temporary); - } - - public get cacheExpired() { - return Date.now() > this.#timeout; - } - - public get cacheRemaining() { - return Math.max(Date.now() - this.#timeout, 0); - } - - public get appealTaskName() { - if (!this.appealable) return null; - switch (this.typeVariation) { - case TypeVariation.Warning: - return TypeVariationAppealNames.Warning; - case TypeVariation.Mute: - return TypeVariationAppealNames.Mute; - case TypeVariation.Ban: - return TypeVariationAppealNames.Ban; - case TypeVariation.VoiceMute: - return TypeVariationAppealNames.VoiceMute; - case TypeVariation.RestrictedAttachment: - return TypeVariationAppealNames.RestrictedAttachment; - case TypeVariation.RestrictedReaction: - return TypeVariationAppealNames.RestrictedReaction; - case TypeVariation.RestrictedEmbed: - return TypeVariationAppealNames.RestrictedEmbed; - case TypeVariation.RestrictedEmoji: - return TypeVariationAppealNames.RestrictedEmoji; - case TypeVariation.RestrictedVoice: - return TypeVariationAppealNames.RestrictedVoice; - case TypeVariation.SetNickname: - return TypeVariationAppealNames.SetNickname; - case TypeVariation.AddRole: - return TypeVariationAppealNames.AddRole; - case TypeVariation.RemoveRole: - return TypeVariationAppealNames.RemoveRole; - default: - return null; - } - } - - public get shouldSend() { - // If the moderation log is not anonymous, it should always send - if (this.moderatorId !== process.env.CLIENT_ID) return true; - - const before = Date.now() - Time.Minute; - const type = this.typeVariation; - const checkSoftBan = type === 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; - - // If there was a log with the same type in the last minute, do not duplicate - 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 === TypeCodes.SoftBan) return false; - } - - // For all other cases, it should send - return true; - } - - public get task() { - const { guild } = this.#manager; - return ( - container.client.schedules.queue.find((value) => value.data && value.data.caseID === this.caseId && value.data.guildID === guild.id) ?? - null - ); - } - - public async fetchUser() { - if (!this.userId) { - throw new Error('userId must be set before calling this method.'); - } - - const previous = this.#user; - if (previous?.id === this.userId) return previous; - - const user = await container.client.users.fetch(this.userId); - this.#user = user; - return user; - } - - public async fetchModerator() { - const previous = this.#moderator; - if (previous) return previous; - - const moderator = await container.client.users.fetch(this.moderatorId); - this.#moderator = moderator; - return moderator; - } - - public isType(type: TypeCodes) { - return ( - this.type === type || this.type === (type | TypeMetadata.Temporary) || this.type === (type | TypeMetadata.Temporary | TypeMetadata.Fast) - ); - } - - public async edit(data: ModerationManagerUpdateData = {}) { - const dataWithType = { ...data, type: ModerationEntity.getTypeFlagsFromDuration(this.type!, data.duration ?? this.duration) }; - const clone = this.clone(); - try { - Object.assign(this, dataWithType); - await this.save(); - } catch (error) { - Object.assign(this, clone); - throw error; - } - - container.client.emit(Events.ModerationEntryEdit, clone, this); - return this; - } - - public async invalidate() { - if (this.invalidated) return this; - const clone = this.clone(); - try { - this.type! |= TypeMetadata.Invalidated; - await this.save(); - } catch (error) { - this.type = clone.type; - throw error; - } - - container.client.emit(Events.ModerationEntryEdit, clone, this); - return this; - } - - public async prepareEmbed() { - if (!this.userId) throw new Error('A user has not been set.'); - const manager = this.#manager; - - const [user, moderator] = await Promise.all([this.fetchUser(), this.fetchModerator()]); - - const [prefix, t] = await readSettings(manager.guild, (settings) => [settings[GuildSettings.Prefix], settings.getLanguage()]); - const formattedDuration = this.duration ? t(LanguageKeys.Commands.Moderation.ModerationLogExpiresIn, { duration: this.duration }) : ''; - const descriptionData: 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({ name: moderator.tag, iconURL: moderator.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) }) - .setDescription(`${body}\n${reason}`) - .setFooter({ - text: t(LanguageKeys.Commands.Moderation.ModerationLogFooter, { caseId: this.caseId }), - iconURL: container.client.user!.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }) - .setTimestamp(this.createdTimestamp); - - if (this.imageURL) embed.setImage(this.imageURL); - return embed; - } - - public setCase(value: number) { - this.caseId = value; - return this; - } - - public setDuration(duration: string | number | null) { - if (this.temporable) { - if (typeof duration === 'string') duration = new Duration(duration.trim()).offset; - if (typeof duration === 'number' && (duration <= 0 || duration > Time.Year)) duration = null; - - if (isNumber(duration)) { - if (duration < 0 || duration > years(5)) { - throw new UserError({ - identifier: LanguageKeys.Commands.Moderation.AutomaticParameterShowDurationPermanent, - context: { duration } - }); - } - this.duration = isNullishOrZero(duration) ? null : duration; - } else { - this.duration = null; - } - } else { - this.duration = null; - } - - this.type = ModerationEntity.getTypeFlagsFromDuration(this.type!, this.duration); - return this; - } - - public setExtraData(value: Record | null) { - this.extraData = value; - return this; - } - - public setModerator(value: User | string) { - if (value instanceof User) { - this.#moderator = value; - this.moderatorId = value.id; - } else if (this.moderatorId !== value) { - this.#moderator = null; - this.moderatorId = value; - } - return this; - } - - public setReason(value?: string | null) { - if (typeof value === 'string') { - const trimmed = value.trim(); - value = trimmed.length === 0 ? null : trimmed; - } else { - value = null; - } - - this.reason = value; - return this; - } - - public setImageURL(value?: string | null) { - this.imageURL = (value && parseURL(value)?.href) ?? null; - return this; - } - - public setType(value: TypeCodes) { - this.type = value; - return this; - } - - public setUser(value: User | string) { - if (value instanceof User) { - this.#user = value; - this.userId = value.id; - } else { - this.userId = value; - } - - return this; - } - - public async create() { - // If the entry was created, there is no point on re-sending - if (!this.userId || this.createdAt) return null; - this.createdAt = new Date(); - - // If the entry should not send, abort creation - if (!this.shouldSend) return null; - - this.caseId = (await this.#manager.getCurrentId()) + 1; - await this.save(); - this.#manager.insert(this); - - container.client.emit(Events.ModerationEntryAdd, this); - return this; - } - - private static getTypeFlagsFromDuration(type: TypeCodes, duration: number | null) { - if (duration === null) return type & ~(TypeMetadata.Temporary | TypeMetadata.Fast); - if (duration < Time.Minute) return type | TypeMetadata.Temporary | TypeMetadata.Fast; - return type | TypeMetadata.Temporary; - } -} diff --git a/src/lib/database/entities/RpgBattleEntity.ts b/src/lib/database/entities/RpgBattleEntity.ts deleted file mode 100644 index 532040ccb0f..00000000000 --- a/src/lib/database/entities/RpgBattleEntity.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { BaseEntity, Check, Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { RpgUserEntity } from './RpgUserEntity'; -import { RpgUserItemEntity } from './RpgUserItemEntity'; - -@Check(/* sql */ `challenger_cooldown >= 0`) -@Check(/* sql */ `challenger_health >= 0`) -@Check(/* sql */ `challenger_energy >= 0`) -@Check(/* sql */ `challenged_cooldown >= 0`) -@Check(/* sql */ `challenged_health >= 0`) -@Check(/* sql */ `challenged_energy >= 0`) -@Entity('rpg_battle', { schema: 'public' }) -export class RpgBattleEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'bigint' }) - public id!: string; - - @Column('boolean') - public challengerTurn?: boolean; - - @Column('smallint') - public challengerCooldown!: number; - - @Column('integer') - public challengerHealth?: number; - - @Column('integer') - public challengerEnergy?: number; - - @Column('jsonb') - public challengerEffects: unknown = []; - - @Column('smallint') - public challengedCooldown!: number; - - @Column('integer') - public challengedHealth?: number; - - @Column('integer') - public challengedEnergy?: number; - - @Column('jsonb') - public challengedEffects: unknown = []; - - @OneToOne(() => RpgUserEntity, (rpgUsers) => rpgUsers.challengedAt, { nullable: false, onDelete: 'CASCADE' }) - @JoinColumn() - public challenged?: RpgUserEntity; - - @ManyToOne(() => RpgUserItemEntity, (rpgUserItems) => rpgUserItems.challengedAt, { onDelete: 'SET NULL' }) - @JoinColumn() - public challengedWeapon?: RpgUserItemEntity; - - @OneToOne(() => RpgUserEntity, (rpgUsers) => rpgUsers.challengerAt, { nullable: false, onDelete: 'CASCADE' }) - @JoinColumn() - public challenger?: RpgUserEntity; - - @ManyToOne(() => RpgUserItemEntity, (rpgUserItems) => rpgUserItems.challengerAt, { onDelete: 'SET NULL' }) - @JoinColumn() - public challengerWeapon?: RpgUserItemEntity; -} diff --git a/src/lib/database/entities/RpgClassEntity.ts b/src/lib/database/entities/RpgClassEntity.ts deleted file mode 100644 index 8a8053c0971..00000000000 --- a/src/lib/database/entities/RpgClassEntity.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { BaseEntity, Check, Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { RpgUserEntity } from './RpgUserEntity'; - -@Check(/* sql */ `name <> ''`) -@Check(/* sql */ `attack_multiplier >= 0`) -@Check(/* sql */ `defense_multiplier >= 0`) -@Check(/* sql */ `agility_multiplier >= 0`) -@Check(/* sql */ `energy_multiplier >= 0`) -@Check(/* sql */ `luck_multiplier >= 0`) -@Entity('rpg_class', { schema: 'public' }) -export class RpgClassEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'integer' }) - public id!: number; - - @Column('varchar', { unique: true, length: 20 }) - public name!: string; - - @Column('double precision', { default: 1.0 }) - public attackMultiplier = 1.0; - - @Column('double precision', { default: 1.0 }) - public defenseMultiplier = 1.0; - - @Column('double precision', { default: 1.0 }) - public agilityMultiplier = 1.0; - - @Column('double precision', { default: 1.0 }) - public energyMultiplier = 1.0; - - @Column('double precision', { default: 1.0 }) - public luckMultiplier = 1.0; - - @OneToMany(() => RpgUserEntity, (rpgUsers) => rpgUsers.class) - public users?: RpgUserEntity[]; -} diff --git a/src/lib/database/entities/RpgGuildEntity.ts b/src/lib/database/entities/RpgGuildEntity.ts deleted file mode 100644 index 4fd22395b45..00000000000 --- a/src/lib/database/entities/RpgGuildEntity.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { BaseEntity, Check, Column, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { kBigIntTransformer } from '../utils/Transformers'; -import { RpgGuildRankEntity } from './RpgGuildRankEntity'; -import { RpgUserEntity } from './RpgUserEntity'; - -@Check(/* sql */ `member_limit >= 5`) -@Check(/* sql */ `win_count >= 0`) -@Check(/* sql */ `lose_count >= 0`) -@Check(/* sql */ `money_count >= 0`) -@Check(/* sql */ `bank_limit >= 0`) -@Check(/* sql */ `upgrade >= 0`) -@Entity('rpg_guild', { schema: 'public' }) -export class RpgGuildEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'integer' }) - public id!: number; - - @Column('varchar', { length: 50 }) - public name!: string; - - @Column('varchar', { nullable: true, length: 200 }) - public description!: string | null; - - @Column('smallint', { default: 5 }) - public memberLimit = 5; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public winCount = 0; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public loseCount = 0; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public moneyCount = 0; - - @Column('bigint', { default: 50000, transformer: kBigIntTransformer }) - public bankLimit = 50000; - - @Column('smallint') - public upgrade = 0; - - @OneToOne(() => RpgUserEntity, (rpgUsers) => rpgUsers.leaderAt, { onDelete: 'CASCADE' }) - @JoinColumn() - public leader?: RpgUserEntity; - - @OneToMany(() => RpgGuildRankEntity, (rank) => rank.guild) - public ranks?: RpgGuildRankEntity[]; - - @OneToMany(() => RpgUserEntity, (rpgUsers) => rpgUsers.guild) - public members?: RpgUserEntity[]; -} diff --git a/src/lib/database/entities/RpgGuildRankEntity.ts b/src/lib/database/entities/RpgGuildRankEntity.ts deleted file mode 100644 index cca8f985c45..00000000000 --- a/src/lib/database/entities/RpgGuildRankEntity.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BaseEntity, Check, Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { RpgGuildEntity } from './RpgGuildEntity'; -import { RpgUserEntity } from './RpgUserEntity'; - -@Check(/* sql */ `name <> ''`) -@Entity('rpg_guild_rank', { schema: 'public' }) -export class RpgGuildRankEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'integer', name: 'id' }) - public id!: number; - - @Column('varchar', { length: 50 }) - public name!: string; - - @ManyToOne(() => RpgGuildEntity, (guild) => guild.ranks, { onDelete: 'CASCADE' }) - @JoinColumn() - public guild?: RpgGuildEntity; - - @OneToMany(() => RpgUserEntity, (rpgUsers) => rpgUsers.guildRank) - public members?: RpgUserEntity[]; -} diff --git a/src/lib/database/entities/RpgItemEntity.ts b/src/lib/database/entities/RpgItemEntity.ts deleted file mode 100644 index e3e74a06e06..00000000000 --- a/src/lib/database/entities/RpgItemEntity.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { BaseEntity, Check, Column, Entity, Index, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { RpgUserItemEntity } from './RpgUserItemEntity'; - -@Check(/* sql */ `name <> ''`) -@Check(/* sql */ `maximum_durability >= 0`) -@Check(/* sql */ `maximum_cooldown >= 0`) -@Check(/* sql */ `attack >= 0`) -@Check(/* sql */ `defense >= 0`) -@Check(/* sql */ `health >= 0`) -@Check(/* sql */ `required_energy >= 0`) -@Check(/* sql */ `rarity >= 1`) -@Check(/* sql */ `accuracy >= 0`) -@Check(/* sql */ `accuracy <= 100`) -@Index(['name', 'rarity'], { unique: true }) -@Entity('rpg_item', { schema: 'public' }) -export class RpgItemEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'integer' }) - public id!: number; - - @Column('enum', { default: 'Weapon', enum: ['Weapon', 'Shield', 'Disposable', 'Special'] }) - public type!: 'Weapon' | 'Shield' | 'Disposable' | 'Special'; - - @Column('varchar', { length: 50 }) - public name!: string; - - @Column('integer') - public maximumDurability!: number; - - @Column('smallint') - public maximumCooldown!: number; - - @Column('double precision') - public attack!: number; - - @Column('double precision') - public defense!: number; - - @Column('double precision') - public health!: number; - - @Column('double precision') - public requiredEnergy!: number; - - @Column('integer') - public rarity!: number; - - @Column('smallint') - public accuracy!: number; - - @Column('jsonb', { default: () => "'{}'::jsonb" }) - public effects: unknown = []; - - @OneToMany(() => RpgUserItemEntity, (rpgUserItems) => rpgUserItems.item) - public userItems?: RpgUserItemEntity[]; -} diff --git a/src/lib/database/entities/RpgUserEntity.ts b/src/lib/database/entities/RpgUserEntity.ts deleted file mode 100644 index b6cd91bdf55..00000000000 --- a/src/lib/database/entities/RpgUserEntity.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { BaseEntity, Check, Column, Entity, JoinColumn, ManyToOne, OneToMany, OneToOne } from 'typeorm'; -import { kBigIntTransformer } from '../utils/Transformers'; -import { RpgBattleEntity } from './RpgBattleEntity'; -import { RpgClassEntity } from './RpgClassEntity'; -import { RpgGuildEntity } from './RpgGuildEntity'; -import { RpgGuildRankEntity } from './RpgGuildRankEntity'; -import { RpgUserItemEntity } from './RpgUserItemEntity'; -import { UserEntity } from './UserEntity'; - -@Check(/* sql */ `win_count >= 0`) -@Check(/* sql */ `death_count >= 0`) -@Check(/* sql */ `crate_common_count >= 0`) -@Check(/* sql */ `crate_uncommon_count >= 0`) -@Check(/* sql */ `crate_rare_count >= 0`) -@Check(/* sql */ `crate_legendary_count >= 0`) -@Check(/* sql */ `attack >= 1`) -@Check(/* sql */ `health >= 1`) -@Check(/* sql */ `agility >= 1`) -@Check(/* sql */ `energy >= 0`) -@Check(/* sql */ `luck >= 0`) -@Entity('rpg_user', { schema: 'public' }) -export class RpgUserEntity extends BaseEntity { - @Column('varchar', { length: 32 }) - public name!: string; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public winCount = 0; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public deathCount = 0; - - @Column('integer', { default: 0 }) - public crateCommonCount = 0; - - @Column('integer', { default: 0 }) - public crateUncommonCount = 0; - - @Column('integer', { default: 0 }) - public crateRareCount = 0; - - @Column('integer', { default: 0 }) - public crateLegendaryCount = 0; - - @Column('integer') - public attack!: number; - - @Column('integer') - public health!: number; - - @Column('integer') - public agility!: number; - - @Column('integer') - public energy!: number; - - @Column('integer') - public luck!: number; - - @OneToOne(() => RpgBattleEntity, (rpgBattles) => rpgBattles.challenged) - public challengedAt?: RpgBattleEntity; - - @OneToOne(() => RpgBattleEntity, (rpgBattles) => rpgBattles.challenger) - public challengerAt?: RpgBattleEntity; - - @OneToOne(() => RpgGuildEntity, (rpgGuilds) => rpgGuilds.leader) - public leaderAt?: RpgGuildEntity; - - @OneToMany(() => RpgUserItemEntity, (rpgUserItems) => rpgUserItems.user) - public items?: RpgUserItemEntity[]; - - @ManyToOne(() => RpgClassEntity, (rpgClass) => rpgClass.users, { onDelete: 'SET NULL' }) - @JoinColumn() - public class?: RpgClassEntity; - - @ManyToOne(() => RpgUserItemEntity, (rpgUserItems) => rpgUserItems.equippedBy, { onDelete: 'SET NULL' }) - @JoinColumn() - public equippedItem?: RpgUserItemEntity; - - @ManyToOne(() => RpgGuildEntity, (rpgGuilds) => rpgGuilds.members, { onDelete: 'SET NULL' }) - @JoinColumn() - public guild?: RpgGuildEntity; - - @ManyToOne(() => RpgGuildRankEntity, (rpgGuildRank) => rpgGuildRank.members, { onDelete: 'SET NULL' }) - @JoinColumn() - public guildRank?: RpgGuildRankEntity; - - @OneToOne(() => UserEntity, (users) => users.game, { primary: true, onDelete: 'CASCADE' }) - @JoinColumn() - public user?: UserEntity; -} diff --git a/src/lib/database/entities/RpgUserItemEntity.ts b/src/lib/database/entities/RpgUserItemEntity.ts deleted file mode 100644 index 7cdc0255c06..00000000000 --- a/src/lib/database/entities/RpgUserItemEntity.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { BaseEntity, Check, Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { RpgBattleEntity } from './RpgBattleEntity'; -import { RpgItemEntity } from './RpgItemEntity'; -import { RpgUserEntity } from './RpgUserEntity'; - -@Check(/* sql */ `"durability" >= 0`) -@Entity('rpg_user_item', { schema: 'public' }) -export class RpgUserItemEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'bigint' }) - public id!: string; - - @Column('integer') - public durability!: string; - - @OneToMany(() => RpgBattleEntity, (rpgBattles) => rpgBattles.challengedWeapon) - public challengedAt?: RpgBattleEntity[]; - - @OneToMany(() => RpgBattleEntity, (rpgBattles) => rpgBattles.challengerWeapon) - public challengerAt?: RpgBattleEntity[]; - - @ManyToOne(() => RpgItemEntity, (rpgItems) => rpgItems.userItems, { onDelete: 'CASCADE' }) - @JoinColumn() - public item?: RpgItemEntity; - - @ManyToOne(() => RpgUserEntity, (rpgUsers) => rpgUsers.items, { onDelete: 'CASCADE' }) - @JoinColumn() - public user?: RpgUserEntity; - - @OneToMany(() => RpgUserEntity, (rpgUsers) => rpgUsers.equippedItem) - public equippedBy?: RpgUserEntity[]; -} diff --git a/src/lib/database/entities/ScheduleEntity.ts b/src/lib/database/entities/ScheduleEntity.ts deleted file mode 100644 index ca520eb380b..00000000000 --- a/src/lib/database/entities/ScheduleEntity.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { ScheduleManager } from '#lib/structures/managers/ScheduleManager'; -import { Events } from '#lib/types/Enums'; -import { container } from '@sapphire/framework'; -import { Cron } from '@sapphire/time-utilities'; -import { BaseEntity, Column, Entity, PrimaryGeneratedColumn, ValueTransformer } from 'typeorm'; - -const cronTransformer: ValueTransformer = { - from(value: string | null) { - return value === null ? null : new Cron(value); - }, - to(value: Cron | null) { - return value === null ? null : value.cron; - } -}; - -export const enum ResponseType { - Ignore, - Delay, - Update, - Finished -} - -export type PartialResponseValue = - | { type: ResponseType.Ignore | ResponseType.Finished } - | { type: ResponseType.Delay; value: number } - | { type: ResponseType.Update; value: Date }; - -export type ResponseValue = PartialResponseValue & { entry: ScheduleEntity }; - -@Entity('schedule', { schema: 'public' }) -export class ScheduleEntity extends BaseEntity { - #manager: ScheduleManager = null!; - - /** - * The id for this scheduled task - */ - @PrimaryGeneratedColumn({ type: 'integer' }) - public id!: number; - - /** - * The name of the Task this scheduled task will run - */ - @Column('varchar') - public taskId!: string; - - /** - * The Date when this scheduled task ends - */ - @Column('timestamp without time zone') - public time!: Date; - - /** - * Whether this scheduled task is scheduled with the Cron pattern - */ - @Column('varchar', { nullable: true, transformer: cronTransformer, default: null }) - public recurring: Cron | null = null; - - /** - * If the task should catch up in the event the bot is down - */ - @Column('boolean', { default: true }) - public catchUp = true; - - /** - * The stored metadata to send to the Task - */ - @Column('jsonb') - public data!: Record; - - /** - * Whether or not the entity is running - */ - #running = false; - - /** - * Whether or not the entity is paused - */ - #paused = true; - - public setup(manager: ScheduleManager) { - this.#manager = manager; - return this; - } - - public get task() { - return container.settings.tasks.get(this.taskId) ?? null; - } - - public get running() { - return this.#running; - } - - public async run(): Promise { - const { task } = this; - if (!task?.enabled || this.#running || this.#paused) return { entry: this, type: ResponseType.Ignore }; - - this.#running = true; - let response: PartialResponseValue | null = null; - try { - response = (await task.run({ ...(this.data ?? {}), id: this.id })) as PartialResponseValue | null; - } catch (error) { - container.client.emit(Events.TaskError, error, { piece: task, entity: this }); - } - - this.#running = false; - - if (response !== null) return { ...response, entry: this }; - - return this.recurring - ? { entry: this, type: ResponseType.Update, value: this.recurring.next() } - : { entry: this, type: ResponseType.Finished }; - } - - public resume() { - this.#paused = false; - return this; - } - - public pause() { - this.#paused = true; - return this; - } - - public delete() { - return this.#manager.remove(this); - } -} diff --git a/src/lib/database/entities/SuggestionEntity.ts b/src/lib/database/entities/SuggestionEntity.ts deleted file mode 100644 index 261ce8ccd67..00000000000 --- a/src/lib/database/entities/SuggestionEntity.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'; - -@Entity('suggestion', { schema: 'public' }) -export class SuggestionEntity extends BaseEntity { - @PrimaryColumn('integer') - public id!: number; - - @PrimaryColumn('varchar', { length: 19 }) - public guildId!: string; - - @Column('varchar', { length: 19 }) - public messageId!: string; - - @Column('varchar', { length: 19 }) - public authorId!: string; -} diff --git a/src/lib/database/entities/TwitchSubscriptionEntity.ts b/src/lib/database/entities/TwitchSubscriptionEntity.ts deleted file mode 100644 index 01aec316bde..00000000000 --- a/src/lib/database/entities/TwitchSubscriptionEntity.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { TwitchEventSubTypes } from '#lib/types'; -import { BaseEntity, Column, Entity, Index, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; -import { GuildSubscriptionEntity } from './GuildSubscriptionEntity'; - -@Index(['streamerId', 'subscriptionType'], { unique: true }) -@Entity('twitch_subscriptions', { schema: 'public' }) -export class TwitchSubscriptionEntity extends BaseEntity { - @PrimaryGeneratedColumn({ type: 'integer' }) - public id!: number; - - @Column('varchar', { length: 10 }) - public streamerId!: string; - - @Column('varchar', { length: 36 }) - public subscriptionId!: string; - - @Column({ type: 'enum', enum: TwitchEventSubTypes }) - public subscriptionType!: TwitchEventSubTypes; - - @OneToMany(() => GuildSubscriptionEntity, (guildSubscription) => guildSubscription.subscription) - public guildSubscription!: GuildSubscriptionEntity[]; -} diff --git a/src/lib/database/entities/UserCooldownEntity.ts b/src/lib/database/entities/UserCooldownEntity.ts deleted file mode 100644 index 7c5d6661d27..00000000000 --- a/src/lib/database/entities/UserCooldownEntity.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BaseEntity, Column, Entity, JoinColumn, OneToOne } from 'typeorm'; -import { UserEntity } from './UserEntity'; - -@Entity('user_cooldown', { schema: 'public' }) -export class UserCooldownEntity extends BaseEntity { - @Column('timestamp without time zone', { nullable: true }) - public daily: Date | null = null; - - @Column('timestamp without time zone', { nullable: true }) - public reputation: Date | null = null; - - @OneToOne(() => UserEntity, { primary: true, onDelete: 'CASCADE' }) - @JoinColumn() - public user?: UserEntity; -} diff --git a/src/lib/database/entities/UserEntity.ts b/src/lib/database/entities/UserEntity.ts deleted file mode 100644 index 8b35aebec32..00000000000 --- a/src/lib/database/entities/UserEntity.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Events } from '#lib/types/Enums'; -import { container } from '@sapphire/framework'; -import { AfterInsert, AfterLoad, AfterRemove, AfterUpdate, BaseEntity, Column, Entity, OneToMany, OneToOne, PrimaryColumn } from 'typeorm'; -import { kBigIntTransformer } from '../utils/Transformers'; -import { RpgUserEntity } from './RpgUserEntity'; -import { UserCooldownEntity } from './UserCooldownEntity'; -import { UserGameIntegrationEntity } from './UserGameIntegrationEntity'; -import { UserProfileEntity } from './UserProfileEntity'; - -@Entity('user', { schema: 'public' }) -export class UserEntity extends BaseEntity { - @PrimaryColumn('varchar', { length: 19 }) - public id!: string; - - @Column('integer', { default: 0 }) - public points = 0; - - @Column('integer', { default: 0 }) - public reputations = 0; - - @Column('boolean', { default: true }) - public moderationDM = true; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public money = 0; - - @OneToOne(() => RpgUserEntity, (rpgUsers) => rpgUsers.user) - public game?: RpgUserEntity; - - @OneToOne(() => UserProfileEntity, (profile) => profile.user, { cascade: true }) - public profile?: UserProfileEntity; - - @OneToMany(() => UserGameIntegrationEntity, (gi) => gi.user, { cascade: true }) - public gi?: UserGameIntegrationEntity[]; - - @OneToOne(() => UserCooldownEntity, (cooldown) => cooldown.user, { cascade: true }) - public cooldowns?: UserCooldownEntity; - - #money: number | null; - - public constructor() { - super(); - this.#money = null; - } - - public get level() { - return Math.floor(0.2 * Math.sqrt(this.points)); - } - - @AfterLoad() - protected entityLoad() { - this.#money = this.money; - } - - @AfterInsert() - @AfterUpdate() - protected entityUpdate() { - if (this.#money !== null && this.money !== this.#money) { - container.client.emit(Events.MoneyTransaction, this, this.money - this.#money, this.#money); - this.#money = this.money; - } - } - - @AfterRemove() - protected entityRemove() { - this.#money = null; - } -} diff --git a/src/lib/database/entities/UserGameIntegrationEntity.ts b/src/lib/database/entities/UserGameIntegrationEntity.ts deleted file mode 100644 index 341805f6720..00000000000 --- a/src/lib/database/entities/UserGameIntegrationEntity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { BaseEntity, Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { UserEntity } from './UserEntity'; - -@Entity('user_game_integration', { schema: 'public' }) -export class UserGameIntegrationEntity extends BaseEntity { - @PrimaryGeneratedColumn() - public id!: number; - - @Column('varchar', { length: 35 }) - public game!: string; - - @Column('jsonb') - public extraData?: T; - - @ManyToOne(() => UserEntity, { onDelete: 'CASCADE' }) - @JoinColumn() - public user?: UserEntity; -} diff --git a/src/lib/database/entities/UserProfileEntity.ts b/src/lib/database/entities/UserProfileEntity.ts deleted file mode 100644 index eaa5321f6fe..00000000000 --- a/src/lib/database/entities/UserProfileEntity.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { BaseEntity, Column, Entity, JoinColumn, OneToOne } from 'typeorm'; -import { kBigIntTransformer } from '../utils/Transformers'; -import { UserEntity } from './UserEntity'; - -@Entity('user_profile', { schema: 'public' }) -export class UserProfileEntity extends BaseEntity { - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public banners: string[] = []; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public publicBadges: string[] = []; - - @Column('varchar', { array: true, default: () => 'ARRAY[]::VARCHAR[]' }) - public badges: string[] = []; - - @Column('integer', { default: 0 }) - public color = 0x000000; - - @Column('bigint', { default: 0, transformer: kBigIntTransformer }) - public vault = 0; - - @Column('varchar', { length: 6, default: '1001' }) - public bannerLevel = '1001'; - - @Column('varchar', { length: 6, default: '0001' }) - public bannerProfile = '0001'; - - @Column('boolean', { default: false }) - public darkTheme = false; - - @OneToOne(() => UserEntity, { primary: true, onDelete: 'CASCADE' }) - @JoinColumn() - public user?: UserEntity; -} diff --git a/src/lib/database/entities/index.ts b/src/lib/database/entities/index.ts deleted file mode 100644 index 2b449ff7b56..00000000000 --- a/src/lib/database/entities/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -export * from './BannerEntity'; -export * from './ClientEntity'; -export * from './GuildEntity'; -export * from './GuildSubscriptionEntity'; -export * from './MemberEntity'; -export * from './ModerationEntity'; -export * from './RpgBattleEntity'; -export * from './RpgClassEntity'; -export * from './RpgGuildEntity'; -export * from './RpgGuildRankEntity'; -export * from './RpgItemEntity'; -export * from './RpgUserEntity'; -export * from './RpgUserItemEntity'; -export * from './ScheduleEntity'; -export * from './SuggestionEntity'; -export * from './TwitchSubscriptionEntity'; -export * from './UserCooldownEntity'; -export * from './UserEntity'; -export * from './UserGameIntegrationEntity'; -export * from './UserProfileEntity'; diff --git a/src/lib/database/index.ts b/src/lib/database/index.ts deleted file mode 100644 index a25b612b3c3..00000000000 --- a/src/lib/database/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './entities'; -export * from './keys'; -export * from './repositories/ClientRepository'; -export * from './repositories/MemberRepository'; -export * from './repositories/UserRepository'; -export * from './settings'; -export * from './utils/DbSet'; -export * from './utils/matchers'; diff --git a/src/lib/database/keys/index.ts b/src/lib/database/keys/index.ts deleted file mode 100644 index 7a6fcbc20f2..00000000000 --- a/src/lib/database/keys/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as GuildSettings from './settings/All'; diff --git a/src/lib/database/keys/settings/All.ts b/src/lib/database/keys/settings/All.ts deleted file mode 100644 index ef701f2ba61..00000000000 --- a/src/lib/database/keys/settings/All.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * as Channels from './Channels'; -export * as Events from './Events'; -export * as Messages from './Messages'; -export * as Permissions from './Permissions'; -export * as Roles from './Roles'; -export * as Selfmod from './Selfmod/All'; -export * as Social from './Social'; -export * as Suggestions from './Suggestions'; - -export const Prefix = 'prefix'; -export const Language = 'language'; -export const CustomCommands = 'customCommands'; -export const CommandAutoDelete = 'commandAutoDelete'; -export const DisabledChannels = 'disabledChannels'; -export const DisabledCommands = 'disabledCommands'; -export const DisabledCommandChannels = 'disabledCommandsChannels'; -export const StickyRoles = 'stickyRoles'; -export const ReactionRoles = 'reactionRoles'; diff --git a/src/lib/database/keys/settings/AutoDelete/All.ts b/src/lib/database/keys/settings/AutoDelete/All.ts deleted file mode 100644 index cf58900acd6..00000000000 --- a/src/lib/database/keys/settings/AutoDelete/All.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const IgnoredAll = 'messagesAutoDeleteIgnoredAll'; -export const IgnoredRoles = 'messagesAutoDeleteIgnoredRoles'; -export const IgnoredChannels = 'messagesAutoDeleteIgnoredChannels'; -export const IgnoredCommands = 'messagesAutoDeleteIgnoredCommands'; diff --git a/src/lib/database/keys/settings/Channels.ts b/src/lib/database/keys/settings/Channels.ts deleted file mode 100644 index be881836cde..00000000000 --- a/src/lib/database/keys/settings/Channels.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as Ignore from './Channels/Ignore'; -export * as Logs from './Channels/Logs'; - -export const MediaOnly = 'channelsMediaOnly'; diff --git a/src/lib/database/keys/settings/Channels/Ignore.ts b/src/lib/database/keys/settings/Channels/Ignore.ts deleted file mode 100644 index 81828d8e770..00000000000 --- a/src/lib/database/keys/settings/Channels/Ignore.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const MessageDelete = 'channelsIgnoreMessageDeletes'; -export const MessageEdit = 'channelsIgnoreMessageEdits'; -export const ReactionAdd = 'channelsIgnoreReactionAdds'; -export const All = 'channelsIgnoreAll'; diff --git a/src/lib/database/keys/settings/Channels/Logs.ts b/src/lib/database/keys/settings/Channels/Logs.ts deleted file mode 100644 index 8544728924d..00000000000 --- a/src/lib/database/keys/settings/Channels/Logs.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const ChannelCreate = 'channelsLogsChannelCreate'; -export const ChannelDelete = 'channelsLogsChannelDelete'; -export const ChannelUpdate = 'channelsLogsChannelUpdate'; -export const EmojiCreate = 'channelsLogsEmojiCreate'; -export const EmojiDelete = 'channelsLogsEmojiDelete'; -export const EmojiUpdate = 'channelsLogsEmojiUpdate'; -export const Image = 'channelsLogsImage'; -export const MemberAdd = 'channelsLogsMemberAdd'; -export const MemberNickNameUpdate = 'channelsLogsMemberNickNameUpdate'; -export const MemberRemove = 'channelsLogsMemberRemove'; -export const MemberRoleUpdate = 'channelsLogsMemberRolesUpdate'; -export const MemberUserNameUpdate = 'channelsLogsMemberUserNameUpdate'; -export const MessageDelete = 'channelsLogsMessageDelete'; -export const MessageDeleteNsfw = 'channelsLogsMessageDeleteNsfw'; -export const MessageUpdate = 'channelsLogsMessageUpdate'; -export const MessageUpdateNsfw = 'channelsLogsMessageUpdateNsfw'; -export const Moderation = 'channelsLogsModeration'; -export const NSFWMessage = 'channelsLogsNsfwMessage'; -export const Prune = 'channelsLogsPrune'; -export const Reaction = 'channelsLogsReaction'; -export const RoleCreate = 'channelsLogsRoleCreate'; -export const RoleDelete = 'channelsLogsRoleDelete'; -export const RoleUpdate = 'channelsLogsRoleUpdate'; -export const ServerUpdate = 'channelsLogsServerUpdate'; diff --git a/src/lib/database/keys/settings/Events.ts b/src/lib/database/keys/settings/Events.ts deleted file mode 100644 index fe7e4cb92fa..00000000000 --- a/src/lib/database/keys/settings/Events.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const BanAdd = 'eventsBanAdd'; -export const BanRemove = 'eventsBanRemove'; -export const Twemoji = 'eventsTwemojiReactions'; diff --git a/src/lib/database/keys/settings/Messages.ts b/src/lib/database/keys/settings/Messages.ts deleted file mode 100644 index 25d1780cd77..00000000000 --- a/src/lib/database/keys/settings/Messages.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const IgnoreChannels = 'messagesIgnoreChannels'; -export const ModerationDM = 'messagesModerationDm'; -export const ModerationReasonDisplay = 'messagesModerationReasonDisplay'; -export const ModerationMessageDisplay = 'messagesModerationMessageDisplay'; -export const ModerationAutoDelete = 'messagesModerationAutoDelete'; -export const ModeratorNameDisplay = 'messagesModeratorNameDisplay'; - -export * as AutoDelete from './AutoDelete/All'; diff --git a/src/lib/database/keys/settings/Permissions.ts b/src/lib/database/keys/settings/Permissions.ts deleted file mode 100644 index b3d760f2d77..00000000000 --- a/src/lib/database/keys/settings/Permissions.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const Users = 'permissionsUsers'; -export const Roles = 'permissionsRoles'; diff --git a/src/lib/database/keys/settings/Roles.ts b/src/lib/database/keys/settings/Roles.ts deleted file mode 100644 index 116e3ab79a7..00000000000 --- a/src/lib/database/keys/settings/Roles.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const Admin = 'rolesAdmin'; -export const Auto = 'rolesAuto'; -export const Initial = 'rolesInitial'; -export const InitialHumans = 'rolesInitialHumans'; -export const InitialBots = 'rolesInitialBots'; -export const Moderator = 'rolesModerator'; -export const Muted = 'rolesMuted'; -export const RestrictedReaction = 'rolesRestrictedReaction'; -export const RestrictedEmbed = 'rolesRestrictedEmbed'; -export const RestrictedEmoji = 'rolesRestrictedEmoji'; -export const RestrictedAttachment = 'rolesRestrictedAttachment'; -export const RestrictedVoice = 'rolesRestrictedVoice'; -export const Public = 'rolesPublic'; -export const RemoveInitial = 'rolesRemoveInitial'; -export const UniqueRoleSets = 'rolesUniqueRoleSets'; diff --git a/src/lib/database/keys/settings/Selfmod/All.ts b/src/lib/database/keys/settings/Selfmod/All.ts deleted file mode 100644 index e5b38ab307b..00000000000 --- a/src/lib/database/keys/settings/Selfmod/All.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as Attachments from './Attachments'; -export * as Capitals from './Capitals'; -export * as Filter from './Filter'; -export * as Invites from './Invites'; -export * as Links from './Links'; -export * as Messages from './Messages'; -export * as NewLines from './Newlines'; -export * as NoMentionSpam from './NoMentionSpam'; -export * as Reactions from './Reactions'; - -export const IgnoreChannels = 'selfmodIgnoreChannels'; diff --git a/src/lib/database/keys/settings/Selfmod/Attachments.ts b/src/lib/database/keys/settings/Selfmod/Attachments.ts deleted file mode 100644 index 0812c11b4e4..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Attachments.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const Enabled = 'selfmodAttachmentsEnabled'; -export const IgnoredRoles = 'selfmodAttachmentsIgnoredRoles'; -export const IgnoredChannels = 'selfmodAttachmentsIgnoredChannels'; -export const SoftAction = 'selfmodAttachmentsSoftAction'; -export const HardAction = 'selfmodAttachmentsHardAction'; -export const HardActionDuration = 'selfmodAttachmentsHardActionDuration'; -export const ThresholdMaximum = 'selfmodAttachmentsThresholdMaximum'; -export const ThresholdDuration = 'selfmodAttachmentsThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Capitals.ts b/src/lib/database/keys/settings/Selfmod/Capitals.ts deleted file mode 100644 index 2214aa544a5..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Capitals.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const Enabled = 'selfmodCapitalsEnabled'; -export const IgnoredRoles = 'selfmodCapitalsIgnoredRoles'; -export const IgnoredChannels = 'selfmodCapitalsIgnoredChannels'; -export const Minimum = 'selfmodCapitalsMinimum'; -export const Maximum = 'selfmodCapitalsMaximum'; -export const SoftAction = 'selfmodCapitalsSoftAction'; -export const HardAction = 'selfmodCapitalsHardAction'; -export const HardActionDuration = 'selfmodCapitalsHardActionDuration'; -export const ThresholdMaximum = 'selfmodCapitalsThresholdMaximum'; -export const ThresholdDuration = 'selfmodCapitalsThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Filter.ts b/src/lib/database/keys/settings/Selfmod/Filter.ts deleted file mode 100644 index 2ec1c214a57..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Filter.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const Raw = 'selfmodFilterRaw'; -export const Enabled = 'selfmodFilterEnabled'; -export const IgnoredRoles = 'selfmodFilterIgnoredRoles'; -export const IgnoredChannels = 'selfmodFilterIgnoredChannels'; -export const SoftAction = 'selfmodFilterSoftAction'; -export const HardAction = 'selfmodFilterHardAction'; -export const HardActionDuration = 'selfmodFilterHardActionDuration'; -export const ThresholdMaximum = 'selfmodFilterThresholdMaximum'; -export const ThresholdDuration = 'selfmodFilterThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Invites.ts b/src/lib/database/keys/settings/Selfmod/Invites.ts deleted file mode 100644 index 3c3bd749ba6..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Invites.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const Enabled = 'selfmodInvitesEnabled'; -export const IgnoredCodes = 'selfmodInvitesIgnoredCodes'; -export const IgnoredGuilds = 'selfmodInvitesIgnoredGuilds'; -export const IgnoredRoles = 'selfmodInvitesIgnoredRoles'; -export const IgnoredChannels = 'selfmodInvitesIgnoredChannels'; -export const SoftAction = 'selfmodInvitesSoftAction'; -export const HardAction = 'selfmodInvitesHardAction'; -export const HardActionDuration = 'selfmodInvitesHardActionDuration'; -export const ThresholdMaximum = 'selfmodInvitesThresholdMaximum'; -export const ThresholdDuration = 'selfmodInvitesThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Links.ts b/src/lib/database/keys/settings/Selfmod/Links.ts deleted file mode 100644 index b75a768103c..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Links.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const Enabled = 'selfmodLinksEnabled'; -export const Allowed = 'selfmodLinksAllowed'; -export const IgnoredRoles = 'selfmodLinksIgnoredRoles'; -export const IgnoredChannels = 'selfmodLinksIgnoredChannels'; -export const SoftAction = 'selfmodLinksSoftAction'; -export const HardAction = 'selfmodLinksHardAction'; -export const HardActionDuration = 'selfmodLinksHardActionDuration'; -export const ThresholdMaximum = 'selfmodLinksThresholdMaximum'; -export const ThresholdDuration = 'selfmodLinksThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Messages.ts b/src/lib/database/keys/settings/Selfmod/Messages.ts deleted file mode 100644 index aaf50a4eac4..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Messages.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const Enabled = 'selfmodMessagesEnabled'; -export const IgnoredRoles = 'selfmodMessagesIgnoredRoles'; -export const IgnoredChannels = 'selfmodMessagesIgnoredChannels'; -export const Maximum = 'selfmodMessagesMaximum'; -export const QueueSize = 'selfmodMessagesQueueSize'; -export const SoftAction = 'selfmodMessagesSoftAction'; -export const HardAction = 'selfmodMessagesHardAction'; -export const HardActionDuration = 'selfmodMessagesHardActionDuration'; -export const ThresholdMaximum = 'selfmodMessagesThresholdMaximum'; -export const ThresholdDuration = 'selfmodMessagesThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/Newlines.ts b/src/lib/database/keys/settings/Selfmod/Newlines.ts deleted file mode 100644 index 3cbae6ffd29..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Newlines.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const Enabled = 'selfmodNewlinesEnabled'; -export const IgnoredRoles = 'selfmodNewlinesIgnoredRoles'; -export const IgnoredChannels = 'selfmodNewlinesIgnoredChannels'; -export const Maximum = 'selfmodNewlinesMaximum'; -export const SoftAction = 'selfmodNewlinesSoftAction'; -export const HardAction = 'selfmodNewlinesHardAction'; -export const HardActionDuration = 'selfmodNewlinesHardActionDuration'; -export const ThresholdMaximum = 'selfmodNewlinesThresholdMaximum'; -export const ThresholdDuration = 'selfmodNewlinesThresholdDuration'; diff --git a/src/lib/database/keys/settings/Selfmod/NoMentionSpam.ts b/src/lib/database/keys/settings/Selfmod/NoMentionSpam.ts deleted file mode 100644 index 6724f6e449c..00000000000 --- a/src/lib/database/keys/settings/Selfmod/NoMentionSpam.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const Enabled = 'noMentionSpamEnabled'; -export const Alerts = 'noMentionSpamAlerts'; -export const MentionsAllowed = 'noMentionSpamMentionsAllowed'; -export const TimePeriod = 'noMentionSpamTimePeriod'; diff --git a/src/lib/database/keys/settings/Selfmod/Reactions.ts b/src/lib/database/keys/settings/Selfmod/Reactions.ts deleted file mode 100644 index 059c5446625..00000000000 --- a/src/lib/database/keys/settings/Selfmod/Reactions.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const Enabled = 'selfmodReactionsEnabled'; -export const IgnoredRoles = 'selfmodReactionsIgnoredRoles'; -export const IgnoredChannels = 'selfmodReactionsIgnoredChannels'; -export const Maximum = 'selfmodReactionsMaximum'; -export const Allowed = 'selfmodReactionsAllowed'; -export const Blocked = 'selfmodReactionsBlocked'; -export const SoftAction = 'selfmodReactionsSoftAction'; -export const HardAction = 'selfmodReactionsHardAction'; -export const HardActionDuration = 'selfmodReactionsHardActionDuration'; -export const ThresholdMaximum = 'selfmodReactionsThresholdMaximum'; -export const ThresholdDuration = 'selfmodReactionsThresholdDuration'; diff --git a/src/lib/database/keys/settings/Social.ts b/src/lib/database/keys/settings/Social.ts deleted file mode 100644 index 81e40913415..00000000000 --- a/src/lib/database/keys/settings/Social.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const Enabled = 'socialEnabled'; -export const AchieveRole = 'socialAchieveRole'; -export const AchieveLevel = 'socialAchieveLevel'; -export const AchieveChannel = 'socialAchieveChannel'; -export const AchieveMultiple = 'socialAchieveMultiple'; -export const Multiplier = 'socialMultiplier'; -export const IgnoredChannels = 'socialIgnoredChannels'; -export const IgnoredRoles = 'socialIgnoredRoles'; diff --git a/src/lib/database/keys/settings/Suggestions.ts b/src/lib/database/keys/settings/Suggestions.ts deleted file mode 100644 index d539a6822f0..00000000000 --- a/src/lib/database/keys/settings/Suggestions.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * as OnAction from './Suggestions/OnAction'; - -export const Channel = 'suggestionsChannel'; diff --git a/src/lib/database/keys/settings/Suggestions/OnAction.ts b/src/lib/database/keys/settings/Suggestions/OnAction.ts deleted file mode 100644 index 2f26f7c9756..00000000000 --- a/src/lib/database/keys/settings/Suggestions/OnAction.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const DM = 'suggestionsOnActionDm'; -export const RePostMessage = 'suggestionsOnActionRePost'; -export const HideAuthor = 'suggestionsOnActionHideAuthor'; diff --git a/src/lib/database/migrations/1594413973851-V01_MigrateClientStorage.ts b/src/lib/database/migrations/1594413973851-V01_MigrateClientStorage.ts deleted file mode 100644 index 49f0451033d..00000000000 --- a/src/lib/database/migrations/1594413973851-V01_MigrateClientStorage.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm'; - -export class V01MigrateClientStorage1594413973851 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateClient(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('client'); - await queryRunner.dropTable('schedule'); - } - - private async migrateClient(queryRunner: QueryRunner): Promise { - // Create the new client table - await queryRunner.createTable( - new Table({ - name: 'client', - columns: [ - new TableColumn({ - name: 'id', - type: 'varchar', - length: '19', - default: `'${process.env.CLIENT_ID}'`, - isNullable: false, - isPrimary: true - }), - new TableColumn({ name: 'user_blocklist', type: 'varchar', isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'user_boost', type: 'varchar', isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'guild_blocklist', type: 'varchar', isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'guild_boost', type: 'varchar', isArray: true, default: 'ARRAY[]::VARCHAR[]' }) - ] - }) - ); - - // Create the new schedule table - await queryRunner.createTable( - new Table({ - name: 'schedule', - columns: [ - new TableColumn({ - name: 'id', - type: 'integer', - isPrimary: true, - isNullable: false, - isGenerated: true, - generationStrategy: 'increment', - comment: 'ID for a scheduled task' - }), - new TableColumn({ name: 'task_id', type: 'varchar', isNullable: false, comment: 'Name of the task that will run' }), - new TableColumn({ - name: 'time', - type: 'timestamp without time zone', - isNullable: false, - comment: 'Date when scheduled task ends' - }), - new TableColumn({ - name: 'recurring', - type: 'varchar', - isNullable: true, - default: null, - comment: 'Whether the scheduled task is scheduled with a cron pattern' - }), - new TableColumn({ - name: 'catch_up', - type: 'boolean', - isNullable: false, - default: true, - comment: 'Whether the task should catch up in event the bot is down' - }), - new TableColumn({ name: 'data', type: 'jsonb', isNullable: false, comment: 'The stored metadata to send to the task' }) - ] - }) - ); - - // Get the data from the "clientStorage" table and transform it into Client entities - // Quotes around table name are required here - const { clientEntities, scheduleEntities } = transformClientStorage( - await queryRunner.query(/* sql */ `SELECT * FROM public."clientStorage";`) - ); - - // Save the new Client entities to the database - const stringifiedClientData = JSON.stringify(clientEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.client - SELECT * FROM json_populate_recordset(NULL::public.client, '${stringifiedClientData}') - ON CONFLICT DO NOTHING; - `); - - // Save the new Schedule entities to the database - const stringifiedScheduleData = JSON.stringify(scheduleEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.schedule - SELECT * FROM json_populate_recordset(NULL::public.schedule, '${stringifiedScheduleData}') - ON CONFLICT DO NOTHING; - `); - } -} - -function transformClientStorage(clientStorage: ClientStorage[]): { - clientEntities: TransformedClientStorage[]; - scheduleEntities: TransformedSchedule[]; -} { - const scheduleEntities: TransformedSchedule[] = []; - const clientEntities: TransformedClientStorage[] = []; - - for (const cs of clientStorage) { - clientEntities.push({ - id: cs.id, - user_blocklist: cs.userBlacklist, - user_boost: cs.boosts_users, - guild_blocklist: cs.guildBlacklist, - guild_boost: cs.boosts_guilds - }); - - for (const schedule of cs.schedules) { - if (schedule.time >= 1640995200000) continue; - - scheduleEntities.push({ - id: scheduleEntities.length.toString(), - data: schedule.data, - catch_up: schedule.catchUp, - task_id: schedule.taskName, - repeat: schedule.repeat, - time: new Date(schedule.time), - recurring: schedule.recurring - }); - } - } - - return { clientEntities, scheduleEntities }; -} - -interface Schedule { - catchUp: boolean; - taskName: string; - data: Record; - id: string; - time: number; - repeat: string; - recurring?: unknown | null; -} - -interface TransformedSchedule extends Omit { - catch_up: boolean; - task_id: string; - time: Date; -} - -interface ClientStorage { - id: string; - userBlacklist: string[]; - guildBlacklist: string[]; - boosts_guilds: string[]; - boosts_users: string[]; - schedules: Schedule[]; - commandUses: number; -} - -interface TransformedClientStorage extends Pick { - user_blocklist: string[]; - user_boost: string[]; - guild_blocklist: string[]; - guild_boost: string[]; -} diff --git a/src/lib/database/migrations/1594582514749-V02_MigrateDashboardUsers.ts b/src/lib/database/migrations/1594582514749-V02_MigrateDashboardUsers.ts deleted file mode 100644 index 1bea8cb8f96..00000000000 --- a/src/lib/database/migrations/1594582514749-V02_MigrateDashboardUsers.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm'; - -export class V02MigrateDashboardUsers1594582514749 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateDashboardUsers(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('dashboard_user'); - } - - private async migrateDashboardUsers(queryRunner: QueryRunner): Promise { - // Create the new dashboard_user table - await queryRunner.createTable( - new Table({ - name: 'dashboard_user', - columns: [ - new TableColumn({ name: 'id', type: 'varchar', length: '19', isPrimary: true, isNullable: false, comment: 'ID of the user' }), - new TableColumn({ - name: 'access_token', - type: 'char', - length: '30', - isNullable: true, - default: null, - comment: 'Token to access the dasboard' - }), - new TableColumn({ - name: 'refresh_token', - type: 'char', - length: '30', - isNullable: true, - default: null, - comment: 'Refresh token to refresh the access' - }), - new TableColumn({ - name: 'expires_at', - type: 'timestamp without time zone', - isNullable: true, - default: null, - comment: 'Expiry timestamp for the token' - }) - ] - }) - ); - - // Get the data from the "dashboard_users" table and transform it into DashboardUser entities - const dashboardUserEntities = transformDashboardUsers(await queryRunner.query(/* sql */ `SELECT * FROM public.dashboard_users;`)); - - // Save new DashboardUser entities to database - const stringifiedData = JSON.stringify(dashboardUserEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.dashboard_user - SELECT * FROM json_populate_recordset(NULL::public.dashboard_user, '${stringifiedData}') - ON CONFLICT DO NOTHING; - `); - } -} - -function transformDashboardUsers(dUsers: DashboardUser[]): TransformedDashboardUser[] { - return dUsers.map((user) => ({ - id: user.id, - access_token: user.access_token, - refresh_token: user.refresh_token, - expires_at: new Date(Number(user.expires_at)) - })); -} - -interface DashboardUser { - id: string; - access_token: string; - refresh_token: string; - expires_at: string; -} - -interface TransformedDashboardUser extends Omit { - expires_at: Date; -} diff --git a/src/lib/database/migrations/1594582821724-V03_MigrateBanners.ts b/src/lib/database/migrations/1594582821724-V03_MigrateBanners.ts deleted file mode 100644 index 5eb20af5f41..00000000000 --- a/src/lib/database/migrations/1594582821724-V03_MigrateBanners.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V03MigrateBanners1594582821724 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.banners RENAME TO "banner";`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.banner RENAME TO "banners";`); - } -} diff --git a/src/lib/database/migrations/1594582905434-V04_MigrateGiveaways.ts b/src/lib/database/migrations/1594582905434-V04_MigrateGiveaways.ts deleted file mode 100644 index a7279c38ef6..00000000000 --- a/src/lib/database/migrations/1594582905434-V04_MigrateGiveaways.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V04MigrateGiveaways1594582905434 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateGiveaways(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - const giveawayRawData = revertTransformGiveaways(await queryRunner.query(/* sql */ `SELECT * FROM public.giveaway;`)); - await queryRunner.clearTable('giveaway'); - await queryRunner.changeColumn( - 'giveaway', - 'ends_at', - new TableColumn({ name: 'ends_at', type: 'bigint', isNullable: false, comment: 'The date at which the giveaway ends' }) - ); - - // Save the new Giveaway entities to the database - const stringifiedData = JSON.stringify(giveawayRawData).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.giveaway - SELECT * FROM json_populate_recordset(NULL::public.giveaway, '${stringifiedData}') - ON CONFLICT DO NOTHING; - `); - } - - private async migrateGiveaways(queryRunner: QueryRunner): Promise { - // Get the data from the "giveaway" table and transform it into Giveaway entities - const giveawayEntities = transformGiveaways(await queryRunner.query(/* sql */ `SELECT * FROM public.giveaway;`)); - - // TRUNCATE the "giveaway" table before filling it with new data - await queryRunner.clearTable('giveaway'); - - // Change the type of the ends_at column to Timestamp - await queryRunner.changeColumn( - 'giveaway', - 'ends_at', - new TableColumn({ - name: 'ends_at', - type: 'timestamp without time zone', - isNullable: false, - comment: 'The date at which the giveaway ends' - }) - ); - - // Save the new Giveaway entities to the database - const stringifiedData = JSON.stringify(giveawayEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.giveaway - SELECT * FROM json_populate_recordset(NULL::public.giveaway, '${stringifiedData}') - ON CONFLICT DO NOTHING; - `); - } -} - -function transformGiveaways(dGiveaway: Giveaway[]): TransformedGiveaway[] { - const output: TransformedGiveaway[] = []; - - for (const ga of dGiveaway) { - if (Number(ga.ends_at) >= 1640995200000) continue; - - output.push({ - title: ga.title, - ends_at: new Date(Number(ga.ends_at)), - guild_id: ga.guild_id, - channel_id: ga.channel_id, - message_id: ga.message_id, - minimum: ga.minimum, - minimum_winners: ga.minimum_winners - }); - } - - return output; -} - -function revertTransformGiveaways(rdGiveaway: TransformedGiveaway[]): Giveaway[] { - return rdGiveaway.map((ga) => ({ - title: ga.title, - ends_at: new Date(ga.ends_at).getTime().toString(), - guild_id: ga.guild_id, - channel_id: ga.channel_id, - message_id: ga.message_id, - minimum: ga.minimum, - minimum_winners: ga.minimum_winners - })); -} - -interface Giveaway { - title: string; - ends_at: string; - guild_id: string; - channel_id: string; - message_id: string; - minimum: number; - minimum_winners: number; -} - -interface TransformedGiveaway extends Omit { - ends_at: Date; -} diff --git a/src/lib/database/migrations/1594583103788-V05_MigrateGuilds.ts b/src/lib/database/migrations/1594583103788-V05_MigrateGuilds.ts deleted file mode 100644 index 2dfee794c31..00000000000 --- a/src/lib/database/migrations/1594583103788-V05_MigrateGuilds.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -const guildChangeTypeColumns = [ - ['command-autodelete', 'text[]', 'text[]'], - ['custom-commands', 'text[]', 'text[]'], - ['disabledCommandsChannels', 'text[]', 'text[]'], - ['music.default-volume', 'smallint', 'double precision'], - ['music.maximum-duration', 'integer', 'double precision'], - ['music.maximum-entries-per-user', 'smallint', 'double precision'], - ['notifications.streams.twitch.streamers', 'text[]', 'text[]'], - ['permissions.roles', 'text[]', 'text[]'], - ['permissions.users', 'text[]', 'text[]'], - ['roles.auto', 'text[]', 'text[]'], - ['roles.reactions', 'text[]', 'text[]'], - ['roles.uniqueRoleSets', 'text[]', 'text[]'], - ['selfmod.invites.ignoredCodes', 'character varying[]', 'text[]'], - ['selfmod.links.softAction', 'smallint', 'integer'], - ['selfmod.links.thresholdMaximum', 'smallint', 'integer'], - ['selfmod.messages.hardAction', 'smallint', 'integer'], - ['selfmod.messages.maximum', 'smallint', 'integer'], - ['selfmod.messages.queue-size', 'smallint', 'integer'], - ['selfmod.messages.softAction', 'smallint', 'integer'], - ['selfmod.reactions.hardAction', 'smallint', 'integer'], - ['selfmod.reactions.maximum', 'smallint', 'integer'], - ['selfmod.reactions.softAction', 'smallint', 'integer'], - ['selfmod.reactions.thresholdMaximum', 'smallint', 'integer'], - ['social.multiplier', 'numeric(53)', 'double precision'], - ['stickyRoles', 'text[]', 'text[]'], - ['trigger.alias', 'text[]', 'text[]'], - ['trigger.includes', 'text[]', 'text[]'] -] as const; - -const guildChangeDefaultColumns = [ - ['selfmod.capitals.ignoredChannels', 'ARRAY []::character varying[];', "'{}'::character varying[]"], - ['selfmod.capitals.ignoredRoles', 'ARRAY []::character varying[];', "'{}'::character varying[]"], - ['selfmod.filter.ignoredChannels', 'ARRAY []::character varying[];', "'{}'::character varying[]"], - ['selfmod.filter.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.invites.ignoredChannels', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.invites.ignoredCodes', 'ARRAY []::character varying[]', "'{}'::text[]"], - ['selfmod.invites.ignoredGuilds', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.invites.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.links.ignoredChannels', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.links.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.links.whitelist', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.messages.ignoredChannels', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.messages.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.newlines.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.newlines.ignoredRoles', 'ARRAY []::character varying[]', "'{}'::character varying[]"], - ['selfmod.reactions.whitelist', 'ARRAY []::character varying[]', "'{}'::character varying[]"] -]; - -export class V05MigrateGuilds1594583103788 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateGuilds(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - await Promise.all( - guildChangeTypeColumns.map(([colName, , oldType]) => - queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "${colName}" - TYPE ${oldType}; - `) - ) - ); - - await Promise.all( - guildChangeDefaultColumns.map(([colName, , oldDefault]) => - queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "${colName}" - SET DEFAULT ${oldDefault}; - `) - ) - ); - - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'roles.staff', type: 'varchar', length: '19', isNullable: true, default: null, comment: 'Staff roles' }) - ); - } - - private async migrateGuilds(queryRunner: QueryRunner): Promise { - // Change the type of specified columns in the "guilds" table - await Promise.all( - guildChangeTypeColumns.map(([colName, newType]) => - queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "${colName}" - TYPE ${newType}; - `) - ) - ); - - // Change the default specified columns in the "guilds" table - await Promise.all( - guildChangeDefaultColumns.map(([colName, newDefault]) => - queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "${colName}" - SET DEFAULT ${newDefault}; - `) - ) - ); - - // Remove the "roles.staff" column - await queryRunner.dropColumn('guilds', 'roles.staff'); - } -} diff --git a/src/lib/database/migrations/1594583243068-V06_MigrateMembers.ts b/src/lib/database/migrations/1594583243068-V06_MigrateMembers.ts deleted file mode 100644 index ac1b2e88cd8..00000000000 --- a/src/lib/database/migrations/1594583243068-V06_MigrateMembers.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V06MigrateMembers1594583243068 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateMembers(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.member RENAME TO "members";`); - - await queryRunner.renameColumn('members', 'points', 'point_count'); - } - - private async migrateMembers(queryRunner: QueryRunner): Promise { - // Rename "members" table to "member" - await queryRunner.query(/* sql */ `ALTER TABLE public.members RENAME TO "member";`); - - // Rename "point_count" column to "points" - await queryRunner.renameColumn('member', 'point_count', 'points'); - } -} diff --git a/src/lib/database/migrations/1594583300041-V07_MigrateModeration.ts b/src/lib/database/migrations/1594583300041-V07_MigrateModeration.ts deleted file mode 100644 index 1042e36b09a..00000000000 --- a/src/lib/database/migrations/1594583300041-V07_MigrateModeration.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { NonNullObject } from '@sapphire/utilities'; -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V07MigrateModeration1594583300041 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.migrateModerations(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - const moderationRawData = revertTransformModerations(await queryRunner.query(/* sql */ `SELECT * FROM public.moderation;`)); - await queryRunner.clearTable('moderation'); - await queryRunner.changeColumn( - 'moderation', - 'created_at', - new TableColumn({ name: 'created_at', type: 'bigint', isNullable: true, comment: 'The date at which the moderation entry was made' }) - ); - - const stringifiedData = JSON.stringify(moderationRawData).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.moderation - SELECT * FROM json_populate_recordset(NULL::public.moderation, '${stringifiedData}') - ON CONFLICT DO NOTHING; - `); - } - - private async migrateModerations(queryRunner: QueryRunner): Promise { - // Get the data from the "moderation" table and transform it into Moderation entities - const moderationEntities = transformModerations(await queryRunner.query(/* sql */ `SELECT * FROM public.moderation;`)); - - // TRUNCATE the "moderation" table before filling it with new data - await queryRunner.clearTable('moderation'); - - // Change the type of the created_at column to Timestamp - await queryRunner.changeColumn( - 'moderation', - 'created_at', - new TableColumn({ - name: 'created_at', - type: 'timestamp without time zone', - isNullable: true, - default: null, - comment: 'The date at which the moderation entry was created' - }) - ); - - // Save the new Moderation entities to the database - const stringifiedData = JSON.stringify(moderationEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.moderation - SELECT * FROM json_populate_recordset(NULL::public.moderation, '${stringifiedData}') - ON CONFLICT DO NOTHING; - `); - } -} - -function transformModerations(dModeration: Moderation[]): TransformedModeration[] { - return dModeration.map((mod) => ({ - case_id: mod.case_id, - created_at: mod.created_at === null ? null : new Date(Number(mod.created_at)), - duration: mod.duration, - extra_data: mod.extra_data, - guild_id: mod.guild_id, - moderator_id: mod.moderator_id, - reason: mod.reason, - image_url: mod.image_url, - type: mod.type, - user_id: mod.user_id - })); -} - -function revertTransformModerations(rdModerations: TransformedModeration[]): Moderation[] { - return rdModerations.map((mod) => ({ - case_id: mod.case_id, - created_at: mod.created_at ? new Date(mod.created_at).getTime().toString() : null, - duration: mod.duration, - extra_data: mod.extra_data, - guild_id: mod.guild_id, - image_url: mod.image_url, - moderator_id: mod.moderator_id, - reason: mod.reason, - type: mod.type, - user_id: mod.user_id - })); -} - -interface Moderation { - case_id: number; - created_at: string | null; - duration: number; - extra_data: unknown[] | NonNullObject | null; - guild_id: string; - moderator_id: string; - reason: string; - user_id: string; - type: number; - image_url: string | null; -} - -interface TransformedModeration extends Omit { - created_at: Date | null; -} diff --git a/src/lib/database/migrations/1594625931497-V08_MigrateUsers.ts b/src/lib/database/migrations/1594625931497-V08_MigrateUsers.ts deleted file mode 100644 index d26a4eb2919..00000000000 --- a/src/lib/database/migrations/1594625931497-V08_MigrateUsers.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from 'typeorm'; - -export class V08MigrateUsers1594625931497 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'user', - columns: [ - new TableColumn({ name: 'id', type: 'varchar', length: '19', isNullable: false, isPrimary: true }), - new TableColumn({ name: 'points', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'reputations', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'moderation_dm', type: 'boolean', isNullable: false, default: true }), - new TableColumn({ name: 'money', type: 'bigint', isNullable: false, default: 0 }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'user_profile', - columns: [ - new TableColumn({ name: 'user_id', type: 'varchar', length: '19', isNullable: false, isPrimary: true }), - new TableColumn({ name: 'banners', type: 'varchar', isNullable: false, isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'public_badges', type: 'varchar', isNullable: false, isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'badges', type: 'varchar', isNullable: false, isArray: true, default: 'ARRAY[]::VARCHAR[]' }), - new TableColumn({ name: 'color', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'vault', type: 'bigint', isNullable: false, default: 0 }), - new TableColumn({ name: 'banner_level', type: 'varchar', isNullable: false, default: '1001' }), - new TableColumn({ name: 'banner_profile', type: 'varchar', isNullable: false, default: '0001' }), - new TableColumn({ name: 'dark_theme', type: 'boolean', isNullable: false, default: false }) - ], - foreignKeys: [ - new TableForeignKey({ - columnNames: ['user_id'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'user_cooldown', - columns: [ - new TableColumn({ name: 'user_id', type: 'varchar', length: '19', isNullable: false, isPrimary: true }), - new TableColumn({ name: 'daily', type: 'timestamp without time zone', isNullable: true }), - new TableColumn({ name: 'reputation', type: 'timestamp without time zone', isNullable: true }) - ], - foreignKeys: [ - new TableForeignKey({ - columnNames: ['user_id'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ] - }) - ); - - // Get the data from the "users" table and transform it into User and UserProfile entities - const { userEntities, userProfileEntities } = transformUser(await queryRunner.query(/* sql */ `SELECT * FROM public.users;`)); - - // Save the new User entities to the database - const stringifiedUserData = JSON.stringify(userEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.user - SELECT * FROM json_populate_recordset(NULL::public.user, '${stringifiedUserData}') - ON CONFLICT DO NOTHING; - `); - - // Save the new UserProfile entities to the database - const stringifiedUserProfileData = JSON.stringify(userProfileEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.user_profile - SELECT * FROM json_populate_recordset(NULL::public.user_profile, '${stringifiedUserProfileData}') - ON CONFLICT DO NOTHING; - `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('user'); - await queryRunner.dropTable('user_profile'); - } -} - -function transformUser(users: User[]): { userEntities: TransformedUser[]; userProfileEntities: TransformedUserProfile[] } { - const userEntities: TransformedUser[] = []; - const userProfileEntities: TransformedUserProfile[] = []; - - for (const user of users) { - userEntities.push({ - id: user.id, - moderation_dm: user.moderation_dm, - money: Number(user.money), - points: Number(user.point_count), - reputations: user.reputation_count - }); - - if (!isUserProfileAllDefaults(user)) { - userProfileEntities.push({ - user_id: user.id, - badges: user.badge_list, - banner_level: user.theme_level, - banner_profile: user.theme_profile, - banners: user.banner_list, - color: user.color, - dark_theme: user.dark_theme, - public_badges: user.badge_set, - vault: user.vault - }); - } - } - - return { userEntities, userProfileEntities }; -} - -function isUserProfileAllDefaults(user: User) { - return ( - user.badge_list.length === 0 && - user.theme_level === '1001' && - user.theme_profile === '0001' && - user.banner_list.length === 0 && - user.color === 0 && - user.badge_set.length === 0 && - user.vault === 0 && - !user.dark_theme - ); -} - -interface User { - id: string; - command_uses: number; - banner_list: string[]; - badge_set: string[]; - badge_list: string[]; - color: number; - marry: string[]; - money: string; - point_count: number; - reputation_count: number; - theme_level: string; - theme_profile: string; - next_daily: string; - dark_theme: boolean; - moderation_dm: boolean; - vault: number; -} - -interface TransformedUser { - id: string; - points: number; - reputations: number; - moderation_dm: boolean; - money: number; -} - -interface TransformedUserProfile { - user_id: string; - banners: string[]; - public_badges: string[]; - badges: string[]; - color: number; - vault: number; - banner_level: string; - banner_profile: string; - dark_theme: boolean; -} diff --git a/src/lib/database/migrations/1594628900945-V09_MigrateSuggestion.ts b/src/lib/database/migrations/1594628900945-V09_MigrateSuggestion.ts deleted file mode 100644 index d9d7b415a3b..00000000000 --- a/src/lib/database/migrations/1594628900945-V09_MigrateSuggestion.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V09MigrateSuggestion1594628900945 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.suggestions RENAME TO "suggestion";`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.suggestion RENAME TO "suggestions";`); - } -} diff --git a/src/lib/database/migrations/1594629639526-V10_MigrateTwitchSubscription.ts b/src/lib/database/migrations/1594629639526-V10_MigrateTwitchSubscription.ts deleted file mode 100644 index 5a422f5791b..00000000000 --- a/src/lib/database/migrations/1594629639526-V10_MigrateTwitchSubscription.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm'; - -export class V10MigrateTwitchSubscription1594629639526 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'twitch_stream_subscription', - columns: [ - new TableColumn({ name: 'id', type: 'varchar', length: '16', isNullable: false, isPrimary: true }), - new TableColumn({ name: 'is_streaming', type: 'boolean', isNullable: false }), - new TableColumn({ name: 'expires_at', type: 'timestamp', isNullable: false }), - new TableColumn({ - name: 'guild_ids', - type: 'varchar', - length: '19', - isArray: true, - isNullable: false, - default: 'ARRAY[]::VARCHAR[]' - }) - ] - }) - ); - - // Get the data from the "users" table and transform it into User and UserProfile entities - const subscriptionEntities = transformTwitchSubscription( - await queryRunner.query(/* sql */ `SELECT * FROM public.twitch_stream_subscriptions;`) - ); - - // Save the new TwitchStreamSubscription entities to the database - const stringifiedSubscriptionData = JSON.stringify(subscriptionEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.twitch_stream_subscription - SELECT * FROM json_populate_recordset(NULL::public.twitch_stream_subscription, '${stringifiedSubscriptionData}') - ON CONFLICT DO NOTHING; - `); - } - - public async down(queryRunner: QueryRunner): Promise { - // Get the data from the "users" table and transform it into User and UserProfile entities - const subscriptionEntities = revertTransformTwitchSubscription( - await queryRunner.query(/* sql */ `SELECT * FROM public.twitch_stream_subscription;`) - ); - - // Save the new TwitchStreamSubscription entities to the database - const stringifiedSubscriptionData = JSON.stringify(subscriptionEntities).replace(/'/g, "''"); - await queryRunner.query(/* sql */ ` - INSERT INTO public.twitch_stream_subscriptions - SELECT * FROM json_populate_recordset(NULL::public.twitch_stream_subscriptions, '${stringifiedSubscriptionData}') - ON CONFLICT DO NOTHING; - `); - - await queryRunner.dropTable('twitch_stream_subscription'); - } -} - -function transformTwitchSubscription(subscriptions: TwitchStreamSubscription[]): TransformedTwitchStreamSubscription[] { - return subscriptions.map((sc) => ({ - id: sc.id, - is_streaming: sc.is_streaming, - expires_at: new Date(Number(sc.expires_at)), - guild_ids: sc.guild_ids - })); -} - -function revertTransformTwitchSubscription(subscriptions: TransformedTwitchStreamSubscription[]): TwitchStreamSubscription[] { - return subscriptions.map((sc) => ({ - id: sc.id, - is_streaming: sc.is_streaming, - expires_at: new Date(sc.expires_at).getTime(), - guild_ids: sc.guild_ids - })); -} - -interface TwitchStreamSubscription { - id: string; - is_streaming: boolean; - expires_at: number; - guild_ids: string[]; -} - -interface TransformedTwitchStreamSubscription { - id: string; - is_streaming: boolean; - expires_at: Date; - guild_ids: string[]; -} diff --git a/src/lib/database/migrations/1594649287397-V11_MigrateRpg.ts b/src/lib/database/migrations/1594649287397-V11_MigrateRpg.ts deleted file mode 100644 index dec439f920f..00000000000 --- a/src/lib/database/migrations/1594649287397-V11_MigrateRpg.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableCheck, TableColumn, TableForeignKey, TableIndex } from 'typeorm'; - -export class V11MigrateRpg1594649287397 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - // Drops all tables - await queryRunner.query(/* sql */ `DROP TABLE rpg_users CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_guilds CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_guild_rank CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_items CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_user_items CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_battles CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_class CASCADE;`); - await queryRunner.query(/* sql */ `DROP TYPE rpg_item_type;`); - - await queryRunner.createTable( - new Table({ - name: 'rpg_class', - checks: [ - new TableCheck({ expression: /* sql */ `name <> ''` }), - new TableCheck({ expression: /* sql */ `attack_multiplier >= 0` }), - new TableCheck({ expression: /* sql */ `defense_multiplier >= 0` }), - new TableCheck({ expression: /* sql */ `agility_multiplier >= 0` }), - new TableCheck({ expression: /* sql */ `energy_multiplier >= 0` }), - new TableCheck({ expression: /* sql */ `luck_multiplier >= 0` }) - ], - columns: [ - new TableColumn({ name: 'id', type: 'integer', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'name', type: 'varchar', length: '20', isUnique: true, isNullable: false }), - new TableColumn({ name: 'attack_multiplier', type: 'double precision', isNullable: false, default: 1.0 }), - new TableColumn({ name: 'defense_multiplier', type: 'double precision', isNullable: false, default: 1.0 }), - new TableColumn({ name: 'agility_multiplier', type: 'double precision', isNullable: false, default: 1.0 }), - new TableColumn({ name: 'energy_multiplier', type: 'double precision', isNullable: false, default: 1.0 }), - new TableColumn({ name: 'luck_multiplier', type: 'double precision', isNullable: false, default: 1.0 }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'rpg_guild_rank', - checks: [new TableCheck({ expression: /* sql */ `name <> ''` })], - columns: [ - new TableColumn({ name: 'id', type: 'integer', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'name', type: 'varchar', length: '50', isNullable: false }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'rpg_guild', - checks: [ - new TableCheck({ expression: /* sql */ `member_limit >= 5` }), - new TableCheck({ expression: /* sql */ `win_count >= 0` }), - new TableCheck({ expression: /* sql */ `lose_count >= 0` }), - new TableCheck({ expression: /* sql */ `money_count >= 0` }), - new TableCheck({ expression: /* sql */ `bank_limit >= 0` }), - new TableCheck({ expression: /* sql */ `upgrade >= 0` }) - ], - columns: [ - new TableColumn({ name: 'id', type: 'integer', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'name', type: 'varchar', length: '50', isNullable: false }), - new TableColumn({ name: 'description', type: 'varchar', length: '200', isNullable: true }), - new TableColumn({ name: 'member_limit', type: 'smallint', isNullable: false, default: 5 }), - new TableColumn({ name: 'win_count', type: 'smallint', isNullable: false, default: 0 }), - new TableColumn({ name: 'lose_count', type: 'smallint', isNullable: false, default: 0 }), - new TableColumn({ name: 'money_count', type: 'smallint', isNullable: false, default: 0 }), - new TableColumn({ name: 'bank_limit', type: 'smallint', isNullable: false, default: 50000 }), - new TableColumn({ name: 'upgrade', type: 'smallint', isNullable: false, default: 0 }) - ] - }) - ); - - await queryRunner.query(/* sql */ `CREATE TYPE "public"."rpg_item_type_enum" AS ENUM('Weapon', 'Shield', 'Disposable', 'Special');`); - - await queryRunner.createTable( - new Table({ - name: 'rpg_item', - checks: [ - new TableCheck({ expression: /* sql */ `name <> ''` }), - new TableCheck({ expression: /* sql */ `maximum_durability >= 0` }), - new TableCheck({ expression: /* sql */ `maximum_cooldown >= 0` }), - new TableCheck({ expression: /* sql */ `attack >= 0` }), - new TableCheck({ expression: /* sql */ `defense >= 0` }), - new TableCheck({ expression: /* sql */ `health >= 0` }), - new TableCheck({ expression: /* sql */ `required_energy >= 0` }), - new TableCheck({ expression: /* sql */ `rarity >= 1` }), - new TableCheck({ expression: /* sql */ `accuracy >= 0` }), - new TableCheck({ expression: /* sql */ `accuracy <= 100` }) - ], - indices: [new TableIndex({ columnNames: ['name', 'rarity'], isUnique: true })], - columns: [ - new TableColumn({ name: 'id', type: 'integer', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'type', type: 'rpg_item_type_enum', isNullable: false }), - new TableColumn({ name: 'name', type: 'varchar', length: '50', isNullable: false }), - new TableColumn({ name: 'maximum_durability', type: 'integer', isNullable: false }), - new TableColumn({ name: 'maximum_cooldown', type: 'smallint', isNullable: false }), - new TableColumn({ name: 'attack', type: 'double precision', isNullable: false }), - new TableColumn({ name: 'defense', type: 'double precision', isNullable: false }), - new TableColumn({ name: 'health', type: 'double precision', isNullable: false }), - new TableColumn({ name: 'required_energy', type: 'double precision', isNullable: false }), - new TableColumn({ name: 'rarity', type: 'integer', isNullable: false }), - new TableColumn({ name: 'accuracy', type: 'smallint', isNullable: false }), - new TableColumn({ name: 'effects', type: 'jsonb', default: "'{}'::jsonb" }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'rpg_user_item', - checks: [new TableCheck({ expression: /* sql */ `"durability" >= 0` })], - columns: [ - new TableColumn({ name: 'id', type: 'bigint', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'durability', type: 'integer', isNullable: false }), - new TableColumn({ name: 'item_id', type: 'integer', isNullable: false }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'rpg_user', - checks: [ - new TableCheck({ expression: /* sql */ `win_count >= 0` }), - new TableCheck({ expression: /* sql */ `death_count >= 0` }), - new TableCheck({ expression: /* sql */ `crate_common_count >= 0` }), - new TableCheck({ expression: /* sql */ `crate_uncommon_count >= 0` }), - new TableCheck({ expression: /* sql */ `crate_rare_count >= 0` }), - new TableCheck({ expression: /* sql */ `crate_legendary_count >= 0` }), - new TableCheck({ expression: /* sql */ `attack >= 1` }), - new TableCheck({ expression: /* sql */ `health >= 1` }), - new TableCheck({ expression: /* sql */ `agility >= 1` }), - new TableCheck({ expression: /* sql */ `energy >= 0` }), - new TableCheck({ expression: /* sql */ `luck >= 0` }) - ], - columns: [ - new TableColumn({ name: 'name', type: 'character varying', length: '32', isNullable: false }), - new TableColumn({ name: 'win_count', type: 'bigint', isNullable: false, default: 0 }), - new TableColumn({ name: 'death_count', type: 'bigint', isNullable: false, default: 0 }), - new TableColumn({ name: 'crate_common_count', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'crate_uncommon_count', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'crate_rare_count', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'crate_legendary_count', type: 'integer', isNullable: false, default: 0 }), - new TableColumn({ name: 'attack', type: 'integer', isNullable: false }), - new TableColumn({ name: 'health', type: 'integer', isNullable: false }), - new TableColumn({ name: 'agility', type: 'integer', isNullable: false }), - new TableColumn({ name: 'energy', type: 'integer', isNullable: false }), - new TableColumn({ name: 'luck', type: 'integer', isNullable: false }), - new TableColumn({ name: 'class_id', type: 'integer', isNullable: true }), - new TableColumn({ name: 'equipped_item_id', type: 'bigint', isNullable: true }), - new TableColumn({ name: 'guild_id', type: 'integer', isNullable: true }), - new TableColumn({ name: 'guild_rank_id', type: 'integer', isNullable: true }), - new TableColumn({ name: 'user_id', type: 'character varying', length: '19', isNullable: false, isPrimary: true }) - ] - }) - ); - - await queryRunner.createTable( - new Table({ - name: 'rpg_battle', - checks: [ - new TableCheck({ expression: /* sql */ `challenger_cooldown >= 0` }), - new TableCheck({ expression: /* sql */ `challenger_health >= 0` }), - new TableCheck({ expression: /* sql */ `challenger_energy >= 0` }), - new TableCheck({ expression: /* sql */ `challenged_cooldown >= 0` }), - new TableCheck({ expression: /* sql */ `challenged_health >= 0` }), - new TableCheck({ expression: /* sql */ `challenged_energy >= 0` }) - ], - columns: [ - new TableColumn({ name: 'id', type: 'bigint', isGenerated: true, isNullable: false, isPrimary: true }), - new TableColumn({ name: 'challenger_turn', type: 'boolean', isNullable: false }), - new TableColumn({ name: 'challenger_cooldown', type: 'smallint', isNullable: false }), - new TableColumn({ name: 'challenger_health', type: 'integer', isNullable: false }), - new TableColumn({ name: 'challenger_energy', type: 'integer', isNullable: false }), - new TableColumn({ name: 'challenger_effects', type: 'jsonb', isNullable: false }), - new TableColumn({ name: 'challenged_cooldown', type: 'smallint', isNullable: false }), - new TableColumn({ name: 'challenged_health', type: 'integer', isNullable: false }), - new TableColumn({ name: 'challenged_energy', type: 'integer', isNullable: false }), - new TableColumn({ name: 'challenged_effects', type: 'jsonb', isNullable: false }), - new TableColumn({ name: 'challenged_user', type: 'character varying', length: '19', isNullable: false, isUnique: true }), - new TableColumn({ name: 'challenged_weapon_id', type: 'bigint', isNullable: true }), - new TableColumn({ name: 'challenger_user', type: 'character varying', length: '19', isNullable: false, isUnique: true }), - new TableColumn({ name: 'challenger_weapon_id', type: 'bigint', isNullable: true }) - ] - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user_item', - new TableForeignKey({ - columnNames: ['item_id'], - referencedTableName: 'rpg_item', - referencedColumnNames: ['id'], - onDelete: 'CASCADE', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user', - new TableForeignKey({ - columnNames: ['class_id'], - referencedTableName: 'rpg_class', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user', - new TableForeignKey({ - columnNames: ['equipped_item_id'], - referencedTableName: 'rpg_user_item', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user', - new TableForeignKey({ - columnNames: ['guild_id'], - referencedTableName: 'rpg_guild', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user', - new TableForeignKey({ - columnNames: ['guild_rank_id'], - referencedTableName: 'rpg_guild_rank', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_user', - new TableForeignKey({ - columnNames: ['user_id'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_battle', - new TableForeignKey({ - columnNames: ['challenged_user'], - referencedTableName: 'rpg_user', - referencedColumnNames: ['user_id'], - onDelete: 'CASCADE', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_battle', - new TableForeignKey({ - columnNames: ['challenged_weapon_id'], - referencedTableName: 'rpg_user_item', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_battle', - new TableForeignKey({ - columnNames: ['challenger_user'], - referencedTableName: 'rpg_user', - referencedColumnNames: ['user_id'], - onDelete: 'CASCADE', - onUpdate: 'NO ACTION' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_battle', - new TableForeignKey({ - columnNames: ['challenger_weapon_id'], - referencedTableName: 'rpg_user_item', - referencedColumnNames: ['id'], - onDelete: 'SET NULL', - onUpdate: 'NO ACTION' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - // Drops all tables - await queryRunner.query(/* sql */ `DROP TABLE rpg_user CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_guild CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_guild_rank CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_item CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_user_item CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_battle CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE rpg_class CASCADE;`); - await queryRunner.query(/* sql */ `DROP TYPE rpg_item_type_enum;`); - } -} diff --git a/src/lib/database/migrations/1594669268323-V12_ClearOldTables.ts b/src/lib/database/migrations/1594669268323-V12_ClearOldTables.ts deleted file mode 100644 index 8d94f64a285..00000000000 --- a/src/lib/database/migrations/1594669268323-V12_ClearOldTables.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V12ClearOldTables1594669268323 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `DROP TABLE public.dashboard_users CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE public."clientStorage" CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE public."users" CASCADE;`); - await queryRunner.query(/* sql */ `DROP TABLE public.twitch_stream_subscriptions CASCADE;`); - } - - public async down(): Promise { - // N.A. - } -} diff --git a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.json b/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.json deleted file mode 100644 index d3d0feefd4c..00000000000 --- a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.json +++ /dev/null @@ -1,1122 +0,0 @@ -[ - [ - "blacklist", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "disable", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "enable", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "load", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "reload", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "transfer", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "unload", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "info", - { - "category": "General", - "subCategory": "Chat Bot Info" - } - ], - [ - "invite", - { - "category": "General", - "subCategory": "Chat Bot Info" - } - ], - [ - "ping", - { - "category": "General", - "subCategory": "Chat Bot Info" - } - ], - [ - "conf", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "roleset", - { - "category": "Admin", - "subCategory": "General" - } - ], - [ - "catfact", - { - "category": "Animal", - "subCategory": "General" - } - ], - [ - "dog", - { - "category": "Animal", - "subCategory": "General" - } - ], - [ - "fox", - { - "category": "Animal", - "subCategory": "General" - } - ], - [ - "kitty", - { - "category": "Animal", - "subCategory": "General" - } - ], - [ - "shibe", - { - "category": "Animal", - "subCategory": "General" - } - ], - [ - "anime", - { - "category": "Anime", - "subCategory": "General" - } - ], - [ - "manga", - { - "category": "Anime", - "subCategory": "General" - } - ], - [ - "waifu", - { - "category": "Anime", - "subCategory": "General" - } - ], - [ - "changemymind", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "choice", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "dice", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "escaperope", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "love", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "rate", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "shindeiru", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "xkcd", - { - "category": "Fun", - "subCategory": "General" - } - ], - [ - "c4", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "coinflip", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "higherlower", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "hungergames", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "slotmachine", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "tictactoe", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "wheeloffortune", - { - "category": "Games", - "subCategory": "General" - } - ], - [ - "weather", - { - "category": "Google", - "subCategory": "General" - } - ], - [ - "createmute", - { - "category": "Management", - "subCategory": "General" - } - ], - [ - "permissionnodes", - { - "category": "Management", - "subCategory": "General" - } - ], - [ - "roles", - { - "category": "Management", - "subCategory": "General" - } - ], - [ - "chase", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "cuddle", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "deletthis", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "f", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "goodnight", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "goofytime", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "hug", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "ineedhealing", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "randreddit", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "ship", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "snipe", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "thesearch", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "triggered", - { - "category": "Misc", - "subCategory": "General" - } - ], - [ - "addrole", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "ban", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "dehoist", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "kick", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "lockdown", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "mute", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "prune", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "removerole", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "setnickname", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "softban", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "togglemoderationdm", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "unban", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "unmute", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "unwarn", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "vmute", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "voicekick", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "vunmute", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "warn", - { - "category": "Moderation", - "subCategory": "General" - } - ], - [ - "autorole", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "balance", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "daily", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "leaderboard", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "level", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "mylevel", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "pay", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "profile", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "remindme", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "reputation", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "setcolor", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "vault", - { - "category": "Social", - "subCategory": "General" - } - ], - [ - "resolvesuggestion", - { - "category": "Suggestions", - "subCategory": "General" - } - ], - [ - "suggest", - { - "category": "Suggestions", - "subCategory": "General" - } - ], - [ - "donate", - { - "category": "System", - "subCategory": "General" - } - ], - [ - "echo", - { - "category": "System", - "subCategory": "General" - } - ], - [ - "stats", - { - "category": "System", - "subCategory": "General" - } - ], - [ - "support", - { - "category": "System", - "subCategory": "General" - } - ], - [ - "tag", - { - "category": "Tags", - "subCategory": "General" - } - ], - [ - "avatar", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "color", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "content", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "emoji", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "emotes", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "poll", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "topinvites", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "whois", - { - "category": "Tools", - "subCategory": "General" - } - ], - [ - "followage", - { - "category": "Twitch", - "subCategory": "General" - } - ], - [ - "twitch", - { - "category": "Twitch", - "subCategory": "General" - } - ], - [ - "twitchsubscription", - { - "category": "Twitch", - "subCategory": "General" - } - ], - [ - "help", - { - "category": "General", - "subCategory": "Chat Bot Info" - } - ], - [ - "manageattachments", - { - "category": "Management", - "subCategory": "Attachment Filter" - } - ], - [ - "managecommandautodelete", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "managecommandchannel", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "managerolereaction", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setignorechannels", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setimagelogs", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setmemberlogs", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setmessagelogs", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setmodlogs", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setprefix", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setrolechannel", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "setrolemessage", - { - "category": "Management", - "subCategory": "Configuration" - } - ], - [ - "guildinfo", - { - "category": "Management", - "subCategory": "Helpers" - } - ], - [ - "roleinfo", - { - "category": "Management", - "subCategory": "Helpers" - } - ], - [ - "stickyroles", - { - "category": "Management", - "subCategory": "Members" - } - ], - [ - "capitalsmode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "filter", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "filtermode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "invitemode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "linkmode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "messagemode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "newlinemode", - { - "category": "Management", - "subCategory": "Message Filters" - } - ], - [ - "reactionmode", - { - "category": "Management", - "subCategory": "Reaction Filters" - } - ], - [ - "history", - { - "category": "Moderation", - "subCategory": "Management" - } - ], - [ - "moderations", - { - "category": "Moderation", - "subCategory": "Management" - } - ], - [ - "mutes", - { - "category": "Moderation", - "subCategory": "Management" - } - ], - [ - "warnings", - { - "category": "Moderation", - "subCategory": "Management" - } - ], - [ - "restrictattachment", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "restrictembed", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "restrictemoji", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "restrictreaction", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "restrictvoice", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "unrestrictattachment", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "unrestrictembed", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "unrestrictemoji", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "unrestrictreaction", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "unrestrictvoice", - { - "category": "Moderation", - "subCategory": "Restriction" - } - ], - [ - "case", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "flow", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "permissions", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "raid", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "reason", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "slowmode", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "time", - { - "category": "Moderation", - "subCategory": "Utilities" - } - ], - [ - "social", - { - "category": "Social", - "subCategory": "Member Management" - } - ], - [ - "banner", - { - "category": "Social", - "subCategory": "Profile Management" - } - ], - [ - "toggledarkmode", - { - "category": "Social", - "subCategory": "Profile Management" - } - ], - [ - "eval", - { - "category": "System", - "subCategory": "Admin" - } - ], - [ - "reboot", - { - "category": "System", - "subCategory": "Admin" - } - ], - [ - "urban", - { - "category": "Tools", - "subCategory": "Dictionary" - } - ], - [ - "eshop", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "horoscope", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "igdb", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "itunes", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "movies", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "price", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "shows", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "wikipedia", - { - "category": "Tools", - "subCategory": "Websearch" - } - ], - [ - "youtube", - { - "category": "Tools", - "subCategory": "Websearch" - } - ] -] diff --git a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts b/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts deleted file mode 100644 index b0dc16d776f..00000000000 --- a/src/lib/database/migrations/1594757329224-V13_MigrateAnalytics.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Actions, CommandCategoryTypes, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { InfluxDB, Point } from '@influxdata/influxdb-client'; -import { BucketsAPI } from '@influxdata/influxdb-client-apis'; -import { readFile } from 'node:fs/promises'; -import { join } from 'node:path'; -import { MigrationInterface, QueryRunner, Table, TableCheck, TableColumn } from 'typeorm'; - -const CATEGORIES_FILE = '1594757329224-V13_MigrateAnalytics.json'; -const INFLUX_ALL_COMMANDS_SCRIPT = `from(bucket: "${process.env.INFLUX_ORG_ANALYTICS_BUCKET}") |> range(start: 0) |> filter(fn: (r) => r["_measurement"] == "commands") |> sum(column: "_value")`; - -/** - * Since I believe in the competence of this dev team. - * I decided to remove the check for if the bucket exists under "up" - */ -export class V13MigrateAnalytics1594757329224 implements MigrationInterface { - private migStart: Date = new Date(); - - public async up(queryRunner: QueryRunner): Promise { - const categories = new Map(JSON.parse(await readFile(join(__dirname, CATEGORIES_FILE), 'utf-8'))); - - const influx = new InfluxDB(process.env.INFLUX_URL); - const writer = influx.getWriteApi(process.env.INFLUX_ORG, process.env.INFLUX_ORG_ANALYTICS_BUCKET, 's'); - - const commandUses: CommandUsageStats = await queryRunner.query(/* sql */ `SELECT * FROM command_counter;`); - - const points: Point[] = []; - for await (const commandUse of commandUses) { - if (commandUse.uses === 0) continue; - points.push(this.createPoint(commandUse.id, commandUse.uses, categories.get(commandUse.id) ?? { category: 'General' })); - } - - writer.writePoints(points); - await writer.flush(); - await writer.close(); - - await queryRunner.dropTable('command_counter'); - } - - public async down(queryRunner: QueryRunner): Promise { - const influx = new InfluxDB(process.env.INFLUX_URL); - const bucketAPI = new BucketsAPI(influx); - const buckets = await bucketAPI.getBuckets(); - const reader = influx.getQueryApi(process.env.INFLUX_ORG); - - if (!buckets.buckets?.some((bucket) => bucket.name === process.env.INFLUX_ORG_ANALYTICS_BUCKET)) return; - - const commands = await reader.collectRows(INFLUX_ALL_COMMANDS_SCRIPT); - - await queryRunner.createTable( - new Table({ - name: 'command_counter', - checks: [new TableCheck({ expression: /* sql */ `"uses" >= 0` })], - columns: [ - new TableColumn({ name: 'id', type: 'varchar', length: '32', isPrimary: true }), - new TableColumn({ name: 'uses', type: 'integer', default: 0, isNullable: false }) - ] - }) - ); - - for (const command of commands) { - await queryRunner.query( - /* sql */ ` - INSERT - INTO command_counter ("id", "uses") - VALUES ($1, $2) - ON CONFLICT (id) - DO - UPDATE - SET uses = command_counter.uses + $2; - `, - [command._field, Number(command._value)] - ); - } - } - - private createPoint(commandName: string, commandUsageAmount: number, categoryData: CategoryData) { - return new Point(Points.Commands) - .tag(Tags.Action, Actions.Addition) - .tag(Tags.MigrationName, this.constructor.name) - .tag(CommandCategoryTypes.Category, categoryData.category) - .timestamp(this.migStart) - .intField(commandName.replace(/^time$/, 'case-time'), commandUsageAmount); - } -} - -interface InfluxSummedCommandEntry { - result: '_result'; - table: string; - _start: string; - _stop: string; - _field: string; - _measurement: Points.Commands; - action: Actions; - category: string; - client_id: string; - origin_event: string; - subCategory: string; - _value: string; -} - -type CommandUsageStats = CommandUsage[]; - -interface CommandUsage { - id: string; - uses: number; -} - -interface CategoryData { - category: string; -} diff --git a/src/lib/database/migrations/1594843508131-V14_FixRpgGuildRankEntity.ts b/src/lib/database/migrations/1594843508131-V14_FixRpgGuildRankEntity.ts deleted file mode 100644 index 6e679f053f8..00000000000 --- a/src/lib/database/migrations/1594843508131-V14_FixRpgGuildRankEntity.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn, TableForeignKey } from 'typeorm'; - -export class V14FixRpgGuildRankEntity1594843508131 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'rpg_guild_rank', - new TableColumn({ - name: 'guild_id', - type: 'integer' - }) - ); - - await queryRunner.createForeignKey( - 'rpg_guild_rank', - new TableForeignKey({ - columnNames: ['guild_id'], - referencedTableName: 'rpg_guild', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('rpg_guild_rank', 'guild_id'); - } -} diff --git a/src/lib/database/migrations/1594922379627-V15_ClearDashboardUsers.ts b/src/lib/database/migrations/1594922379627-V15_ClearDashboardUsers.ts deleted file mode 100644 index 078b78be987..00000000000 --- a/src/lib/database/migrations/1594922379627-V15_ClearDashboardUsers.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm'; - -export class V15ClearDashboardUsers1594922379627 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('dashboard_user'); - } - - public async down(queryRunner: QueryRunner): Promise { - // Create the new dashboard_user table - await queryRunner.createTable( - new Table({ - name: 'dashboard_user', - columns: [ - new TableColumn({ name: 'id', type: 'varchar', length: '19', isPrimary: true, isNullable: false, comment: 'ID of the user' }), - new TableColumn({ - name: 'access_token', - type: 'char', - length: '30', - isNullable: true, - default: null, - comment: 'Token to access the dasboard' - }), - new TableColumn({ - name: 'refresh_token', - type: 'char', - length: '30', - isNullable: true, - default: null, - comment: 'Refresh token to refresh the access' - }), - new TableColumn({ - name: 'expires_at', - type: 'timestamp without time zone', - isNullable: true, - default: null, - comment: 'Expiry timestamp for the token' - }) - ] - }) - ); - } -} diff --git a/src/lib/database/migrations/1595064247769-V16_CreateSpousesTable.ts b/src/lib/database/migrations/1595064247769-V16_CreateSpousesTable.ts deleted file mode 100644 index a17edbfa902..00000000000 --- a/src/lib/database/migrations/1595064247769-V16_CreateSpousesTable.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from 'typeorm'; - -export class V16CreateSpousesTable1595064247769 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'user_spouses_user', - columns: [ - new TableColumn({ name: 'user_id_1', type: 'varchar', length: '19', isNullable: false }), - new TableColumn({ name: 'user_id_2', type: 'varchar', length: '19', isNullable: false }) - ], - foreignKeys: [ - new TableForeignKey({ - columnNames: ['user_id_1'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }), - new TableForeignKey({ - columnNames: ['user_id_2'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ] - }) - ); - - await queryRunner.createPrimaryKey('user_spouses_user', ['user_id_1', 'user_id_2']); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('user_spouses_user'); - } -} diff --git a/src/lib/database/migrations/1596269328762-V17_MigrateModeratorNonNull.ts b/src/lib/database/migrations/1596269328762-V17_MigrateModeratorNonNull.ts deleted file mode 100644 index 9bd363afffc..00000000000 --- a/src/lib/database/migrations/1596269328762-V17_MigrateModeratorNonNull.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V17MigrateModeratorNonNull1596269328762 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `UPDATE public.moderation SET moderator_id = '${process.env.CLIENT_ID}' WHERE moderator_id IS NULL;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER COLUMN moderator_id SET DEFAULT '${process.env.CLIENT_ID}';`); - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER COLUMN moderator_id SET NOT NULL;`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER COLUMN moderator_id DROP NOT NULL;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER COLUMN moderator_id SET DEFAULT NULL;`); - await queryRunner.query(/* sql */ `UPDATE public.moderation SET moderator_id = NULL WHERE moderator_id = '${process.env.CLIENT_ID}';`); - } -} diff --git a/src/lib/database/migrations/1596289368633-V18_CreateIgnoreLogs.ts b/src/lib/database/migrations/1596289368633-V18_CreateIgnoreLogs.ts deleted file mode 100644 index e95625623b9..00000000000 --- a/src/lib/database/migrations/1596289368633-V18_CreateIgnoreLogs.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -const NEW_COLUMNS = ['channels.ignore.all', 'channels.ignore.message-edit', 'channels.ignore.message-delete', 'channels.ignore.reaction-add']; - -export class V18CreateIgnoreLogs1596289368633 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await Promise.all( - NEW_COLUMNS.map((colName) => - queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: colName, - type: 'varchar', - length: '19', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }) - ) - ) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await Promise.all(NEW_COLUMNS.map((colName) => queryRunner.dropColumn('guilds', colName))); - } -} diff --git a/src/lib/database/migrations/1596299849081-V19_MigrateReactionRoles.ts b/src/lib/database/migrations/1596299849081-V19_MigrateReactionRoles.ts deleted file mode 100644 index 953222cb44c..00000000000 --- a/src/lib/database/migrations/1596299849081-V19_MigrateReactionRoles.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V19MigrateReactionRoles1596299849081 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - // Create the new column: - await queryRunner.addColumn('guilds', new TableColumn({ name: 'reaction-roles', type: 'JSON', isArray: true, default: 'ARRAY[]::JSON[]' })); - - // Read all entries and insert the values to the new column: - const entries = (await queryRunner.query( - /* sql */ `SELECT id, "channels.roles", "roles.messageReaction", "roles.reactions" FROM public.guilds;` - )) as RawData[]; - for (const entry of entries) { - // If no reactions were set or no there wasn't a configured channel, skip. - if (!entry['roles.reactions'].length || !entry['channels.roles']) continue; - - const reactionRoles: ReactionRole[] = []; - for (const value of entry['roles.reactions']) { - reactionRoles.push({ - role: value.role, - emoji: value.emoji, - channel: entry['channels.roles'], - message: entry['roles.messageReaction'] - }); - } - - const escaped = reactionRoles.map((value) => `'${JSON.stringify(value).replace(/'/g, "''")}'`); - const escapedId = entry.id.replace(/'/g, "''"); - await queryRunner.query(/* sql */ `UPDATE public.guilds SET "reaction-roles" = ARRAY[${escaped}]::JSON[] WHERE id = '${escapedId}';`); - } - - // Drop the old columns: - await queryRunner.dropColumn('guilds', 'channels.roles'); - await queryRunner.dropColumn('guilds', 'roles.messageReaction'); - await queryRunner.dropColumn('guilds', 'roles.reactions'); - } - - public async down(queryRunner: QueryRunner): Promise { - // Create the old columns: - await queryRunner.addColumns('guilds', [ - new TableColumn({ name: 'channels.roles', type: 'varchar', length: '19', isNullable: true }), - new TableColumn({ name: 'roles.messageReaction', type: 'varchar', length: '19', isNullable: true }), - new TableColumn({ name: 'roles.reactions', type: 'JSON', isArray: true, default: 'ARRAY[]::JSON[]' }) - ]); - - // Drop the new column: - await queryRunner.dropColumn('guilds', 'reaction-roles'); - } -} - -interface ReactionRole { - role: string; - emoji: string; - message: string | null; - channel: string; -} - -interface RawData { - id: string; - 'channels.roles': string; - 'roles.messageReaction': string | null; - 'roles.reactions': { - emoji: string; - role: string; - }[]; -} diff --git a/src/lib/database/migrations/1597088981807-V20_UpdateGuildEntityChecks.ts b/src/lib/database/migrations/1597088981807-V20_UpdateGuildEntityChecks.ts deleted file mode 100644 index 455be443110..00000000000 --- a/src/lib/database/migrations/1597088981807-V20_UpdateGuildEntityChecks.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { MigrationInterface, QueryRunner, TableCheck } from 'typeorm'; -import { RandomGenerator } from 'typeorm/util/RandomGenerator'; - -export class V20UpdateGuildEntityChecks1597088981807 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.nukeAllGuildEntityCheckContraints(queryRunner); - await this.createNewCheckContraints(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - // down is intentionally identical as up here because it defines how the checks should've always been - await this.nukeAllGuildEntityCheckContraints(queryRunner); - await this.createNewCheckContraints(queryRunner); - } - - private async nukeAllGuildEntityCheckContraints(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - DO $$ DECLARE - r RECORD; - BEGIN - FOR r IN ( - SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel - ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp - ON nsp.oid = connamespace - WHERE nsp.nspname = 'public' - AND rel.relname = 'guilds' - AND conname LIKE ${process.env.NODE_ENV === 'development' ? "'%CHK%'" : "'%_check%'"} - ) LOOP - EXECUTE 'ALTER TABLE guilds DROP CONSTRAINT IF EXISTS ' || quote_ident(r.conname) || ' '; - END LOOP; - END $$; - `); - } - - private async createNewCheckContraints(queryRunner: QueryRunner): Promise { - await queryRunner.createCheckConstraints('guilds', [ - new TableCheck({ - name: this.generateCheckName(/* sql */ `"prefix"::text <> ''::text`), - columnNames: ['"prefix"'], - expression: /* sql */ `"prefix"::text <> ''::text` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.attachmentMaximum" >= 0) AND ("selfmod.attachmentMaximum" <= 60)`), - columnNames: ['"selfmod.attachmentMaximum"'], - expression: /* sql */ `("selfmod.attachmentMaximum" >= 0) AND ("selfmod.attachmentMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.attachmentDuration" >= 5000) AND ("selfmod.attachmentDuration" <= 120000)`), - columnNames: ['"selfmod.attachmentDuration"'], - expression: /* sql */ `("selfmod.attachmentDuration" >= 5000) AND ("selfmod.attachmentDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.attachmentPunishmentDuration" >= 1000`), - columnNames: ['"selfmod.attachmentPunishmentDuration"'], - expression: /* sql */ `"selfmod.attachmentPunishmentDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.minimum" >= 5) AND ("selfmod.capitals.minimum" <= 2000)`), - columnNames: ['"selfmod.capitals.minimum"'], - expression: /* sql */ `("selfmod.capitals.minimum" >= 5) AND ("selfmod.capitals.minimum" <= 2000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.maximum" >= 10) AND ("selfmod.capitals.maximum" <= 100)`), - columnNames: ['"selfmod.capitals.maximum"'], - expression: /* sql */ `("selfmod.capitals.maximum" >= 10) AND ("selfmod.capitals.maximum" <= 100)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.capitals.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.capitals.hardActionDuration"'], - expression: /* sql */ `"selfmod.capitals.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.thresholdMaximum" >= 0) AND ("selfmod.capitals.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.capitals.thresholdMaximum"'], - expression: /* sql */ `("selfmod.capitals.thresholdMaximum" >= 0) AND ("selfmod.capitals.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.capitals.thresholdDuration" >= 0) AND ("selfmod.capitals.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.capitals.thresholdDuration"'], - expression: /* sql */ `("selfmod.capitals.thresholdDuration" >= 0) AND ("selfmod.capitals.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.newlines.maximum" >= 10) AND ("selfmod.newlines.maximum" <= 2000)`), - columnNames: ['"selfmod.newlines.maximum"'], - expression: /* sql */ `("selfmod.newlines.maximum" >= 10) AND ("selfmod.newlines.maximum" <= 2000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.newlines.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.newlines.hardActionDuration"'], - expression: /* sql */ `"selfmod.newlines.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.newlines.thresholdMaximum" >= 0) AND ("selfmod.newlines.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.newlines.thresholdMaximum"'], - expression: /* sql */ `("selfmod.newlines.thresholdMaximum" >= 0) AND ("selfmod.newlines.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.newlines.thresholdDuration" >= 0) AND ("selfmod.newlines.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.newlines.thresholdDuration"'], - expression: /* sql */ `("selfmod.newlines.thresholdDuration" >= 0) AND ("selfmod.newlines.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.invites.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.invites.hardActionDuration"'], - expression: /* sql */ `"selfmod.invites.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.invites.thresholdMaximum" >= 0) AND ("selfmod.invites.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.invites.thresholdMaximum"'], - expression: /* sql */ `("selfmod.invites.thresholdMaximum" >= 0) AND ("selfmod.invites.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.invites.thresholdDuration" >= 0) AND ("selfmod.invites.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.invites.thresholdDuration"'], - expression: /* sql */ `("selfmod.invites.thresholdDuration" >= 0) AND ("selfmod.invites.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.filter.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.filter.hardActionDuration"'], - expression: /* sql */ `"selfmod.filter.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.filter.thresholdMaximum" >= 0) AND ("selfmod.filter.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.filter.thresholdMaximum"'], - expression: /* sql */ `("selfmod.filter.thresholdMaximum" >= 0) AND ("selfmod.filter.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.filter.thresholdDuration" >= 0) AND ("selfmod.filter.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.filter.thresholdDuration"'], - expression: /* sql */ `("selfmod.filter.thresholdDuration" >= 0) AND ("selfmod.filter.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.reactions.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.reactions.hardActionDuration"'], - expression: /* sql */ `"selfmod.reactions.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.reactions.thresholdMaximum" >= 0) AND ("selfmod.reactions.thresholdMaximum" <= 20)` - ), - columnNames: ['"selfmod.reactions.thresholdMaximum"'], - expression: /* sql */ `("selfmod.reactions.thresholdMaximum" >= 0) AND ("selfmod.reactions.thresholdMaximum" <= 20)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.reactions.thresholdDuration" >= 0) AND ("selfmod.reactions.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.reactions.thresholdDuration"'], - expression: /* sql */ `("selfmod.reactions.thresholdDuration" >= 0) AND ("selfmod.reactions.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.messages.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.messages.hardActionDuration"'], - expression: /* sql */ `"selfmod.messages.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.messages.thresholdMaximum" >= 0) AND ("selfmod.messages.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.messages.thresholdMaximum"'], - expression: /* sql */ `("selfmod.messages.thresholdMaximum" >= 0) AND ("selfmod.messages.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.messages.thresholdDuration" >= 0) AND ("selfmod.messages.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.messages.thresholdDuration"'], - expression: /* sql */ `("selfmod.messages.thresholdDuration" >= 0) AND ("selfmod.messages.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.links.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.links.hardActionDuration"'], - expression: /* sql */ `"selfmod.links.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.links.thresholdMaximum" >= 0) AND ("selfmod.links.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.links.thresholdMaximum"'], - expression: /* sql */ `("selfmod.links.thresholdMaximum" >= 0) AND ("selfmod.links.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.links.thresholdDuration" >= 0) AND ("selfmod.links.thresholdDuration" <= 120000)`), - columnNames: ['"selfmod.links.thresholdDuration"'], - expression: /* sql */ `("selfmod.links.thresholdDuration" >= 0) AND ("selfmod.links.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.raidthreshold" >= 2) AND ("selfmod.raidthreshold" <= 50)`), - columnNames: ['"selfmod.raidthreshold"'], - expression: /* sql */ `("selfmod.raidthreshold" >= 2) AND ("selfmod.raidthreshold" <= 50)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"no-mention-spam.mentionsAllowed" >= 0`), - columnNames: ['"no-mention-spam.mentionsAllowed"'], - expression: /* sql */ `"no-mention-spam.mentionsAllowed" >= 0` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"no-mention-spam.timePeriod" >= 0`), - columnNames: ['"no-mention-spam.timePeriod"'], - expression: /* sql */ `"no-mention-spam.timePeriod" >= 0` - }) - ]); - } - - /** - * Generates a random check name the same way typeorm does for the"@check" decorators - * @see https://github.com/typeorm/typeorm/blob/ec3be4115faba62c1dbbc786ec9283438362bb50/src/naming-strategy/DefaultNamingStrategy.ts#L106-L111 - */ - private generateCheckName(expression: string): string { - const tableName = 'guilds'; - const replacedTableName = tableName.replace('.', '_'); - const key = `${replacedTableName}_${expression}`; - return `CHK_${RandomGenerator.sha1(key).slice(0, 26)}`; - } -} diff --git a/src/lib/database/migrations/1597266996401-V21_AddMissingChecks.ts b/src/lib/database/migrations/1597266996401-V21_AddMissingChecks.ts deleted file mode 100644 index 6ce67173272..00000000000 --- a/src/lib/database/migrations/1597266996401-V21_AddMissingChecks.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { MigrationInterface, QueryRunner, TableCheck } from 'typeorm'; -import { RandomGenerator } from 'typeorm/util/RandomGenerator'; - -export class V21AddMissingChecks1597266996401 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.updateModerationChecks(queryRunner); - await this.createUserChecks(queryRunner); - await this.createUserProfileCheck(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - await this.nukeAllTableCheckContraints('user', queryRunner); - await this.nukeAllTableCheckContraints('user_profile', queryRunner); - await this.nukeAllTableCheckContraints('moderation', queryRunner); - - await queryRunner.createCheckConstraints('user', [ - new TableCheck({ - name: this.generateCheckName(/* sql */ `("duration" >= 0) AND ("duration" <= 31536000000)`), - columnNames: ['"duration"'], - expression: /* sql */ `("duration" >= 0) AND ("duration" <= 31536000000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"reason"::text <> ''::text`), - columnNames: ['"reason"'], - expression: /* sql */ `"reason"::text <> ''::text` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"type" >= 0`), - columnNames: ['"type"'], - expression: /* sql */ `"type" >= 0` - }) - ]); - } - - private async updateModerationChecks(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE guilds DROP CONSTRAINT IF EXISTS moderation_duration_check;`); - await queryRunner.createCheckConstraint( - 'moderation', - new TableCheck({ - name: this.generateCheckName(/* sql */ `("duration" >= 0) AND ("duration" <= 31536000000)`), - columnNames: ['"duration"'], - expression: /* sql */ `("duration" >= 0) AND ("duration" <= 31536000000)` - }) - ); - } - - private async createUserChecks(queryRunner: QueryRunner): Promise { - await queryRunner.createCheckConstraints('user', [ - new TableCheck({ - name: this.generateCheckName(/* sql */ `money >= 0`), - columnNames: ['money'], - expression: /* sql */ `money >= 0` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `points >= 0`), - columnNames: ['points'], - expression: /* sql */ `points >= 0` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `reputations >= 0`), - columnNames: ['reputations'], - expression: /* sql */ `reputations >= 0` - }) - ]); - } - - private async createUserProfileCheck(queryRunner: QueryRunner): Promise { - await queryRunner.createCheckConstraint( - 'user_profile', - new TableCheck({ - name: this.generateCheckName(/* sql */ `(color >= 0) AND (color <= 16777215)`), - columnNames: ['color'], - expression: /* sql */ `(color >= 0) AND (color <= 16777215)` - }) - ); - } - - private async nukeAllTableCheckContraints(table: 'user' | 'user_profile' | 'moderation', queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - DO $$ DECLARE - r RECORD; - BEGIN - FOR r IN ( - SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel - ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp - ON nsp.oid = connamespace - WHERE nsp.nspname = 'public' - AND rel.relname = '${table}' - AND conname LIKE ${process.env.NODE_ENV === 'development' ? "'%CHK%'" : "'%_check%'"} - ) LOOP - EXECUTE 'ALTER TABLE guilds DROP CONSTRAINT IF EXISTS ' || quote_ident(r.conname) || ' '; - END LOOP; - END $$; - `); - } - - /** - * Generates a random check name the same way typeorm does for the"@check" decorators - * @see https://github.com/typeorm/typeorm/blob/ec3be4115faba62c1dbbc786ec9283438362bb50/src/naming-strategy/DefaultNamingStrategy.ts#L106-L111 - */ - private generateCheckName(expression: string): string { - const tableName = 'guilds'; - const replacedTableName = tableName.replace('.', '_'); - const key = `${replacedTableName}_${expression}`; - return `CHK_${RandomGenerator.sha1(key).slice(0, 26)}`; - } -} diff --git a/src/lib/database/migrations/1598010877863-V22_AddSelfStarCapabilities.ts b/src/lib/database/migrations/1598010877863-V22_AddSelfStarCapabilities.ts deleted file mode 100644 index 45a99232fae..00000000000 --- a/src/lib/database/migrations/1598010877863-V22_AddSelfStarCapabilities.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V22AddSelfStarCapabilities1598010877863 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'starboard.selfStar', - type: 'boolean', - default: false - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'starboard.selfStar'); - } -} diff --git a/src/lib/database/migrations/1598083459734-V23_AddGIData.ts b/src/lib/database/migrations/1598083459734-V23_AddGIData.ts deleted file mode 100644 index aff61f3f6f5..00000000000 --- a/src/lib/database/migrations/1598083459734-V23_AddGIData.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from 'typeorm'; - -export class V23AddGIData1598083459734 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'user_game_integration', - columns: [ - new TableColumn({ name: 'user_id', type: 'varchar', length: '19', isNullable: false }), - new TableColumn({ name: 'id', type: 'int', isPrimary: true, isGenerated: true, generationStrategy: 'increment' }), - new TableColumn({ name: 'game', type: 'varchar', length: '35' }), - new TableColumn({ name: 'extra_data', type: 'jsonb' }) - ], - foreignKeys: [ - new TableForeignKey({ - columnNames: ['user_id'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ] - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('user_game_integration'); - } -} diff --git a/src/lib/database/migrations/1599692515073-V24_RemoveCleanUpTask.ts b/src/lib/database/migrations/1599692515073-V24_RemoveCleanUpTask.ts deleted file mode 100644 index 5fa33573d5c..00000000000 --- a/src/lib/database/migrations/1599692515073-V24_RemoveCleanUpTask.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V24RemoveCleanUpTask1599692515073 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `DELETE FROM public.schedule WHERE task_id = 'cleanup';`); - } - - public async down(): Promise { - // noop - } -} diff --git a/src/lib/database/migrations/1604530387718-V25_SettingsGatewayRemoval.ts b/src/lib/database/migrations/1604530387718-V25_SettingsGatewayRemoval.ts deleted file mode 100644 index 28a110a3709..00000000000 --- a/src/lib/database/migrations/1604530387718-V25_SettingsGatewayRemoval.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V25SettingsGatewayRemoval1604530387718 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "selfmod.newlines.maximum" - SET DEFAULT 20; - `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public.guilds - ALTER COLUMN "selfmod.newlines.maximum" - SET DEFAULT 10; - `); - } -} diff --git a/src/lib/database/migrations/1605027257347-V26_RemoveCommandUserCounter.ts b/src/lib/database/migrations/1605027257347-V26_RemoveCommandUserCounter.ts deleted file mode 100644 index 851f66e6c4e..00000000000 --- a/src/lib/database/migrations/1605027257347-V26_RemoveCommandUserCounter.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V26RemoveCommandUseCounter1605027257347 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE guilds DROP COLUMN "commandUses";`); - await queryRunner.query(/* sql */ `ALTER TABLE guilds DROP COLUMN IF EXISTS "suggestions.selfStar";`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE guilds ADD COLUMN "commandUses" integer DEFAULT 0;`); - } -} diff --git a/src/lib/database/migrations/1605297776910-V27_TextToJsonb.ts b/src/lib/database/migrations/1605297776910-V27_TextToJsonb.ts deleted file mode 100644 index 9d59709b2d3..00000000000 --- a/src/lib/database/migrations/1605297776910-V27_TextToJsonb.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -const columnsToModify = [ - 'custom-commands', - 'permissions.users', - 'permissions.roles', - 'command-autodelete', - 'disabledCommandsChannels', - 'stickyRoles', - 'reaction-roles', - 'roles.auto', - 'roles.uniqueRoleSets', - 'trigger.alias', - 'trigger.includes', - 'notifications.streams.twitch.streamers' -]; - -export class V27TextToJsonb1605297776910 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - CREATE OR REPLACE FUNCTION jsonb_array_to_jsonb(jsonb[]) - RETURNS jsonb - language sql as - $$ - SELECT to_jsonb($1) - $$; - `); - - await Promise.all( - columnsToModify.map((column) => - queryRunner.query(/* sql */ ` - ALTER TABLE guilds - ALTER COLUMN "${column}" - DROP NOT NULL; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - DROP DEFAULT; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET DATA TYPE jsonb - USING jsonb_array_to_jsonb("${column}"::JSONB[]); - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET DEFAULT '[]'::JSONB; - - UPDATE guilds - SET "${column}" = '[]'::JSONB - WHERE "${column}" IS NULL; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET NOT NULL; - `) - ) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await Promise.all( - columnsToModify.map((column) => - queryRunner.query(/* sql */ ` - ALTER TABLE guilds - ALTER COLUMN "${column}" SET DATA TYPE text[]; - - ALTER TABLE guilds - ALTER COLUMN "${column}" SET DEFAULT ARRAY []::json[]; - `) - ) - ); - } -} diff --git a/src/lib/database/migrations/1605460185741-V28_SuggestionIdRemoveFromGuild.ts b/src/lib/database/migrations/1605460185741-V28_SuggestionIdRemoveFromGuild.ts deleted file mode 100644 index 0529fff4a09..00000000000 --- a/src/lib/database/migrations/1605460185741-V28_SuggestionIdRemoveFromGuild.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V28SuggestionIdRemoveFromGuild1605460185741 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ `ALTER TABLE guilds DROP COLUMN IF EXISTS "suggestions.id";`); - } - - public async down(queryRunner: QueryRunner): Promise { - // Start at 100 in case a revert is needed, the current highest suggestion is 76 so this is a safe number to start at. - await queryRunner.query(/* sql */ `ALTER TABLE guilds ADD COLUMN "suggestions.id" integer DEFAULT 100;`); - } -} diff --git a/src/lib/database/migrations/1606138444111-V29_AttachmentMode.ts b/src/lib/database/migrations/1606138444111-V29_AttachmentMode.ts deleted file mode 100644 index ad8a85ef716..00000000000 --- a/src/lib/database/migrations/1606138444111-V29_AttachmentMode.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V29AttachmentMode1606138444111 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - // Rename the current column into the new ones, for consistency with the others: - await queryRunner.renameColumn('guilds', 'selfmod.attachment', 'selfmod.attachments.enabled'); - await queryRunner.renameColumn('guilds', 'selfmod.attachmentAction', 'selfmod.attachments.hardAction'); - await queryRunner.renameColumn('guilds', 'selfmod.attachmentPunishmentDuration', 'selfmod.attachments.hardActionDuration'); - await queryRunner.renameColumn('guilds', 'selfmod.attachmentMaximum', 'selfmod.attachments.thresholdMaximum'); - await queryRunner.renameColumn('guilds', 'selfmod.attachmentDuration', 'selfmod.attachments.thresholdDuration'); - - // Create the new columns: - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'selfmod.attachments.softAction', type: 'smallint', isNullable: false, default: 0 }) - ); - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'selfmod.attachments.ignoredRoles', - type: 'varchar', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }) - ); - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'selfmod.attachments.ignoredChannels', - type: 'varchar', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }) - ); - - // Transform the old data into the new one: - await queryRunner.query(/* sql */ ` - UPDATE public.guilds - SET - -- 1010 (Log + 010 [2]) should be converted to 010 (Log) and 011 [3], therefore we read the smallint - -- as a 4-bit bitfield, read the first bit ('1') and shift it by one, this way we get 010 [2] in action. - -- Then we convert the action into a 3-bit bitfield ('1010'::bit(3) becomes '010'::bit(3)) and add one, - -- thus we get 011 [3]. - "selfmod.attachments.softAction" = get_bit("selfmod.attachments.hardAction"::integer::bit(4), 0) << 1, - "selfmod.attachments.hardAction" = "selfmod.attachments.hardAction"::integer::bit(3)::int + 1; - `); - } - - public async down(queryRunner: QueryRunner): Promise { - // Transform the new data into the old one, this needs the new columns in order to be able to reset the data - // into the old format, which combined two columns in one: - await queryRunner.query(/* sql */ ` - UPDATE public.guilds - SET - -- We do the opposite, if we have to reduce hardAction by one (011 [3] becomes 010 [2]), then we add the - -- bit from softAction shifted by 3, that way, if softAction was x1x, get_bit would return 1, and after - -- << 3, it'd turn into 1000. We add this and get 1010 back. - "selfmod.attachments.hardAction" = ("selfmod.attachments.hardAction" - 1) + (get_bit("selfmod.attachments.softAction"::integer::bit(3), 1) << 3); - `); - - // Rename the new columns into the old ones: - await queryRunner.renameColumn('guilds', 'selfmod.attachments.enabled', 'selfmod.attachment'); - await queryRunner.renameColumn('guilds', 'selfmod.attachments.hardAction', 'selfmod.attachmentAction'); - await queryRunner.renameColumn('guilds', 'selfmod.attachments.hardActionDuration', 'selfmod.attachmentPunishmentDuration'); - await queryRunner.renameColumn('guilds', 'selfmod.attachments.thresholdMaximum', 'selfmod.attachmentMaximum'); - await queryRunner.renameColumn('guilds', 'selfmod.attachments.thresholdDuration', 'selfmod.attachmentDuration'); - - // Drop the new columns: - await queryRunner.dropColumn('guilds', 'selfmod.attachments.softAction'); - await queryRunner.dropColumn('guilds', 'selfmod.attachments.ignoredRoles'); - await queryRunner.dropColumn('guilds', 'selfmod.attachments.ignoredChannels'); - } -} diff --git a/src/lib/database/migrations/1606411800922-V30_AttachmentModeChecks.ts b/src/lib/database/migrations/1606411800922-V30_AttachmentModeChecks.ts deleted file mode 100644 index 7c680d96611..00000000000 --- a/src/lib/database/migrations/1606411800922-V30_AttachmentModeChecks.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { MigrationInterface, QueryRunner, TableCheck } from 'typeorm'; -import { RandomGenerator } from 'typeorm/util/RandomGenerator'; - -export class V30AttachmentModeChecks1606411800922 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.nukeAllGuildEntityCheckContraints(queryRunner); - await this.createNewCheckContraints(queryRunner); - } - - public async down(queryRunner: QueryRunner): Promise { - // down is intentionally identical as up here because it defines how the checks should've always been - await this.nukeAllGuildEntityCheckContraints(queryRunner); - await this.createNewCheckContraints(queryRunner); - } - - private async nukeAllGuildEntityCheckContraints(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - DO $$ DECLARE - r RECORD; - BEGIN - FOR r IN ( - SELECT con.conname - FROM pg_catalog.pg_constraint con - INNER JOIN pg_catalog.pg_class rel - ON rel.oid = con.conrelid - INNER JOIN pg_catalog.pg_namespace nsp - ON nsp.oid = connamespace - WHERE nsp.nspname = 'public' - AND rel.relname = 'guilds' - AND conname LIKE 'CHK_%' - ) LOOP - EXECUTE 'ALTER TABLE guilds DROP CONSTRAINT IF EXISTS ' || quote_ident(r.conname) || ' '; - END LOOP; - END $$; - `); - } - - private async createNewCheckContraints(queryRunner: QueryRunner): Promise { - await queryRunner.createCheckConstraints('guilds', [ - new TableCheck({ - name: this.generateCheckName(/* sql */ `"prefix"::text <> ''::text`), - columnNames: ['"prefix"'], - expression: /* sql */ `"prefix"::text <> ''::text` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.attachments.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.attachments.hardActionDuration"'], - expression: /* sql */ `"selfmod.attachments.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.attachments.thresholdMaximum" >= 0) AND ("selfmod.attachments.thresholdMaximum" <= 60)` - ), - columnNames: ['"selfmod.attachments.thresholdMaximum"'], - expression: /* sql */ `("selfmod.attachments.thresholdMaximum" >= 0) AND ("selfmod.attachments.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.attachments.thresholdDuration" >= 0) AND ("selfmod.attachments.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.attachments.thresholdDuration"'], - expression: /* sql */ `("selfmod.attachments.thresholdDuration" >= 0) AND ("selfmod.attachments.thresholdDuration" <= 120000)` - }), - - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.minimum" >= 5) AND ("selfmod.capitals.minimum" <= 2000)`), - columnNames: ['"selfmod.capitals.minimum"'], - expression: /* sql */ `("selfmod.capitals.minimum" >= 5) AND ("selfmod.capitals.minimum" <= 2000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.maximum" >= 10) AND ("selfmod.capitals.maximum" <= 100)`), - columnNames: ['"selfmod.capitals.maximum"'], - expression: /* sql */ `("selfmod.capitals.maximum" >= 10) AND ("selfmod.capitals.maximum" <= 100)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.capitals.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.capitals.hardActionDuration"'], - expression: /* sql */ `"selfmod.capitals.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.capitals.thresholdMaximum" >= 0) AND ("selfmod.capitals.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.capitals.thresholdMaximum"'], - expression: /* sql */ `("selfmod.capitals.thresholdMaximum" >= 0) AND ("selfmod.capitals.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.capitals.thresholdDuration" >= 0) AND ("selfmod.capitals.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.capitals.thresholdDuration"'], - expression: /* sql */ `("selfmod.capitals.thresholdDuration" >= 0) AND ("selfmod.capitals.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.newlines.maximum" >= 10) AND ("selfmod.newlines.maximum" <= 2000)`), - columnNames: ['"selfmod.newlines.maximum"'], - expression: /* sql */ `("selfmod.newlines.maximum" >= 10) AND ("selfmod.newlines.maximum" <= 2000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.newlines.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.newlines.hardActionDuration"'], - expression: /* sql */ `"selfmod.newlines.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.newlines.thresholdMaximum" >= 0) AND ("selfmod.newlines.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.newlines.thresholdMaximum"'], - expression: /* sql */ `("selfmod.newlines.thresholdMaximum" >= 0) AND ("selfmod.newlines.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.newlines.thresholdDuration" >= 0) AND ("selfmod.newlines.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.newlines.thresholdDuration"'], - expression: /* sql */ `("selfmod.newlines.thresholdDuration" >= 0) AND ("selfmod.newlines.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.invites.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.invites.hardActionDuration"'], - expression: /* sql */ `"selfmod.invites.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.invites.thresholdMaximum" >= 0) AND ("selfmod.invites.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.invites.thresholdMaximum"'], - expression: /* sql */ `("selfmod.invites.thresholdMaximum" >= 0) AND ("selfmod.invites.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.invites.thresholdDuration" >= 0) AND ("selfmod.invites.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.invites.thresholdDuration"'], - expression: /* sql */ `("selfmod.invites.thresholdDuration" >= 0) AND ("selfmod.invites.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.filter.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.filter.hardActionDuration"'], - expression: /* sql */ `"selfmod.filter.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.filter.thresholdMaximum" >= 0) AND ("selfmod.filter.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.filter.thresholdMaximum"'], - expression: /* sql */ `("selfmod.filter.thresholdMaximum" >= 0) AND ("selfmod.filter.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.filter.thresholdDuration" >= 0) AND ("selfmod.filter.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.filter.thresholdDuration"'], - expression: /* sql */ `("selfmod.filter.thresholdDuration" >= 0) AND ("selfmod.filter.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.reactions.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.reactions.hardActionDuration"'], - expression: /* sql */ `"selfmod.reactions.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.reactions.thresholdMaximum" >= 0) AND ("selfmod.reactions.thresholdMaximum" <= 20)` - ), - columnNames: ['"selfmod.reactions.thresholdMaximum"'], - expression: /* sql */ `("selfmod.reactions.thresholdMaximum" >= 0) AND ("selfmod.reactions.thresholdMaximum" <= 20)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.reactions.thresholdDuration" >= 0) AND ("selfmod.reactions.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.reactions.thresholdDuration"'], - expression: /* sql */ `("selfmod.reactions.thresholdDuration" >= 0) AND ("selfmod.reactions.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.messages.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.messages.hardActionDuration"'], - expression: /* sql */ `"selfmod.messages.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.messages.thresholdMaximum" >= 0) AND ("selfmod.messages.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.messages.thresholdMaximum"'], - expression: /* sql */ `("selfmod.messages.thresholdMaximum" >= 0) AND ("selfmod.messages.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName( - /* sql */ `("selfmod.messages.thresholdDuration" >= 0) AND ("selfmod.messages.thresholdDuration" <= 120000)` - ), - columnNames: ['"selfmod.messages.thresholdDuration"'], - expression: /* sql */ `("selfmod.messages.thresholdDuration" >= 0) AND ("selfmod.messages.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"selfmod.links.hardActionDuration" >= 1000`), - columnNames: ['"selfmod.links.hardActionDuration"'], - expression: /* sql */ `"selfmod.links.hardActionDuration" >= 1000` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.links.thresholdMaximum" >= 0) AND ("selfmod.links.thresholdMaximum" <= 60)`), - columnNames: ['"selfmod.links.thresholdMaximum"'], - expression: /* sql */ `("selfmod.links.thresholdMaximum" >= 0) AND ("selfmod.links.thresholdMaximum" <= 60)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.links.thresholdDuration" >= 0) AND ("selfmod.links.thresholdDuration" <= 120000)`), - columnNames: ['"selfmod.links.thresholdDuration"'], - expression: /* sql */ `("selfmod.links.thresholdDuration" >= 0) AND ("selfmod.links.thresholdDuration" <= 120000)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `("selfmod.raidthreshold" >= 2) AND ("selfmod.raidthreshold" <= 50)`), - columnNames: ['"selfmod.raidthreshold"'], - expression: /* sql */ `("selfmod.raidthreshold" >= 2) AND ("selfmod.raidthreshold" <= 50)` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"no-mention-spam.mentionsAllowed" >= 0`), - columnNames: ['"no-mention-spam.mentionsAllowed"'], - expression: /* sql */ `"no-mention-spam.mentionsAllowed" >= 0` - }), - new TableCheck({ - name: this.generateCheckName(/* sql */ `"no-mention-spam.timePeriod" >= 0`), - columnNames: ['"no-mention-spam.timePeriod"'], - expression: /* sql */ `"no-mention-spam.timePeriod" >= 0` - }) - ]); - } - - /** - * Generates a random check name the same way typeorm does for the"@check" decorators - * @see https://github.com/typeorm/typeorm/blob/ec3be4115faba62c1dbbc786ec9283438362bb50/src/naming-strategy/DefaultNamingStrategy.ts#L106-L111 - */ - private generateCheckName(expression: string): string { - const tableName = 'guilds'; - const replacedTableName = tableName.replace('.', '_'); - const key = `${replacedTableName}_${expression}`; - return `CHK_${RandomGenerator.sha1(key).slice(0, 26)}`; - } -} diff --git a/src/lib/database/migrations/1606650850324-V31_MultiRole.ts b/src/lib/database/migrations/1606650850324-V31_MultiRole.ts deleted file mode 100644 index 6ee29ef9bdb..00000000000 --- a/src/lib/database/migrations/1606650850324-V31_MultiRole.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -const columnsToModify = ['roles.admin', 'roles.moderator', 'roles.dj']; - -export class V31MultiRole1606650850324 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - CREATE OR REPLACE FUNCTION nullable_varchar_to_varchar_array(varchar) - RETURNS varchar[] - language sql as - $$ - SELECT CASE - WHEN $1 IS NULL - THEN ARRAY[]::varchar[] - ELSE ARRAY[$1]::varchar[] - END - $$; - `); - - await Promise.all( - columnsToModify.map((column) => - queryRunner.query(/* sql */ ` - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET DATA TYPE varchar(19)[] - USING nullable_varchar_to_varchar_array("${column}"); - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET DEFAULT ARRAY[]::varchar[]; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET NOT NULL; - `) - ) - ); - - await queryRunner.query(/* sql */ ` - DROP FUNCTION IF EXISTS nullable_varchar_to_varchar_array(varchar); - `); - } - - public async down(queryRunner: QueryRunner): Promise { - await Promise.all( - columnsToModify.map((column) => - queryRunner.query(/* sql */ ` - ALTER TABLE guilds - ALTER COLUMN "${column}" - DROP NOT NULL; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - DROP DEFAULT; - - ALTER TABLE guilds - ALTER COLUMN "${column}" - SET DATA TYPE varchar(19) - USING "${column}"[1]; - `) - ) - ); - } -} diff --git a/src/lib/database/migrations/1606948188150-V32_SeparatedMemberNameUpdateLogs.ts b/src/lib/database/migrations/1606948188150-V32_SeparatedMemberNameUpdateLogs.ts deleted file mode 100644 index 68b9867bf7c..00000000000 --- a/src/lib/database/migrations/1606948188150-V32_SeparatedMemberNameUpdateLogs.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V32SeparatedMemberNameUpdateLogs1606948188150 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.renameColumn('guilds', 'events.memberNameUpdate', 'events.member-nickname-update'); - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'events.member-username-update', - type: 'boolean', - isNullable: true, - default: false - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.renameColumn('guilds', 'events.member-nickname-update', 'events.memberNameUpdate'); - await queryRunner.dropColumn('guilds', 'events.member-username-update'); - } -} diff --git a/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts b/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts deleted file mode 100644 index b15f027a5f7..00000000000 --- a/src/lib/database/migrations/1610450637243-V33_LimitLessLanguageCodes.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { 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/migrations/1610659806881-V34_IncreasedModerationDurations.ts b/src/lib/database/migrations/1610659806881-V34_IncreasedModerationDurations.ts deleted file mode 100644 index 19d0cd90c5c..00000000000 --- a/src/lib/database/migrations/1610659806881-V34_IncreasedModerationDurations.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { MigrationInterface, QueryRunner, TableCheck } from 'typeorm'; - -export class V34IncreasedModerationDurations1610659806881 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - // Modify guild schema: - const guilds = (await queryRunner.getTable('guilds'))!; - await queryRunner.dropCheckConstraints(guilds, guilds.checks); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.attachments.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.capitals.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.links.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.messages.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.newlines.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.invites.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.filter.hardActionDuration" TYPE bigint;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.reactions.hardActionDuration" TYPE bigint;`); - - // Modify moderation schema: - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER "duration" TYPE bigint;`); - - // Modify checks: - const moderation = (await queryRunner.getTable('moderation'))!; - const check = moderation.checks.find((check) => check.expression?.includes('duration')); - if (check) await queryRunner.dropCheckConstraint(moderation, check); - await queryRunner.createCheckConstraint( - 'moderation', - new TableCheck({ expression: /* sql */ `("duration" >= 0) AND ("duration" <= 157680000000)` }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - // Modify guild schema: - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.attachments.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.capitals.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.links.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.messages.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.newlines.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.invites.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.filter.hardActionDuration" TYPE integer;`); - await queryRunner.query(/* sql */ `ALTER TABLE public.guilds ALTER "selfmod.reactions.hardActionDuration" TYPE integer;`); - - await queryRunner.createCheckConstraints('guilds', [ - new TableCheck({ expression: /* sql */ `"prefix"::text <> ''::text` }), - new TableCheck({ expression: /* sql */ `"selfmod.attachments.hardActionDuration" >= 1000` }), - new TableCheck({ - expression: /* sql */ `("selfmod.attachments.thresholdMaximum" >= 0) AND ("selfmod.attachments.thresholdMaximum" <= 60)` - }), - new TableCheck({ - expression: /* sql */ `("selfmod.attachments.thresholdDuration" >= 0) AND ("selfmod.attachments.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `("selfmod.capitals.minimum" >= 5) AND ("selfmod.capitals.minimum" <= 2000)` }), - new TableCheck({ expression: /* sql */ `("selfmod.capitals.maximum" >= 10) AND ("selfmod.capitals.maximum" <= 100)` }), - new TableCheck({ expression: /* sql */ `"selfmod.capitals.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.capitals.thresholdMaximum" >= 0) AND ("selfmod.capitals.thresholdMaximum" <= 60)` }), - new TableCheck({ - expression: /* sql */ `("selfmod.capitals.thresholdDuration" >= 0) AND ("selfmod.capitals.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `("selfmod.newlines.maximum" >= 10) AND ("selfmod.newlines.maximum" <= 2000)` }), - new TableCheck({ expression: /* sql */ `"selfmod.newlines.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.newlines.thresholdMaximum" >= 0) AND ("selfmod.newlines.thresholdMaximum" <= 60)` }), - new TableCheck({ - expression: /* sql */ `("selfmod.newlines.thresholdDuration" >= 0) AND ("selfmod.newlines.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `"selfmod.invites.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.invites.thresholdMaximum" >= 0) AND ("selfmod.invites.thresholdMaximum" <= 60)` }), - new TableCheck({ - expression: /* sql */ `("selfmod.invites.thresholdDuration" >= 0) AND ("selfmod.invites.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `"selfmod.filter.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.filter.thresholdMaximum" >= 0) AND ("selfmod.filter.thresholdMaximum" <= 60)` }), - new TableCheck({ expression: /* sql */ `("selfmod.filter.thresholdDuration" >= 0) AND ("selfmod.filter.thresholdDuration" <= 120000)` }), - new TableCheck({ expression: /* sql */ `"selfmod.reactions.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.reactions.thresholdMaximum" >= 0) AND ("selfmod.reactions.thresholdMaximum" <= 20)` }), - new TableCheck({ - expression: /* sql */ `("selfmod.reactions.thresholdDuration" >= 0) AND ("selfmod.reactions.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `"selfmod.messages.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.messages.thresholdMaximum" >= 0) AND ("selfmod.messages.thresholdMaximum" <= 60)` }), - new TableCheck({ - expression: /* sql */ `("selfmod.messages.thresholdDuration" >= 0) AND ("selfmod.messages.thresholdDuration" <= 120000)` - }), - new TableCheck({ expression: /* sql */ `"selfmod.links.hardActionDuration" >= 1000` }), - new TableCheck({ expression: /* sql */ `("selfmod.links.thresholdMaximum" >= 0) AND ("selfmod.links.thresholdMaximum" <= 60)` }), - new TableCheck({ expression: /* sql */ `("selfmod.links.thresholdDuration" >= 0) AND ("selfmod.links.thresholdDuration" <= 120000)` }), - new TableCheck({ expression: /* sql */ `("selfmod.raidthreshold" >= 2) AND ("selfmod.raidthreshold" <= 50)` }), - new TableCheck({ expression: /* sql */ `"no-mention-spam.mentionsAllowed" >= 0` }), - new TableCheck({ expression: /* sql */ `"no-mention-spam.timePeriod" >= 0` }), - new TableCheck({ expression: /* sql */ `"starboard.minimum" >= 1` }) - ]); - - // Modify moderation schema: - await queryRunner.query(/* sql */ `ALTER TABLE public.moderation ALTER "duration" TYPE integer;`); - - // Modify checks: - const moderation = (await queryRunner.getTable('moderation'))!; - const check = moderation.checks.find((check) => check.expression?.includes('duration')); - if (check) await queryRunner.dropCheckConstraint(moderation, check); - await queryRunner.createCheckConstraint( - 'moderation', - new TableCheck({ expression: /* sql */ `("duration" >= 0) AND ("duration" <= 31536000000)` }) - ); - } -} diff --git a/src/lib/database/migrations/1612574048431-V35_RemoveRaidColumns.ts b/src/lib/database/migrations/1612574048431-V35_RemoveRaidColumns.ts deleted file mode 100644 index 26021e13a67..00000000000 --- a/src/lib/database/migrations/1612574048431-V35_RemoveRaidColumns.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V35RemoveRaidColumns1612574048431 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'selfmod.raid'); - await queryRunner.dropColumn('guilds', 'selfmod.raidthreshold'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumns('guilds', [ - new TableColumn({ - name: 'selfmod.raid', - default: false, - type: 'boolean', - isNullable: false - }), - new TableColumn({ - name: 'selfmod.raidthreshold', - default: 10, - type: 'smallint', - isNullable: false - }) - ]); - } -} diff --git a/src/lib/database/migrations/1614640993140-V36_RemoveEveryonePermissionNodes.ts b/src/lib/database/migrations/1614640993140-V36_RemoveEveryonePermissionNodes.ts deleted file mode 100644 index 73ab828204c..00000000000 --- a/src/lib/database/migrations/1614640993140-V36_RemoveEveryonePermissionNodes.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V36RemoveEveryonePermissionNodes1614640993140 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const rows = (await queryRunner.query( - /* sql */ `SELECT "id", "permissions.roles" FROM public.guilds WHERE jsonb_array_length("permissions.roles") <> 0;` - )) as Entry[]; - - for (const row of rows) { - const roles = row['permissions.roles']; - const everyoneIndex = roles.findIndex((role) => role.id === row.id); - if (everyoneIndex === -1) continue; - - const everyone = roles[everyoneIndex]; - if (everyone.allow.length === 0) continue; - - everyone.allow.length = 0; - if (everyone.deny.length === 0) roles.splice(everyoneIndex, 1); - await queryRunner.query(/* sql */ `UPDATE public.guilds SET "permissions.roles" = $2::JSONB WHERE id = $1;`, [ - row.id, - JSON.stringify(roles) - ]); - } - } - - public async down(): Promise { - /* noop */ - } -} - -interface Entry { - id: string; - 'permissions.roles': PermissionsRole[]; -} - -interface PermissionsRole { - id: string; - deny: string[]; - allow: string[]; -} diff --git a/src/lib/database/migrations/1615269810077-V37_BirthdayIntegration.ts b/src/lib/database/migrations/1615269810077-V37_BirthdayIntegration.ts deleted file mode 100644 index f02eef8576b..00000000000 --- a/src/lib/database/migrations/1615269810077-V37_BirthdayIntegration.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V37BirthdayIntegration1615269810077 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumns('guilds', [ - new TableColumn({ name: 'birthday.channel', type: 'varchar', isNullable: true, length: '19' }), - new TableColumn({ name: 'birthday.message', type: 'varchar', isNullable: true, length: '200' }), - new TableColumn({ name: 'birthday.role', type: 'varchar', isNullable: true, length: '19' }) - ]); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'birthday.channel'); - await queryRunner.dropColumn('guilds', 'birthday.role'); - await queryRunner.dropColumn('guilds', 'birthday.message'); - } -} diff --git a/src/lib/database/migrations/1616108184492-V38_UpdateBirthdayIntegration.ts b/src/lib/database/migrations/1616108184492-V38_UpdateBirthdayIntegration.ts deleted file mode 100644 index 285f21b107c..00000000000 --- a/src/lib/database/migrations/1616108184492-V38_UpdateBirthdayIntegration.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V38UpdateBirthdayIntegration1616108184492 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const newEntries = this.transformOldToNew( - await queryRunner.query(/* sql */ `SELECT id, data FROM public.schedule WHERE task_id = 'birthday';`) - ); - - for (const entry of newEntries) { - await queryRunner.query(/* sql */ `UPDATE public.schedule SET data = $1::JSONB WHERE id = $2 AND task_id = 'birthday';`, [ - JSON.stringify(entry.data), - entry.id - ]); - } - } - - public async down(queryRunner: QueryRunner): Promise { - const oldEntries = this.transformNewToOld( - await queryRunner.query(/* sql */ `SELECT id, data FROM public.schedule WHERE task_id = 'birthday';`) - ); - - for (const entry of oldEntries) { - await queryRunner.query(/* sql */ `UPDATE public.schedule SET data = $1::JSONB WHERE id = $2 AND task_id = 'birthday';`, [ - JSON.stringify(entry.data), - entry.id - ]); - } - } - - private transformOldToNew(birthdaySchedules: BirthdayStorage[]): BirthdayStorage[] { - const newEntries: BirthdayStorage[] = []; - - for (const entry of birthdaySchedules) { - const dateOfEntry = new Date(entry.data.birthDate); - newEntries.push({ - id: entry.id, - data: { - guildID: entry.data.guildID, - userID: entry.data.userID, - day: dateOfEntry.getDate(), - month: dateOfEntry.getMonth(), - year: dateOfEntry.getFullYear() - } - }); - } - - return newEntries; - } - - private transformNewToOld(birthdaySchedules: BirthdayStorage[]): BirthdayStorage[] { - const newEntries: BirthdayStorage[] = []; - - for (const entry of birthdaySchedules) { - const month = (entry.data.month - 1).toString().padStart(2, '0'); - - newEntries.push({ - id: entry.id, - data: { - guildID: entry.data.guildID, - userID: entry.data.userID, - birthDate: `${entry.data.year}-${month}-${entry.data.day}T00:00:00.000Z` - } - }); - } - - return newEntries; - } -} - -interface BirthdayStorage { - id: string; - data: T; -} - -interface OldBirthdayData { - userID: string; - guildID: string; - birthDate: string; -} - -interface NewBirthdayData { - userID: string; - guildID: string; - year: number | null; - month: number; - day: number; -} diff --git a/src/lib/database/migrations/1616168146993-V39_RenamePropertiesToKebabCase.ts b/src/lib/database/migrations/1616168146993-V39_RenamePropertiesToKebabCase.ts deleted file mode 100644 index 80dbacb48cb..00000000000 --- a/src/lib/database/migrations/1616168146993-V39_RenamePropertiesToKebabCase.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V39RenamePropertiesToKebabCase1616168146993 implements MigrationInterface { - private readonly keys: readonly [previous: string, next: string][] = [ - ['disableNaturalPrefix', 'disable-natural-prefix'], - ['disabledCommands', 'disabled-commands'], - ['command-autodelete', 'command-auto-delete'], - ['disabledChannels', 'disabled-channels'], - ['disabledCommandsChannels', 'disabled-commands-channels'], - ['events.banAdd', 'events.ban-add'], - ['events.banRemove', 'events.ban-remove'], - ['events.memberAdd', 'events.member-add'], - ['events.memberRemove', 'events.member-remove'], - ['events.memberRoleUpdate', 'events.member-role-update'], - ['events.messageDelete', 'events.message-delete'], - ['events.messageEdit', 'events.message-edit'], - ['messages.ignoreChannels', 'messages.ignore-channels'], - ['stickyRoles', 'sticky-roles'], - ['roles.removeInitial', 'roles.remove-initial'], - ['roles.uniqueRoleSets', 'roles.unique-role-sets'], - ['selfmod.attachments.ignoredRoles', 'selfmod.attachments.ignored-roles'], - ['selfmod.attachments.ignoredChannels', 'selfmod.attachments.ignored-channels'], - ['selfmod.attachments.softAction', 'selfmod.attachments.soft-action'], - ['selfmod.attachments.hardAction', 'selfmod.attachments.hard-action'], - ['selfmod.attachments.hardActionDuration', 'selfmod.attachments.hard-action-duration'], - ['selfmod.attachments.thresholdMaximum', 'selfmod.attachments.threshold-maximum'], - ['selfmod.attachments.thresholdDuration', 'selfmod.attachments.threshold-duration'], - ['selfmod.capitals.ignoredRoles', 'selfmod.capitals.ignored-roles'], - ['selfmod.capitals.ignoredChannels', 'selfmod.capitals.ignored-channels'], - ['selfmod.capitals.softAction', 'selfmod.capitals.soft-action'], - ['selfmod.capitals.hardAction', 'selfmod.capitals.hard-action'], - ['selfmod.capitals.hardActionDuration', 'selfmod.capitals.hard-action-duration'], - ['selfmod.capitals.thresholdMaximum', 'selfmod.capitals.threshold-maximum'], - ['selfmod.capitals.thresholdDuration', 'selfmod.capitals.threshold-duration'], - ['selfmod.links.ignoredRoles', 'selfmod.links.ignored-roles'], - ['selfmod.links.ignoredChannels', 'selfmod.links.ignored-channels'], - ['selfmod.links.softAction', 'selfmod.links.soft-action'], - ['selfmod.links.hardAction', 'selfmod.links.hard-action'], - ['selfmod.links.hardActionDuration', 'selfmod.links.hard-action-duration'], - ['selfmod.links.thresholdMaximum', 'selfmod.links.threshold-maximum'], - ['selfmod.links.thresholdDuration', 'selfmod.links.threshold-duration'], - ['selfmod.messages.ignoredRoles', 'selfmod.messages.ignored-roles'], - ['selfmod.messages.ignoredChannels', 'selfmod.messages.ignored-channels'], - ['selfmod.messages.softAction', 'selfmod.messages.soft-action'], - ['selfmod.messages.hardAction', 'selfmod.messages.hard-action'], - ['selfmod.messages.hardActionDuration', 'selfmod.messages.hard-action-duration'], - ['selfmod.messages.thresholdMaximum', 'selfmod.messages.threshold-maximum'], - ['selfmod.messages.thresholdDuration', 'selfmod.messages.threshold-duration'], - ['selfmod.newlines.ignoredRoles', 'selfmod.newlines.ignored-roles'], - ['selfmod.newlines.ignoredChannels', 'selfmod.newlines.ignored-channels'], - ['selfmod.newlines.softAction', 'selfmod.newlines.soft-action'], - ['selfmod.newlines.hardAction', 'selfmod.newlines.hard-action'], - ['selfmod.newlines.hardActionDuration', 'selfmod.newlines.hard-action-duration'], - ['selfmod.newlines.thresholdMaximum', 'selfmod.newlines.threshold-maximum'], - ['selfmod.newlines.thresholdDuration', 'selfmod.newlines.threshold-duration'], - ['selfmod.invites.ignoredCodes', 'selfmod.invites.ignored-codes'], - ['selfmod.invites.ignoredGuilds', 'selfmod.invites.ignored-guilds'], - ['selfmod.invites.ignoredRoles', 'selfmod.invites.ignored-roles'], - ['selfmod.invites.ignoredChannels', 'selfmod.invites.ignored-channels'], - ['selfmod.invites.softAction', 'selfmod.invites.soft-action'], - ['selfmod.invites.hardAction', 'selfmod.invites.hard-action'], - ['selfmod.invites.hardActionDuration', 'selfmod.invites.hard-action-duration'], - ['selfmod.invites.thresholdMaximum', 'selfmod.invites.threshold-maximum'], - ['selfmod.invites.thresholdDuration', 'selfmod.invites.threshold-duration'], - ['selfmod.filter.ignoredRoles', 'selfmod.filter.ignored-roles'], - ['selfmod.filter.ignoredChannels', 'selfmod.filter.ignored-channels'], - ['selfmod.filter.softAction', 'selfmod.filter.soft-action'], - ['selfmod.filter.hardAction', 'selfmod.filter.hard-action'], - ['selfmod.filter.hardActionDuration', 'selfmod.filter.hard-action-duration'], - ['selfmod.filter.thresholdMaximum', 'selfmod.filter.threshold-maximum'], - ['selfmod.filter.thresholdDuration', 'selfmod.filter.threshold-duration'], - ['selfmod.reactions.ignoredRoles', 'selfmod.reactions.ignored-roles'], - ['selfmod.reactions.ignoredChannels', 'selfmod.reactions.ignored-channels'], - ['selfmod.reactions.softAction', 'selfmod.reactions.soft-action'], - ['selfmod.reactions.hardAction', 'selfmod.reactions.hard-action'], - ['selfmod.reactions.hardActionDuration', 'selfmod.reactions.hard-action-duration'], - ['selfmod.reactions.thresholdMaximum', 'selfmod.reactions.threshold-maximum'], - ['selfmod.reactions.thresholdDuration', 'selfmod.reactions.threshold-duration'], - ['selfmod.ignoreChannels', 'selfmod.ignored-channels'], - ['no-mention-spam.mentionsAllowed', 'no-mention-spam.mentions-allowed'], - ['no-mention-spam.timePeriod', 'no-mention-spam.time-period'], - ['social.achieveMessage', 'social.achieve-message'], - ['social.ignoreChannels', 'social.ignored-channels'], - ['starboard.ignoreChannels', 'starboard.ignored-channels'], - ['starboard.selfStar', 'starboard.self-star'] - ]; - - public async up(queryRunner: QueryRunner): Promise { - for (const [previous, next] of this.keys) { - await queryRunner.renameColumn('guilds', previous, next); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const [previous, next] of this.keys) { - await queryRunner.renameColumn('guilds', next, previous); - } - } -} diff --git a/src/lib/database/migrations/1616188199786-V40_AddSocialIgnoredRoles.ts b/src/lib/database/migrations/1616188199786-V40_AddSocialIgnoredRoles.ts deleted file mode 100644 index 6b236be13a9..00000000000 --- a/src/lib/database/migrations/1616188199786-V40_AddSocialIgnoredRoles.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V40AddSocialIgnoredRoles1616188199786 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'social.ignored-roles', - type: 'varchar', - isArray: true, - length: '19', - default: 'ARRAY[]::VARCHAR[]' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'social.ignored-roles'); - } -} diff --git a/src/lib/database/migrations/1616191193015-V41_AddMusicAllowedVoiceChannelsAndRoles.ts b/src/lib/database/migrations/1616191193015-V41_AddMusicAllowedVoiceChannelsAndRoles.ts deleted file mode 100644 index 46da91301fe..00000000000 --- a/src/lib/database/migrations/1616191193015-V41_AddMusicAllowedVoiceChannelsAndRoles.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V41AddMusicAllowedVoiceChannelsAndRoles1616191193015 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'music.allowed-voice-channels', - type: 'varchar', - isArray: true, - length: '19', - default: 'ARRAY[]::VARCHAR[]' - }) - ); - - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'music.allowed-roles', - type: 'varchar', - isArray: true, - length: '19', - default: 'ARRAY[]::VARCHAR[]' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'music.allowed-voice-channels'); - await queryRunner.dropColumn('guilds', 'music.allowed-roles'); - } -} diff --git a/src/lib/database/migrations/1616201639503-V42_AddAllowedRolesIntoGiveaways.ts b/src/lib/database/migrations/1616201639503-V42_AddAllowedRolesIntoGiveaways.ts deleted file mode 100644 index 04dc5cfe268..00000000000 --- a/src/lib/database/migrations/1616201639503-V42_AddAllowedRolesIntoGiveaways.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V42AddAllowedRolesIntoGiveaways1616201639503 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'giveaway', - new TableColumn({ - name: 'allowed_roles', - type: 'varchar', - isArray: true, - length: '19', - default: 'ARRAY[]::VARCHAR[]' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('giveaway', 'allowed_roles'); - } -} diff --git a/src/lib/database/migrations/1616786337398-V43_RemovedReferencesToUndesiredWords.ts b/src/lib/database/migrations/1616786337398-V43_RemovedReferencesToUndesiredWords.ts deleted file mode 100644 index f2abf9c961d..00000000000 --- a/src/lib/database/migrations/1616786337398-V43_RemovedReferencesToUndesiredWords.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V43RemovedReferencesToUndesiredWords1616786337398 implements MigrationInterface { - private readonly keys: readonly [previous: string, next: string][] = [ - ['selfmod.links.whitelist', 'selfmod.links.allowed'], - ['selfmod.reactions.whitelist', 'selfmod.reactions.allowed'], - ['selfmod.reactions.blacklist', 'selfmod.reactions.blocked'] - ]; - - public async up(queryRunner: QueryRunner): Promise { - for (const [previous, next] of this.keys) { - await queryRunner.renameColumn('guilds', previous, next); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const [previous, next] of this.keys) { - await queryRunner.renameColumn('guilds', next, previous); - } - } -} diff --git a/src/lib/database/migrations/1617272351741-V44_AddAutoDeleteIgnoreOptions.ts b/src/lib/database/migrations/1617272351741-V44_AddAutoDeleteIgnoreOptions.ts deleted file mode 100644 index bf62d10315b..00000000000 --- a/src/lib/database/migrations/1617272351741-V44_AddAutoDeleteIgnoreOptions.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V44AddAutoDeleteIgnoreOptions1617272351741 implements MigrationInterface { - private readonly names = [ - new TableColumn({ - name: 'messages.auto-delete.ignored-all', - type: 'boolean', - isNullable: false, - default: false - }), - new TableColumn({ - name: 'messages.auto-delete.ignored-roles', - type: 'varchar', - length: '19', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }), - new TableColumn({ - name: 'messages.auto-delete.ignored-channels', - type: 'varchar', - length: '19', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }), - new TableColumn({ - name: 'messages.auto-delete.ignored-commands', - type: 'varchar', - length: '32', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }) - ]; - - public async up(queryRunner: QueryRunner): Promise { - for (const column of this.names) { - await queryRunner.addColumn('guilds', column); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const { name } of this.names) { - await queryRunner.dropColumn('guilds', name); - } - } -} diff --git a/src/lib/database/migrations/1617297815771-V45_AddAliasesArrayToTags.ts b/src/lib/database/migrations/1617297815771-V45_AddAliasesArrayToTags.ts deleted file mode 100644 index e015ba6730c..00000000000 --- a/src/lib/database/migrations/1617297815771-V45_AddAliasesArrayToTags.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V45AddAliasesArrayToTags1617297815771 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const entries = await this.getData(queryRunner); - for (const entry of entries) { - for (const cc of entry['custom-commands']) { - Reflect.set(cc, 'aliases', []); - } - - await this.setData(queryRunner, entry); - } - } - - public async down(queryRunner: QueryRunner): Promise { - const entries = await this.getData(queryRunner); - for (const entry of entries) { - for (const cc of entry['custom-commands']) { - Reflect.deleteProperty(cc, 'aliases'); - } - - await this.setData(queryRunner, entry); - } - } - - private getData(queryRunner: QueryRunner): Promise { - return queryRunner.query(/* sql */ `SELECT id, "custom-commands" FROM public.guilds WHERE JSONB_ARRAY_LENGTH("custom-commands") > 0;`); - } - - private setData(queryRunner: QueryRunner, entry: T) { - const cc = JSON.stringify(entry['custom-commands']).replaceAll("'", "''"); - return queryRunner.query(/* sql */ ` - UPDATE public.guilds - SET "custom-commands" = '${cc}'::JSONB - WHERE id = '${entry.id}';`); - } -} - -interface OldData { - id: string; - 'custom-commands': { - id: string; - embed: boolean; - color: number; - content: string; - }[]; -} - -interface NewData { - id: string; - 'custom-commands': { - id: string; - embed: boolean; - color: number; - aliases: string[]; - content: string; - }[]; -} diff --git a/src/lib/database/migrations/1617314282232-V46_AddStarboardMaximumAge.ts b/src/lib/database/migrations/1617314282232-V46_AddStarboardMaximumAge.ts deleted file mode 100644 index 1e915ef5e2f..00000000000 --- a/src/lib/database/migrations/1617314282232-V46_AddStarboardMaximumAge.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V46AddStarboardMaximumAge1617314282232 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.maximum-age', type: 'bigint', isNullable: true })); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'starboard.maximum-age'); - } -} diff --git a/src/lib/database/migrations/1617645345960-V47_AddNewLogsChannels.ts b/src/lib/database/migrations/1617645345960-V47_AddNewLogsChannels.ts deleted file mode 100644 index 9ea17e75ee2..00000000000 --- a/src/lib/database/migrations/1617645345960-V47_AddNewLogsChannels.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V47AddNewLogsChannels1617645345960 implements MigrationInterface { - private readonly names: readonly string[] = [ - 'channels.logs.role-create', - 'channels.logs.role-update', - 'channels.logs.role-delete', - 'channels.logs.channel-create', - 'channels.logs.channel-update', - 'channels.logs.channel-delete', - 'channels.logs.emoji-create', - 'channels.logs.emoji-update', - 'channels.logs.emoji-delete', - 'channels.logs.server-update' - ]; - - private readonly replaces: readonly [string, string][] = [ - ['channels.member-logs', 'channels.logs.member'], - ['channels.message-logs', 'channels.logs.message'], - ['channels.moderation-logs', 'channels.logs.moderation'], - ['channels.nsfw-message-logs', 'channels.logs.nsfw-message'], - ['channels.image-logs', 'channels.logs.image'], - ['channels.prune-logs', 'channels.logs.prune'], - ['channels.reaction-logs', 'channels.logs.reaction'] - ]; - - public async up(queryRunner: QueryRunner): Promise { - for (const name of this.names) { - const column = new TableColumn({ name, type: 'varchar', length: '19', isNullable: true }); - await queryRunner.addColumn('guilds', column); - } - - for (const [previous, next] of this.replaces) { - await queryRunner.renameColumn('guilds', previous, next); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const name of this.names) { - await queryRunner.dropColumn('guilds', name); - } - - for (const [next, previous] of this.replaces) { - await queryRunner.renameColumn('guilds', previous, next); - } - } -} diff --git a/src/lib/database/migrations/1617890802896-V48_AddSeparateInitialRoles.ts b/src/lib/database/migrations/1617890802896-V48_AddSeparateInitialRoles.ts deleted file mode 100644 index d66288a9384..00000000000 --- a/src/lib/database/migrations/1617890802896-V48_AddSeparateInitialRoles.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V48AddSeparateInitialRoles1617890802896 implements MigrationInterface { - private readonly keys = ['roles.initial-humans', 'roles.initial-bots']; - public async up(queryRunner: QueryRunner): Promise { - for (const key of this.keys) { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: key, - type: 'varchar', - length: '19', - isNullable: true - }) - ); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const key of this.keys) { - await queryRunner.dropColumn('guilds', key); - } - } -} diff --git a/src/lib/database/migrations/1618562933625-V49_StripConfusablesFromWordFilter.ts b/src/lib/database/migrations/1618562933625-V49_StripConfusablesFromWordFilter.ts deleted file mode 100644 index 3058cc12123..00000000000 --- a/src/lib/database/migrations/1618562933625-V49_StripConfusablesFromWordFilter.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { remove as removeConfusables } from 'confusables'; -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V49StripConfusablesFromWordFilter1618562933625 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const entries = (await queryRunner.query( - /* sql */ `SELECT "id", "selfmod.filter.raw" FROM public.guilds WHERE array_length("selfmod.filter.raw", 1) <> 0;` - )) as Entry[]; - - for (const entry of entries) { - await queryRunner.query(/* sql */ `UPDATE public.guilds SET "selfmod.filter.raw" = $2::VARCHAR[] WHERE id = $1;`, [ - entry.id, - this.transform(entry) - ]); - } - } - - public async down(): Promise { - // No-op - } - - private transform(entry: Entry) { - const transformed = new Set(); - for (const word of entry['selfmod.filter.raw']) { - transformed.add(removeConfusables(word.toLowerCase())); - } - - return [...transformed]; - } -} - -interface Entry { - id: string; - 'selfmod.filter.raw': string[]; -} diff --git a/src/lib/database/migrations/1618951687674-V50_RemoveDatabaseChecks.ts b/src/lib/database/migrations/1618951687674-V50_RemoveDatabaseChecks.ts deleted file mode 100644 index ef5b915ebb8..00000000000 --- a/src/lib/database/migrations/1618951687674-V50_RemoveDatabaseChecks.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableCheck } from 'typeorm'; - -export class V50RemoveDatabaseChecks1618951687674 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await this.dropChecks(queryRunner, 'banner'); - await this.dropChecks(queryRunner, 'giveaway'); - await this.dropChecks(queryRunner, 'guilds'); - await this.dropChecks(queryRunner, 'member'); - await this.dropChecks(queryRunner, 'starboard'); - await this.dropChecks(queryRunner, 'user'); - await this.dropChecks(queryRunner, 'user_profile'); - } - - public async down(queryRunner: QueryRunner): Promise { - // Banner - await queryRunner.createCheckConstraint('banner', new TableCheck({ expression: /* sql */ `"group"::text <> ''::text` })); - await queryRunner.createCheckConstraint('banner', new TableCheck({ expression: /* sql */ `"title"::text <> ''::text` })); - await queryRunner.createCheckConstraint('banner', new TableCheck({ expression: /* sql */ `"price" >= 0` })); - - // Giveaway - await queryRunner.createCheckConstraint('giveaway', new TableCheck({ expression: /* sql */ `"minimum" <> 0` })); - await queryRunner.createCheckConstraint('giveaway', new TableCheck({ expression: /* sql */ `"minimum_winners" <> 0` })); - - // Guilds - await queryRunner.createCheckConstraint( - 'guilds', - new TableCheck({ expression: /* sql */ `("duration" >= 0) AND ("duration" <= 157680000000)` }) - ); - await queryRunner.createCheckConstraint('guilds', new TableCheck({ expression: /* sql */ `"reason"::text <> ''::text` })); - await queryRunner.createCheckConstraint('guilds', new TableCheck({ expression: /* sql */ `"type" >= 0` })); - - // Member - await queryRunner.createCheckConstraint('member', new TableCheck({ expression: /* sql */ `"points" >= 0` })); - - // Starboard - await queryRunner.createCheckConstraint('starboard', new TableCheck({ expression: /* sql */ `"stars" >= 0` })); - - // User - await queryRunner.createCheckConstraint('user', new TableCheck({ expression: /* sql */ `"money" >= 0` })); - await queryRunner.createCheckConstraint('user', new TableCheck({ expression: /* sql */ `"points" >= 0` })); - await queryRunner.createCheckConstraint('user', new TableCheck({ expression: /* sql */ `"reputations" >= 0` })); - - // User Profile - await queryRunner.createCheckConstraint('user_profile', new TableCheck({ expression: /* sql */ `(color >= 0) AND (color <= 16777215)` })); - } - - private async dropChecks(queryRunner: QueryRunner, name: string) { - const table = (await queryRunner.getTable(name)) as Table; - await queryRunner.dropCheckConstraints(table, table.checks); - } -} diff --git a/src/lib/database/migrations/1619089555427-V51_NewSocialFeaturesAndValueRename.ts b/src/lib/database/migrations/1619089555427-V51_NewSocialFeaturesAndValueRename.ts deleted file mode 100644 index a10c5b4bc66..00000000000 --- a/src/lib/database/migrations/1619089555427-V51_NewSocialFeaturesAndValueRename.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V51NewSocialFeaturesAndValueRename1619089555427 implements MigrationInterface { - private oldRegExp = /%ROLE%|%MEMBER%|%MEMBERNAME%|%GUILD%|%POINTS%/g; - private newRegExp = /{(?:role\.name|member(?:\.username)?|server|points)}/g; - - private defaultNewMessage = 'Congratulations dear {member}, you achieved the role {role.name}'; - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve-role', type: 'varchar', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve-level', type: 'varchar', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve-channel', type: 'varchar', isNullable: true, length: '19' })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve-multiple', type: 'smallint', default: 1 })); - - const entries = (await queryRunner.query( - /* sql */ `SELECT "id", "social.achieve", "social.achieve-message" FROM public.guilds WHERE "social.achieve" OR char_length("social.achieve-message") > 1;` - )) as OldEntry[]; - - for (const entry of entries) { - const achieve = entry['social.achieve']; - if (!achieve) continue; - - const message = entry['social.achieve-message']; - await queryRunner.query(/* sql */ `UPDATE public.guilds SET "social.achieve-role" = $2 WHERE id = $1;`, [ - entry.id, - message ? this.transformToNew(message) : this.defaultNewMessage - ]); - } - - await queryRunner.dropColumn('guilds', 'social.achieve'); - await queryRunner.dropColumn('guilds', 'social.achieve-message'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve', type: 'boolean', default: false })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'social.achieve-message', type: 'varchar', isNullable: true, length: '2000' })); - - const entries = (await queryRunner.query( - /* sql */ `SELECT "id", "social.achieve-role" FROM public.guilds WHERE char_length("social.achieve-role") > 1;` - )) as NewEntry[]; - - for (const entry of entries) { - const message = entry['social.achieve-role']; - if (!message) continue; - - if (message === this.defaultNewMessage) { - await queryRunner.query(/* sql */ `UPDATE public.guilds SET "social.achieve" = $2 WHERE id = $1;`, [entry.id, true]); - } else { - await queryRunner.query( - /* sql */ `UPDATE public.guilds SET "social.achieve" = $2, "social.achieve-message" = $3, $2 WHERE id = $1;`, - [entry.id, true, this.transformToOld(message)] - ); - } - } - - await queryRunner.dropColumn('guilds', 'social.achieve-role'); - await queryRunner.dropColumn('guilds', 'social.achieve-level'); - await queryRunner.dropColumn('guilds', 'social.achieve-channel'); - await queryRunner.dropColumn('guilds', 'social.achieve-multiple'); - } - - private transformToNew(content: string): string { - return content.replace(this.oldRegExp, (match) => { - switch (match) { - case '%ROLE%': - return '{role.name}'; - case '%MEMBER%': - return '{member}'; - case '%MEMBERNAME%': - return '{member.username}'; - case '%GUILD%': - return '{server}'; - case '%POINTS%': - return '{points}'; - default: - return match; - } - }); - } - - private transformToOld(content: string): string { - return content.replace(this.newRegExp, (match) => { - switch (match) { - case '{role.name}': - return '%ROLE%'; - case '{member}': - return '%MEMBER%'; - case '{member.username}': - return '%MEMBERNAME%'; - case '{server}': - return '%GUILD%'; - case '{points}': - return '%POINTS%'; - default: - return match; - } - }); - } -} - -interface OldEntry { - id: string; - 'social.achieve': boolean; - 'social.achieve-message': string | null; -} - -interface NewEntry { - id: string; - 'social.achieve-role': string | null; -} diff --git a/src/lib/database/migrations/1619969827210-V52_JoinAndLeaveMessageAutoDelete.ts b/src/lib/database/migrations/1619969827210-V52_JoinAndLeaveMessageAutoDelete.ts deleted file mode 100644 index e201b176ba7..00000000000 --- a/src/lib/database/migrations/1619969827210-V52_JoinAndLeaveMessageAutoDelete.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V52JoinAndLeaveMessageAutoDelete1619969827210 implements MigrationInterface { - private readonly keys = ['messages.farewell-auto-delete', 'messages.greeting-auto-delete']; - public async up(queryRunner: QueryRunner): Promise { - for (const key of this.keys) { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: key, - type: 'bigint', - isNullable: true - }) - ); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const key of this.keys) { - await queryRunner.dropColumn('guilds', key); - } - } -} diff --git a/src/lib/database/migrations/1620050724729-V53_AfkSettings.ts b/src/lib/database/migrations/1620050724729-V53_AfkSettings.ts deleted file mode 100644 index 03bf0fc3122..00000000000 --- a/src/lib/database/migrations/1620050724729-V53_AfkSettings.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V53AfkSettings1620050724729 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.role', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.prefix', type: 'varchar', length: '32', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.prefix-force', type: 'boolean', default: false })); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'afk.role'); - await queryRunner.dropColumn('guilds', 'afk.prefix'); - await queryRunner.dropColumn('guilds', 'afk.prefix-force'); - } -} diff --git a/src/lib/database/migrations/1626169505546-V54_EventsModernization.ts b/src/lib/database/migrations/1626169505546-V54_EventsModernization.ts deleted file mode 100644 index 23213077767..00000000000 --- a/src/lib/database/migrations/1626169505546-V54_EventsModernization.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { isNullish, Nullish } from '@sapphire/utilities'; -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V54EventsModernization1626169505546 implements MigrationInterface { - private readonly oldChannelKeys = ['channels.logs.member', 'channels.logs.message', 'channels.logs.nsfw-message'] as const; - private readonly oldEventKeys = [ - 'events.member-add', - 'events.member-remove', - 'events.member-nickname-update', - 'events.member-username-update', - 'events.member-role-update', - 'events.message-delete', - 'events.message-edit' - ] as const; - - private readonly oldKeys = [...this.oldChannelKeys, ...this.oldEventKeys] as const; - - private readonly newKeys = [ - 'channels.logs.member-add', - 'channels.logs.member-remove', - 'channels.logs.member-nickname-update', - 'channels.logs.member-username-update', - 'channels.logs.member-roles-update', - 'channels.logs.message-delete', - 'channels.logs.message-delete-nsfw', - 'channels.logs.message-update', - 'channels.logs.message-update-nsfw' - ] as const; - - public async up(queryRunner: QueryRunner): Promise { - for (const key of this.newKeys) { - await queryRunner.addColumn('guilds', new TableColumn({ name: key, type: 'varchar', length: '19', isNullable: true })); - } - - const entries = (await queryRunner.query(/* sql */ ` - SELECT - "id", - "channels.logs.member", - "channels.logs.message", - "channels.logs.nsfw-message", - "events.member-add", - "events.member-remove", - "events.member-nickname-update", - "events.member-username-update", - "events.member-role-update", - "events.message-delete", - "events.message-edit" - FROM public.guilds - WHERE - "channels.logs.member" IS NOT NULL OR - "channels.logs.message" IS NOT NULL OR - "channels.logs.nsfw-message" IS NOT NULL;`)) as OldEntry[]; - - for (const entry of entries) { - const newEntry = this.updateToNew(entry); - const values = [ - entry.id, - newEntry['channels.logs.member-add'], - newEntry['channels.logs.member-remove'], - newEntry['channels.logs.member-nickname-update'], - newEntry['channels.logs.member-username-update'], - newEntry['channels.logs.member-roles-update'], - newEntry['channels.logs.message-delete'], - newEntry['channels.logs.message-delete-nsfw'], - newEntry['channels.logs.message-update'], - newEntry['channels.logs.message-update-nsfw'] - ]; - - await queryRunner.query( - /* sql */ ` - UPDATE public.guilds - SET - "channels.logs.member-add" = $2, - "channels.logs.member-remove" = $3, - "channels.logs.member-nickname-update" = $4, - "channels.logs.member-username-update" = $5, - "channels.logs.member-roles-update" = $6, - "channels.logs.message-delete" = $7, - "channels.logs.message-delete-nsfw" = $8, - "channels.logs.message-update" = $9, - "channels.logs.message-update-nsfw" = $10 - WHERE id = $1;`, - values - ); - } - - for (const key of this.oldKeys) { - await queryRunner.dropColumn('guilds', key); - } - } - - public async down(queryRunner: QueryRunner): Promise { - for (const key of this.oldChannelKeys) { - await queryRunner.addColumn('guilds', new TableColumn({ name: key, type: 'varchar', length: '19', isNullable: true })); - } - - for (const key of this.oldEventKeys) { - await queryRunner.addColumn('guilds', new TableColumn({ name: key, type: 'boolean', default: 'false' })); - } - - const entries = (await queryRunner.query(/* sql */ ` - SELECT - "id", - "channels.logs.member-add", - "channels.logs.member-remove", - "channels.logs.member-nickname-update", - "channels.logs.member-username-update", - "channels.logs.member-roles-update", - "channels.logs.message-delete", - "channels.logs.message-delete-nsfw", - "channels.logs.message-update", - "channels.logs.message-update-nsfw" - FROM public.guilds - WHERE - "channels.logs.member-add" IS NOT NULL OR - "channels.logs.member-remove" IS NOT NULL OR - "channels.logs.member-nickname-update" IS NOT NULL OR - "channels.logs.member-username-update" IS NOT NULL OR - "channels.logs.member-roles-update" IS NOT NULL OR - "channels.logs.message-delete" IS NOT NULL OR - "channels.logs.message-delete-nsfw" IS NOT NULL OR - "channels.logs.message-update" IS NOT NULL OR - "channels.logs.message-update-nsfw" IS NOT NULL;`)) as NewEntry[]; - - for (const entry of entries) { - const oldEntry = this.updateToOld(entry); - const values = [ - entry.id, - oldEntry['channels.logs.member'], - oldEntry['channels.logs.message'], - oldEntry['channels.logs.nsfw-message'], - oldEntry['events.member-add'], - oldEntry['events.member-remove'], - oldEntry['events.member-nickname-update'], - oldEntry['events.member-username-update'], - oldEntry['events.member-role-update'], - oldEntry['events.message-delete'], - oldEntry['events.message-edit'] - ]; - - await queryRunner.query( - /* sql */ ` - UPDATE public.guilds - SET - "channels.logs.member" = $2, - "channels.logs.message" = $3, - "channels.logs.nsfw-message" = $4, - "events.member-add" = $5, - "events.member-remove" = $6, - "events.member-nickname-update" = $7, - "events.member-username-update" = $8, - "events.member-role-update" = $9, - "events.message-delete" = $10, - "events.message-edit" = $11 - WHERE id = $1;`, - values - ); - } - - for (const key of this.newKeys) { - await queryRunner.dropColumn('guilds', key); - } - } - - private updateToNew(entry: OldEntry): NewEntry { - return { - id: entry.id, - 'channels.logs.member-add': entry['events.member-add'] ? entry['channels.logs.member'] : null, - 'channels.logs.member-remove': entry['events.member-remove'] ? entry['channels.logs.member'] : null, - 'channels.logs.member-nickname-update': entry['events.member-nickname-update'] ? entry['channels.logs.member'] : null, - 'channels.logs.member-username-update': entry['events.member-username-update'] ? entry['channels.logs.member'] : null, - 'channels.logs.member-roles-update': entry['events.member-role-update'] ? entry['channels.logs.member'] : null, - 'channels.logs.message-delete': entry['events.message-delete'] ? entry['channels.logs.message'] : null, - 'channels.logs.message-delete-nsfw': entry['events.message-delete'] ? entry['channels.logs.nsfw-message'] : null, - 'channels.logs.message-update': entry['events.message-edit'] ? entry['channels.logs.message'] : null, - 'channels.logs.message-update-nsfw': entry['events.message-edit'] ? entry['channels.logs.nsfw-message'] : null - }; - } - - private updateToOld(entry: NewEntry): OldEntry { - return { - id: entry.id, - 'channels.logs.member': - entry['channels.logs.member-add'] ?? - entry['channels.logs.member-remove'] ?? - entry['channels.logs.member-roles-update'] ?? - entry['channels.logs.member-nickname-update'] ?? - entry['channels.logs.member-username-update'], - 'channels.logs.message': entry['channels.logs.message-update'] ?? entry['channels.logs.message-delete'], - 'channels.logs.nsfw-message': entry['channels.logs.message-update-nsfw'] ?? entry['channels.logs.message-delete-nsfw'], - 'events.member-add': !isNullish(entry['channels.logs.member-add']), - 'events.member-remove': !isNullish(entry['channels.logs.member-remove']), - 'events.member-nickname-update': !isNullish(entry['channels.logs.member-nickname-update']), - 'events.member-username-update': !isNullish(entry['channels.logs.member-username-update']), - 'events.member-role-update': !isNullish(entry['channels.logs.member-roles-update']), - 'events.message-delete': !isNullish(entry['channels.logs.message-delete'] ?? entry['channels.logs.message-delete-nsfw']), - 'events.message-edit': !isNullish(entry['channels.logs.message-update'] ?? entry['channels.logs.message-update-nsfw']) - }; - } -} - -interface OldEntry { - id: string; - 'channels.logs.member': string | Nullish; - 'channels.logs.message': string | Nullish; - 'channels.logs.nsfw-message': string | Nullish; - 'events.member-add': boolean; - 'events.member-remove': boolean; - 'events.member-nickname-update': boolean; - 'events.member-username-update': boolean; - 'events.member-role-update': boolean; - 'events.message-delete': boolean; - 'events.message-edit': boolean; -} - -interface NewEntry { - id: string; - 'channels.logs.member-add': string | Nullish; - 'channels.logs.member-remove': string | Nullish; - 'channels.logs.member-nickname-update': string | Nullish; - 'channels.logs.member-username-update': string | Nullish; - 'channels.logs.member-roles-update': string | Nullish; - 'channels.logs.message-delete': string | Nullish; - 'channels.logs.message-delete-nsfw': string | Nullish; - 'channels.logs.message-update': string | Nullish; - 'channels.logs.message-update-nsfw': string | Nullish; -} diff --git a/src/lib/database/migrations/1627318321333-V55_MediaOnlyChannels.ts b/src/lib/database/migrations/1627318321333-V55_MediaOnlyChannels.ts deleted file mode 100644 index 242d31d3fac..00000000000 --- a/src/lib/database/migrations/1627318321333-V55_MediaOnlyChannels.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V55MediaOnlyChannels1627318321333 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ - name: 'channels.media-only', - type: 'varchar', - length: '19', - isNullable: false, - isArray: true, - default: 'ARRAY[]::VARCHAR[]' - }) - ); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'channels.media-only'); - } -} diff --git a/src/lib/database/migrations/1629315603851-V56_MigrateTwitchToEventSub.ts b/src/lib/database/migrations/1629315603851-V56_MigrateTwitchToEventSub.ts deleted file mode 100644 index 32db37e0711..00000000000 --- a/src/lib/database/migrations/1629315603851-V56_MigrateTwitchToEventSub.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { TwitchEventSubTypes } from '#lib/types/definitions/Twitch'; -import { Twitch } from '#lib/util/Notifications/Twitch'; -import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey, TableUnique } from 'typeorm'; - -export class V56MigrateTwitchToEventSub1629315603851 implements MigrationInterface { - private twitch = new Twitch(); - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query( - /* sql */ `CREATE TYPE "public"."twitch_subscriptions_subscription_type_enum" AS ENUM('stream.online', 'stream.offline');` - ); - - await queryRunner.createTable( - new Table({ - name: 'twitch_subscriptions', - uniques: [ - new TableUnique({ - name: 'streamer_id_subscription_type_uniq', - columnNames: ['streamer_id', 'subscription_type'] - }) - ], - columns: [ - new TableColumn({ - name: 'id', - type: 'int', - isPrimary: true, - isNullable: false, - isGenerated: true, - generationStrategy: 'increment' - }), - new TableColumn({ - name: 'streamer_id', - type: 'varchar', - length: '10', - isNullable: false - }), - new TableColumn({ - name: 'subscription_id', - type: 'varchar', - length: '36', - isNullable: false - }), - new TableColumn({ - name: 'subscription_type', - type: 'twitch_subscriptions_subscription_type_enum', - isNullable: false - }) - ] - }), - true, - true - ); - - await queryRunner.createTable( - new Table({ - name: 'guild_subscription', - foreignKeys: [ - new TableForeignKey({ - name: 'twitch_subscriptions_id_subscription_id_fkey', - columnNames: ['subscription_id'], - referencedColumnNames: ['id'], - referencedTableName: 'twitch_subscriptions', - onDelete: 'NO ACTION', - onUpdate: 'NO ACTION' - }) - ], - columns: [ - new TableColumn({ - name: 'guild_id', - type: 'varchar', - length: '19', - isNullable: false, - isPrimary: true - }), - new TableColumn({ - name: 'channel_id', - type: 'varchar', - length: '19', - isNullable: false, - isPrimary: true - }), - new TableColumn({ - name: 'message', - type: 'varchar', - length: '50', - isNullable: true - }), - new TableColumn({ - name: 'subscription_id', - type: 'integer', - isNullable: false, - isPrimary: true - }) - ] - }), - true, - true - ); - - const oldTwitchSubscriptions = (await queryRunner.query( - /* sql */ `SELECT * FROM public."twitch_stream_subscription";` - )) as TwitchSubscriptionsOld[]; - - const oldGuildData = (await queryRunner.query(/* sql */ ` - SELECT id, "notifications.streams.twitch.streamers" AS notificationData - FROM public."guilds" - WHERE jsonb_array_length("notifications.streams.twitch.streamers") > 0; - `)) as GuildColumnsOld[]; - - const transformedDataForTwitchSubscriptions = await this.mapOldTwitchDataToNewTwitchSubscriptions(oldTwitchSubscriptions); - const transformedDataForGuildSubscriptions = this.mapOldGuildDataToNewGuildData(oldGuildData, transformedDataForTwitchSubscriptions); - - const stringifiedTwitchData = JSON.stringify([...transformedDataForTwitchSubscriptions.values()]).replace(/'/g, "''"); - const stringifiedGuildData = JSON.stringify(transformedDataForGuildSubscriptions).replace(/'/g, "''"); - - await queryRunner.query(/* sql */ ` - INSERT INTO public."twitch_subscriptions" - SELECT * FROM json_populate_recordset(NULL::public."twitch_subscriptions", '${stringifiedTwitchData}') - ON CONFLICT DO NOTHING; - `); - - await queryRunner.query(/* sql */ ` - INSERT INTO public."guild_subscription" - SELECT * FROM json_populate_recordset(NULL::public."guild_subscription", '${stringifiedGuildData}') - ON CONFLICT DO NOTHING; - `); - - await queryRunner.dropColumn('guilds', 'notifications.streams.twitch.streamers'); - await queryRunner.dropTable('twitch_stream_subscription'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('guild_subscription'); - await queryRunner.dropTable('twitch_subscriptions'); - await queryRunner.query(/* sql */ `drop type twitch_subscriptions_subscription_type_enum;`); - } - - private async mapOldTwitchDataToNewTwitchSubscriptions(oldData: TwitchSubscriptionsOld[]): Promise> { - const allStreamerIds = [...new Set(oldData.map((entry) => entry.id))]; - const streamerIdSubscriptionIdMap = new Map(); - - let id = 1; - - for (const streamer of allStreamerIds) { - const subscriptionId = await this.twitch.subscriptionsStreamHandle(streamer, TwitchEventSubTypes.StreamOnline); - streamerIdSubscriptionIdMap.set(streamer, { - id, - streamer_id: streamer, - subscription_id: subscriptionId, - subscription_type: TwitchEventSubTypes.StreamOnline - }); - - id++; - } - - return streamerIdSubscriptionIdMap; - } - - private mapOldGuildDataToNewGuildData( - oldData: GuildColumnsOld[], - transformedDataForTwitchSubscriptions: Map - ): GuildSubscriptions[] { - const newSubscriptions: GuildSubscriptions[] = []; - - for (const guild of oldData) { - for (const notificationEntry of guild.notificationdata) { - const [streamerId, subscriptions] = notificationEntry; - - for (const subscription of subscriptions) { - const transformedData = transformedDataForTwitchSubscriptions.get(streamerId); - if (!transformedData) { - continue; - } - - const newObject: GuildSubscriptions = { - guild_id: guild.id, - channel_id: subscription.channel, - message: subscription.message || null, - subscription_id: transformedData.id - }; - - newSubscriptions.push(newObject); - } - } - } - - return newSubscriptions; - } -} - -// #region Types - -interface TwitchSubscriptionsNew { - id: number; - streamer_id: string; - subscription_id: string; - subscription_type: TwitchEventSubTypes; -} - -interface TwitchSubscriptionsOld { - id: string; - is_streaming: boolean; - expires_at: Date; - guild_ids: string[]; -} - -interface GuildSubscriptions { - guild_id: string; - channel_id: string; - message: string | null; - subscription_id: number; -} - -interface GuildColumnsOld { - id: string; - notificationdata: NotificationsStreamTwitch[]; -} - -const enum NotificationsStreamsTwitchEventStatus { - Online, - Offline -} - -interface NotificationsStreamsTwitchStreamer { - channel: string; - author: string; - message: string | null; - status: NotificationsStreamsTwitchEventStatus; - gamesBlacklist: readonly string[]; - gamesWhitelist: readonly string[]; - createdAt: number; -} - -type NotificationsStreamTwitch = [streamerId: string, data: readonly NotificationsStreamsTwitchStreamer[]]; - -// #endregion diff --git a/src/lib/database/migrations/1633184279614-V57_MigrateReactionRolesAndTriggers.ts b/src/lib/database/migrations/1633184279614-V57_MigrateReactionRolesAndTriggers.ts deleted file mode 100644 index ddca279b310..00000000000 --- a/src/lib/database/migrations/1633184279614-V57_MigrateReactionRolesAndTriggers.ts +++ /dev/null @@ -1,158 +0,0 @@ -import type { SerializedEmoji } from '#utils/functions'; -import { TwemojiRegex } from '@sapphire/discord-utilities'; -import type { MigrationInterface, QueryRunner } from 'typeorm'; -import type { ReactionRole } from '../entities/GuildEntity'; - -export class V57MigrateReactionRolesAndTriggers1633184279614 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const oldGuilds = (await queryRunner.query(/* sql */ ` - SELECT id, - "reaction-roles" AS "reactionRoles", - "trigger.includes" AS "triggerIncludes" - FROM public."guilds" - WHERE jsonb_array_length("reaction-roles") >= 1 - OR jsonb_array_length("trigger.includes") >= 1 - ;`)) as GuildData[]; - - const newGuilds = this.upMapReactions(oldGuilds); - - for (const guild of newGuilds) { - await queryRunner.query( - /* sql */ ` - UPDATE public."guilds" - SET "reaction-roles" = $1::jsonb, - "trigger.includes" = $2::jsonb - WHERE id = '${guild.id}'; - `, - [JSON.stringify(guild.reactionRoles), JSON.stringify(guild.triggerIncludes)] - ); - } - } - - public async down(queryRunner: QueryRunner): Promise { - const oldGuilds = (await queryRunner.query(/* sql */ ` - SELECT id, - "reaction-roles" AS "reactionRoles", - "trigger.includes" AS "triggerIncludes" - FROM public."guilds" - WHERE jsonb_array_length("reaction-roles") >= 1 - OR jsonb_array_length("trigger.includes") >= 1 - ;`)) as GuildData[]; - - const newGuilds = this.downMapReactions(oldGuilds); - - for (const guild of newGuilds) { - await queryRunner.query( - /* sql */ ` - UPDATE public."guilds" - SET "reaction-roles" = $1::jsonb, - "trigger.includes" = $2::jsonb - WHERE id = '${guild.id}'; - `, - [JSON.stringify(guild.reactionRoles), JSON.stringify(guild.triggerIncludes)] - ); - } - } - - private upMapReactions(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - for (const [rrIndex, reaction] of guild.reactionRoles.entries()) { - if (!reaction.emoji) { - guild.reactionRoles.splice(rrIndex, 1); - continue; - } - - if (reaction.emoji.includes('%')) { - continue; - } - - const parts = reaction.emoji.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - reaction.emoji = `${emojiAnimated}${emojiId}` as SerializedEmoji; - } - - for (const [tiIndex, trigger] of guild.triggerIncludes.entries()) { - if (trigger.action !== 'react') { - continue; - } - - if (!trigger.output) { - guild.triggerIncludes.splice(tiIndex, 1); - continue; - } - - if (trigger.output.includes('%')) { - continue; - } - - if (TwemojiRegex.test(trigger.output)) { - trigger.output = encodeURIComponent(trigger.output) as SerializedEmoji; - } else { - const parts = trigger.output.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - trigger.output = `${emojiAnimated}${emojiId}` as SerializedEmoji; - } - } - } - - return guilds; - } - - private downMapReactions(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - for (const [rrIndex, reaction] of guild.reactionRoles.entries()) { - if (!reaction.emoji) { - guild.reactionRoles.splice(rrIndex, 1); - continue; - } - - if (reaction.emoji.includes('%')) { - continue; - } - - const emojiId = reaction.emoji.slice(1); - const emojiAnimated = reaction.emoji.at(0) === 'a'; - - reaction.emoji = `${emojiAnimated ? 'a' : ''}:_:${emojiId}` as SerializedEmoji; - } - - for (const [tiIndex, trigger] of guild.triggerIncludes.entries()) { - if (trigger.action !== 'react') { - continue; - } - - if (!trigger.output) { - guild.triggerIncludes.splice(tiIndex, 1); - continue; - } - - if (trigger.output.includes('%')) { - continue; - } - - const emojiId = trigger.output.slice(1); - const emojiAnimated = trigger.output.at(0) === 'a'; - - trigger.output = `${emojiAnimated ? 'a' : ''}:_:${emojiId}` as SerializedEmoji; - } - } - - return guilds; - } -} - -interface GuildData { - id: string; - reactionRoles: ReactionRole[]; - triggerIncludes: TriggerIncludes[]; -} - -interface TriggerIncludes { - action: 'react'; - input: string; - output: SerializedEmoji; -} diff --git a/src/lib/database/migrations/1633201003755-V58_GiveawayAuthor.ts b/src/lib/database/migrations/1633201003755-V58_GiveawayAuthor.ts deleted file mode 100644 index fa73f673573..00000000000 --- a/src/lib/database/migrations/1633201003755-V58_GiveawayAuthor.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V58GiveawayAuthor1633201003755 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('giveaway', new TableColumn({ name: 'author_id', type: 'varchar', length: '19', isNullable: true })); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('giveaway', 'author_id'); - } -} diff --git a/src/lib/database/migrations/1633266112042-V59_MigrateSelfmodEmojis.ts b/src/lib/database/migrations/1633266112042-V59_MigrateSelfmodEmojis.ts deleted file mode 100644 index a9d9f54aef5..00000000000 --- a/src/lib/database/migrations/1633266112042-V59_MigrateSelfmodEmojis.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V59MigrateSelfmodEmojis1633266112042 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - const oldBlockedReactionsGuilds = (await queryRunner.query( - /* sql */ `SELECT id, "selfmod.reactions.blocked" as "roles" FROM public."guilds" WHERE array_length("selfmod.reactions.blocked", 1) > 0;` - )) as GuildData[]; - - const newBlockedReactionGuilds = this.upMapReactions(oldBlockedReactionsGuilds); - - for (const guild of newBlockedReactionGuilds) { - await queryRunner.query(/* sql */ `UPDATE public."guilds" SET "selfmod.reactions.blocked" = $1 WHERE id = '${guild.id}';`, [guild.roles]); - } - } - - public async down(queryRunner: QueryRunner): Promise { - const oldGuilds = (await queryRunner.query( - /* sql */ `SELECT id, "selfmod.reactions.blocked" as "roles" FROM public."guilds" WHERE array_length("selfmod.reactions.blocked", 1) > 0;` - )) as GuildData[]; - - const newGuilds = this.downMapReactions(oldGuilds); - - for (const guild of newGuilds) { - await queryRunner.query(/* sql */ `UPDATE public."guilds" SET "selfmod.reactions.blocked" = $1 WHERE id = '${guild.id}';`, [guild.roles]); - } - } - - private upMapReactions(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - for (let reaction of guild.roles) { - if (reaction.includes('%')) { - continue; - } - - const parts = reaction.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - reaction = `${emojiAnimated}${emojiId}`; - } - } - - return guilds; - } - - private downMapReactions(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - for (let reaction of guild.roles) { - if (reaction.includes('%')) { - continue; - } - - const parts = reaction.split('a'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0) === ''; - - reaction = `${emojiAnimated ? 'a' : ''}:_:${emojiId}`; - } - } - - return guilds; - } -} - -interface GuildData { - id: string; - roles: string[]; -} diff --git a/src/lib/database/migrations/1633267799333-V60_MigrateStarboardEmojis.ts b/src/lib/database/migrations/1633267799333-V60_MigrateStarboardEmojis.ts deleted file mode 100644 index baf1b4c11e3..00000000000 --- a/src/lib/database/migrations/1633267799333-V60_MigrateStarboardEmojis.ts +++ /dev/null @@ -1,155 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V60MigrateStarboardAndSuggestionEmojis1633267799333 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public."guilds" - ALTER COLUMN "suggestions.emojis.downvote" - SET DEFAULT 's694594285269680179';`); - await queryRunner.query(/* sql */ ` - ALTER TABLE public."guilds" - ALTER COLUMN "suggestions.emojis.upvote" - SET DEFAULT 's694594285487652954';`); - - const oldGuildData = (await queryRunner.query(/* sql */ ` - SELECT id, - "starboard.emoji" AS "starboardEmoji", - "suggestions.emojis.downvote" AS "downvoteEmoji", - "suggestions.emojis.upvote" AS "upvoteEmoji" - FROM public."guilds"; - ;`)) as GuildData[]; - - const newGuildData = this.upMap(oldGuildData); - - for (const guild of newGuildData) { - await queryRunner.query( - /* sql */ ` - UPDATE public."guilds" - SET "starboard.emoji" = $1, - "suggestions.emojis.downvote" = $2, - "suggestions.emojis.upvote" = $3 - WHERE id = '${guild.id}'; - `, - [guild.starboardEmoji, guild.downvoteEmoji, guild.upvoteEmoji] - ); - } - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public."guilds" - ALTER COLUMN "suggestions.emojis.downvote" - SET DEFAULT ':ArrowB:694594285269680179';`); - await queryRunner.query(/* sql */ ` - ALTER TABLE products - ALTER COLUMN "suggestions.emojis.upvote" - SET DEFAULT ':ArrowT:694594285487652954';`); - - const oldGuildData = (await queryRunner.query(/* sql */ ` - SELECT id, - "starboard.emoji" AS "starboardEmoji", - "suggestions.emojis.downvote" AS "downvoteEmoji", - "suggestions.emojis.upvote" AS "upvoteEmoji" - FROM public."guilds"; - ;`)) as GuildData[]; - - const newGuildData = this.downMap(oldGuildData); - - for (const guild of newGuildData) { - await queryRunner.query( - /* sql */ ` - UPDATE public."guilds" - SET "starboard.emoji" = $1, - "suggestions.emojis.downvote" = $2, - "suggestions.emojis.upvote" = $3 - WHERE id = '${guild.id}'; - `, - [guild.starboardEmoji, guild.downvoteEmoji, guild.upvoteEmoji] - ); - } - } - - private upMap(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - if (guild.starboardEmoji.includes('%')) { - continue; - } - - const parts = guild.starboardEmoji.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - guild.starboardEmoji = `${emojiAnimated}${emojiId}`; - } - - for (const guild of guilds) { - if (guild.downvoteEmoji.includes('%')) { - continue; - } - - const parts = guild.downvoteEmoji.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - guild.downvoteEmoji = `${emojiAnimated || 's'}${emojiId}`; - } - - for (const guild of guilds) { - if (guild.upvoteEmoji.includes('%')) { - continue; - } - - const parts = guild.upvoteEmoji.split(':'); - const emojiId = parts.at(-1)!; - const emojiAnimated = parts.at(0); - - guild.upvoteEmoji = `${emojiAnimated || 's'}${emojiId}`; - } - - return guilds; - } - - private downMap(guilds: GuildData[]): GuildData[] { - for (const guild of guilds) { - if (guild.starboardEmoji.includes('%')) { - continue; - } - - const emojiId = guild.starboardEmoji.slice(1); - const emojiAnimated = guild.starboardEmoji.at(0) === 'a'; - - guild.starboardEmoji = `${emojiAnimated ? 'a' : ''}:_:${emojiId}`; - } - - for (const guild of guilds) { - if (guild.downvoteEmoji.includes('%')) { - continue; - } - - const emojiId = guild.downvoteEmoji.slice(1); - const emojiAnimated = guild.downvoteEmoji.at(0) === 'a'; - - guild.downvoteEmoji = `${emojiAnimated ? 'a' : ''}:_:${emojiId}`; - } - - for (const guild of guilds) { - if (guild.upvoteEmoji.includes('%')) { - continue; - } - - const emojiId = guild.upvoteEmoji.slice(1); - const emojiAnimated = guild.upvoteEmoji.at(0) === 'a'; - - guild.upvoteEmoji = `${emojiAnimated ? 'a' : ''}:_:${emojiId}`; - } - - return guilds; - } -} - -interface GuildData { - id: string; - starboardEmoji: string; - downvoteEmoji: string; - upvoteEmoji: string; -} diff --git a/src/lib/database/migrations/1634379789387-V61_AddMusicAutoLeave.ts b/src/lib/database/migrations/1634379789387-V61_AddMusicAutoLeave.ts deleted file mode 100644 index 8f2971104d9..00000000000 --- a/src/lib/database/migrations/1634379789387-V61_AddMusicAutoLeave.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V61AddMusicAutoLeave1634379789387 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.auto-leave', type: 'boolean', default: 'true' })); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'music.auto-leave'); - } -} diff --git a/src/lib/database/migrations/1646161749171-V62_VersionSevenRemoveGuildSettings.ts b/src/lib/database/migrations/1646161749171-V62_VersionSevenRemoveGuildSettings.ts deleted file mode 100644 index c51236be3c2..00000000000 --- a/src/lib/database/migrations/1646161749171-V62_VersionSevenRemoveGuildSettings.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V62VersionSevenRemoveGuildSettings1646161749171 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'afk.role'); - await queryRunner.dropColumn('guilds', 'afk.prefix'); - await queryRunner.dropColumn('guilds', 'afk.prefix-force'); - - await queryRunner.dropColumn('guilds', 'birthday.channel'); - await queryRunner.dropColumn('guilds', 'birthday.message'); - await queryRunner.dropColumn('guilds', 'birthday.role'); - - await queryRunner.dropColumn('guilds', 'channels.announcements'); - await queryRunner.dropColumn('guilds', 'channels.greeting'); - await queryRunner.dropColumn('guilds', 'channels.farewell'); - await queryRunner.dropColumn('guilds', 'channels.spam'); - - await queryRunner.dropColumn('guilds', 'messages.farewell'); - await queryRunner.dropColumn('guilds', 'messages.farewell-auto-delete'); - await queryRunner.dropColumn('guilds', 'messages.greeting'); - await queryRunner.dropColumn('guilds', 'messages.greeting-auto-delete'); - await queryRunner.dropColumn('guilds', 'messages.join-dm'); - await queryRunner.dropColumn('guilds', 'messages.announcement-embed'); - - await queryRunner.dropColumn('guilds', 'roles.subscriber'); - - await queryRunner.dropColumn('guilds', 'starboard.channel'); - await queryRunner.dropColumn('guilds', 'starboard.emoji'); - await queryRunner.dropColumn('guilds', 'starboard.ignored-channels'); - await queryRunner.dropColumn('guilds', 'starboard.minimum'); - await queryRunner.dropColumn('guilds', 'starboard.self-star'); - await queryRunner.dropColumn('guilds', 'starboard.maximum-age'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.role', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.prefix', type: 'varchar', length: '32', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'afk.prefix-force', type: 'boolean', default: false })); - - await queryRunner.addColumn('guilds', new TableColumn({ name: 'birthday.channel', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'birthday.message', type: 'varchar', length: '200', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'birthday.role', type: 'varchar', length: '19', isNullable: true })); - - await queryRunner.addColumn('guilds', new TableColumn({ name: 'channels.announcements', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'channels.greeting', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'channels.farewell', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'channels.spam', type: 'varchar', length: '19', isNullable: true })); - - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.farewell', type: 'varchar', length: '2000', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.farewell-auto-delete', type: 'bigint', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.greeting', type: 'varchar', length: '2000', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.greeting-auto-delete', type: 'bigint', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.join-dm', type: 'varchar', length: '1500', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'messages.announcement-embed', type: 'boolean', default: false })); - - await queryRunner.addColumn('guilds', new TableColumn({ name: 'roles.subscriber', type: 'varchar', length: '19', isNullable: true })); - - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.channel', type: 'varchar', length: '19', isNullable: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.emoji', type: 'varchar', length: '75', default: '%E2%AD%90' })); - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'starboard.ignored-channels', type: 'varchar', length: '19', isArray: true, default: 'ARRAY[]::VARCHAR[]' }) - ); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.minimum', type: 'smallint', default: '1' })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.self-star', type: 'boolean', default: false })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'starboard.maximum-age', type: 'bigint', isNullable: true })); - } -} diff --git a/src/lib/database/migrations/1646162907066-V63_VersionSevenRemoveStarboard.ts b/src/lib/database/migrations/1646162907066-V63_VersionSevenRemoveStarboard.ts deleted file mode 100644 index b1857965212..00000000000 --- a/src/lib/database/migrations/1646162907066-V63_VersionSevenRemoveStarboard.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm'; - -export class V63VersionSevenRemoveStarboard1646162907066 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('starboard'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'starboard', - columns: [ - new TableColumn({ name: 'enabled', type: 'boolean' }), - new TableColumn({ name: 'user_id', type: 'varchar', length: '19' }), - new TableColumn({ name: 'message_id', type: 'varchar', length: '19', isPrimary: true }), - new TableColumn({ name: 'channel_id', type: 'varchar', length: '19' }), - new TableColumn({ name: 'guild_id', type: 'varchar', length: '19', isPrimary: true }), - new TableColumn({ name: 'star_message_id', type: 'varchar', length: '19', isNullable: true }), - new TableColumn({ name: 'stars', type: 'integer' }) - ] - }) - ); - } -} diff --git a/src/lib/database/migrations/1646163533583-V64_VersionSevenRemoveSpouses.ts b/src/lib/database/migrations/1646163533583-V64_VersionSevenRemoveSpouses.ts deleted file mode 100644 index 66da8a775b5..00000000000 --- a/src/lib/database/migrations/1646163533583-V64_VersionSevenRemoveSpouses.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from 'typeorm'; - -export class V64VersionSevenRemoveSpouses1646163533583 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('user_spouses_user'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.createTable( - new Table({ - name: 'user_spouses_user', - columns: [ - new TableColumn({ name: 'user_id_1', type: 'varchar', length: '19', isNullable: false }), - new TableColumn({ name: 'user_id_2', type: 'varchar', length: '19', isNullable: false }) - ], - foreignKeys: [ - new TableForeignKey({ - columnNames: ['user_id_1'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }), - new TableForeignKey({ - columnNames: ['user_id_2'], - referencedTableName: 'user', - referencedColumnNames: ['id'], - onDelete: 'CASCADE' - }) - ] - }) - ); - - await queryRunner.createPrimaryKey('user_spouses_user', ['user_id_1', 'user_id_2']); - } -} diff --git a/src/lib/database/migrations/1646178098086-V65_RemoveStaleSchedules.ts b/src/lib/database/migrations/1646178098086-V65_RemoveStaleSchedules.ts deleted file mode 100644 index e68b969ec20..00000000000 --- a/src/lib/database/migrations/1646178098086-V65_RemoveStaleSchedules.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V65VersionSevenRemoveStaleSchedules1646178098086 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - DELETE FROM public.schedule - WHERE task_id = 'birthday' OR task_id = 'removeBirthdayRole'; - `); - } - - public async down(): Promise { - // NOP - } -} diff --git a/src/lib/database/migrations/1647241680539-V66_ExpandGuildSubscriptionMessage.ts b/src/lib/database/migrations/1647241680539-V66_ExpandGuildSubscriptionMessage.ts deleted file mode 100644 index 60bb63633cc..00000000000 --- a/src/lib/database/migrations/1647241680539-V66_ExpandGuildSubscriptionMessage.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { MigrationInterface, QueryRunner } from 'typeorm'; - -export class V66ExpandGuildSubscriptionMessage1647241680539 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public.guild_subscription - ALTER COLUMN message - TYPE VARCHAR(200); - `); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(/* sql */ ` - ALTER TABLE public.guild_subscription - ALTER COLUMN message - TYPE VARCHAR(50); - `); - } -} diff --git a/src/lib/database/migrations/1648974657502-V67_RemoveAudioSettings.ts b/src/lib/database/migrations/1648974657502-V67_RemoveAudioSettings.ts deleted file mode 100644 index 4552c01a399..00000000000 --- a/src/lib/database/migrations/1648974657502-V67_RemoveAudioSettings.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { hours } from '#utils/common'; -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V67RemoveAudioSettings1648974657502 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'music.allowed-roles'); - await queryRunner.dropColumn('guilds', 'music.allowed-voice-channels'); - await queryRunner.dropColumn('guilds', 'music.allow-streams'); - await queryRunner.dropColumn('guilds', 'music.auto-leave'); - await queryRunner.dropColumn('guilds', 'music.default-volume'); - await queryRunner.dropColumn('guilds', 'music.maximum-duration'); - await queryRunner.dropColumn('guilds', 'music.maximum-entries-per-user'); - - await queryRunner.dropColumn('guilds', 'roles.dj'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'music.allowed-roles', type: 'varchar', length: '19', isArray: true, default: 'ARRAY[]::VARCHAR[]' }) - ); - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'music.allowed-voice-channels', type: 'varchar', length: '19', isArray: true, default: 'ARRAY[]::VARCHAR[]' }) - ); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.allow-streams', type: 'boolean', default: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.auto-leave', type: 'boolean', default: true })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.default-volume', type: 'smallint', default: 100 })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.maximum-duration', type: 'integer', default: hours(2) })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'music.maximum-entries-per-user', type: 'smallint', default: 100 })); - - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'roles.dj', type: 'varchar', length: '19', isArray: true, default: 'ARRAY[]::VARCHAR[]' }) - ); - } -} diff --git a/src/lib/database/migrations/1654278189464-V68_PartialRemoveSuggestionSettings.ts b/src/lib/database/migrations/1654278189464-V68_PartialRemoveSuggestionSettings.ts deleted file mode 100644 index 48b71a7de4c..00000000000 --- a/src/lib/database/migrations/1654278189464-V68_PartialRemoveSuggestionSettings.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V68PartialRemoveSuggestionSettings1654278189464 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'suggestions.emojis.upvote'); - await queryRunner.dropColumn('guilds', 'suggestions.emojis.downvote'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'suggestions.emojis.upvote', type: 'varchar', length: '128', default: "'s694594285487652954'" }) - ); - - await queryRunner.addColumn( - 'guilds', - new TableColumn({ name: 'suggestions.emojis.downvote', type: 'varchar', length: '128', default: "'s694594285269680179'" }) - ); - } -} diff --git a/src/lib/database/migrations/1654346108374-V69_RemoveTriggers.ts b/src/lib/database/migrations/1654346108374-V69_RemoveTriggers.ts deleted file mode 100644 index ed3399e1a6a..00000000000 --- a/src/lib/database/migrations/1654346108374-V69_RemoveTriggers.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'; - -export class V69RemoveTriggers1654346108374 implements MigrationInterface { - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.dropColumn('guilds', 'trigger.alias'); - await queryRunner.dropColumn('guilds', 'trigger.includes'); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.addColumn('guilds', new TableColumn({ name: 'trigger.alias', type: 'jsonb', default: "'[]'::JSONB" })); - await queryRunner.addColumn('guilds', new TableColumn({ name: 'trigger.includes', type: 'jsonb', default: "'[]'::JSONB" })); - } -} diff --git a/src/lib/database/repositories/ClientRepository.ts b/src/lib/database/repositories/ClientRepository.ts deleted file mode 100644 index b8f4fa378dc..00000000000 --- a/src/lib/database/repositories/ClientRepository.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable @typescript-eslint/unified-signatures */ -import { ClientEntity } from '#lib/database/entities/ClientEntity'; -import { EntityRepository, FindOneOptions, Repository } from 'typeorm'; - -@EntityRepository(ClientEntity) -export class ClientRepository extends Repository { - public async ensure(options?: FindOneOptions) { - return (await this.findOne(process.env.CLIENT_ID, options)) ?? new ClientEntity(); - } -} diff --git a/src/lib/database/repositories/MemberRepository.ts b/src/lib/database/repositories/MemberRepository.ts deleted file mode 100644 index ff8d261df10..00000000000 --- a/src/lib/database/repositories/MemberRepository.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/unified-signatures */ -import { MemberEntity } from '#lib/database/entities/MemberEntity'; -import { EntityRepository, FindOneOptions, Repository } from 'typeorm'; - -@EntityRepository(MemberEntity) -export class MemberRepository extends Repository { - public async ensure(userId: string, guildId: string, options: FindOneOptions = {}) { - const previous = await this.findOne({ where: { userId, guildId }, ...options }); - if (previous) return previous; - - const data = new MemberEntity(); - data.userId = userId; - data.guildId = guildId; - return data; - } -} diff --git a/src/lib/database/repositories/UserRepository.ts b/src/lib/database/repositories/UserRepository.ts deleted file mode 100644 index 6bec92b6538..00000000000 --- a/src/lib/database/repositories/UserRepository.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable @typescript-eslint/unified-signatures */ -import { UserCooldownEntity } from '#lib/database/entities/UserCooldownEntity'; -import { UserGameIntegrationEntity } from '#lib/database/entities/UserGameIntegrationEntity'; -import { UserProfileEntity } from '#lib/database/entities/UserProfileEntity'; -import { Collection } from '@discordjs/collection'; -import { AsyncQueue } from '@sapphire/async-queue'; -import { container } from '@sapphire/framework'; -import type { User } from 'discord.js'; -import { EntityRepository, FindOneOptions, Repository } from 'typeorm'; -import { UserEntity } from '../entities/UserEntity'; - -@EntityRepository(UserEntity) -export class UserRepository extends Repository { - public async ensure(id: string, options?: FindOneOptions) { - const previous = await this.findOne(id, options); - if (previous) return previous; - - const data = new UserEntity(); - data.id = id; - return data; - } - - public async ensureProfile(id: string, options: FindOneOptions = {}) { - const user = await this.ensure(id, { ...options, relations: ['profile'] }); - if (!user.profile) { - user.profile = new UserProfileEntity(); - user.profile.user = user; - } - - return user as UserEntity & { profile: NonNullable }; - } - - public async ensureCooldowns(id: string, options: FindOneOptions = {}) { - const user = await this.ensure(id, { ...options, relations: ['cooldowns'] }); - if (!user.cooldowns) { - user.cooldowns = new UserCooldownEntity(); - user.cooldowns.user = user; - } - - return user as UserEntity & { cooldowns: NonNullable }; - } - - public async ensureProfileAndCooldowns(id: string, options: FindOneOptions = {}) { - const user = await this.ensure(id, { ...options, relations: ['profile', 'cooldowns'] }); - if (!user.profile) { - user.profile = new UserProfileEntity(); - user.profile.user = user; - } - - if (!user.cooldowns) { - user.cooldowns = new UserCooldownEntity(); - user.cooldowns.user = user; - } - - return user as UserEntity & { profile: NonNullable; cooldowns: NonNullable }; - } - - public async fetchIntegration(gameName: string, user: User): Promise> { - const { userGameIntegrations } = container.db; - let gameIntegration = (await userGameIntegrations.findOne({ - where: { - user: { - id: user.id - }, - game: gameName - } - })) as UserGameIntegrationEntity; - - if (gameIntegration) return gameIntegration; - - gameIntegration = new UserGameIntegrationEntity(); - gameIntegration.game = gameName; - gameIntegration.user = await this.ensure(user.id); - return gameIntegration; - } - - public async lock(targets: readonly string[], cb: (...targets: readonly string[]) => Promise): Promise { - if (targets.length !== new Set(targets).size) { - throw new Error(`Duplicated targets detected: '${targets.join("', '")}'`); - } - - const queues = targets.map((target) => { - const existing = UserRepository.queues.get(target); - if (existing) return existing; - - const created = new AsyncQueue(); - UserRepository.queues.set(target, created); - return created; - }); - - await Promise.all(queues.map((queue) => queue.wait())); - - try { - return await cb(...targets); - } finally { - for (const queue of queues) queue.shift(); - } - } - - private static interval = setInterval(() => { - UserRepository.queues.sweep((value) => value.remaining === 0); - }, 60000).unref(); - - private static queues = new Collection(); - - public static destroy() { - if (UserRepository.interval) clearInterval(UserRepository.interval); - } -} - -export namespace UserRepository { - export interface UserEntityWithProfileAndCooldowns extends UserEntity { - profile: NonNullable; - cooldowns: NonNullable; - } - - export interface UserEntityWithProfile extends UserEntity { - profile: NonNullable; - } -} diff --git a/src/lib/database/settings/ConfigurableKey.ts b/src/lib/database/settings/ConfigurableKey.ts deleted file mode 100644 index 8921af4d504..00000000000 --- a/src/lib/database/settings/ConfigurableKey.ts +++ /dev/null @@ -1,149 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import { NonEmptyArray, SchemaGroup } from '#lib/database/settings/schema/SchemaGroup'; -import { ConfigurableKeyValueOptions, SchemaKey } from '#lib/database/settings/schema/SchemaKey'; -import { Collection } from '@discordjs/collection'; -import { isFunction, isNumber, isPrimitive } from '@sapphire/utilities'; -import { ColumnOptions, ColumnType, getMetadataArgsStorage } from 'typeorm'; - -export const configurableKeys = new Collection(); -export const configurableGroups = new SchemaGroup(); - -export function ConfigurableKey(options: ConfigurableKeyOptions): PropertyDecorator { - return (target, property) => { - const storage = getMetadataArgsStorage(); - const column = storage.columns.find((c) => c.target === target.constructor && c.propertyName === (property as string)); - if (!column) throw new Error('Cannot find the metadata column.'); - - const name = (options.name ?? column.options.name) as keyof GuildEntity; - if (typeof name === 'undefined') throw new TypeError('The option "name" must be specified.'); - - const array = options.array ?? column.options.array ?? false; - const inclusive = options.inclusive ?? true; - const minimum = options.minimum ?? null; - const maximum = options.maximum ?? hydrateLength(column.options.length); - const type = options.type?.toLowerCase() ?? hydrateType(column.options.type!); - const df = options.default ?? getDefault(column.options, array, minimum); - const dashboardOnly = options.dashboardOnly ?? false; - const value = new SchemaKey({ - target: target.constructor, - property: property as keyof GuildEntity, - ...options, - array, - default: df, - inclusive, - maximum, - minimum, - name, - type, - dashboardOnly - }); - - configurableKeys.set(property as keyof GuildEntity, value); - value.parent = configurableGroups.add(name.split('.') as NonEmptyArray, value); - }; -} - -function getDefault(options: ColumnOptions, array: boolean, minimum: number | null) { - if (isPrimitive(options.default)) return options.default; - if (array) return []; - if (isNumber(minimum)) return minimum; - if (options.nullable) return null; - if (isFunction(options.default) && options.default() === "'[]'::JSONB") return []; - throw new TypeError(`The default value for the column '${options.name}' cannot be obtained automatically.`); -} - -function hydrateLength(length: string | number | undefined) { - if (typeof length === 'string') return Number(length); - if (typeof length === 'number') return length; - return null; -} - -function hydrateType(type: ColumnType) { - // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check - switch (type) { - case 'number': - case 'bigint': - case 'boolean': - case 'float': - case 'jsonb': - case 'string': { - return type; - } - - case 'long': - case 'int2': - case 'integer': - case 'int4': - case 'int8': - case 'int64': - case 'unsigned big int': - case 'tinyint': - case 'smallint': - case 'mediumint': - case 'int': { - return 'integer'; - } - - case 'float4': - case 'float8': - case 'smallmoney': - case 'money': - case 'real': - case 'numeric': - case 'double precision': - case 'double': { - return 'number'; - } - - case 'text': - case 'nvarchar': - case 'national varchar': - case 'varchar': - case 'varchar2': - case 'nvarchar2': - case 'shorttext': - case 'character varying': - case 'varying character': - case 'char varying': { - return 'string'; - } - - case 'bool': { - return 'boolean'; - } - - case 'smalldatetime': - case 'date': - case 'interval year to month': - case 'interval day to second': - case 'interval': - case 'year': - case 'datetime': - case 'datetime2': - case 'time': - case 'time with time zone': - case 'time without time zone': - case 'timestamp': - case 'timestamp without time zone': - case 'timestamp with time zone': - case 'timestamp with local time zone': { - return 'date'; - } - - case 'character': - case 'native character': - case 'char': - case 'nchar': - case 'national char': { - return 'character'; - } - - default: { - throw new Error(`Unsupported type ${type}`); - } - } -} - -type OptionalKeys = 'name' | 'type' | 'inclusive' | 'maximum' | 'minimum' | 'array' | 'default' | 'dashboardOnly'; -type ConfigurableKeyOptions = Omit & - Partial>; diff --git a/src/lib/database/settings/SettingsManager.ts b/src/lib/database/settings/SettingsManager.ts deleted file mode 100644 index 212d7bc65ee..00000000000 --- a/src/lib/database/settings/SettingsManager.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { GuildSettingsCollection } from './structures/collections/GuildSettingsCollection'; -import { SerializerStore } from './structures/SerializerStore'; -import { TaskStore } from './structures/TaskStore'; - -export class SettingsManager { - public readonly serializers = new SerializerStore(); - public readonly tasks = new TaskStore(); - public readonly guilds = new GuildSettingsCollection(); -} diff --git a/src/lib/database/settings/Utils.ts b/src/lib/database/settings/Utils.ts deleted file mode 100644 index 0819c4e4b25..00000000000 --- a/src/lib/database/settings/Utils.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraArgs } from '#lib/structures'; -import { UserError } from '@sapphire/framework'; -import type { GuildEntity } from '../entities/GuildEntity'; -import type { ISchemaValue } from './base/ISchemaValue'; -import type { SchemaGroup } from './schema/SchemaGroup'; -import type { SchemaKey } from './schema/SchemaKey'; - -export function isSchemaGroup(groupOrKey: ISchemaValue): groupOrKey is SchemaGroup { - return groupOrKey.type === 'Group'; -} - -export function isSchemaKey(groupOrKey: ISchemaValue): groupOrKey is SchemaKey { - return groupOrKey.type !== 'Group'; -} - -export async function set(settings: GuildEntity, key: SchemaKey, args: SkyraArgs) { - const parsed = await key.parse(settings, args); - 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) values.push(parsed); - else values[index] = parsed; - } else { - const value = Reflect.get(settings, key.property); - const { serializer } = key; - if (serializer.equals(value, parsed)) { - throw new UserError({ - identifier: LanguageKeys.Settings.Gateway.DuplicateValue, - context: { - path: key.name, - value: key.stringify(settings, args.t, parsed) - } - }); - } - - Reflect.set(settings, key.property, parsed); - } - - return settings.getLanguage(); -} - -export async function remove(settings: GuildEntity, key: SchemaKey, args: SkyraArgs) { - const parsed = await key.parse(settings, args); - 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 new UserError({ - identifier: LanguageKeys.Settings.Gateway.MissingValue, - context: { - path: key.name, - value: key.stringify(settings, args.t, parsed) - } - }); - } - - values.splice(index, 1); - } else { - Reflect.set(settings, key.property, key.default); - } - - return settings.getLanguage(); -} - -export function reset(settings: GuildEntity, key: SchemaKey) { - const language = settings.getLanguage(); - Reflect.set(settings, key.property, key.default); - return language; -} diff --git a/src/lib/database/settings/base/IBaseEntity.ts b/src/lib/database/settings/base/IBaseEntity.ts deleted file mode 100644 index 5fc658b956b..00000000000 --- a/src/lib/database/settings/base/IBaseEntity.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { BaseEntity } from 'typeorm'; - -export interface IBaseEntity extends BaseEntity { - resetAll(): void; -} diff --git a/src/lib/database/settings/base/IBaseManager.ts b/src/lib/database/settings/base/IBaseManager.ts deleted file mode 100644 index e6d02d469e5..00000000000 --- a/src/lib/database/settings/base/IBaseManager.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IBaseManager { - refresh(): void; - onPatch(): void; - onRemove(): void; -} diff --git a/src/lib/database/settings/base/ISchemaValue.d.ts b/src/lib/database/settings/base/ISchemaValue.d.ts deleted file mode 100644 index 2e1c2bf2a53..00000000000 --- a/src/lib/database/settings/base/ISchemaValue.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import type { SchemaGroup } from '#lib/database/settings/schema/SchemaGroup'; -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: TFunction): string; -} diff --git a/src/lib/database/settings/base/SettingsCollection.ts b/src/lib/database/settings/base/SettingsCollection.ts deleted file mode 100644 index ca0f519e5ed..00000000000 --- a/src/lib/database/settings/base/SettingsCollection.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { Collection } from '@discordjs/collection'; -import { RWLock } from 'async-rwlock'; -import type { IBaseEntity } from './IBaseEntity'; - -export interface SettingsCollectionCallback { - (entity: T): Promise | R; -} - -export abstract class SettingsCollection extends Collection { - private readonly queue = new Map>(); - private readonly locks = new Map(); - - public delete(key: string) { - this.locks.delete(key); - return super.delete(key); - } - - public read(key: string, paths: readonly [K1]): Promise<[T[K1]]>; - public read(key: string, paths: readonly [K1, K2]): Promise<[T[K1], T[K2]]>; - public read( - key: string, - paths: readonly [K1, K2, K3] - ): Promise<[T[K1], T[K2], T[K3]]>; - - public read( - key: string, - paths: readonly [K1, K2, K3, K4] - ): Promise<[T[K1], T[K2], T[K3], T[K4]]>; - - public read( - key: string, - paths: readonly [K1, K2, K3, K4, K5] - ): Promise<[T[K1], T[K2], T[K3], T[K4], T[K5]]>; - - public read( - key: string, - paths: readonly [K1, K2, K3, K4, K5, K6] - ): Promise<[T[K1], T[K2], T[K3], T[K4], T[K5], T[K6]]>; - - public read< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T - >(key: string, paths: readonly [K1, K2, K3, K4, K5, K6, K7]): Promise<[T[K1], T[K2], T[K3], T[K4], T[K5], T[K6], T[K7]]>; - - public read< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T, - K8 extends keyof T - >(key: string, paths: readonly [K1, K2, K3, K4, K5, K6, K7, K8]): Promise<[T[K1], T[K2], T[K3], T[K4], T[K5], T[K6], T[K7], T[K8]]>; - - public read< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T, - K8 extends keyof T, - K9 extends keyof T - >(key: string, paths: readonly [K1, K2, K3, K4, K5, K6, K7, K8, K9]): Promise<[T[K1], T[K2], T[K3], T[K4], T[K5], T[K6], T[K7], T[K8], T[K9]]>; - - public read(key: string, paths: readonly K[]): Promise; - public read(key: string, path: K): Promise; - public read(key: string, cb: SettingsCollectionCallback): Promise; - public read(key: string): Promise; - public async read(key: string, cb?: keyof T | readonly (keyof T)[] | SettingsCollectionCallback): Promise { - const lock = this.acquireLock(key); - try { - // Acquire a read lock: - await lock.readLock(); - - // Fetch the entry: - const settings = this.get(key) ?? (await this.processFetch(key)); - - if (typeof cb === 'undefined') { - return settings; - } - - // If a callback was given, call it: - if (typeof cb === 'function') { - return await cb(settings); - } - - // If an array of keys was given, map all values: - if (Array.isArray(cb)) { - return cb.map((k: keyof T) => settings[k]); - } - - // Else, retrieve the single value: - return settings[cb as keyof T]; - } finally { - // Unlock the lock: - lock.unlock(); - } - } - - public write(key: string, pairs: readonly [[K1, T[K1]]]): Promise; - public write(key: string, pairs: readonly [[K1, T[K1]], [K2, T[K2]]]): Promise; - public write( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]]] - ): Promise; - - public write( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]]] - ): Promise; - - public write( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]], [K5, T[K5]]] - ): Promise; - - public write( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]], [K5, T[K5]], [K6, T[K6]]] - ): Promise; - - public write< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T - >(key: string, pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]], [K5, T[K5]], [K6, T[K6]], [K7, T[K7]]]): Promise; - - public write< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T, - K8 extends keyof T - >( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]], [K5, T[K5]], [K6, T[K6]], [K7, T[K7]], [K8, T[K8]]] - ): Promise; - - public write< - K1 extends keyof T, - K2 extends keyof T, - K3 extends keyof T, - K4 extends keyof T, - K5 extends keyof T, - K6 extends keyof T, - K7 extends keyof T, - K8 extends keyof T, - K9 extends keyof T - >( - key: string, - pairs: readonly [[K1, T[K1]], [K2, T[K2]], [K3, T[K3]], [K4, T[K4]], [K5, T[K5]], [K6, T[K6]], [K7, T[K7]], [K8, T[K8]], [K9, T[K9]]] - ): Promise; - - public write(key: string, pairs: readonly [K, T[K]][]): Promise; - public write(key: string, cb: SettingsCollectionCallback): Promise; - public async write(key: string, cb: readonly [keyof T, T[keyof T]][] | SettingsCollectionCallback): Promise { - const lock = this.acquireLock(key); - - // Acquire a write lock: - await lock.writeLock(); - - // Fetch the entry: - const settings = this.get(key) ?? (await this.unlockOnThrow(this.processFetch(key), lock)); - - try { - // If a callback was given, call it, receive its return, save the settings, and return: - if (typeof cb === 'function') { - const result = await cb(settings); - await settings.save(); - return result; - } - - // Otherwise, for each key, we set the value: - for (const [k, v] of cb) { - settings[k] = v; - } - - // Now we save, and return undefined: - await settings.save(); - return undefined; - } catch (error) { - await this.tryReload(settings); - throw error; - } finally { - lock.unlock(); - } - } - - public abstract fetch(key: string): Promise; - - private async tryReload(entity: T): Promise { - try { - await entity.reload(); - } catch (error) { - if (error instanceof Error && error.name === 'EntityNotFound') entity.resetAll(); - else throw error; - } - } - - private async unlockOnThrow(promise: Promise, lock: RWLock) { - try { - return await promise; - } catch (error) { - lock.unlock(); - throw error; - } - } - - private async processFetch(key: string): Promise { - const previous = this.queue.get(key); - if (previous) return previous; - - try { - const promise = this.fetch(key); - this.queue.set(key, promise); - return await promise; - } finally { - this.queue.delete(key); - } - } - - private acquireLock(key: string): RWLock { - const previous = this.locks.get(key); - if (previous) return previous; - - const lock = new RWLock(); - this.locks.set(key, lock); - return lock; - } -} diff --git a/src/lib/database/settings/functions.ts b/src/lib/database/settings/functions.ts deleted file mode 100644 index 3d5cc4e3301..00000000000 --- a/src/lib/database/settings/functions.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { container } from '@sapphire/framework'; -import type { GuildResolvable } from 'discord.js'; -import type { GuildEntity } from '../entities/GuildEntity'; -import type { SettingsCollectionCallback } from './base/SettingsCollection'; - -type K = keyof V; -type V = GuildEntity; - -export function readSettings(guild: GuildResolvable, paths: readonly [K1]): Promise<[V[K1]]>; -export function readSettings(guild: GuildResolvable, paths: readonly [K1, K2]): Promise<[V[K1], V[K2]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3] -): Promise<[V[K1], V[K2], V[K3]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4] -): Promise<[V[K1], V[K2], V[K3], V[K4]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4, K5] -): Promise<[V[K1], V[K2], V[K3], V[K4], V[K5]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4, K5, K6] -): Promise<[V[K1], V[K2], V[K3], V[K4], V[K5], V[K6]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4, K5, K6, K7] -): Promise<[V[K1], V[K2], V[K3], V[K4], V[K5], V[K6], V[K7]]>; -export function readSettings( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4, K5, K6, K7, K8] -): Promise<[V[K1], V[K2], V[K3], V[K4], V[K5], V[K6], V[K7], V[K8]]>; -export function readSettings< - K1 extends K, - K2 extends K, - K3 extends K, - K4 extends K, - K5 extends K, - K6 extends K, - K7 extends K, - K8 extends K, - K9 extends K ->( - guild: GuildResolvable, - paths: readonly [K1, K2, K3, K4, K5, K6, K7, K8, K9] -): Promise<[V[K1], V[K2], V[K3], V[K4], V[K5], V[K6], V[K7], V[K8], V[K9]]>; -export function readSettings(guild: GuildResolvable, paths: readonly KX[]): Promise; -export function readSettings(guild: GuildResolvable, path: K1): Promise; -export function readSettings(guild: GuildResolvable, cb: SettingsCollectionCallback): Promise; -export function readSettings(guild: GuildResolvable): Promise; -export function readSettings(guild: GuildResolvable, paths?: any) { - const resolved = container.client.guilds.resolveId(guild); - if (resolved === null) throw new TypeError(`Cannot resolve "guild" to a Guild instance.`); - return container.settings.guilds.read(resolved, paths); -} - -export function writeSettings(guild: GuildResolvable, pairs: readonly [[K1, V[K1]]]): Promise; -export function writeSettings(guild: GuildResolvable, pairs: readonly [[K1, V[K1]], [K2, V[K2]]]): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]]] -): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]]] -): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]], [K5, V[K5]]] -): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]], [K5, V[K5]], [K6, V[K6]]] -): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]], [K5, V[K5]], [K6, V[K6]], [K7, V[K7]]] -): Promise; -export function writeSettings( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]], [K5, V[K5]], [K6, V[K6]], [K7, V[K7]], [K8, V[K8]]] -): Promise; -export function writeSettings< - K1 extends K, - K2 extends K, - K3 extends K, - K4 extends K, - K5 extends K, - K6 extends K, - K7 extends K, - K8 extends K, - K9 extends K ->( - guild: GuildResolvable, - pairs: readonly [[K1, V[K1]], [K2, V[K2]], [K3, V[K3]], [K4, V[K4]], [K5, V[K5]], [K6, V[K6]], [K7, V[K7]], [K8, V[K8]], [K9, V[K9]]] -): Promise; -export function writeSettings(guild: GuildResolvable, pairs: readonly [KX, V[KX]][]): Promise; -export function writeSettings(guild: GuildResolvable, cb: SettingsCollectionCallback): Promise; -export function writeSettings(guild: GuildResolvable, paths: any) { - const resolved = container.client.guilds.resolveId(guild); - if (resolved === null) throw new TypeError(`Cannot resolve "guild" to a Guild instance.`); - return container.settings.guilds.write(resolved, paths); -} diff --git a/src/lib/database/settings/index.ts b/src/lib/database/settings/index.ts deleted file mode 100644 index 6d4e123eb45..00000000000 --- a/src/lib/database/settings/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export * from './base/IBaseEntity'; -export * from './base/IBaseManager'; -export * from './base/SettingsCollection'; -export * from './ConfigurableKey'; -export * from './functions'; -export * from './schema/SchemaGroup'; -export * from './schema/SchemaKey'; -export * from './SettingsManager'; -export * from './structures/AdderManager'; -export * from './structures/collections/GuildSettingsCollection'; -export * from './structures/PermissionNodeManager'; -export * from './structures/Serializer'; -export * from './structures/SerializerStore'; -export * from './structures/Task'; -export * from './structures/TaskStore'; -export * from './Utils'; diff --git a/src/lib/database/settings/schema/SchemaGroup.ts b/src/lib/database/settings/schema/SchemaGroup.ts deleted file mode 100644 index 5e523ff9ca9..00000000000 --- a/src/lib/database/settings/schema/SchemaGroup.ts +++ /dev/null @@ -1,113 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import type { ISchemaValue } from '#lib/database/settings/base/ISchemaValue'; -import { codeBlock, isNullish, toTitleCase } from '@sapphire/utilities'; -import type { TFunction } from 'i18next'; -import { AliasedCollection } from '../structures/collections/AliasedCollection'; -import type { SchemaKey } from './SchemaKey'; - -export type NonEmptyArray = [T, ...T[]]; - -export class SchemaGroup extends AliasedCollection implements ISchemaValue { - public readonly parent: SchemaGroup | null; - public readonly name: string; - public readonly dashboardOnly = false; - public readonly type = 'Group'; - - public constructor(name = 'Root', parent: SchemaGroup | null = null) { - super(); - this.name = name; - this.parent = parent; - } - - public set(key: string, value: ISchemaValue) { - // Add auto-alias: - if (key.includes('-')) { - this.aliases.set(key.replaceAll('-', ''), value); - } - - return super.set(key, value); - } - - public add([key, ...tail]: NonEmptyArray, value: SchemaKey): SchemaGroup { - if (tail.length === 0) { - this.set(key, value); - return this; - } - - const previous = this.get(key); - if (previous) { - if (previous instanceof SchemaGroup) { - return previous.add(tail as NonEmptyArray, value); - } - - throw new Error(`You cannot add '${key}' to a non-group entry.`); - } - - const group = new SchemaGroup(`${this.name} / ${toTitleCase(key)}`, this); - group.add(tail as NonEmptyArray, value); - this.set(key, group); - return group; - } - - public *childKeys() { - for (const [key, entry] of this) { - if (entry.type !== 'Group') yield key; - } - } - - public *childValues() { - for (const entry of this.values()) { - if (entry.type !== 'Group') yield entry; - } - } - - public getPathArray([key, ...tail]: NonEmptyArray): ISchemaValue | null { - if (tail.length === 0) { - return key === '' || key === '.' ? this : this.get(key) ?? null; - } - - const value = this.get(key); - if (isNullish(value)) return null; - if (value instanceof SchemaGroup) return value.getPathArray(tail as NonEmptyArray); - return null; - } - - public getPathString(key: string): ISchemaValue | null { - return this.getPathArray(key.split('.') as NonEmptyArray); - } - - public display(settings: GuildEntity, language: TFunction) { - const folders: string[] = []; - const sections = new Map(); - let longest = 0; - for (const [key, value] of this.entries()) { - if (value.dashboardOnly) continue; - if (value.type === 'Group') { - folders.push(`// ${key}`); - } else { - const values = sections.get(value.type) ?? []; - values.push(key); - - if (key.length > longest) longest = key.length; - if (values.length === 1) sections.set(value.type, values); - } - } - - const array: string[] = []; - if (folders.length) array.push('= Folders =', ...folders.sort(), ''); - if (sections.size) { - for (const keyType of [...sections.keys()].sort()) { - array.push( - `= ${toTitleCase(keyType)}s =`, - ...sections - .get(keyType)! - .sort() - .map((key) => `${key.padEnd(longest)} :: ${this.get(key)!.display(settings, language)}`), - '' - ); - } - } - - return codeBlock('asciidoc', array.join('\n')); - } -} diff --git a/src/lib/database/settings/schema/SchemaKey.ts b/src/lib/database/settings/schema/SchemaKey.ts deleted file mode 100644 index 68fbab41b88..00000000000 --- a/src/lib/database/settings/schema/SchemaKey.ts +++ /dev/null @@ -1,138 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import type { ISchemaValue } from '#lib/database/settings/base/ISchemaValue'; -import type { Serializer, SerializerUpdateContext } from '#lib/database/settings/structures/Serializer'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraArgs } from '#lib/structures'; -import type { CustomGet } from '#lib/types'; -import { container } from '@sapphire/framework'; -import { isNullish, NonNullObject } from '@sapphire/utilities'; -import type { TFunction } from 'i18next'; -import type { SchemaGroup } from './SchemaGroup'; - -export class SchemaKey implements ISchemaValue { - /** - * The i18n key for the configuration key. - */ - public description: CustomGet; - - /** - * The maximum value for the configuration key. - */ - public maximum: number | null; - - /** - * The minimum value for the configuration key. - */ - public minimum: number | null; - - /** - * Whether or not the range checks are inclusive. - */ - public inclusive: boolean; - - /** - * The visible name of the configuration key. - */ - public name: string; - - /** - * The property from the TypeORM entity. - */ - public property: K; - - /** - * The class this targets. - */ - public target: NonNullObject; - - /** - * The type of the value this property accepts. - */ - public type: string; - - /** - * Whether or not this accepts multiple values. - */ - public array: boolean; - - /** - * The default value for this key. - */ - public default: unknown; - - /** - * Whether this key should only be configurable on the dashboard - */ - public dashboardOnly: boolean; - - /** - * The parent group that holds this key. - */ - public parent: SchemaGroup | null = null; - - public constructor(options: ConfigurableKeyValueOptions) { - this.description = options.description; - this.maximum = options.maximum; - this.minimum = options.minimum; - this.inclusive = options.inclusive ?? false; - this.name = options.name; - this.property = options.property as K; - this.target = options.target; - this.type = options.type; - this.array = options.array; - this.default = options.default; - this.dashboardOnly = options.dashboardOnly ?? false; - } - - public get serializer(): Serializer { - const value = container.settings.serializers.get(this.type); - if (typeof value === 'undefined') throw new Error(`The serializer for '${this.type}' does not exist.`); - return value as Serializer; - } - - public async parse(settings: GuildEntity, args: SkyraArgs): Promise { - const { serializer } = this; - const context = this.getContext(settings, args.t); - - const result = await serializer.parse(args, context); - if (result.success) return result.value; - throw result.error.message; - } - - public stringify(settings: GuildEntity, t: TFunction, value: GuildEntity[K]): string { - const { serializer } = this; - const context = this.getContext(settings, t); - return serializer.stringify(value, context); - } - - public display(settings: GuildEntity, t: TFunction): string { - const { serializer } = this; - const context = this.getContext(settings, t); - - if (this.array) { - const values = settings[this.property] as readonly any[]; - return isNullish(values) || values.length === 0 - ? 'None' - : `[ ${values.map((value) => serializer.stringify(value, context)).join(' | ')} ]`; - } - - const value = settings[this.property]; - return isNullish(value) ? t(LanguageKeys.Commands.Admin.ConfSettingNotSet) : serializer.stringify(value, context); - } - - public getContext(settings: GuildEntity, language: TFunction): SerializerUpdateContext { - const context: SerializerUpdateContext = { - entity: settings, - guild: settings.guild, - t: language, - entry: this - }; - - return context; - } -} - -export type ConfigurableKeyValueOptions = Pick< - SchemaKey, - 'description' | 'maximum' | 'minimum' | 'inclusive' | 'name' | 'property' | 'target' | 'type' | 'array' | 'default' | 'dashboardOnly' ->; diff --git a/src/lib/database/settings/structures/AdderManager.ts b/src/lib/database/settings/structures/AdderManager.ts deleted file mode 100644 index a01bd59cf4f..00000000000 --- a/src/lib/database/settings/structures/AdderManager.ts +++ /dev/null @@ -1,126 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import { GuildSettings } from '#lib/database/keys'; -import type { IBaseManager } from '#lib/database/settings/base/IBaseManager'; -import { Adder } from '#lib/database/utils/Adder'; -import { isNullishOrZero, Nullish } from '@sapphire/utilities'; - -export type AdderKey = 'attachments' | 'capitals' | 'links' | 'messages' | 'newlines' | 'invites' | 'words' | 'reactions'; - -export class AdderManager implements IBaseManager { - public attachments: Adder | null = null; - public capitals: Adder | null = null; - public links: Adder | null = null; - public messages: Adder | null = null; - public newlines: Adder | null = null; - public invites: Adder | null = null; - public words: Adder | null = null; - public reactions: Adder | null = null; - - #settings: GuildEntity; - - public constructor(settings: GuildEntity) { - this.#settings = settings; - } - - public refresh(): void { - const settings = this.#settings; - this.attachments = this.makeAdder( - settings[GuildSettings.Selfmod.Attachments.ThresholdMaximum], // - settings[GuildSettings.Selfmod.Attachments.ThresholdDuration] - ); - this.capitals = this.makeAdder( - settings[GuildSettings.Selfmod.Capitals.ThresholdMaximum], - settings[GuildSettings.Selfmod.Capitals.ThresholdDuration] - ); - this.links = this.makeAdder( - settings[GuildSettings.Selfmod.Links.ThresholdMaximum], // - settings[GuildSettings.Selfmod.Links.ThresholdDuration] - ); - this.messages = this.makeAdder( - settings[GuildSettings.Selfmod.Messages.ThresholdMaximum], - settings[GuildSettings.Selfmod.Messages.ThresholdDuration] - ); - this.newlines = this.makeAdder( - settings[GuildSettings.Selfmod.NewLines.ThresholdMaximum], - settings[GuildSettings.Selfmod.NewLines.ThresholdDuration] - ); - this.invites = this.makeAdder( - settings[GuildSettings.Selfmod.Invites.ThresholdMaximum], - settings[GuildSettings.Selfmod.Invites.ThresholdDuration] - ); - this.words = this.makeAdder( - settings[GuildSettings.Selfmod.Filter.ThresholdMaximum], - settings[GuildSettings.Selfmod.Filter.ThresholdDuration] - ); - this.reactions = this.makeAdder( - settings[GuildSettings.Selfmod.Reactions.ThresholdMaximum], - settings[GuildSettings.Selfmod.Reactions.ThresholdDuration] - ); - } - - public onPatch(): void { - const settings = this.#settings; - this.attachments = this.updateAdder( - this.attachments, - settings[GuildSettings.Selfmod.Attachments.ThresholdMaximum], - settings[GuildSettings.Selfmod.Attachments.ThresholdDuration] - ); - this.capitals = this.updateAdder( - this.capitals, - settings[GuildSettings.Selfmod.Capitals.ThresholdMaximum], - settings[GuildSettings.Selfmod.Capitals.ThresholdDuration] - ); - this.links = this.updateAdder( - this.links, - settings[GuildSettings.Selfmod.Links.ThresholdMaximum], - settings[GuildSettings.Selfmod.Links.ThresholdDuration] - ); - this.messages = this.updateAdder( - this.messages, - settings[GuildSettings.Selfmod.Messages.ThresholdMaximum], - settings[GuildSettings.Selfmod.Messages.ThresholdDuration] - ); - this.newlines = this.updateAdder( - this.newlines, - settings[GuildSettings.Selfmod.NewLines.ThresholdMaximum], - settings[GuildSettings.Selfmod.NewLines.ThresholdDuration] - ); - this.invites = this.updateAdder( - this.invites, - settings[GuildSettings.Selfmod.Invites.ThresholdMaximum], - settings[GuildSettings.Selfmod.Invites.ThresholdDuration] - ); - this.words = this.updateAdder( - this.words, - settings[GuildSettings.Selfmod.Filter.ThresholdMaximum], - settings[GuildSettings.Selfmod.Filter.ThresholdDuration] - ); - this.reactions = this.updateAdder( - this.reactions, - settings[GuildSettings.Selfmod.Reactions.ThresholdMaximum], - settings[GuildSettings.Selfmod.Reactions.ThresholdDuration] - ); - } - - public onRemove(): void { - this.attachments = null; - this.capitals = null; - this.links = null; - this.messages = null; - this.newlines = null; - this.invites = null; - this.words = null; - this.reactions = null; - } - - private makeAdder(maximum: number | Nullish, duration: number | Nullish) { - if (isNullishOrZero(maximum) || isNullishOrZero(duration)) return null; - return new Adder(maximum, duration, true); - } - - private updateAdder(adder: Adder | null, maximum: number | Nullish, duration: number | Nullish) { - if (isNullishOrZero(maximum) || isNullishOrZero(duration)) return null; - if (!adder || adder.maximum !== maximum || adder.duration !== duration) return new Adder(maximum, duration, true); - return adder; - } -} diff --git a/src/lib/database/settings/structures/PermissionNodeManager.ts b/src/lib/database/settings/structures/PermissionNodeManager.ts deleted file mode 100644 index a02bf47bd43..00000000000 --- a/src/lib/database/settings/structures/PermissionNodeManager.ts +++ /dev/null @@ -1,238 +0,0 @@ -import type { GuildEntity, PermissionsNode } from '#lib/database/entities/GuildEntity'; -import { GuildSettings } from '#lib/database/keys'; -import { matchAny } from '#lib/database/utils/matchers/Command'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraCommand } from '#lib/structures'; -import { Collection } from '@discordjs/collection'; -import { UserError } from '@sapphire/framework'; -import { arrayStrictEquals } from '@sapphire/utilities'; -import { GuildMember, Role, User } from 'discord.js'; -import type { IBaseManager } from '../base/IBaseManager'; - -export const enum PermissionNodeAction { - Allow, - Deny -} - -type Nodes = readonly PermissionsNode[]; -type Node = Nodes[number]; - -export class PermissionNodeManager implements IBaseManager { - #settings: GuildEntity; - #previous: Nodes = []; - - private sorted = new Collection(); - - public constructor(settings: GuildEntity) { - this.#settings = settings; - } - - public run(member: GuildMember, command: SkyraCommand) { - return this.runUser(member, command) ?? this.runRole(member, command); - } - - public has(roleId: string) { - return this.sorted.has(roleId); - } - - public add(target: Role | GuildMember | User, command: string, action: PermissionNodeAction) { - const key = target instanceof Role ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; - - const nodes = this.#settings[key]; - const nodeIndex = nodes.findIndex((n) => n.id === target.id); - - if (nodeIndex === -1) { - const node: Node = { - id: target.id, - allow: action === PermissionNodeAction.Allow ? [command] : [], - deny: action === PermissionNodeAction.Deny ? [command] : [] - }; - - this.#settings[key].push(node); - } else { - const previous = nodes[nodeIndex]; - if ( - (action === PermissionNodeAction.Allow && previous.allow.includes(command)) || - (action === PermissionNodeAction.Deny && previous.deny.includes(command)) - ) { - throw new UserError({ identifier: LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, context: { command } }); - } - - const node: Node = { - id: target.id, - allow: action === PermissionNodeAction.Allow ? previous.allow.concat(command) : previous.allow, - deny: action === PermissionNodeAction.Deny ? previous.deny.concat(command) : previous.deny - }; - - this.#settings[key][nodeIndex] = node; - } - } - - public remove(target: Role | GuildMember | User, command: string, action: PermissionNodeAction) { - const key = target instanceof Role ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; - - const nodes = this.#settings[key]; - - const nodeIndex = nodes.findIndex((n) => n.id === target.id); - if (nodeIndex === -1) throw new UserError({ identifier: LanguageKeys.Commands.Management.PermissionNodesNodeNotExists }); - - const property = this.getName(action); - const previous = nodes[nodeIndex]; - const commandIndex = previous[property].indexOf(command); - if (commandIndex === -1) throw new UserError({ identifier: LanguageKeys.Commands.Management.PermissionNodesCommandNotExists }); - - const node: Nodes[number] = { - id: target.id, - allow: 'allow' ? previous.allow.slice() : previous.allow, - deny: 'deny' ? previous.deny.slice() : previous.deny - }; - node[property].splice(commandIndex, 1); - - this.#settings[key].splice(nodeIndex, 1, node); - } - - public reset(target: Role | GuildMember | User) { - const key = target instanceof Role ? GuildSettings.Permissions.Roles : GuildSettings.Permissions.Users; - - const nodes = this.#settings[key]; - const nodeIndex = nodes.findIndex((n) => n.id === target.id); - - if (nodeIndex === -1) { - throw new UserError({ identifier: LanguageKeys.Commands.Management.PermissionNodesNodeNotExists, context: { target } }); - } - - this.#settings[key].splice(nodeIndex, 1); - } - - public refresh() { - const nodes = this.#settings[GuildSettings.Permissions.Roles]; - this.#previous = nodes.slice(); - - if (nodes.length === 0) { - this.sorted.clear(); - return; - } - - // Generate sorted data and detect useless nodes to remove - const { pendingToAdd, pendingToRemove } = this.generateSorted(nodes); - - // Set up everything - const sorted = new Collection(); - for (const pending of pendingToAdd) { - sorted.set(pending.id, { - allow: new Set(pending.allow), - deny: new Set(pending.deny) - }); - } - - this.sorted = sorted; - - // Delete redundant entries - for (const removedItem of pendingToRemove) { - const removedIndex = nodes.findIndex((element) => element.id === removedItem); - if (removedIndex !== -1) nodes.splice(removedIndex, 1); - } - } - - public onPatch() { - const nodes = this.#settings[GuildSettings.Permissions.Roles]; - if (!arrayStrictEquals(this.#previous, nodes)) this.refresh(); - } - - public onRemove(): void { - this.sorted.clear(); - this.#previous = []; - } - - private runUser(member: GuildMember, command: SkyraCommand) { - // Assume sorted data - const permissionNodeRoles = this.#settings.permissionsUsers; - const memberId = member.id; - for (const node of permissionNodeRoles) { - if (node.id !== memberId) continue; - if (matchAny(node.allow, command)) return true; - if (matchAny(node.deny, command)) return false; - } - - return null; - } - - private runRole(member: GuildMember, command: SkyraCommand) { - const roles = member.roles.cache; - - // Assume sorted data - for (const [id, node] of this.sorted.entries()) { - if (!roles.has(id)) continue; - if (matchAny(node.allow, command)) return true; - if (matchAny(node.deny, command)) return false; - } - - return null; - } - - private generateSorted(nodes: readonly PermissionsNode[]) { - const { pendingToRemove, sortedRoles } = this.getSortedRoles(nodes); - - const sortedNodes: PermissionsNode[] = []; - for (const sortedRole of sortedRoles.values()) { - const node = nodes.find((node) => node.id === sortedRole.id); - if (node === undefined) continue; - - sortedNodes.push(node); - } - - return { - pendingToAdd: sortedNodes, - pendingToRemove - }; - } - - private getSortedRoles(rawNodes: readonly PermissionsNode[]) { - const ids = new Set(rawNodes.map((rawNode) => rawNode.id)); - - // I know we should never rely on private methods, however, `Guild#_sortedRoles` - // exists in v13 and is called every time the `Role#position` getter is called, - // so to avoid doing a very expensive call for each role, we will call this once - // and then handle whatever it returns. This has a cost of O(n * log(n)), which is - // pretty good. For 255 role permission nodes, this would do 1,413 checks. - // - // An alternative is to filter, then map the roles by their position, but that has - // a cost of O(n) * O(n * log(n)), which is really bad, with a total amount of - // 360,320 checks. - // - // Although that's also theoretical, `Guild#_sortedRoles` calls `Util.discordSort` - // with the role cache, which besides checking for positions, also does up to 4 - // string operations (`String#slice()` and `Number(string)` in each), which is - // already a performance killer. - // - // eslint-disable-next-line @typescript-eslint/dot-notation - const roles = this.#settings.guild['_sortedRoles']() - // Set#delete returns `true` when the entry exists, so we will use this - // to automatically sweep the valid entries and leave the invalid ones out - .filter((role) => ids.delete(role.id)); - - // Guild#_sortedRoles sorts in the inverse order, so we need to turn it into an array and reverse it: - const reversed = [...roles.values()].reverse(); - - return { - pendingToRemove: ids, - sortedRoles: reversed - }; - } - - private getName(type: PermissionNodeAction) { - switch (type) { - case PermissionNodeAction.Allow: - return 'allow'; - case PermissionNodeAction.Deny: - return 'deny'; - default: - throw new Error('Unreachable'); - } - } -} - -interface PermissionsManagerNode { - allow: Set; - deny: Set; -} diff --git a/src/lib/database/settings/structures/Serializer.ts b/src/lib/database/settings/structures/Serializer.ts deleted file mode 100644 index 20ce63ea9aa..00000000000 --- a/src/lib/database/settings/structures/Serializer.ts +++ /dev/null @@ -1,168 +0,0 @@ -import type { GuildEntity } from '#lib/database/entities/GuildEntity'; -import type { SchemaKey } from '#lib/database/settings/schema/SchemaKey'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { translate } from '#lib/i18n/translate'; -import type { SkyraArgs } from '#lib/structures'; -import type { O } from '#utils/constants'; -import { AliasPiece, AliasPieceOptions, ArgumentError, UserError } from '@sapphire/framework'; -import type { Awaitable } from '@sapphire/utilities'; -import type { Guild } from 'discord.js'; -import type { TFunction } from 'i18next'; - -export interface Ok { - success: true; - value: T; -} - -export interface Err { - success: false; - error: E; -} - -export type Result = Ok | Err; - -export type SerializerResult = Result; -export type AsyncSerializerResult = Promise>; - -export abstract class Serializer extends AliasPiece { - /** - * Resolves a string into a value. - * @param value The value to parsed. - * @param context The context for the key. - */ - public abstract parse(args: Serializer.Args, context: SerializerUpdateContext): SerializerResult | AsyncSerializerResult; - - /** - * Check whether or not the value is valid. - * @param value The value to check. - */ - public abstract isValid(value: T, context: SerializerUpdateContext): Awaitable; - - /** - * The stringify method to be overwritten in actual Serializers - * @param data The data to stringify - * @param guild The guild given for context in this call - */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public stringify(data: T, _context: SerializerUpdateContext): string { - return String(data); - } - - /** - * Check if two entries are equals. - * @param left The left value to check against. - * @param right The right value to check against. - */ - public equals(left: T, right: T): boolean { - return left === right; - } - - /** - * Returns a SerializerResult from a Result. - * @param args The Args parser. - * @param value The result to handle. - */ - protected result(args: Serializer.Args, value: Result): SerializerResult { - return value.success ? value : this.errorFromArgument(args, value.error); - } - - /** - * Returns a successful result. - * @param value The value to return. - */ - protected ok(value: T): SerializerResult { - return { success: true, value }; - } - - /** - * Returns an erroneous result. - * @param error The message of the error. - */ - protected error(error: string): SerializerResult { - return { success: false, error: new Error(error) }; - } - - protected errorFromArgument(args: Serializer.Args, error: UserError): SerializerResult; - /** - * Returns an erroneous result given an ArgumentError. - * @param args The Args parser. - * @param error The error returned by the Argument. - */ - protected errorFromArgument(args: Serializer.Args, error: ArgumentError): SerializerResult; - protected errorFromArgument(args: Serializer.Args, error: UserError | ArgumentError): SerializerResult { - const argument = error instanceof ArgumentError ? error.argument.name : 'Unknown'; - const identifier = translate(error.identifier); - return this.error(args.t(identifier, { ...error, ...(error.context as O), argument })); - } - - /** - * Check the boundaries of a key's minimum or maximum. - * @param length The value to check - * @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 }, t }: SerializerUpdateContext): SerializerResult { - if (minimum !== null && maximum !== null) { - if ((length >= minimum && length <= maximum && inclusive) || (length > minimum && length < maximum && !inclusive)) { - return this.ok(value); - } - - if (minimum === maximum) { - return this.error( - t(inclusive ? LanguageKeys.Serializers.MinMaxExactlyInclusive : LanguageKeys.Serializers.MinMaxExactlyExclusive, { - name, - min: minimum - }) - ); - } - - return this.error( - t(inclusive ? LanguageKeys.Serializers.MinMaxBothInclusive : LanguageKeys.Serializers.MinMaxBothExclusive, { - name, - min: minimum, - max: maximum - }) - ); - } - - if (minimum !== null) { - if ((length >= minimum && inclusive) || (length > minimum && !inclusive)) { - return this.ok(value); - } - - return this.error( - t(inclusive ? LanguageKeys.Serializers.MinMaxMinInclusive : LanguageKeys.Serializers.MinMaxMinExclusive, { - name, - min: minimum - }) - ); - } - - if (maximum !== null) { - if ((length <= maximum && inclusive) || (length < maximum && !inclusive)) { - return this.ok(value); - } - - return this.error( - t(inclusive ? LanguageKeys.Serializers.MinMaxMaxInclusive : LanguageKeys.Serializers.MinMaxMaxExclusive, { - name, - max: maximum - }) - ); - } - - return this.ok(value); - } -} - -export namespace Serializer { - export type Options = AliasPieceOptions; - export type Args = SkyraArgs; -} - -export interface SerializerUpdateContext { - entry: SchemaKey; - entity: GuildEntity; - guild: Guild; - t: TFunction; -} diff --git a/src/lib/database/settings/structures/SerializerStore.ts b/src/lib/database/settings/structures/SerializerStore.ts deleted file mode 100644 index 7d74b205359..00000000000 --- a/src/lib/database/settings/structures/SerializerStore.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AliasStore } from '@sapphire/framework'; -import { Serializer } from './Serializer'; - -export class SerializerStore extends AliasStore> { - /** - * Constructs our SerializerStore for use in Skyra. - * @param client The client that instantiates this store - */ - public constructor() { - super(Serializer as any, { name: 'serializers' }); - this.container.client.stores.register(this); - } -} diff --git a/src/lib/database/settings/structures/Task.ts b/src/lib/database/settings/structures/Task.ts deleted file mode 100644 index 2eb0a59bccf..00000000000 --- a/src/lib/database/settings/structures/Task.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { PartialResponseValue } from '#lib/database/entities'; -import { Piece, PieceOptions } from '@sapphire/framework'; -import type { Awaitable } from '@sapphire/utilities'; - -export abstract class Task extends Piece { - /** - * The run method to be overwritten in actual Task pieces - * @param data The data - */ - public abstract run(data: unknown): Awaitable; -} - -export namespace Task { - export type Options = PieceOptions; -} diff --git a/src/lib/database/settings/structures/TaskStore.ts b/src/lib/database/settings/structures/TaskStore.ts deleted file mode 100644 index 5e5c9a0defa..00000000000 --- a/src/lib/database/settings/structures/TaskStore.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Store } from '@sapphire/framework'; -import { Task } from './Task'; - -export class TaskStore extends Store { - /** - * Constructs our TaskStore for use in Skyra - * @param client The client that instantiates this store - */ - public constructor() { - super(Task as any, { name: 'tasks' }); - this.container.client.stores.register(this); - } -} diff --git a/src/lib/database/settings/structures/collections/AliasedCollection.ts b/src/lib/database/settings/structures/collections/AliasedCollection.ts deleted file mode 100644 index 2445877685a..00000000000 --- a/src/lib/database/settings/structures/collections/AliasedCollection.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Collection } from '@discordjs/collection'; - -export class AliasedCollection extends Collection { - /** - * The aliases for this collection: - */ - public readonly aliases = new Collection(); - - public get(key: K): V | undefined { - return super.get(key) ?? this.aliases.get(key); - } -} diff --git a/src/lib/database/settings/structures/collections/GuildSettingsCollection.ts b/src/lib/database/settings/structures/collections/GuildSettingsCollection.ts deleted file mode 100644 index 4effeaf9071..00000000000 --- a/src/lib/database/settings/structures/collections/GuildSettingsCollection.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { GuildEntity } from '#lib/database/entities/GuildEntity'; -import { SettingsCollection, SettingsCollectionCallback } from '#lib/database/settings/base/SettingsCollection'; -import { container } from '@sapphire/framework'; - -export interface GuildSettingsCollectionCallback extends SettingsCollectionCallback {} - -export class GuildSettingsCollection extends SettingsCollection { - public async fetch(key: string): Promise { - const { guilds } = container.db; - const existing = await guilds.findOne(key); - if (existing) { - this.set(key, existing); - return existing; - } - - const created = new GuildEntity(); - created.id = key; - this.set(key, created); - return created; - } -} diff --git a/src/lib/database/utils/Adder.ts b/src/lib/database/utils/Adder.ts deleted file mode 100644 index f88653bec69..00000000000 --- a/src/lib/database/utils/Adder.ts +++ /dev/null @@ -1,116 +0,0 @@ -export class AdderError extends Error { - /** - * The amount of points the adder reached when it threw this error. - */ - public readonly amount: number; - - /** - * Constructs an AdderError instance. - * @param message The message to be passed to the Error constructor - * @param amount The amount of points the adder reached when it threw this error - */ - public constructor(message: string, amount: number) { - super(message); - this.amount = amount; - } -} - -export class Adder extends Array<{ id: T; end: number }> { - /** - * The maximum amount of entries in this instance. - */ - public maximum: number; - - /** - * The duration for each entry in this instance. - */ - public duration: number; - - /** - * Whether or not the Adder should auto-remove when it reaches its maximum. - */ - public autoRemove: boolean; - - /** - * Constructs a new Adder instance. - * @param maximum The maximum amount of entries that can be stored, this is inclusive. - * @param duration The duration of which entries expire. - * @param autoRemove Whether or not the Adder should automatically remove when a set of items reaches its maximum. - */ - public constructor(maximum: number, duration: number, autoRemove = false) { - super(); - this.maximum = maximum; - this.duration = duration; - this.autoRemove = autoRemove; - } - - /** - * Add a new entry to the adder, throws if it reaches its maximum. - * @param id The element to push - * @param times The amount of times to push it. - * @returns The amount of elements with the same id after the modifications. - */ - public add(id: T, times = 1) { - // Perform a sweep to remove expired elements, then count. - this.sweep(); - const amount = this.count(id) + times; - - // Push the elements to the end. - for (let i = 0; i < times; i++) { - this.push({ id, end: Date.now() + this.duration }); - } - - // If maximum, throw. - if (amount >= this.maximum) { - if (this.autoRemove) this.remove(id); - throw new AdderError('Limit Reached', amount); - } - - return amount; - } - - /** - * Remove all entries matching an ID. - * @param id The ID to remove. - * @returns The amount of elements removed. - */ - public remove(id: T) { - let deleted = 0; - let i = 0; - let entry: { id: T; end: number }; - - while (i < this.length) { - entry = this[i]; - if (entry.id === id) { - this.splice(i, 1); - deleted++; - } else { - i++; - } - } - - return deleted; - } - - /** - * Count all entries with the same ID. - * @param id The ID to match against. - * @returns The amount of entries matching the same ID. - */ - public count(id: T) { - return this.reduce((count, entry) => (entry.id === id ? count + 1 : count), 0); - } - - /** - * Sweep all expired entries. - * @returns The amount of deleted entries. - */ - public sweep() { - const now = Date.now(); - let i = 0; - while (i < this.length && this[i].end <= now) i++; - if (i !== 0) this.splice(0, i); - - return i; - } -} diff --git a/src/lib/database/utils/DbSet.ts b/src/lib/database/utils/DbSet.ts deleted file mode 100644 index 3f0afc9e40e..00000000000 --- a/src/lib/database/utils/DbSet.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { BrandingColors } from '#utils/constants'; -import type { Message } from 'discord.js'; -import type { Connection, FindConditions, FindManyOptions, Repository } from 'typeorm'; -import { connect } from '../database.config'; -import { BannerEntity } from '../entities/BannerEntity'; -import { GuildEntity } from '../entities/GuildEntity'; -import { GuildSubscriptionEntity } from '../entities/GuildSubscriptionEntity'; -import { ModerationEntity } from '../entities/ModerationEntity'; -import { RpgBattleEntity } from '../entities/RpgBattleEntity'; -import { RpgClassEntity } from '../entities/RpgClassEntity'; -import { RpgGuildEntity } from '../entities/RpgGuildEntity'; -import { RpgGuildRankEntity } from '../entities/RpgGuildRankEntity'; -import { RpgItemEntity } from '../entities/RpgItemEntity'; -import { RpgUserEntity } from '../entities/RpgUserEntity'; -import { RpgUserItemEntity } from '../entities/RpgUserItemEntity'; -import { ScheduleEntity } from '../entities/ScheduleEntity'; -import { SuggestionEntity } from '../entities/SuggestionEntity'; -import { TwitchSubscriptionEntity } from '../entities/TwitchSubscriptionEntity'; -import { UserCooldownEntity } from '../entities/UserCooldownEntity'; -import { UserGameIntegrationEntity } from '../entities/UserGameIntegrationEntity'; -import { UserProfileEntity } from '../entities/UserProfileEntity'; -import { ClientRepository } from '../repositories/ClientRepository'; -import { MemberRepository } from '../repositories/MemberRepository'; -import { UserRepository } from '../repositories/UserRepository'; - -export class DbSet { - public readonly connection: Connection; - public readonly banners: Repository; - public readonly clients: ClientRepository; - public readonly guilds: Repository; - public readonly guildSubscriptions: Repository; - public readonly members: MemberRepository; - public readonly moderations: Repository; - public readonly rpgBattles: Repository; - public readonly rpgClasses: Repository; - public readonly rpgGuildRanks: Repository; - public readonly rpgGuilds: Repository; - public readonly rpgItems: Repository; - public readonly rpgUserItems: Repository; - public readonly rpgUsers: Repository; - public readonly schedules: Repository; - public readonly suggestions: Repository; - public readonly twitchSubscriptions: Repository; - public readonly users: UserRepository; - public readonly userProfiles: Repository; - public readonly userGameIntegrations: Repository; - public readonly userCooldowns: Repository; - - private constructor(connection: Connection) { - this.connection = connection; - this.banners = this.connection.getRepository(BannerEntity); - this.clients = this.connection.getCustomRepository(ClientRepository); - this.guilds = this.connection.getRepository(GuildEntity); - this.guildSubscriptions = this.connection.getRepository(GuildSubscriptionEntity); - this.members = this.connection.getCustomRepository(MemberRepository); - this.moderations = this.connection.getRepository(ModerationEntity); - this.rpgBattles = this.connection.getRepository(RpgBattleEntity); - this.rpgClasses = this.connection.getRepository(RpgClassEntity); - this.rpgGuildRanks = this.connection.getRepository(RpgGuildRankEntity); - this.rpgGuilds = this.connection.getRepository(RpgGuildEntity); - this.rpgItems = this.connection.getRepository(RpgItemEntity); - this.rpgUserItems = this.connection.getRepository(RpgUserItemEntity); - this.rpgUsers = this.connection.getRepository(RpgUserEntity); - this.schedules = this.connection.getRepository(ScheduleEntity); - this.suggestions = this.connection.getRepository(SuggestionEntity); - this.twitchSubscriptions = this.connection.getRepository(TwitchSubscriptionEntity); - this.users = this.connection.getCustomRepository(UserRepository); - this.userProfiles = this.connection.getRepository(UserProfileEntity); - this.userGameIntegrations = this.connection.getRepository(UserGameIntegrationEntity); - this.userCooldowns = this.connection.getRepository(UserCooldownEntity); - } - - public async fetchModerationDirectMessageEnabled(id: string) { - const entry = await this.users.findOne(id, { select: ['moderationDM'] }); - return entry?.moderationDM ?? true; - } - - /** - * Finds entities that match given options. - */ - public fetchModerationEntry(options?: FindManyOptions): Promise; - - /** - * Finds entities that match given conditions. - */ - // eslint-disable-next-line @typescript-eslint/unified-signatures - public fetchModerationEntry(conditions?: FindConditions): Promise; - public async fetchModerationEntry(optionsOrConditions?: FindConditions | FindManyOptions) { - return this.moderations.findOne(optionsOrConditions as any); - } - - /** - * Finds entities that match given options. - */ - public fetchModerationEntries(options?: FindManyOptions): Promise; - - /** - * Finds entities that match given conditions. - */ - // eslint-disable-next-line @typescript-eslint/unified-signatures - public fetchModerationEntries(conditions?: FindConditions): Promise; - public async fetchModerationEntries(optionsOrConditions?: FindConditions | FindManyOptions) { - return this.moderations.find(optionsOrConditions as any); - } - - public async fetchColor(message: Message) { - const user = await this.userProfiles.findOne(message.author.id, { select: ['color'] }); - - return user?.color || message.member?.displayColor || BrandingColors.Primary; - } - - public static instance: DbSet | null = null; - private static connectPromise: Promise | null; - - public static async connect() { - return (DbSet.instance ??= await (DbSet.connectPromise ??= connect().then((connection) => { - DbSet.connectPromise = null; - return new DbSet(connection); - }))); - } -} diff --git a/src/lib/database/utils/Transformers.ts b/src/lib/database/utils/Transformers.ts deleted file mode 100644 index 203408eeb23..00000000000 --- a/src/lib/database/utils/Transformers.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ensure } from '#lib/customCommands'; -import { isNullish } from '@sapphire/utilities'; -import type { ValueTransformer } from 'typeorm'; -import type { CustomCommand } from '../entities/GuildEntity'; - -export const kBigIntTransformer: ValueTransformer = { - from: (value) => (isNullish(value) ? value : Number(value as string)), - to: (value) => (isNullish(value) ? value : String(value as number)) -}; - -export const kTagsTransformer: ValueTransformer = { - from: (values: RawCustomCommand[]): CustomCommand[] => values.map((value) => ({ ...value, content: ensure(value.content) })), - to: (values: CustomCommand[]): RawCustomCommand[] => values.map((value) => ({ ...value, content: value.content.toString() })) -}; - -interface RawCustomCommand extends Omit { - content: string; -} diff --git a/src/lib/database/utils/matchers/Command.ts b/src/lib/database/utils/matchers/Command.ts deleted file mode 100644 index 7aeb7977b37..00000000000 --- a/src/lib/database/utils/matchers/Command.ts +++ /dev/null @@ -1,120 +0,0 @@ -import type { SkyraCommand } from '#lib/structures'; -import { CommandStore, container } from '@sapphire/framework'; -import { isNullish } from '@sapphire/utilities'; - -function getNameSpaceDetails(name: string): readonly [string | null, string] { - const index = name.indexOf('.'); - if (index === -1) return [null, name]; - return [name.substring(0, index), name.substring(index + 1)]; -} - -function matchName(name: string, command: SkyraCommand): boolean { - return command.name === name || command.aliases.some((alias) => alias === name); -} - -function matchNameAndCategory(name: string, category: string, command: SkyraCommand): boolean { - return command.category === category && matchName(name, command); -} - -function matchNameCategoryAndSubCategory(name: string, category: string, subCategory: string, command: SkyraCommand): boolean { - return command.subCategory === subCategory && matchNameAndCategory(name, category, command); -} - -export function matchAny(names: Iterable, command: SkyraCommand): boolean { - for (const name of names) { - if (match(name, command)) return true; - } - return false; -} - -export function match(name: string, command: SkyraCommand): boolean { - // Match All: - if (name === '*') return true; - - // Match Category: - const [category, categoryRest] = getNameSpaceDetails(name); - if (category === null) return matchName(name, command); - if (category !== command.category) return false; - if (categoryRest === '*') return true; - - // Match Sub-Category: - const [subCategory, subCategoryRest] = getNameSpaceDetails(categoryRest); - if (subCategory === null) return matchNameAndCategory(name, category, command); - if (subCategory !== command.subCategory) return false; - if (subCategoryRest === '*') return true; - - // Match Command: - return matchNameCategoryAndSubCategory(subCategoryRest, category, subCategory, command); -} - -function resolveCategory(commands: CommandStore, category: string): string | null { - const scanned = new Set(); - const lowerCaseCategory = category.toLowerCase(); - - for (const command of commands.values()) { - const value = command.category; - if (isNullish(value)) continue; - if (scanned.has(value)) continue; - if (value.toLowerCase() === lowerCaseCategory) return value; - scanned.add(value); - } - - return null; -} - -function resolveSubCategory(commands: CommandStore, category: string, subCategory: string): string | null { - const scanned = new Set(); - const lowerCaseSubCategory = subCategory.toLowerCase(); - - for (const command of commands.values()) { - if (command.category !== category) continue; - - const { subCategory } = command; - if (isNullish(subCategory)) continue; - - if (scanned.has(subCategory)) continue; - if (subCategory.toLowerCase() === lowerCaseSubCategory) return subCategory; - scanned.add(subCategory); - } - - return null; -} - -function resolveCommandWithCategory(commands: CommandStore, name: string, category: string): string | null { - const command = commands.get(name) as SkyraCommand | undefined; - if (command === undefined) return null; - return command.category === category ? command.name : null; -} - -function resolveCommandWithCategoryAndSubCategory(commands: CommandStore, name: string, category: string, subCategory: string): string | null { - const command = commands.get(name) as SkyraCommand | undefined; - if (command === undefined) return null; - return command.category === category && command.subCategory === subCategory ? command.name : null; -} - -export function resolve(name: string): string | null { - // Match All: - if (name === '*') return name; - - const parts = name.split('.'); - - // If it's an empty string, or has more than three parts, it is invalid: - if (parts.length === 0 || parts.length > 3) return null; - - const commands = container.stores.get('commands'); - - // Handle `${command}`: - if (parts.length === 1) return commands.get(name.toLowerCase())?.name ?? null; - - // Handle `${category}.${string}`: - const category = resolveCategory(commands, parts[0]); - if (category === null) return null; - if (parts.length === 2) return parts[1] === '*' ? `${category}.*` : resolveCommandWithCategory(commands, parts[1].toLowerCase(), category); - - // Handle `${category}.${category}.${string}`: - const subCategory = resolveSubCategory(commands, category, parts[1]); - if (subCategory === null) return null; - return parts[2] === '*' - ? `${category}.${subCategory}.*` - : resolveCommandWithCategoryAndSubCategory(commands, parts[2].toLowerCase(), category, subCategory); -} diff --git a/src/lib/database/utils/matchers/index.ts b/src/lib/database/utils/matchers/index.ts deleted file mode 100644 index c30585e2512..00000000000 --- a/src/lib/database/utils/matchers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as CommandMatcher from './Command'; diff --git a/src/lib/discord/Api.ts b/src/lib/discord/Api.ts deleted file mode 100644 index 983da8db589..00000000000 --- a/src/lib/discord/Api.ts +++ /dev/null @@ -1,1107 +0,0 @@ -import { container } from '@sapphire/framework'; - -export function api() { - return Reflect.get(container.client, 'api') as Api; -} - -interface Api { - channels: ApiChannels; - guilds: ApiGuilds; - invites: ApiInvites; - users: ApiUsers; - voice: ApiVoice; - webhooks: ApiWebhooks; -} - -interface ApiChannels { - (channelId: string): ApiChannelsChannel; -} - -/** - * @endpoint /channels/{channel.id} - */ -interface ApiChannelsChannel { - /** - * Get a channel by ID. Returns a channel object. - * @url https://discord.com/developers/docs/resources/channel#get-channel - */ - get: ApiMethods['get']; - - /** - * Update a channel's settings. Requires the `MANAGE_CHANNELS` permission for the guild. Returns a channel on - * success, and a 400 BAD REQUEST on invalid parameters. Fires a Channel Update Gateway event. If modifying a - * category, individual Channel Update events will fire for each child channel that also changes. - * @url https://discord.com/developers/docs/resources/channel#modify-channel - */ - put: ApiMethods['put']; - - /** - * Update a channel's settings. Requires the `MANAGE_CHANNELS` permission for the guild. Returns a channel on - * success, and a 400 BAD REQUEST on invalid parameters. Fires a Channel Update Gateway event. If modifying a - * category, individual Channel Update events will fire for each child channel that also changes. - * @url https://discord.com/developers/docs/resources/channel#modify-channel - */ - patch: ApiMethods['patch']; - - /** - * Delete a channel, or close a private message. Requires the `MANAGE_CHANNELS` permission for the guild. Deleting a - * category does not delete its child channels; they will have their `parent_id` removed and a Channel Update - * Gateway event will fire for each of them. Returns a channel object on success. Fires a Channel Delete Gateway - * event. - * @url https://discord.com/developers/docs/resources/channel#deleteclose-channel - */ - delete: ApiMethods['delete']; - - /** - * Messages endpoints. - */ - messages: ApiChannelsChannelMessages; - - /** - * Permissions endpoints. - */ - permissions: ApiChannelsChannelPermissions; - - /** - * Invites endpoints. - */ - invites: ApiChannelsChannelInvites; - - /** - * Typing endpoints. - */ - typing: ApiChannelsChannelTyping; - - /** - * Pins endpoints. - */ - pins: ApiChannelsChannelPins; - - /** - * Webhook endpoints. - */ - webhooks: ApiChannelsChannelWebhooks; -} - -/** - * @endpoint /channels/{channel.id}/messages - */ -interface ApiChannelsChannelMessages { - /** - * Returns the messages for a channel. If operating on a guild channel, this endpoint requires the `VIEW_CHANNEL` - * permission to be present on the current user. If the current user is missing the `READ_MESSAGE_HISTORY` - * permission in the channel then this will return no messages (since they cannot read the message history). Returns - * an array of message objects on success. - * @url https://discord.com/developers/docs/resources/channel#get-channel-messages - */ - get: ApiMethods['get']; - - /** - * Post a message to a guild text or DM channel. If operating on a guild channel, this endpoint requires the - * `SEND_MESSAGES` permission to be present on the current user. If the `tts` field is set to `true`, the - * `SEND_TTS_MESSAGES` permission is required for the message to be spoken. Returns a message object. Fires a - * Message Create Gateway event. See message formatting for more information on how to properly format messages. - * @url https://discord.com/developers/docs/resources/channel#create-message - */ - post: ApiMethods['post']; - - /** - * Bulk delete endpoints. - */ - 'bulk-delete': ApiChannelsChannelMessagesBulkDelete; - - (messageId: string): ApiChannelsChannelMessagesMessage; -} - -/** - * @endpoint /channels/{channel.id}/messages/{message.id} - */ -interface ApiChannelsChannelMessagesMessage { - /** - * Returns a specific message in the channel. If operating on a guild channel, this endpoint requires the - * `READ_MESSAGE_HISTORY` permission to be present on the current user. Returns a message object on success. - * @url https://discord.com/developers/docs/resources/channel#get-channel-message - */ - get: ApiMethods['get']; - - /** - * Edit a previously sent message. You can only edit messages that have been sent by the current user. Returns a - * message object. Fires a Message Update Gateway event. - * @url https://discord.com/developers/docs/resources/channel#edit-message - */ - patch: ApiMethods['patch']; - - /** - * Delete a message. If operating on a guild channel and trying to delete a message that was not sent by the current - * user, this endpoint requires the `MANAGE_MESSAGES` permission. Returns a 204 empty response on success. Fires a - * Message Delete Gateway event. - * @url https://discord.com/developers/docs/resources/channel#delete-message - */ - delete: ApiMethods['delete']; - - reactions: ApiChannelsChannelMessagesMessageReactions; -} - -/** - * @endpoint /channels/{channel.id}/messages/{message.id}/reactions - */ -interface ApiChannelsChannelMessagesMessageReactions { - /** - * Deletes all reactions on a message. This endpoint requires the `MANAGE_MESSAGES` permission to be present on the - * current user. - * @url https://discord.com/developers/docs/resources/channel#delete-all-reactions - */ - delete: ApiMethods['delete']; - - (emoji: string): ApiChannelsChannelMessagesMessageReactionsEmoji; - (emoji: string, userId: '@me'): ApiChannelsChannelMessagesMessageReactionsEmojiMe; - (emoji: string, userId: string): ApiChannelsChannelMessagesMessageReactionsEmojiUser; -} - -/** - * @endpoint /channels/{channel.id}/messages/{message.id}/reactions/{emoji} - */ -interface ApiChannelsChannelMessagesMessageReactionsEmoji { - /** - * Get a list of users that reacted with this emoji. Returns an array of user objects on success. - * @url https://discord.com/developers/docs/resources/channel#get-reactions - */ - get: ApiMethods['get']; - - /** - * Deletes all the reactions for a given emoji on a message. This endpoint requires the `MANAGE_MESSAGES` permission - * to be present on the current user. - * @url https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji - */ - delete: ApiMethods['delete']; - - (userId: '@me'): ApiChannelsChannelMessagesMessageReactionsEmojiMe; - >(userId: '@me', key: T): ApiChannelsChannelMessagesMessageReactionsEmojiMe[T]; - - (userId: string): ApiChannelsChannelMessagesMessageReactionsEmojiUser; - >( - userId: string, - key: T - ): ApiChannelsChannelMessagesMessageReactionsEmojiUser[T]; -} - -/** - * @endpoint /channels/{channel.id}/messages/{message.id}/reactions/{emoji}/@me - */ -interface ApiChannelsChannelMessagesMessageReactionsEmojiMe { - /** - * Create a reaction for the message. `emoji` takes the form of `name:id` for custom guild emoji, or Unicode - * characters. This endpoint requires the 'READ_MESSAGE_HISTORY' permission to be present on the current user. - * Additionally, if nobody else has reacted to the message using this emoji, this endpoint requires the - * `ADD_REACTIONS` permission to be present on the current user. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/channel#create-reaction - */ - put: ApiMethods['put']; - - /** - * Delete a reaction the current user has made for the message. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/channel#delete-own-reaction - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /channels/{channel.id}/messages/{message.id}/reactions/{emoji}/{user.id} - */ -interface ApiChannelsChannelMessagesMessageReactionsEmojiUser { - /** - * Deletes another user's reaction. This endpoint requires the `MANAGE_MESSAGES` permission to be present on the - * current user. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/channel#delete-user-reaction - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /channels/{channel.id}/messages/bulk-delete - */ -interface ApiChannelsChannelMessagesBulkDelete { - /** - * Delete multiple messages in a single request. This endpoint can only be used on guild channels and requires the - * `MANAGE_MESSAGES` permission. Returns a 204 empty response on success. Fires a Message Delete Bulk Gateway event. - * - * Any message IDs given that do not exist or are invalid will count towards the minimum and maximum message count - * (currently 2 and 100 respectively). Additionally, duplicated IDs will only be counted once. - */ - post: ApiMethods['post']; -} - -interface ApiChannelsChannelPermissions { - (permissionId: string): ApiChannelsChannelPermissionsPermission; -} - -/** - * @endpoint /channels/{channel.id}/permissions/{overwrite.id} - */ -interface ApiChannelsChannelPermissionsPermission { - /** - * Edit the channel permission overwrites for a user or role in a channel. Only usable for guild channels. Requires - * the `MANAGE_ROLES` permission. Returns a 204 empty response on success. For more information about permissions, - * see permissions. - * @url https://discord.com/developers/docs/resources/channel#edit-channel-permissions - */ - put: ApiMethods['put']; - - /** - * Delete a channel permission overwrite for a user or role in a channel. Only usable for guild channels. Requires - * the `MANAGE_ROLES` permission. Returns a 204 empty response on success. For more information about permissions, - * see permissions. - * @url https://discord.com/developers/docs/resources/channel#delete-channel-permission - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /channels/{channel.id}/invites - */ -interface ApiChannelsChannelInvites { - /** - * Returns a list of invite objects (with invite metadata) for the channel. Only usable for guild channels. Requires - * the `MANAGE_CHANNELS` permission. - * @url https://discord.com/developers/docs/resources/channel#get-channel-invites - */ - get: ApiMethods['get']; - - /** - * Create a new invite object for the channel. Only usable for guild channels. Requires the `CREATE_INSTANT_INVITE` - * permission. All JSON parameters for this route are optional, however the request body is not. If you are not - * sending any fields, you still have to send an empty JSON object (`{}`). Returns an invite object. - * @url https://discord.com/developers/docs/resources/channel#create-channel-invite - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /channels/{channel.id}/typing - */ -interface ApiChannelsChannelTyping { - /** - * Post a typing indicator for the specified channel. Generally bots should not implement this route. However, if a - * bot is responding to a command and expects the computation to take a few seconds, this endpoint may be called to - * let the user know that the bot is processing their message. Returns a 204 empty response on success. Fires a - * Typing Start Gateway event. - * @url https://discord.com/developers/docs/resources/channel#trigger-typing-indicator - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /channels/{channel.id}/pins - */ -interface ApiChannelsChannelPins { - /** - * Returns all pinned messages in the channel as an array of message objects. - * @url https://discord.com/developers/docs/resources/channel#get-pinned-messages - */ - get: ApiMethods['get']; - - (messageId: string): ApiChannelsChannelPinsMessage; -} - -/** - * @endpoint /channels/{channel.id}/pins/{message.id} - */ -interface ApiChannelsChannelPinsMessage { - /** - * Pin a message in a channel. Requires the `MANAGE_MESSAGES` permission. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/channel#add-pinned-channel-message - */ - put: ApiMethods['put']; - - /** - * Delete a pinned message in a channel. Requires the `MANAGE_MESSAGES` permission. Returns a 204 empty response on - * success. - * @url https://discord.com/developers/docs/resources/channel#delete-pinned-channel-message - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /channels/{channel.id}/webhooks - */ -interface ApiChannelsChannelWebhooks { - /** - * Returns a list of channel webhook objects. Requires the `MANAGE_WEBHOOKS` permission. - * @url https://discord.com/developers/docs/resources/webhook#get-channel-webhooks - */ - get: ApiMethods['get']; - - /** - * Create a new webhook. Requires the `MANAGE_WEBHOOKS` permission. Returns a webhook object on success. - * @url https://discord.com/developers/docs/resources/webhook#create-webhook - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /guilds - */ -interface ApiGuilds { - /** - * Create a new guild. Returns a guild object on success. Fires a Guild Create Gateway event. - * @url https://discord.com/developers/docs/resources/guild#create-guild - */ - post: ApiMethods['post']; - - (guildId: string): ApiGuildsGuild; - >(guildId: string, key: T): ApiGuildsGuild[T]; - , S extends R>(guildId: string, key: T, subKey: S): ApiGuildsGuild[T][S]; -} - -/** - * @endpoint /guilds/{guild.id} - */ -interface ApiGuildsGuild { - /** - * Returns the guild object for the given id. - * @url https://discord.com/developers/docs/resources/guild#get-guild - */ - get: ApiMethods['get']; - - /** - * Modify a guild's settings. Requires the `MANAGE_GUILD` permission. Returns the updated guild object on success. - * Fires a Guild Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#modify-guild - */ - patch: ApiMethods['patch']; - - /** - * Delete a guild permanently. User must be owner. Returns `204 No Content` on success. Fires a Guild Delete Gateway - * event. - * @url https://discord.com/developers/docs/resources/guild#delete-guild - */ - delete: ApiMethods['delete']; - - /** - * Channel endpoints. - */ - channels: ApiGuildsGuildChannels; - - /** - * Member endpoints. - */ - members: ApiGuildsGuildMembers; - - /** - * Ban endpoints. - */ - bans: ApiGuildsGuildBans; - - /** - * Role endpoints. - */ - roles: ApiGuildsGuildRoles; - - /** - * Prune endpoints. - */ - prune: ApiGuildsGuildPrune; - - /** - * Region endpoints. - */ - regions: ApiGuildsGuildRegions; - - /** - * Invite endpoints. - */ - invites: ApiGuildsGuildInvites; - - /** - * Integration endpoints. - */ - integrations: ApiGuildsGuildIntegrations; - - /** - * Emojis endpoints. - */ - emojis: ApiGuildsGuildEmojis; - - /** - * Webhook endpoints. - */ - webhooks: ApiGuildsGuildWebhooks; - - /** - * Embed endpoints. - */ - embed: ApiGuildsGuildEmbed; - - /** - * Vanity URL endpoints. - */ - 'vanity-url': ApiGuildsGuildVanityUrl; - - /** - * Widget endpoints. - */ - 'widget.png': ApiGuildsGuildWidget; - - /** - * Audit-Logs endpoints. - */ - 'audit-logs': ApiGuildsGuildAuditLogs; -} - -/** - * @endpoint /guilds/{guild.id}/channels - */ -interface ApiGuildsGuildChannels { - /** - * Returns a list of guild channel objects. - * @url https://discord.com/developers/docs/resources/guild#get-guild-channels - */ - get: ApiMethods['get']; - - /** - * Create a new channel object for the guild. Requires the `MANAGE_CHANNELS` permission. Returns the new channel - * object on success. Fires a Channel Create Gateway event. - * @url https://discord.com/developers/docs/resources/guild#create-guild-channel - */ - post: ApiMethods['post']; - - /** - * Modify the positions of a set of channel objects for the guild. Requires `MANAGE_CHANNELS` permission. Returns a - * 204 empty response on success. Fires multiple Channel Update Gateway events. - * @url https://discord.com/developers/docs/resources/guild#modify-guild-channel-positions - */ - patch: ApiMethods['patch']; -} - -/** - * @endpoint /guilds/{guild.id}/members - */ -interface ApiGuildsGuildMembers { - /** - * Returns a list of guild member objects that are members of the guild. - * @url https://discord.com/developers/docs/resources/guild#list-guild-members - */ - get: ApiMethods['get']; - - '@me': ApiGuildsGuildMembersMe; - - search: APiGuildsGuildMembersFetch; - - (memberId: '@me'): ApiGuildsGuildMembersMe; - >(memberId: '@me', key: T): ApiGuildsGuildMembersMe[T]; - - (memberId: string): ApiGuildsGuildMembersMember; - >(memberId: string, key: T): ApiGuildsGuildMembersMember[T]; -} - -/** - * @endpoint /guilds/{guild.id}/members/{user.id} - */ -interface ApiGuildsGuildMembersMember { - /** - * Returns a guild member object for the specified user. - * @url https://discord.com/developers/docs/resources/guild#get-guild-member - */ - get: ApiMethods['get']; - - /** - * Adds a user to the guild, provided you have a valid oauth2 access token for the user with the `guilds.join` - * scope. Returns a 201 Created with the guild member as the body, or 204 No Content if the user is already a member - * of the guild. Fires a Guild Member Add Gateway event. Requires the bot to have the `CREATE_INSTANT_INVITE` - * permission. - * @url https://discord.com/developers/docs/resources/guild#add-guild-member - */ - put: ApiMethods['put']; - - /** - * Modify attributes of a guild member. Returns a 204 empty response on success. Fires a Guild Member Update Gateway - * event. If the `channel_id` is set to null, this will force the target user to be disconnected from voice. - * @url https://discord.com/developers/docs/resources/guild#modify-guild-member - */ - patch: ApiMethods['patch']; - - /** - * Remove a member from a guild. Requires `KICK_MEMBERS` permission. Returns a 204 empty response on success. Fires - * a Guild Member Remove Gateway event. - * @url https://discord.com/developers/docs/resources/guild#remove-guild-member - */ - delete: ApiMethods['delete']; - - roles: ApiGuildsGuildMembersMemberRoles; -} - -interface ApiGuildsGuildMembersMemberRoles { - (roleId: string): ApiGuildsGuildMembersMemberRolesRole; -} - -/** - * @endpoint /guilds/{guild.id}/members/{user.id}/roles/{role.id} - */ -interface ApiGuildsGuildMembersMemberRolesRole { - /** - * Adds a role to a guild member. Requires the `MANAGE_ROLES` permission. Returns a 204 empty response on success. - * Fires a Guild Member Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#add-guild-member-role - */ - put: ApiMethods['put']; - - /** - * Removes a role from a guild member. Requires the `MANAGE_ROLES` permission. Returns a 204 empty response on - * success. Fires a Guild Member Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#remove-guild-member-role - */ - delete: ApiMethods['delete']; -} - -interface ApiGuildsGuildMembersMe { - nick: ApiGuildsGuildMembersMeNick; -} - -interface APiGuildsGuildMembersFetch { - get: ApiMethods['get']; -} - -/** - * @endpoint /guilds/{guild.id}/members/@me/nick - */ -interface ApiGuildsGuildMembersMeNick { - /** - * Modifies the nickname of the current user in a guild. Returns a 200 with the nickname on success. Fires a Guild - * Member Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#modify-current-user-nick - */ - patch: ApiMethods['patch']; -} - -/** - * @endpoint /guilds/{guild.id}/bans - */ -interface ApiGuildsGuildBans { - /** - * Returns a list of ban objects for the users banned from this guild. Requires the `BAN_MEMBERS` permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-bans - */ - get: ApiMethods['get']; - - (userId: string): ApiGuildsGuildBansUser; -} - -/** - * @endpoint /guilds/{guild.id}/bans/{user.id} - */ -interface ApiGuildsGuildBansUser { - /** - * Returns a ban object for the given user or a 404 not found if the ban cannot be found. Requires the `BAN_MEMBERS` - * permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-ban - */ - get: ApiMethods['get']; - - /** - * Create a guild ban, and optionally delete previous messages sent by the banned user. Requires the `BAN_MEMBERS` - * permission. Returns a 204 empty response on success. Fires a Guild Ban Add Gateway event. - * @url https://discord.com/developers/docs/resources/guild#create-guild-ban - */ - put: ApiMethods['put']; - - /** - * Remove the ban for a user. Requires the `BAN_MEMBERS` permissions. Returns a 204 empty response on success. Fires - * a Guild Ban Remove Gateway event. - * @url https://discord.com/developers/docs/resources/guild#remove-guild-ban - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /guilds/{guild.id}/roles - */ -interface ApiGuildsGuildRoles { - /** - * Returns a list of role objects for the guild. - * @url https://discord.com/developers/docs/resources/guild#get-guild-roles - */ - get: ApiMethods['get']; - - /** - * Create a new role for the guild. Requires the `MANAGE_ROLES` permission. Returns the new role object on success. - * Fires a Guild Role Create Gateway event. All JSON params are optional. - * @url https://discord.com/developers/docs/resources/guild#create-guild-role - */ - post: ApiMethods['post']; - - /** - * Modify the positions of a set of role objects for the guild. Requires the `MANAGE_ROLES` permission. Returns a - * list of all of the guild's role objects on success. Fires multiple Guild Role Update Gateway events. - * @url https://discord.com/developers/docs/resources/guild#modify-guild-role-positions - */ - patch: ApiMethods['patch']; - - (roleId: string): ApiGuildsGuildRolesRole; -} - -/** - * @endpoint /guilds/{guild.id}/roles/{role.id} - */ -interface ApiGuildsGuildRolesRole { - /** - * Delete a guild role. Requires the `MANAGE_ROLES` permission. Returns a 204 empty response on success. Fires a - * Guild Role Delete Gateway event. - * @url https://discord.com/developers/docs/resources/guild#delete-guild-role - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /guilds/{guild.id}/prune - */ -interface ApiGuildsGuildPrune { - /** - * Returns an object with one 'pruned' key indicating the number of members that would be removed in a prune - * operation. Requires the `KICK_MEMBERS` permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-prune-count - */ - get: ApiMethods['get']; - - /** - * Begin a prune operation. Requires the `KICK_MEMBERS` permission. Returns an object with one 'pruned' key - * indicating the number of members that were removed in the prune operation. For large guilds it's recommended to - * set the `compute_prune_count` option to `false`, forcing 'pruned' to `null`. Fires multiple Guild Member Remove - * Gateway events. - * @url https://discord.com/developers/docs/resources/guild#begin-guild-prune - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /guilds/{guild.id}/regions - */ -interface ApiGuildsGuildRegions { - /** - * Returns a list of voice region objects for the guild. Unlike the similar `/voice` route, this returns VIP servers - * when the guild is VIP-enabled. - * @url https://discord.com/developers/docs/resources/guild#get-guild-voice-regions - */ - get: ApiMethods['get']; -} - -/** - * @endpoint /guilds/{guild.id}/invites - */ -interface ApiGuildsGuildInvites { - /** - * Returns a list of invite objects (with invite metadata) for the guild. Requires the `MANAGE_GUILD` permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-invites - */ - get: ApiMethods['get']; -} - -/** - * @endpoint /guilds/{guild.id}/integrations - */ -interface ApiGuildsGuildIntegrations { - /** - * Returns a list of integration objects for the guild. Requires the `MANAGE_GUILD` permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-integrations - */ - get: ApiMethods['get']; - - /** - * Attach an integration object from the current user to the guild. Requires the `MANAGE_GUILD` permission. Returns - * a 204 empty response on success. Fires a Guild Integrations Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#create-guild-integration - */ - post: ApiMethods['post']; - - /** - * Modify the behavior and settings of an integration object for the guild. Requires the `MANAGE_GUILD` permission. - * Returns a 204 empty response on success. Fires a Guild Integrations Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#modify-guild-integration - */ - patch: ApiMethods['patch']; - - (integrationId: string): ApiGuildsGuildIntegrationsIntegration; - >(integrationId: string, key: T): ApiGuildsGuildIntegrationsIntegration[T]; -} - -/** - * @endpoint /guilds/{guild.id}/integrations/{integration.id} - */ -interface ApiGuildsGuildIntegrationsIntegration { - /** - * Delete the attached integration object for the guild. Requires the `MANAGE_GUILD` permission. Returns a 204 empty - * response on success. Fires a Guild Integrations Update Gateway event. - * @url https://discord.com/developers/docs/resources/guild#delete-guild-integration - */ - delete: ApiMethods['delete']; - - sync: ApiGuildsGuildIntegrationsIntegrationSync; -} - -/** - * @endpoint /guilds/{guild.id}/integrations/{integration.id}/sync - */ -interface ApiGuildsGuildIntegrationsIntegrationSync { - /** - * Sync an integration. Requires the `MANAGE_GUILD` permission. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/guild#sync-guild-integration - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /guilds/{guild.id}/emojis - */ -interface ApiGuildsGuildEmojis { - /** - * Returns a list of emoji objects for the given guild. - * @url https://discord.com/developers/docs/resources/emoji#list-guild-emojis - */ - get: ApiMethods['get']; - - /** - * Create a new emoji for the guild. Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. Returns the new emoji - * object on success. Fires a Guild Emojis Update Gateway event. - * @url https://discord.com/developers/docs/resources/emoji#create-guild-emoji - */ - post: ApiMethods['post']; - - (emoji: string): ApiGuildsGuildEmojisEmoji; -} - -/** - * @endpoint /guilds/{guild.id}/emojis/{emoji.id} - */ -interface ApiGuildsGuildEmojisEmoji { - /** - * Returns an emoji object for the given guild and emoji IDs. - * @url https://discord.com/developers/docs/resources/emoji#get-guild-emoji - */ - get: ApiMethods['get']; - - /** - * Modify the given emoji. Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. Returns the updated emoji object on - * success. Fires a Guild Emojis Update Gateway event. - * @url https://discord.com/developers/docs/resources/emoji#modify-guild-emoji - */ - patch: ApiMethods['patch']; - - /** - * Delete the given emoji. Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. Returns `204 No Content` on success. - * Fires a Guild Emojis Update Gateway event. - * @url https://discord.com/developers/docs/resources/emoji#delete-guild-emoji - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /guilds/{guild.id}/webhooks - */ -interface ApiGuildsGuildWebhooks { - /** - * Returns a list of guild webhook objects. Requires the `MANAGE_WEBHOOKS` permission. - * @url https://discord.com/developers/docs/resources/webhook#get-guild-webhooks - */ - get: ApiMethods['get']; -} - -/** - * @endpoint /guilds/{guild.id}/embed - */ -interface ApiGuildsGuildEmbed { - /** - * Returns the guild embed object. Requires the `MANAGE_GUILD` permission. - * @url https://discord.com/developers/docs/resources/guild#get-guild-embed - */ - get: ApiMethods['get']; - - /** - * Modify a guild embed object for the guild. All attributes may be passed in with JSON and modified. Requires the - * `MANAGE_GUILD` permission. Returns the updated guild embed object. - * @url https://discord.com/developers/docs/resources/guild#modify-guild-embed - */ - patch: ApiMethods['patch']; -} - -/** - * @endpoint /guilds/{guild.id}/vanity-url - */ -interface ApiGuildsGuildVanityUrl { - /** - * Returns a partial invite object for guilds with that feature enabled. Requires the `MANAGE_GUILD` permission. - * `code` will be null if a vanity url for the guild is not set. - * @url https://discord.com/developers/docs/resources/guild#get-guild-vanity-url - */ - get: ApiMethods['get']; -} - -/** - * /guilds/{guild.id}/widget.png - */ -interface ApiGuildsGuildWidget { - /** - * Returns a PNG image widget for the guild. Requires no permissions or authentication. The same documentation also - * applies to `embed.png`. - * @url https://discord.com/developers/docs/resources/guild#get-guild-widget-image - */ - get: ApiMethods['get']; -} - -/** - * /guilds/{guild.id}/audit-logs - */ -interface ApiGuildsGuildAuditLogs { - get: ApiMethods['get']; -} - -interface ApiInvites { - (inviteId: string): ApiInvitesInvite; -} - -/** - * @endpoint /invites/{invite.code} - */ -interface ApiInvitesInvite { - /** - * Returns an invite object for the given code. - * @url https://discord.com/developers/docs/resources/invite#get-invite - */ - get: ApiMethods['get']; - - /** - * Delete an invite. Requires the `MANAGE_CHANNELS` permission on the channel this invite belongs to, or - * `MANAGE_GUILD` to remove any invite across the guild. Returns an invite object on success. - * @url https://discord.com/developers/docs/resources/invite#delete-invite - */ - delete: ApiMethods['delete']; -} - -interface ApiUsers { - '@me': ApiUsersMe; - - (userId: '@me'): ApiUsersMe; - >(userId: '@me', key: T): ApiUsersMe[T]; - , S extends R>(userId: '@me', key: T, subKey: S): ApiUsersMe[T][S]; - - (userId: string): ApiUsersUser; -} - -/** - * @endpoint /users/{user.id} - */ -interface ApiUsersUser { - /** - * Returns a user object for a given user ID. - * @url https://discord.com/developers/docs/resources/user#get-user - */ - get: ApiMethods['get']; -} - -/** - * @endpoint /users/@me - */ -interface ApiUsersMe { - /** - * Returns the user object of the requester's account. For OAuth2, this requires the identify scope, which will - * return the object without an email, and optionally the email scope, which returns the object with an email. - * @url https://discord.com/developers/docs/resources/user#get-current-user - */ - get: ApiMethods['get']; - - /** - * Modify the requester's user account settings. Returns a user object on success. - * @url https://discord.com/developers/docs/resources/user#modify-current-user - */ - patch: ApiMethods['patch']; - - /** - * Guild-related endpoints. - */ - guilds: ApiUsersMeGuilds; - - /** - * Channel-related endpoints. - */ - channels: ApiUsersMeChannels; - - /** - * Connection-related endpoints. - */ - connections: ApiUsersMeConnections; -} - -/** - * @endpoint /users/@me/guilds - */ -interface ApiUsersMeGuilds { - /** - * Returns a list of partial guild objects the current user is a member of. Requires the `guilds` OAuth2 scope. - * @url https://discord.com/developers/docs/resources/user#get-current-user-guilds - */ - get: ApiMethods['get']; - - /** - * Guild-related endpoints. - */ - (guildId: string): ApiUsersMeGuildsGuild; -} - -/** - * @endpoint /users/@me/guilds/{guild.id} - */ -interface ApiUsersMeGuildsGuild { - /** - * Leave a guild. Returns a 204 empty response on success. - * @url https://discord.com/developers/docs/resources/user#leave-guild - */ - delete: ApiMethods['delete']; -} - -/** - * @endpoint /users/@me/channels - */ -interface ApiUsersMeChannels { - /** - * Returns a list of DM channel objects. For bots, this is no longer a supported method of getting recent DMs, and - * will return an empty array. - * @url https://discord.com/developers/docs/resources/user#get-user-dms - */ - get: ApiMethods['get']; - - /** - * Create a new DM channel with a user. Returns a DM channel object. - * @url https://discord.com/developers/docs/resources/user#create-dm - */ - post: ApiMethods['post']; -} - -interface ApiUsersMeConnections { - /** - * Returns a list of connection objects. Requires the `connections` OAuth2 scope. - * @url https://discord.com/developers/docs/resources/user#get-user-connections - */ - get: ApiMethods['get']; -} - -interface ApiVoice { - regions: ApiVoiceRegions; -} - -/** - * @endpoint /voice/regions - */ -interface ApiVoiceRegions { - /** - * Returns an array of voice region objects that can be used when creating servers. - * @url https://discord.com/developers/docs/resources/voice#list-voice-regions - */ - get: ApiMethods['get']; -} - -interface ApiWebhooks { - /** - * Access to a webhook by its ID. - */ - (webhookId: string): ApiWebhooksWebhook; -} - -/** - * @endpoint /webhooks/{webhook.id} - */ -interface ApiWebhooksWebhook { - /** - * Returns the new webhook object for the given id. - * @url https://discord.com/developers/docs/resources/webhook#get-webhook - */ - get: ApiMethods['get']; - - /** - * Modify a webhook. Requires the `MANAGE_WEBHOOKS` permission. Returns the updated webhook object on success. - * @url https://discord.com/developers/docs/resources/webhook#modify-webhook - */ - patch: ApiMethods['patch']; - - /** - * Delete a webhook permanently. User must be owner. Returns a 204 NO CONTENT response on success. - * @url https://discord.com/developers/docs/resources/webhook#delete-webhook - */ - delete: ApiMethods['delete']; - - /** - * Access to a token. - */ - (token: string): ApiWebhooksWebhookToken; -} - -/** - * @endpoint /webhooks/{webhook.id}/{webhook.token} - */ -interface ApiWebhooksWebhookToken { - /** - * Same as the non-token version, except this call does not require authentication and returns no user in the - * webhook object. - * @url https://discord.com/developers/docs/resources/webhook#get-webhook-with-token - */ - get: ApiMethods['get']; - - /** - * Same as the non-token version, except this call does not require authentication, does not accept a `channel_id` - * parameter in the body, and does not return a user in the webhook object. - * @url https://discord.com/developers/docs/resources/webhook#modify-webhook-with-token - */ - patch: ApiMethods['patch']; - - /** - * Same as the non-token version, except this call does not require authentication. - * @url https://discord.com/developers/docs/resources/webhook#delete-webhook-with-token - */ - delete: ApiMethods['delete']; - - /** - * Sends a message. - * @url https://discord.com/developers/docs/resources/webhook#execute-webhook - */ - post: ApiMethods['post']; - - /** - * The slack endpoint. - */ - slack: ApiWebhooksWebhookTokenSlack; - - /** - * The github endpoint. - */ - github: ApiWebhooksWebhookTokenGitHub; -} - -/** - * @endpoint /webhooks/{webhook.id}/{webhook.token}/slack - */ -interface ApiWebhooksWebhookTokenSlack { - /** - * Sends a message with the Slack format. - * @url https://discord.com/developers/docs/resources/webhook#execute-slackcompatible-webhook - */ - post: ApiMethods['post']; -} - -/** - * @endpoint /webhooks/{webhook.id}/{webhook.token}/github - */ -interface ApiWebhooksWebhookTokenGitHub { - /** - * Sends a message with the GitHub format. - * @url https://discord.com/developers/docs/resources/webhook#execute-githubcompatible-webhook - */ - post: ApiMethods['post']; -} - -interface ApiMethods { - // eslint-disable-next-line @typescript-eslint/ban-types - get(data?: { query?: {} }): Promise; - post(data: unknown): Promise; - put(data?: unknown): Promise; - patch(data: unknown): Promise; - delete(data?: { reason?: string }): Promise; -} - -type R = Exclude; diff --git a/src/lib/discord/SkyraEmbed.ts b/src/lib/discord/SkyraEmbed.ts deleted file mode 100644 index 14facb21970..00000000000 --- a/src/lib/discord/SkyraEmbed.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ZeroWidthSpace } from '#utils/constants'; -import { MessageEmbed } from 'discord.js'; - -export class SkyraEmbed extends MessageEmbed { - public splitFields(contentOrTitle: string | string[], rawContent?: string | string[]) { - if (typeof contentOrTitle === 'undefined') return this; - - let title: string; - let content: string | string[]; - if (typeof rawContent === 'undefined') { - title = ZeroWidthSpace; - content = contentOrTitle; - } else { - title = contentOrTitle as string; - content = rawContent; - } - - if (Array.isArray(content)) content = content.join('\n'); - if (title === ZeroWidthSpace && !this.description && content.length < 4096) { - this.description = content; - return this; - } - - let x: number; - let slice: string; - while (content.length) { - if (content.length < 1024) { - this.fields.push({ name: title, value: content, inline: false }); - return this; - } - - slice = content.slice(0, 1024); - x = slice.lastIndexOf('\n'); - if (x === -1) x = slice.lastIndexOf(' '); - if (x === -1) x = 1024; - - this.fields.push({ name: title, value: content.trim().slice(0, x), inline: false }); - content = content.slice(x + 1); - title = ZeroWidthSpace; - } - - return this; - } -} diff --git a/src/lib/discord/index.ts b/src/lib/discord/index.ts deleted file mode 100644 index 7260541bf40..00000000000 --- a/src/lib/discord/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './GuildMemberFetchQueue'; -export * from './SkyraEmbed'; diff --git a/src/lib/games/HungerGamesUsage.ts b/src/lib/games/HungerGamesUsage.ts deleted file mode 100644 index 8d1b4b045fd..00000000000 --- a/src/lib/games/HungerGamesUsage.ts +++ /dev/null @@ -1,49 +0,0 @@ -export class HungerGamesUsage { - public tributes = 0; - public deaths: Set = new Set(); - private readonly parts: (string | number)[] = []; - - public constructor(usage: string) { - this.parse(usage); - } - - public display(...values: string[]) { - return this.parts.map((part) => (typeof part === 'number' ? values[part] : part)).join(''); - } - - public parse(usage: string): void { - let current = ''; - for (let i = 0, char; i < usage.length; i++) { - char = usage.charAt(i); - if (char === '{') { - // If there was text, push buffer - if (current) { - this.parts.push(current); - current = ''; - } - - // Parse tag {NT?} - const n = Number(usage.charAt(++i)); - - // If N > tributes, assign tributes to N - if (n > this.tributes) this.tributes = n; - - // If NT, add death - if (usage.charAt(++i) === 'T') { - this.deaths.add(n - 1); - i++; - } - - this.parts.push(n - 1); - } else { - current += char; - } - } - - if (current) this.parts.push(current); - } - - public static create(usage: string): HungerGamesUsage { - return new HungerGamesUsage(usage); - } -} diff --git a/src/lib/games/Slotmachine.ts b/src/lib/games/Slotmachine.ts deleted file mode 100644 index 57232e845c4..00000000000 --- a/src/lib/games/Slotmachine.ts +++ /dev/null @@ -1,216 +0,0 @@ -import type { UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { CanvasColors, socialFolder } from '#utils/constants'; -import { loadImageFromFS } from '#utils/util'; -import { container, UserError } from '@sapphire/framework'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import type { Message } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { join } from 'node:path'; - -const enum Icons { - Cherry, - Bar, - Lemon, - Watermelon, - Bells, - Heart, - Horseshoe, - Diamond, - Seven -} - -interface Coordinate { - x: number; - y: number; -} - -const kReels: readonly Icons[][] = [ - [8, 2, 1, 4, 5, 4, 3, 2, 2, 0, 2, 3, 7, 7, 0, 5, 2, 1, 5, 4, 7, 3, 6, 6, 7, 2, 4, 3, 1, 8, 0, 4, 5, 6, 6, 1, 2, 1, 4, 5, 0, 8, 6, 1, 3, 0, 1], - [4, 1, 2, 2, 4, 3, 8, 2, 1, 6, 5, 2, 7, 0, 0, 6, 1, 4, 2, 1, 0, 2, 5, 5, 3, 6, 8, 7, 1, 1, 7, 4, 4, 3, 3, 0, 6, 1, 3, 5, 6, 0, 3, 0, 5, 6, 4], - [3, 7, 1, 4, 2, 6, 5, 4, 1, 3, 0, 6, 1, 3, 4, 2, 1, 8, 1, 5, 2, 2, 7, 1, 4, 3, 4, 0, 7, 2, 2, 1, 0, 8, 4, 0, 6, 3, 5, 6, 8, 1, 8, 3, 4, 5, 7] -]; -const kCombinations = [ - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6] -]; -const kValues = new Map([ - [Icons.Cherry, 4], - [Icons.Bar, 4], - [Icons.Lemon, 5], - [Icons.Watermelon, 7], - [Icons.Bells, 9], - [Icons.Heart, 11], - [Icons.Horseshoe, 14], - [Icons.Diamond, 18], - [Icons.Seven, 24] -]); - -const kIconSize = 38; -const kAssets = new Map([ - [Icons.Cherry, { x: kIconSize * 2, y: kIconSize * 2 }], - [Icons.Bar, { x: kIconSize, y: kIconSize * 2 }], - [Icons.Lemon, { x: 0, y: kIconSize * 2 }], - [Icons.Watermelon, { x: kIconSize * 2, y: kIconSize }], - [Icons.Bells, { x: kIconSize, y: kIconSize }], - [Icons.Heart, { x: 0, y: kIconSize }], - [Icons.Horseshoe, { x: kIconSize * 2, y: 0 }], - [Icons.Diamond, { x: kIconSize, y: 0 }], - [Icons.Seven, { x: 0, y: 0 }] -]); -const kCoordinates: readonly Coordinate[] = [ - { x: 14, y: 14 }, - { x: 14, y: 58 }, - { x: 14, y: 102 }, - { x: 58, y: 14 }, - { x: 58, y: 58 }, - { x: 58, y: 102 }, - { x: 102, y: 14 }, - { x: 102, y: 58 }, - { x: 102, y: 102 } -]; - -const kPositions = [0, 0, 0]; - -export class Slotmachine { - /** The amount bet */ - private bet: number; - - /** The winnings */ - private winnings = 0; - - /** The message that ran this instance */ - private message: Message; - - /** The player's settings */ - private settings: UserEntity; - - public constructor(message: Message, amount: number, settings: UserEntity) { - this.message = message; - this.bet = amount; - this.settings = settings; - } - - public async run() { - const rolls = this.roll(); - this.calculate(rolls); - - const lost = this.winnings === 0; - const winnings = this.winnings * (await this.fetchBoost()) - this.bet; - const amount = lost ? this.settings.money - this.bet : this.settings.money + winnings; - - const t = await fetchT(this.message); - if (amount < 0) throw new UserError({ identifier: LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney }); - - this.settings.money += lost ? -this.bet : winnings; - await this.settings.save(); - - return [await this.render(rolls, this.settings.profile!.darkTheme, t), amount] as [Buffer, number]; - } - - private async render(rolls: readonly Icons[], darkTheme: boolean, t: TFunction) { - const playerHasWon = this.winnings > 0; - - const canvas = new Canvas(300, 150) - .setColor(darkTheme ? CanvasColors.BackgroundDark : CanvasColors.BackgroundLight) - .printRoundedRectangle(5, 5, 295, 145, 10) - .save() - .setColor(playerHasWon ? CanvasColors.IndicatorGreen : CanvasColors.IndicatorRed) - .setShadowColor(playerHasWon ? 'rgba(64, 224, 15, 0.4)' : 'rgba(237, 29, 2, 0.4)') - .setShadowBlur(4) - .printRectangle(53, 56, 2, 42) - .printRectangle(99, 56, 2, 42) - .restore() - .save() - .setColor(darkTheme ? CanvasColors.BackgroundLight : CanvasColors.BackgroundDark) - .setTextFont('30px RobotoLight') - .setTextAlign('right') - .printText( - t(playerHasWon ? LanguageKeys.Commands.Games.SlotMachineCanvasTextWon : LanguageKeys.Commands.Games.SlotMachineCanvasTextLost), - 280, - 60 - ) - .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(); - - await Promise.all( - rolls.map( - (value, index) => - new Promise((resolve) => { - const { x, y } = kAssets.get(value)!; - const coordinate = kCoordinates[index]; - canvas.printImage(Slotmachine.images.ICON!, x, y, kIconSize, kIconSize, coordinate.x, coordinate.y, kIconSize, kIconSize); - resolve(); - }) - ) - ); - - return canvas.pngAsync(); - } - - /** The boost */ - private async fetchBoost() { - const { clients } = container.db; - const settings = await clients.ensure(); - - return ( - (this.message.guild && settings.guildBoost.includes(this.message.guild.id) ? 1.5 : 1) * - (settings.userBoost.includes(this.message.author.id) ? 1.5 : 1) - ); - } - - private calculate(roll: readonly Icons[]) { - for (const [COMB1, COMB2, COMB3] of kCombinations) { - if (roll[COMB1] === roll[COMB2] && roll[COMB2] === roll[COMB3]) { - this.winnings += this.bet * kValues.get(roll[COMB1])!; - } - } - } - - private roll() { - const roll: Icons[] = []; - for (let i = 0; i < 3; i++) { - const reel = kReels[i]; - const reelLength = reel.length; - const rand = this._spinReel(i); - roll.push(reel[rand === 0 ? reelLength - 1 : rand - 1], reel[rand], reel[rand === reelLength - 1 ? 0 : rand + 1]); - } - - return roll as readonly Icons[]; - } - - private _spinReel(reel: number) { - const kReelLength = kReels[reel].length; - const position = (kPositions[reel] + Math.round(Math.random() * kReelLength + 3)) % kReelLength; - kPositions[reel] = position; - return position; - } - - private static images: SlotmachineAssets = { - ICON: null, - SHINY: null - }; - - public static async init(): Promise { - const [icon, shiny] = await Promise.all([ - loadImageFromFS(join(socialFolder, 'sm-icons.png')), - loadImageFromFS(join(socialFolder, 'shiny-icon.png')) - ]); - Slotmachine.images.ICON = icon; - Slotmachine.images.SHINY = shiny; - } -} - -interface SlotmachineAssets { - ICON: Image | null; - SHINY: Image | null; -} diff --git a/src/lib/games/TriviaManager.ts b/src/lib/games/TriviaManager.ts deleted file mode 100644 index 0ea65f78004..00000000000 --- a/src/lib/games/TriviaManager.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { URL } from 'node:url'; - -export const enum TriviaResponseCode { - Success, - NoResults, - InvalidParameter, - TokenNotFound, - TokenEmpty -} - -export interface TriviaResultOk { - response_code: TriviaResponseCode; - results: QuestionData[]; -} - -/** - * The question object returned by OpenTDB - */ -export interface QuestionData { - category: string; - type: QuestionType; - difficulty: QuestionDifficulty; - question: string; - correct_answer: string; - incorrect_answers: string[]; -} - -export const enum QuestionType { - Boolean = 'boolean', - Multiple = 'multiple' -} - -export const enum QuestionDifficulty { - Easy = 'easy', - Medium = 'medium', - Hard = 'hard' -} - -export const CATEGORIES = { - general: 9, - books: 10, - film: 11, - music: 12, - theatres: 13, - tv: 14, - videogames: 15, - boardgames: 16, - nature: 17, - computers: 18, - maths: 19, - mythology: 20, - sports: 21, - geography: 22, - history: 23, - politics: 24, - art: 25, - celebrities: 26, - animals: 27, - vehicles: 28, - comics: 29, - gadgets: 30, - 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 data = await fetch(url, FetchResultTypes.JSON); - const { response_code, results } = data; - if (response_code === 0 && results.length) return results[0]; - throw new Error('Invalid request'); -} diff --git a/src/lib/games/WheelOfFortune.ts b/src/lib/games/WheelOfFortune.ts deleted file mode 100644 index 65f71114b83..00000000000 --- a/src/lib/games/WheelOfFortune.ts +++ /dev/null @@ -1,195 +0,0 @@ -import type { UserEntity } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { CanvasColors, socialFolder } from '#utils/constants'; -import { loadImageFromFS } from '#utils/util'; -import { container, UserError } from '@sapphire/framework'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { roundNumber } from '@sapphire/utilities'; -import { Canvas, Image } from 'canvas-constructor/napi-rs'; -import type { Message } from 'discord.js'; -import type { TFunction } from 'i18next'; -import { join } from 'node:path'; - -const enum Arrows { - UpDiagonalLeft = 0.2, - Up = 0.1, - UpDiagonalRight = 2.4, - Left = 0.3, - Right = 1.7, - DownDiagonalLeft = 0.5, - Down = 1.2, - DownDiagonalRight = 1.5 -} - -interface Coordinate { - x: number; - y: number; -} - -const kIconSize = 38; -const kAssets: Coordinate[] = [ - { x: kIconSize * 2, y: kIconSize * 2 }, - { x: kIconSize, y: kIconSize * 2 }, - { x: 0, y: kIconSize * 2 }, - { x: kIconSize * 2, y: kIconSize }, - { x: 0, y: kIconSize }, - { x: kIconSize * 2, y: 0 }, - { x: kIconSize, y: 0 }, - { x: 0, y: 0 } -]; - -const kArrowSize = 36; -const kArrows = new Map([ - [Arrows.UpDiagonalLeft, { x: 0, y: 0 }], - [Arrows.Up, { x: kArrowSize, y: 0 }], - [Arrows.UpDiagonalRight, { x: kArrowSize * 2, y: 0 }], - [Arrows.Left, { x: 0, y: kArrowSize }], - [Arrows.Right, { x: kArrowSize * 2, y: kArrowSize }], - [Arrows.DownDiagonalLeft, { x: 0, y: kArrowSize * 2 }], - [Arrows.Down, { x: kArrowSize, y: kArrowSize * 2 }], - [Arrows.DownDiagonalRight, { x: kArrowSize * 2, y: kArrowSize * 2 }] -]); - -export class WheelOfFortune { - /** The amount bet */ - public amount: number; - - /** The spin result */ - public spin = -1; - - /** The winnings, negative if the user has lost */ - public winnings = 0; - - /** The message that ran this instance */ - public message: Message; - - /** The player's settings */ - public settings: UserEntity; - - /** The player */ - public get player() { - return this.message.author; - } - - public constructor(message: Message, amount: number, settings: UserEntity) { - this.message = message; - this.amount = amount; - this.settings = settings; - } - - public async run() { - await this.calculate(); - - const lost = this.winnings < 0; - const final = this.settings.money + this.winnings; - - const t = await fetchT(this.message); - if (lost && final < 0) { - throw new UserError({ identifier: LanguageKeys.Commands.Games.GamesCannotHaveNegativeMoney }); - } - - this.settings.money += this.winnings; - await this.settings.save(); - - return [await this.render(this.settings.profile!.darkTheme, t), final] as const; - } - - /** The boost */ - private async fetchBoost() { - const { clients } = container.db; - const settings = await clients.ensure(); - - return ( - (this.message.guild && settings.guildBoost.includes(this.message.guild.id) ? 1.5 : 1) * - (settings.userBoost.includes(this.message.author.id) ? 1.5 : 1) - ); - } - - private async calculate() { - this.spin = Math.floor(Math.random() * WheelOfFortune.kMultipliers.length); - - // The multiplier to apply - const multiplier = WheelOfFortune.kMultipliers[this.spin]; - - // The winnings - this.winnings = roundNumber( - multiplier >= 1 ? this.amount * multiplier * (await this.fetchBoost()) - this.amount : this.amount * multiplier - this.amount - ); - } - - private async render(darkTheme: boolean, t: TFunction): Promise { - const playerHasWon = this.winnings > 0; - - const { x: arrowX, y: arrowY } = kArrows.get(WheelOfFortune.kMultipliers[this.spin])!; - - const canvas = new Canvas(300, 132) - .setColor(darkTheme ? CanvasColors.BackgroundDark : CanvasColors.BackgroundLight) - .printRoundedRectangle(5, 5, 295, 127, 10) - .save() - .setColor(darkTheme ? CanvasColors.BackgroundLight : CanvasColors.BackgroundDark) - .setTextFont('30px RobotoLight') - .setTextAlign('right') - .printText( - t(playerHasWon ? LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextWon : LanguageKeys.Commands.Games.WheelOfFortuneCanvasTextLost), - 280, - 60 - ) - .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(); - - const image = playerHasWon ? WheelOfFortune.images.WIN_ICONS! : WheelOfFortune.images.LOSE_ICONS!; - await Promise.all( - kAssets.map( - ({ x, y }) => - new Promise((resolve) => { - canvas.printImage(image, x, y, kIconSize, kIconSize, x + 12, y + 12, kIconSize, kIconSize); - resolve(); - }) - ) - ); - - return canvas.pngAsync(); - } - - /** The Wheel of Fortune multipliers */ - private static kMultipliers = [ - Arrows.UpDiagonalLeft, - Arrows.Up, - Arrows.UpDiagonalRight, - Arrows.Right, - Arrows.Left, - Arrows.DownDiagonalLeft, - Arrows.Down, - Arrows.DownDiagonalRight - ]; - - private static images: WheelOfFortuneAssets = { - LOSE_ICONS: null, - WIN_ICONS: null, - ARROWS: null, - SHINY: null - }; - - public static async init() { - const [winIcons, loseIcons, arrows, shiny] = await Promise.all([ - loadImageFromFS(join(socialFolder, 'wof-win-icons.png')), - loadImageFromFS(join(socialFolder, 'wof-lose-icons.png')), - loadImageFromFS(join(socialFolder, 'wof-arrows.png')), - loadImageFromFS(join(socialFolder, 'shiny-icon.png')) - ]); - - WheelOfFortune.images.LOSE_ICONS = loseIcons; - WheelOfFortune.images.WIN_ICONS = winIcons; - WheelOfFortune.images.ARROWS = arrows; - WheelOfFortune.images.SHINY = shiny; - } -} - -interface WheelOfFortuneAssets { - LOSE_ICONS: Image | null; - WIN_ICONS: Image | null; - ARROWS: Image | null; - SHINY: Image | null; -} diff --git a/src/lib/games/base/BaseBotController.ts b/src/lib/games/base/BaseBotController.ts deleted file mode 100644 index b139939f9db..00000000000 --- a/src/lib/games/base/BaseBotController.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { BaseController } from './BaseController'; - -export abstract class BaseBotController extends BaseController { - public constructor() { - super(process.env.CLIENT_NAME); - } - - protected resolveCollectedValidity(): boolean { - return true; - } -} diff --git a/src/lib/games/base/BaseController.ts b/src/lib/games/base/BaseController.ts deleted file mode 100644 index 13e3c33bd94..00000000000 --- a/src/lib/games/base/BaseController.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { BaseGame, GameTurn } from './BaseGame'; - -export abstract class BaseController { - public readonly name: string; - - public turn: GameTurn = GameTurn.PlayerA; - public game: BaseGame = null!; - - public constructor(name: string) { - this.name = name; - } - - public setTurn(turn: GameTurn): this { - this.turn = turn; - return this; - } - - public setGame(game: BaseGame): this { - this.game = game; - return this; - } - - public abstract await(): Promise | T; -} diff --git a/src/lib/games/base/BaseGame.ts b/src/lib/games/base/BaseGame.ts deleted file mode 100644 index 6092ce987f5..00000000000 --- a/src/lib/games/base/BaseGame.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { fetchT } from '@sapphire/plugin-i18next'; -import type { Client, Message } from 'discord.js'; -import type { TFunction } from 'i18next'; -import type { BaseController } from './BaseController'; - -export const enum GameTurn { - PlayerA, - PlayerB -} - -export const enum GameStatus { - Start, - Update, - End -} - -export abstract class BaseGame { - public message: Message; - 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.playerA = playerA.setTurn(GameTurn.PlayerA).setGame(this); - this.playerB = playerB.setTurn(GameTurn.PlayerB).setGame(this); - this.turn = turn; - } - - protected abstract get finished(): boolean; - - protected get player(): BaseController { - return this.turn === GameTurn.PlayerA ? this.playerA : this.playerB; - } - - protected get client(): Client { - return this.message.client; - } - - public async run() { - this.t = await fetchT(this.message); - await this.onStart(); - - while (true) { - // Read player's move: - const { player } = this; - const value = await player.await(); - await this.handle(value, player); - - // If finished, break loop: - if (this.finished) break; - - // Query an update and switch player: - this.nextPlayer(); - await this.onUpdate(); - } - - await this.onEnd(); - } - - protected nextPlayer() { - this.turn = this.turn === GameTurn.PlayerA ? GameTurn.PlayerB : GameTurn.PlayerA; - } - - protected abstract handle(value: T, player: BaseController): unknown; - - protected onStart(): Promise { - return this.message.edit({ content: this.render(GameStatus.Start), embeds: [], attachments: [] }); - } - - protected onUpdate(): Promise { - return this.message.edit({ content: this.render(GameStatus.Update), embeds: [], attachments: [] }); - } - - protected onEnd(): Promise { - return this.message.edit({ content: this.render(GameStatus.End), embeds: [], attachments: [] }); - } - - protected abstract render(status: GameStatus): string; - - protected static getTurn(): GameTurn { - return Math.random() < 0.5 ? GameTurn.PlayerA : GameTurn.PlayerB; - } -} diff --git a/src/lib/games/base/BaseReactionController.ts b/src/lib/games/base/BaseReactionController.ts deleted file mode 100644 index 916f7bc5891..00000000000 --- a/src/lib/games/base/BaseReactionController.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { api } from '#lib/discord/Api'; -import { Events } from '#lib/types/Enums'; -import { getEmojiString } from '#utils/functions'; -import type { LLRCData } from '#utils/LongLivingReactionCollector'; -import { cast } from '#utils/util'; -import { container } from '@sapphire/framework'; -import { RESTJSONErrorCodes } from 'discord-api-types/v9'; -import { DiscordAPIError } from 'discord.js'; -import { BaseController } from './BaseController'; -import type { BaseReactionGame } from './BaseReactionGame'; - -export abstract class BaseReactionController extends BaseController { - public readonly userId: string; - - public constructor(name: string, userId: string) { - super(name); - this.userId = userId; - } - - protected async collectAvailableReaction(): Promise { - const game = cast>(this.game); - return new Promise((resolve) => { - game.listener.setTime(game.reactionTime); - game.listener.setListener((data) => { - if (data.userId !== this.userId) return; - if (data.messageId !== game.message.id) return; - - const emoji = this.resolveCollectedData(data); - if (!emoji) return; - - if (game.reactions.includes(emoji) && this.resolveCollectedValidity(emoji)) { - void this.removeEmoji(data, emoji, this.userId); - game.listener.setListener(null); - game.listener.setTime(-1); - resolve(emoji); - } - }); - - game.listener.setEndListener(() => { - resolve(null); - }); - }); - } - - protected abstract resolveCollectedValidity(collected: string): boolean; - - protected resolveCollectedData(reaction: LLRCData): string | null { - return getEmojiString(reaction.emoji); - } - - protected async removeEmoji(reaction: LLRCData, emoji: string, userId: string): Promise { - try { - await api().channels(reaction.channel.id).messages(reaction.messageId).reactions(emoji)(userId).delete(); - } catch (error) { - if (error instanceof DiscordAPIError) { - if (error.code === RESTJSONErrorCodes.UnknownMessage || error.code === RESTJSONErrorCodes.UnknownEmoji) return; - } - - container.client.emit(Events.Error, error); - } - } -} diff --git a/src/lib/games/base/BaseReactionGame.ts b/src/lib/games/base/BaseReactionGame.ts deleted file mode 100644 index 1ba17b44f8a..00000000000 --- a/src/lib/games/base/BaseReactionGame.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Events } from '#lib/types/Enums'; -import { LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import { sendLoadingMessage } from '#utils/util'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; -import type { BaseController } from './BaseController'; -import { BaseGame } from './BaseGame'; - -export abstract class BaseReactionGame extends BaseGame { - public readonly reactions: readonly string[]; - public readonly listener: LongLivingReactionCollector; - public readonly reactionTime: number; - - public constructor( - message: Message, - playerA: BaseController, - playerB: BaseController, - reactions: readonly string[], - reactionTime: number, - turn = BaseGame.getTurn() - ) { - super(message, playerA, playerB, turn); - this.reactions = reactions; - this.reactionTime = reactionTime; - this.listener = new LongLivingReactionCollector(); - } - - protected async onStart(): Promise { - try { - this.message = await sendLoadingMessage(this.message, this.t); - for (const reaction of this.reactions) await this.message.react(reaction); - } catch { - await send(this.message, this.t(LanguageKeys.Misc.UnexpectedIssue)).catch((error) => this.client.emit(Events.Error, error)); - } - - return super.onStart(); - } - - protected get finished(): boolean { - return this.listener.ended; - } - - protected onEnd(): Promise { - this.listener.end(); - return super.onEnd(); - } -} diff --git a/src/lib/games/connect-four/ConnectFourBotController.ts b/src/lib/games/connect-four/ConnectFourBotController.ts deleted file mode 100644 index 7a05b28c6ee..00000000000 --- a/src/lib/games/connect-four/ConnectFourBotController.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { cast } from '#utils/util'; -import { connectFour } from '@skyra/ai'; -import { BaseBotController } from '../base/BaseBotController'; -import type { ConnectFourGame } from './ConnectFourGame'; - -export class ConnectFourBotController extends BaseBotController { - private readonly depth: number; - - public constructor(depth: number) { - super(); - this.depth = depth; - } - - public await(): number { - const game = cast(this.game); - return connectFour(game.board, this.depth); - } -} diff --git a/src/lib/games/connect-four/ConnectFourGame.ts b/src/lib/games/connect-four/ConnectFourGame.ts deleted file mode 100644 index 09f0d7d408b..00000000000 --- a/src/lib/games/connect-four/ConnectFourGame.ts +++ /dev/null @@ -1,307 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { minutes } from '#utils/common'; -import type { SerializedEmoji } from '#utils/functions'; -import type { Message } from 'discord.js'; -import type { BaseController } from '../base/BaseController'; -import { GameStatus } from '../base/BaseGame'; -import { BaseReactionGame } from '../base/BaseReactionGame'; -import { Emojis } from './lib/constants'; - -export enum Cell { - Empty, - PlayerOne, - PlayerTwo, - WinnerPlayerOne, - WinnerPlayerTwo -} - -export const columns = 7; -export const rows = 6; -const renderMargin = ' '.repeat(7); - -export class ConnectFourGame extends BaseReactionGame { - public readonly board = new Uint8Array(columns * rows); - public readonly remaining = new Uint8Array(columns).fill(rows); - private winner: readonly [number, number][] | null = null; - - public constructor(message: Message, playerA: BaseController, playerB: BaseController, turn = ConnectFourGame.getTurn()) { - super(message, playerA, playerB, ConnectFourGame.emojis, minutes(5), turn); - } - - public get finished() { - return super.finished || this.winner !== null || this.isTableFull(); - } - - protected handle(value: number, player: BaseController): void { - if (value !== -1) { - const y = --this.remaining[value]; - this.setAt(value, y, player.turn + 1); - this.winner = this.check(value, y); - if (this.winner !== null) { - // + 1 is used to show the color, + 2 is used to show the winner - const cell = player.turn + 3; - for (const [x, y] of this.winner) { - this.setAt(x, y, cell); - } - } - } - } - - protected render(status: GameStatus): string { - return status === GameStatus.End ? this.renderOnEnd() : this.renderOnUpdateOrStart(); - } - - protected renderOnEnd() { - return this.winner === null - ? 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.t(LanguageKeys.Commands.Games.TicTacToeTurn, { - icon: ConnectFourGame.players[this.turn], - player: this.player.name, - board: this.renderBoard() - }); - } - - protected renderBoard(): string { - const output: string[] = []; - for (let y = 0; y < rows; ++y) { - // Render each line - const line: string[] = []; - for (let x = 0; x < columns; ++x) { - line.push(ConnectFourGame.renderCell(this.getAt(x, y))); - } - output.push(line.join(renderMargin)); - } - - return output.join('\n'); - } - - private setAt(x: number, y: number, value: Cell) { - const cell = x + y * columns; - this.board[cell] = value; - } - - private getAt(x: number, y: number) { - const cell = x + y * columns; - return this.board[cell]; - } - - private check(x: number, y: number): readonly [number, number][] | null { - const cell = this.getAt(x, y); - - return ( - this.checkVertical(x, y, cell) || - this.checkHorizontal(x, y, cell) || - this.checkDiagonalTopLeftToBottomRight(x, y, cell) || - this.checkDiagonalBottomLeftToTopRight(x, y, cell) - ); - } - - private isTableFull() { - return this.remaining.every((value) => value === 0); - } - - private checkHorizontal(x: number, y: number, cell: Cell) { - /** - * 00__ 10__ 20__ 30__ 40__ 50__ 60__ - * 01__ 11__ 21__ 31__ 41__ 51__ 61__ - * 02__ 12__ 22__ 32__ 42__ 52__ 62__ - * 03__ 13__ 23__ 33__ 43__ 53__ 63__ - * 04__ 14__ 24_o 34_o 44_o 54__ 64__ - * 05__ 15__ 25_x 35_x 45_x 55_x 65__ - * - * Winning: { 25, 35, 45, 55 } - * Assuming last move as 55. - * - * We retrieve the corner for this move: - * lx = x - 3 - * rx = x + 3 - * - * We iterate from { lx, y } to { rx, y } inclusive, increasing lx by 1. - * - * We will also optimize one case: since this is linear, we don't need to iterate from x - 3 to x + 3, but - * instead, we will iterate from max(x - 3, 0), skipping negatives, to min(x + 3, kColumns - 1), this shortens - * the range from [-3..8] to [0..6]. - */ - - let count = 0; - const rx = Math.min(x + 3, columns - 1); - for (let lx = Math.max(x - 3, 0); lx <= rx; ++lx) { - if (this.getAt(lx, y) === cell) { - if (++count === 4) { - return [ - [lx - 3, y], - [lx - 2, y], - [lx - 1, y], - [lx, y] - ] as [number, number][]; - } - } else { - count = 0; - } - } - - return null; - } - - private checkVertical(x: number, y: number, cell: Cell) { - /** - * 00__ 10__ 20__ 30__ 40__ 50__ 60__ - * 01__ 11__ 21__ 31__ 41__ 51__ 61__ - * 02__ 12__ 22__ 32_x 42__ 52__ 62__ - * 03__ 13__ 23_o 33_x 43__ 53__ 63__ - * 04__ 14__ 24_o 34_x 44__ 54__ 64__ - * 05__ 15__ 25_o 35_x 45__ 55__ 65__ - * - * Winning: { 32, 33, 34, 35 } - * Assuming last move as 32. - * - * Vertical check has one advantage versus the other ways: it needs to check three cells below the used cell, - * and nothing more. This is because cells are filled from bottom to top, so we don't need to check the cells - * in the top as they're always empty, thus saving a lot of computational cost. - * - * We retrieve the corner for this move: - * ty = y + 1 - * by = y + 3 - * - * We will also optimize one case: this needs y + 3 positions to be within the range, so we quickly return null - * when there isn't enough space. - * - * If it has space, we will only check the cells { x, ty } to { x, by } inclusive, { x, y } is not checked - * because it's `cell`'s value. - */ - - // If there aren't enough rows in the same column to qualify, skip early - if (y + 3 >= rows) return null; - - return this.getAt(x, y + 1) === cell && this.getAt(x, y + 2) === cell && this.getAt(x, y + 3) === cell - ? ([ - [x, y], - [x, y + 1], - [x, y + 2], - [x, y + 3] - ] as [number, number][]) - : null; - } - - private checkDiagonalTopLeftToBottomRight(x: number, y: number, cell: Cell) { - /** - * 00__ 10__ 20__ 30__ 40__ 50__ 60__ - * 01__ 11__ 21__ 31__ 41__ 51__ 61__ - * 02_x 12__ 22__ 32__ 42__ 52__ 62__ - * 03_o 13_x 23__ 33__ 43__ 53__ 63__ - * 04_x 14_o 24_x 34_o 44__ 54__ 64__ - * 05_o 15_o 25_o 35_x 45__ 55__ 65__ - * - * Winning: { 02, 13, 24, 35 } - * Assuming last move as 02. - * - * We retrieve the corner for this move: - * clx = x - 3 - * cly = y - 3 - * crx = x + 3 - * cry = y + 3 - * - * We iterate from { clx, cly } to { crx, cry } inclusive, increasing by 1 both numbers. - */ - - let count = 0; - const crx = x + 3; - const cry = y + 3; - for (let clx = x - 3, cly = y - 3; clx <= crx && cly <= cry; ++clx, ++cly) { - // Watch for boundaries, since we are going from top left, we might find cells in our way, we continue. - if (clx < 0 || cly < 0) continue; - - // Watch for boundaries, if one goes to the bottom right, there cannot be more cells, we stop checking. - if (clx === columns || cly === rows) return null; - - if (this.getAt(clx, cly) === cell) { - if (++count === 4) { - return [ - [clx - 3, cly - 3], - [clx - 2, cly - 2], - [clx - 1, cly - 1], - [clx, cly] - ] as [number, number][]; - } - } else { - count = 0; - } - } - - return null; - } - - private checkDiagonalBottomLeftToTopRight(x: number, y: number, cell: Cell) { - /** - * 00__ 10__ 20__ 30__ 40__ 50__ 60__ - * 01__ 11__ 21__ 31__ 41__ 51__ 61__ - * 02__ 12__ 22__ 32__ 42__ 52__ 62_x - * 03__ 13__ 23__ 33__ 43__ 53_x 63_o - * 04__ 14__ 24__ 34__ 44_x 54_o 64_x - * 05__ 15__ 25__ 35_x 45_o 55_o 65_o - * - * Winning: { 35, 44, 53, 62 } - * Assuming last move as 62. - * - * We retrieve the corner for this move: - * clx = x - 3 - * cly = y + 3 - * crx = x + 3 - * cry = y - 3 - * - * We iterate from { clx, cly } to { crx, cry } inclusive, increasing clx by 1 and decreasing cly by 1. - */ - - let count = 0; - const crx = x + 3; - const cry = y + 3; - for (let clx = x - 3, cly = y + 3; clx <= crx && cly <= cry; ++clx, --cly) { - // Watch for boundaries, since we are going from bottom left, we might find cells in our way, we continue. - if (clx < 0 || cly >= rows) continue; - - // Watch for boundaries, if one goes to the bottom right, there cannot be more cells, we stop checking. - if (clx === columns || cly < 0) return null; - - if (this.getAt(clx, cly) === cell) { - if (++count === 4) { - return [ - [clx - 3, cly + 3], - [clx - 2, cly + 2], - [clx - 1, cly + 1], - [clx, cly] - ] as [number, number][]; - } - } else { - count = 0; - } - } - - return null; - } - - private static readonly emojis = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣'].map(encodeURIComponent) as SerializedEmoji[]; - - private static readonly players = [Emojis.PlayerOne, Emojis.PlayerTwo] as const; - - private static renderCell(cell: Cell) { - switch (cell) { - case Cell.Empty: - return Emojis.Empty; - case Cell.PlayerOne: - return Emojis.PlayerOne; - case Cell.PlayerTwo: - return Emojis.PlayerTwo; - case Cell.WinnerPlayerOne: - return Emojis.WinnerOne; - case Cell.WinnerPlayerTwo: - return Emojis.WinnerTwo; - } - } -} diff --git a/src/lib/games/connect-four/ConnectFourHumanController.ts b/src/lib/games/connect-four/ConnectFourHumanController.ts deleted file mode 100644 index 09de6d82fda..00000000000 --- a/src/lib/games/connect-four/ConnectFourHumanController.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { cast } from '#utils/util'; -import { BaseReactionController } from '../base/BaseReactionController'; -import type { ConnectFourGame } from './ConnectFourGame'; - -export class ConnectFourHumanController extends BaseReactionController { - public async await(): Promise { - const reaction = await this.collectAvailableReaction(); - if (reaction === null) return -1; - - const game = cast(this.game); - return game.reactions.indexOf(reaction); - } - - protected resolveCollectedValidity(collected: string): boolean { - const game = cast(this.game); - const index = game.reactions.indexOf(collected); - return index !== -1 && game.remaining[index] > 0; - } -} diff --git a/src/lib/games/connect-four/lib/constants.ts b/src/lib/games/connect-four/lib/constants.ts deleted file mode 100644 index dd1cee8188d..00000000000 --- a/src/lib/games/connect-four/lib/constants.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const enum Emojis { - Empty = '<:Empty:352403997606412289>', - PlayerOne = '<:PlayerONE:352403997300359169>', - PlayerTwo = '<:PlayerTWO:352404081974968330>', - WinnerOne = '<:PlayerONEWin:352403997761601547>', - WinnerTwo = '<:PlayerTWOWin:352403997958602752>' -} - -export const Reactions = ['1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣'] as readonly string[]; diff --git a/src/lib/games/tic-tac-toe/TicTacToeBotController.ts b/src/lib/games/tic-tac-toe/TicTacToeBotController.ts deleted file mode 100644 index 37dd826f348..00000000000 --- a/src/lib/games/tic-tac-toe/TicTacToeBotController.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { cast } from '#utils/util'; -import { ticTacToe } from '@skyra/ai'; -import { BaseBotController } from '../base/BaseBotController'; -import type { TicTacToeGame } from './TicTacToeGame'; - -export class TicTacToeBotController extends BaseBotController { - public await(): number { - const game = cast(this.game); - return ticTacToe(game.board); - } -} diff --git a/src/lib/games/tic-tac-toe/TicTacToeGame.ts b/src/lib/games/tic-tac-toe/TicTacToeGame.ts deleted file mode 100644 index c8fe56d0475..00000000000 --- a/src/lib/games/tic-tac-toe/TicTacToeGame.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { minutes } from '#utils/common'; -import type { SerializedEmoji } from '#utils/functions'; -import type { Message } from 'discord.js'; -import type { BaseController } from '../base/BaseController'; -import { GameStatus } from '../base/BaseGame'; -import { BaseReactionGame } from '../base/BaseReactionGame'; - -export class TicTacToeGame extends BaseReactionGame { - public readonly board = new Uint8Array(9); - - public constructor(message: Message, playerA: BaseController, playerB: BaseController, turn = TicTacToeGame.getTurn()) { - super(message, playerA, playerB, TicTacToeGame.emojis, minutes(5), turn); - } - - public get finished() { - return super.finished || this.board.every((cell) => cell !== 0) || this.check() !== null; - } - - protected handle(value: number, player: BaseController): void { - if (value !== -1) this.board[value] = player.turn + 1; - } - - protected render(status: GameStatus): string { - return status === GameStatus.End ? this.renderOnEnd() : this.renderOnUpdateOrStart(); - } - - protected renderOnEnd() { - const winner = this.check(); - return winner === null - ? 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.t(LanguageKeys.Commands.Games.TicTacToeTurn, { - icon: TicTacToeGame.player[this.turn], - player: this.player.name, - board: this.renderBoard() - }); - } - - protected renderBoard(): string { - return `${this.renderRow(0)}\n${this.renderRow(1)}\n${this.renderRow(2)}`; - } - - protected renderRow(row: number): string { - const offset = row * 3; - return `${this.renderCell(offset)}${this.renderCell(offset + 1)}${this.renderCell(offset + 2)}`; - } - - protected renderCell(cell: number): string { - const value = this.board[cell]; - return value === 0 ? decodeURIComponent(TicTacToeGame.emojis[cell]) : TicTacToeGame.player[value - 1]; - } - - private equals(a: number, b: number, c: number): boolean { - return a === b && b === c; - } - - private check(): number | null { - // 0 1 2 - // 3 4 5 - // 6 7 8 - - let a = 0; - - // Check rows - for (let i = 0; i < 9; i += 3) { - a = this.board[i]; - if (a !== 0 && this.equals(a, this.board[i + 1], this.board[i + 2])) return a; - } - - // Check columns - for (let i = 0; i < 3; ++i) { - a = this.board[i]; - if (a !== 0 && this.equals(a, this.board[i + 3], this.board[i + 6])) return a; - } - - // Check descending diagonal - // eslint-disable-next-line prefer-destructuring - a = this.board[0]; - if (a !== 0 && this.equals(a, this.board[4], this.board[8])) return a; - - // Check ascending diagonal - // eslint-disable-next-line prefer-destructuring - a = this.board[6]; - if (a !== 0 && this.equals(a, this.board[4], this.board[2])) return a; - - return null; - } - - private static readonly emojis = ['↖', '⬆', '↗', '⬅', '⏺', '➡️', '↙', '⬇', '↘'].map(encodeURIComponent) as SerializedEmoji[]; - private static readonly player = ['⭕', '❌'] as const; -} diff --git a/src/lib/games/tic-tac-toe/TicTacToeHumanController.ts b/src/lib/games/tic-tac-toe/TicTacToeHumanController.ts deleted file mode 100644 index cd75acaa454..00000000000 --- a/src/lib/games/tic-tac-toe/TicTacToeHumanController.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { cast } from '#utils/util'; -import { BaseReactionController } from '../base/BaseReactionController'; -import type { TicTacToeGame } from './TicTacToeGame'; - -export class TicTacToeHumanController extends BaseReactionController { - public async await(): Promise { - const reaction = await this.collectAvailableReaction(); - if (reaction === null) return -1; - - const game = cast(this.game); - return game.reactions.indexOf(reaction); - } - - protected resolveCollectedValidity(collected: string): boolean { - const game = cast(this.game); - const index = game.reactions.indexOf(collected); - return index !== -1 && game.board[index] === 0; - } -} diff --git a/src/lib/i18n/LanguageHelp.ts b/src/lib/i18n/LanguageHelp.ts deleted file mode 100644 index be591e6cbf2..00000000000 --- a/src/lib/i18n/LanguageHelp.ts +++ /dev/null @@ -1,96 +0,0 @@ -export class LanguageHelp { - private aliases: string = null!; - private usages: string = null!; - private extendedHelp: string = null!; - private explainedUsage: string = null!; - private possibleFormats: string = null!; - private examples: string = null!; - private reminder: string = null!; - - public setAliases(text: string) { - this.aliases = text; - return this; - } - - public setUsages(text: string) { - this.usages = text; - return this; - } - - public setExplainedUsage(text: string) { - this.explainedUsage = text; - return this; - } - - public setExtendedHelp(text: string) { - this.extendedHelp = text; - return this; - } - - public setPossibleFormats(text: string) { - this.possibleFormats = text; - return this; - } - - public setExamples(text: string) { - this.examples = text; - return this; - } - - public setReminder(text: string) { - this.reminder = text; - return this; - } - - public display(name: string, aliases: string | null, options: LanguageHelpDisplayOptions, prefixUsed: string) { - const { usages = [], extendedHelp, explainedUsage = [], possibleFormats = [], examples = [], reminder } = options; - const output: string[] = []; - - // Usages - if (usages.length) { - output.push(this.usages, ...usages.map((usage) => `→ ${prefixUsed}${name}${usage.length === 0 ? '' : ` *${usage}*`}`), ''); - } - - if (aliases !== null) { - output.push(`${this.aliases}: ${aliases}`, ''); - } - - // Extended help - if (extendedHelp) { - output.push(this.extendedHelp, extendedHelp, ''); - } - - // Explained usage - if (explainedUsage.length) { - output.push(this.explainedUsage, ...explainedUsage.map(([arg, desc]) => `→ **${arg}**: ${desc}`), ''); - } - - // Possible formats - if (possibleFormats.length) { - output.push(this.possibleFormats, ...possibleFormats.map(([type, example]) => `→ **${type}**: ${example}`), ''); - } - - // Examples - if (examples.length) { - output.push(this.examples, ...examples.map((example) => `→ ${prefixUsed}${name}${example ? ` *${example}*` : ''}`), ''); - } else { - output.push(this.examples, `→ ${prefixUsed}${name}`, ''); - } - - // Reminder - if (reminder) { - output.push(this.reminder, reminder); - } - - return output.join('\n'); - } -} - -export interface LanguageHelpDisplayOptions { - usages?: string[]; - extendedHelp?: string; - explainedUsage?: [string, string][]; - possibleFormats?: [string, string][]; - examples?: (null | string)[]; - reminder?: string; -} diff --git a/src/lib/i18n/languageKeys/keys/Commands.ts b/src/lib/i18n/languageKeys/keys/Commands.ts deleted file mode 100644 index 9c47f5271f0..00000000000 --- a/src/lib/i18n/languageKeys/keys/Commands.ts +++ /dev/null @@ -1,17 +0,0 @@ -export * as Admin from './commands/Admin'; -export * as Animal from './commands/Animal'; -export * as Animation from './commands/Animation'; -export * as Fun from './commands/Fun'; -export * as Games from './commands/Games'; -export * as General from './commands/General'; -export * as Google from './commands/Google'; -export * as Social from './commands/Levelling'; -export * as Management from './commands/Management'; -export * as Misc from './commands/Misc'; -export * as Moderation from './commands/Moderation'; -export * as StarWars from './commands/StarWars'; -export * as Suggestions from './commands/Suggestions'; -export * as System from './commands/System'; -export * as Tags from './commands/Tags'; -export * as Tools from './commands/Tools'; -export * as Twitch from './commands/Twitch'; diff --git a/src/lib/i18n/languageKeys/keys/CustomCommandSerializer/All.ts b/src/lib/i18n/languageKeys/keys/CustomCommandSerializer/All.ts deleted file mode 100644 index ac336f20d27..00000000000 --- a/src/lib/i18n/languageKeys/keys/CustomCommandSerializer/All.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { FT, T } from '#lib/types'; - -export const InvalidId = T('serializers:customCommandInvalidId'); -export const InvalidAliases = T('serializers:customCommandInvalidAliases'); -export const InvalidEmbed = T('serializers:customCommandInvalidEmbed'); -export const InvalidColor = T('serializers:customCommandInvalidColor'); -export const InvalidContent = T('serializers:customCommandInvalidContent'); -export const InvalidType = FT<{ possibles: readonly string[]; count: number }, string>('serializers:customCommandInvalidType'); -export const MissingParameter = FT<{ type: string }, string>('serializers:customCommandMissingParameter'); diff --git a/src/lib/i18n/languageKeys/keys/DisabledCommandChannels/All.ts b/src/lib/i18n/languageKeys/keys/DisabledCommandChannels/All.ts deleted file mode 100644 index 36a300186a6..00000000000 --- a/src/lib/i18n/languageKeys/keys/DisabledCommandChannels/All.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FT, T } from '#lib/types'; - -export const ChannelDoesNotExist = T('serializers:disabledCommandChannelsChannelsDoesNotExist'); -export const CommandDoesNotExist = FT<{ name: string }, string>('serializers:disabledCommandChannelsChannelsCommandDoesNotExist'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Animal.ts b/src/lib/i18n/languageKeys/keys/commands/Animal.ts deleted file mode 100644 index 8bd4ce64812..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Animal.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { T } from '#lib/types'; - -export const BunnyDescription = T('commands/animal:bunnyDescription'); -export const BunnyExtended = T('commands/animal:bunnyExtended'); -export const BunnyEmbedData = T<{ title: string; source: string }>('commands/animal:bunnyEmbedData'); -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/i18n/languageKeys/keys/commands/Animation.ts b/src/lib/i18n/languageKeys/keys/commands/Animation.ts deleted file mode 100644 index 9194e1e4dd4..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Animation.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -export const AniListAnimeDescription = T('commands/animation:aniListAnimeDescription'); -export const AniListAnimeExtended = T('commands/animation:aniListAnimeExtended'); -export const AniListAnimeQueryFail = FT<{ search: string }, string>('commands/animation:aniListAnimeQueryFail'); -export const AniListMangaDescription = T('commands/animation:aniListMangaDescription'); -export const AniListMangaExtended = T('commands/animation:aniListMangaExtended'); -export const AniListMangaQueryFail = FT<{ search: string }, string>('commands/animation:aniListMangaQueryFail'); -export const AniListQueryOnlyNsfw = FT<{ search: string }, string>('commands/animation:aniListQueryOnlyNsfw'); -export const AniListEmbedTitles = T<{ - adultContent: string; - countryOfOrigin: string; - englishName: string; - episodeLength: string; - episodes: string; - chapters: string; - volumes: string; - externalLinks: string; - nativeName: string; - romajiName: string; -}>('commands/animation:aniListEmbedTitles'); -export const KitsuAnimeOutputDescription = FT<{ englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }, string>( - 'commands/animation:kitsuAnimeOutputDescription' -); -export const KitsuAnimeTypes = T<{ tv: string; movie: string; ova: string; special: string; [index: string]: string }>( - 'commands/animation:kitsuAnimeTypes' -); -export const KitsuAnimeDescription = T('commands/animation:kitsuAnimeDescription'); -export const KitsuAnimeEmbedData = T<{ - type: string; - score: string; - episodes: string; - episodeLength: string; - ageRating: string; - firstAirDate: string; - watchIt: string; - stillAiring: string; -}>('commands/animation:kitsuAnimeEmbedData'); -export const KitsuAnimeExtended = T('commands/animation:kitsuAnimeExtended'); -export const KitsuAnimeNoSynopsis = T('commands/animation:kitsuAnimeNoSynopsis'); -export const KitsuMangaDescription = T('commands/animation:kitsuMangaDescription'); -export const KitsuMangaEmbedData = T<{ type: string; score: string; ageRating: string; firstPublishDate: string; readIt: string; none: string }>( - 'commands/animation:kitsuMangaEmbedData' -); -export const KitsuMangaExtended = T('commands/animation:kitsuMangaExtended'); -export const KitsuMangaOutputDescription = FT<{ englishTitle: string; japaneseTitle: string; canonicalTitle: string; synopsis: string }, string>( - 'commands/animation:kitsuMangaOutputDescription' -); -export const KitsuMangaTypes = T<{ manga: string; novel: string; manhwa: string; oneShot: string; special: string; [index: string]: string }>( - 'commands/animation:kitsuMangaTypes' -); -export const WaifuDescription = T('commands/animation:waifuDescription'); -export const WaifuExtended = T('commands/animation:waifuExtended'); -export const WaifuFooter = T('commands/animation:waifuFooter'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Fun.ts b/src/lib/i18n/languageKeys/keys/commands/Fun.ts deleted file mode 100644 index 015f2e94159..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Fun.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -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 EscapeRopeDescription = T('commands/fun:escaperopeDescription'); -export const EscapeRopeExtended = T('commands/fun:escaperopeExtended'); -export const EscapeRopeOutput = FT<{ user: string }, string>('commands/fun:escaperopeOutput'); -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 PopDescription = T('commands/fun:popDescription'); -export const PopExtended = T('commands/fun:popExtended'); -export const PopTitle = T('commands/fun:popTitle'); -export const PopTitleLost = T('commands/fun:popTitleLost'); -export const PopTitleWinner = FT<{ value: string }, string>('commands/fun:popTitleWinner'); -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 ThinkDescription = T('commands/fun:thinkDescription'); -export const ThinkExtended = T('commands/fun:thinkExtended'); -export const ThinkMessage = FT<{ user: string }>('commands/fun:thinkMessage'); -export const WakandaDescription = T('commands/fun:wakandaDescription'); -export const WakandaExtended = T('commands/fun:wakandaExtended'); -export const WhereDescription = T('commands/fun:whereDescription'); -export const WhereExtended = T('commands/fun:whereExtended'); -export const WhereMessage = FT<{ user: string }>('commands/fun:whereMessage'); -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'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Games.ts b/src/lib/i18n/languageKeys/keys/commands/Games.ts deleted file mode 100644 index 133d309c07d..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Games.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; -import type { HungerGamesGame } from '#root/commands/Games/hungergames'; - -export const BalanceDifference = FT<{ previous: string; next: string }, string>('commands/game:balanceDifference'); -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 GamesPromptDeny = T('commands/game:gamesPromptDeny'); -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 CoinFlipDescription = T('commands/game:coinFlipDescription'); -export const CoinFlipExtended = T('commands/game:coinFlipExtended'); -export const CoinFlipInvalidCoinName = FT<{ parameter: string }, string>('commands/game:coinFlipInvalidCoinName'); -export const CoinFlipHeadNames = T('commands/game:coinFlipHeadNames'); -export const CoinFlipTailNames = T('commands/game:coinFlipTailNames'); -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; number: number }, { title: string; description: string; footer: string }>( - 'commands/game:higherLowerEmbed' -); -export const HigherLowerLose = FT<{ number: number; losses: number }, { title: string; description: string; footer: string }>( - 'commands/game:higherLowerLose' -); -export const HigherLowerWin = FT<{ potentials: number; number: number }, { title: string; description: string; footer: string }>( - 'commands/game:higherLowerWin' -); -export const HigherLowerCancel = FT<{ username: string }, { title: string; description: string }>('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<{ count: 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 }>('commands/game:triviaEmbedTitles'); -export const TriviaWinner = FT<{ winner: string; correctAnswer: string }, string>('commands/game:triviaWinner'); diff --git a/src/lib/i18n/languageKeys/keys/commands/General.ts b/src/lib/i18n/languageKeys/keys/commands/General.ts deleted file mode 100644 index 24cd928de2a..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/General.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -export const HelpAllFlag = FT<{ prefix: string }, string>('commands/general:helpAllFlag'); -export const HelpCommandCount = FT<{ count: number }, string>('commands/general:helpCommandCount'); -export const HelpData = FT<{ titleDescription: string; footerName: string }, { title: string; footer: string }>('commands/general:helpData'); -export const HelpDescription = T('commands/general:helpDescription'); -export const HelpDm = T('commands/general:helpDm'); -export const HelpExtended = T('commands/general:helpExtended'); -export const HelpNoDm = T('commands/general:helpNodm'); -export const InfoBody = T('commands/general:infoBody'); -export const InfoDescription = T('commands/general:infoDescription'); -export const InfoExtended = T('commands/general:infoExtended'); -export const InfoTitles = T<{ stats: string; uptime: string; serverUsage: string }>('commands/general:infoTitles'); -export const InfoFields = FT<{ stats: StatsGeneral; uptime: StatsUptime; usage: StatsUsage }, { stats: string; uptime: string; serverUsage: string }>( - 'commands/general:infoFields' -); -export const InfoComponentLabels = T('commands/general:infoComponentLabels'); -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'); -export const V7Description = T('commands/general:v7Description'); -export const V7Extended = T('commands/general:v7Extended'); -export const V7Message = FT<{ command: string }>('commands/general:v7Message'); -export const V7IrissMessage = FT<{ command: string }>('commands/general:v7IrissMessage'); -export const V7NekokaiMessage = FT<{ command: string }>('commands/general:v7NekokaiMessage'); -export const V7PokemonMessage = FT<{ command: string }>('commands/general:v7PokemonMessage'); - -export interface InfoComponentLabels { - addToServer: string; - supportServer: string; - repository: string; - donate: string; -} - -export interface StatsGeneral { - channels: number; - guilds: number; - nodeJs: string; - users: number; - djsVersion: string; - sapphireVersion: string; -} - -export interface StatsUptime { - client: string; - host: string; - total: string; -} - -export interface StatsUsage { - cpuLoad: string; - ramTotal: number; - ramUsed: number; -} diff --git a/src/lib/i18n/languageKeys/keys/commands/Google.ts b/src/lib/i18n/languageKeys/keys/commands/Google.ts deleted file mode 100644 index c4b8a7f3ecd..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Google.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -export const WeatherDescription = T('commands/google:weatherDescription'); -export const WeatherExtended = T('commands/google:weatherExtended'); - -export const WeatherTemperatureFahrenheit = FT<{ value: number; feelsLike: number }, string>('commands/google:weatherFahrenheit'); -export const WeatherInches = FT<{ value: number }, string>('commands/google:weatherInches'); -export const WeatherMiles = FT<{ value: number }, string>('commands/google:weatherMiles'); -export const WeatherMilesPerHour = FT<{ value: number }, string>('commands/google:weatherMilesPerHour'); -export const WeatherTemperatureCelsius = FT<{ value: number; feelsLike: number }, string>('commands/google:weatherCelsius'); -export const WeatherTemperatureKelvin = FT<{ value: number }, string>('commands/google:weatherKelvin'); -export const WeatherMillimeters = FT<{ value: number }, string>('commands/google:weatherMillimeters'); -export const WeatherPascal = FT<{ value: number }, string>('commands/google:weatherPascal'); -export const WeatherKilometers = FT<{ value: number }, string>('commands/google:weatherKilometers'); -export const WeatherKilometersPerHour = FT<{ value: number }, string>('commands/google:weatherKilometersPerHour'); - -export const WeatherInvalidJsonBody = FT<{ query: string }, string>('commands/google:weatherInvalidJsonBody'); -export const WeatherUnknownLocation = FT<{ query: string }, string>('commands/google:weatherUnknownLocation'); -export const WeatherUnknownError = FT<{ query: string }, string>('commands/google:weatherUnknownError'); -export const WeatherBlockedLocation = FT<{ query: string }, string>('commands/google:weatherBlockedLocation'); -export const WeatherRateLimited = FT<{ query: string }, string>('commands/google:weatherRateLimited'); -export const WeatherRemoteServerError = FT<{ query: string }, string>('commands/google:weatherRemoteServerError'); -export const WeatherServiceUnavailable = FT<{ query: string }, string>('commands/google:weatherServiceUnavailable'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Levelling.ts b/src/lib/i18n/languageKeys/keys/commands/Levelling.ts deleted file mode 100644 index ce7b4136e9c..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Levelling.ts +++ /dev/null @@ -1,130 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; -import type { Role } from 'discord.js'; - -export interface LevelTitles { - experience: string; - nextIn: string; - level: string; -} - -export interface ProfileTitles { - globalRank: string; - credits: string; - reputation: string; - experience: string; - level: string; -} - -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 AutoRoleRemove = FT<{ role: Role; before: number }, string>('commands/social:autoRoleRemove'); -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 AutoRoleInvalidLevel = FT<{ parameter: string }, string>('commands/social:autoRoleInvalidLevel'); -export const AutoRoleInvalidNegativeOrZeroLevel = FT<{ parameter: string }, string>('commands/social:autoRoleInvalidNegativeOrZeroLevel'); -export const AutoRoleTooLow = FT<{ parameter: string; minimum: number; maximum: number }, string>('commands/social:autoRoleTooLow'); -export const AutoRoleTooHigh = FT<{ parameter: string; minimum: number; maximum: number }, string>('commands/social:autoRoleTooHigh'); -export const Balance = FT<{ user: string; amount: number }, 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: number }, 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 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 BannerAllOrUser = T('commands/social:bannerAllOrUser'); -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 LeaderboardDescription = T('commands/social:leaderboardDescription'); -export const LeaderboardExtended = T('commands/social:leaderboardExtended'); -export const LeaderboardHeader = FT<{ guild: string }>('commands/social:leaderboardHeader'); -export const LeaderboardNoEntries = T('commands/social:leaderboardNoEntries'); -export const LeaderboardUnknownUser = FT<{ user: string }, string>('commands/social:leaderboardUnknownUser'); -export const Level = T('commands/social:level'); -export const LevelDescription = T('commands/social:levelDescription'); -export const LevelExtended = T('commands/social:levelExtended'); -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 RemindMeDelete = FT<{ remainingDuration: number; id: number }, string>('commands/social:remindmeDelete'); -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 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 ReputationAvailable = T('commands/social:reputationAvailable'); -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 ScoreboardFooter = FT<{ position: number; total: number }, string>('commands/social:scoreboardFooter'); -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 SocialResetAllPrompt = T('commands/social:socialResetAllPrompt'); -export const SocialResetAllTimeOut = T('commands/social:socialResetAllTimeOut'); -export const SocialResetAllAborted = T('commands/social:socialResetAllAborted'); -export const SocialResetAllEmpty = T('commands/social:socialResetAllEmpty'); -export const SocialResetAllSuccess = FT<{ count: number }>('commands/social:socialResetAllSuccess'); -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 }, - { depositedDescription: string; withdrewDescription: string; showDescription: string; accountMoney: string; accountVault: string } ->('commands/social:vaultEmbedData'); -export const VaultExtended = T('commands/social:vaultExtended'); -export const VaultNotEnoughInVault = FT<{ vault: number }, string>('commands/social:vaultNotEnoughInVault'); -export const VaultNotEnoughMoney = FT<{ money: number }, string>('commands/social:vaultNotEnoughMoney'); -export const VaultInvalidAll = FT<{ parameter: string; possibles: readonly string[] }, string>('commands/social:vaultInvalidAll'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Misc.ts b/src/lib/i18n/languageKeys/keys/commands/Misc.ts deleted file mode 100644 index 04196d2b432..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Misc.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -export const CannotTargetOwner = T('commands/misc:cannotTargetOwner'); -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 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 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 SkyraFactDescription = T('commands/misc:skyrafactDescription'); -export const SkyraFactExtended = T('commands/misc:skyrafactExtended'); -export const SkyraFactTitle = T('commands/misc:skyrafactTitle'); -export const SkyraFactMessages = T('commands/misc:skyrafactMessages'); -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'); diff --git a/src/lib/i18n/languageKeys/keys/commands/StarWars.ts b/src/lib/i18n/languageKeys/keys/commands/StarWars.ts deleted file mode 100644 index eacaeded8d7..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/StarWars.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { EmbedTitles, FT, Resource, T } from '#lib/types'; - -export const FilmDescription = T('commands/starwars:filmDescription'); -export const FilmExtended = T('commands/starwars:filmExtended'); -export const FilmQueryFail = FT<{ film: string }, string>('commands/starwars:filmQueryFail'); -export const FilmEmbedTitles = T('commands/starwars:filmEmbedTitles'); - -export const PersonDescription = T('commands/starwars:personDescription'); -export const PersonExtended = T('commands/starwars:personExtended'); -export const PersonQueryFail = FT<{ person: string }, string>('commands/starwars:personQueryFail'); -export const PersonEmbedTitles = T('commands/starwars:personEmbedTitles'); - -export const PlanetDescription = T('commands/starwars:planetDescription'); -export const PlanetExtended = T('commands/starwars:planetExtended'); -export const PlanetQueryFail = FT<{ planets: string }, string>('commands/starwars:planetQueryFail'); -export const PlanetEmbedTitles = T('commands/starwars:planetEmbedTitles'); - -export const SpeciesDescription = T('commands/starwars:speciesDescription'); -export const SpeciesExtended = T('commands/starwars:speciesExtended'); -export const SpeciesQueryFail = FT<{ species: string }, string>('commands/starwars:speciesQueryFail'); -export const SpeciesEmbedTitles = T('commands/starwars:speciesEmbedTitles'); - -export const StarshipDescription = T('commands/starwars:starshipDescription'); -export const StarshipExtended = T('commands/starwars:starshipExtended'); -export const StarshipQueryFail = FT<{ starship: string }, string>('commands/starwars:starshipQueryFail'); -export const StarshipEmbedTitles = T('commands/starwars:starshipEmbedTitles'); - -export const VehicleDescription = T('commands/starwars:vehicleDescription'); -export const VehicleExtended = T('commands/starwars:vehicleExtended'); -export const VehicleQueryFail = FT<{ vehicle: string }, string>('commands/starwars:vehicleQueryFail'); -export const VehicleEmbedTitles = T('commands/starwars:vehicleEmbedTitles'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Suggestions.ts b/src/lib/i18n/languageKeys/keys/commands/Suggestions.ts deleted file mode 100644 index 377f75b64c3..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Suggestions.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -export const ResolveSuggestionActions = FT<{ author: string }, { accept: string; consider: string; deny: string }>( - 'commands/suggestion:resolveSuggestionActions' -); -export const ResolveSuggestionActionsDms = FT<{ author: string; guild: string }, { accept: string; consider: string; deny: string }>( - 'commands/suggestion:resolveSuggestionActionsDms' -); -export const ResolveSuggestionTooManyFields = T('commands/suggestion:resolveSuggestionTooManyFields'); -export const ResolveSuggestionTooManyCharacters = FT<{ maximum: number; amount: number }>('commands/suggestion:resolveSuggestionTooManyCharacters'); -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 ResolveSuggestionInvalidAction = FT<{ parameter: string; possibles: readonly string[] }, string>( - 'commands/suggestion:resolveSuggestionInvalidAction' -); -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 SuggestNoSetup = FT<{ username: string }, string>('commands/suggestion:suggestNoSetup'); diff --git a/src/lib/i18n/languageKeys/keys/commands/System.ts b/src/lib/i18n/languageKeys/keys/commands/System.ts deleted file mode 100644 index 36855548900..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/System.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -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 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 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 Reboot = T('commands/system:reboot'); -export const RebootDescription = T('commands/system:rebootDescription'); -export const RebootExtended = T('commands/system:rebootExtended'); -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'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Tags.ts b/src/lib/i18n/languageKeys/keys/commands/Tags.ts deleted file mode 100644 index 3d2618ed76e..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Tags.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; -import type { Pick, Tag, Transformer } from '@skyra/tags'; - -export const TagAdded = FT<{ name: string; content: string }, string>('commands/tags:added'); -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 TagCannotAlias = FT<{ tag: string }, string>('commands/tags:cannotAlias'); -export const TagAlias = FT<{ output: string; input: string }, string>('commands/tags:alias'); -export const TagPermissionLevel = T('commands/tags:permissionlevel'); -export const TagRemoved = FT<{ name: string }, string>('commands/tags:removed'); -export const TagRenamed = FT<{ name: string; previous: string }, string>('commands/tags:renamed'); -export const TagReset = T('commands/tags:reset'); -export const ParseMismatchingNamedArgumentTypeValidation = FT<{ expected: Tag; received: Tag }, string>( - 'commands/tags:parseMismatchingNamedArgumentTypeValidation' -); -export const ParseParserEmptyStringTag = T('commands/tags:parseParserEmptyStringTag'); -export const ParseParserMissingToken = T('commands/tags:parseParserMissingToken'); -export const ParseParserPickMissingOptions = T('commands/tags:parseParserPickMissingOptions'); -export const ParseParserRandomDuplicatedOptions = T('commands/tags:parseParserRandomDuplicatedOptions'); -export const ParseParserRandomMissingOptions = T('commands/tags:parseParserRandomMissingOptions'); -export const ParseParserUnexpectedToken = FT<{ expected: string; received: string }, string>('commands/tags:parseParserUnexpectedToken'); -export const ParsePickInvalidOption = FT<{ pick: Pick; option: string }, string>('commands/tags:parsePickInvalidOption'); -export const ParseSentenceMissingArgument = T('commands/tags:parseSentenceMissingArgument'); -export const ParseTransformerInvalidFormatter = FT<{ transformer: Transformer; formatter: string }, string>( - 'commands/tags:parseTransformerInvalidFormatter' -); -export const ParseTokenSpace = T('commands/tags:parseTokenSpace'); -export const ParseTokenTagStart = T('commands/tags:parseTokenTagStart'); -export const ParseTokenTagEnd = T('commands/tags:parseTokenTagEnd'); -export const ParseTokenEquals = T('commands/tags:parseTokenEquals'); -export const ParseTokenColon = T('commands/tags:parseTokenColon'); -export const ParseTokenPipe = T('commands/tags:parseTokenPipe'); -export const ParseTokenLiteral = T('commands/tags:parseTokenLiteral'); diff --git a/src/lib/i18n/languageKeys/keys/commands/Tools.ts b/src/lib/i18n/languageKeys/keys/commands/Tools.ts deleted file mode 100644 index 1d13042562f..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Tools.ts +++ /dev/null @@ -1,179 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; -import type { GuildMember, User } from 'discord.js'; - -export const WikipediaNotFound = T('commands/tools:wikipediaNotfound'); -export const YouTubeNotFound = T('commands/tools:youtubeNotfound'); -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 ContentEmpty = T('commands/tools:contentEmpty'); -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 }>('commands/tools:countryTitles'); -export const CountryFields = T<{ - overview: { officialName: string; capital: string; population: string }; - other: { demonym: string; area: string; currencies: string }; -}>('commands/tools:countryFields'); -export const CreateEmojiDescription = T('commands/tools:createEmojiDescription'); -export const CreateEmojiExtended = T('commands/tools:createEmojiExtended'); -export const CreateEmojisDuplicate = FT<{ name: string }, string>('commands/tools:createEmojiDuplicate'); -export const CreateEmojiInvalidDiscordEmoji = FT<{ parameter: string }, string>('commands/tools:createEmojiInvalidDiscordEmoji'); -export const CreateEmojiInvalidEmoji = T('commands/tools:createEmojiInvalidEmoji'); -export const CreateEmojiSuccess = FT<{ emoji: string }, string>('commands/tools:createEmojiSuccess'); -export const CountryTimezone = T<{ timezone: string[]; count: number }>('commands/tools:countryTimezone'); -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; - releaseDate: string; - numberOfPlayers: string; - platform: string; - genres: string; - noGenres: string; - nsuid: 'NSUID'; - esrb: 'ESRB'; -}>('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<{ parameter: string; maybe: string }, string>('commands/tools:horoscopeInvalidSunsign'); -export const HoroscopeTitles = FT< - { sign: string; intensity: string; keywords: readonly string[]; mood: string; rating: string }, - { dailyHoroscope: string; metadataTitle: string; metadata: readonly string[] } ->('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; - releaseDate: string; - genres: string; - developers: string; - platform: string; -}>('commands/tools:igdbTitles'); -export const IgdbData = T<{ - noDevelopers: string; - noPlatforms: string; - noReleaseDate: string; - noRating: string; - noSummary: string; - noAgeRatings: string; - noGenres: string; -}>('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; - trackPrice: string; - trackReleaseDate: string; - numberOfTracksInCollection: string; - primaryGenre: string; - preview: string; - previewLabel: string; -}>('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; - status: string; - releaseDate: string; - imdbPage: string; - homePage: string; - collection: string; - genres: string; -}>('commands/tools:moviesTitles'); -export const MoviesData = T<{ - variableRuntime: string; - movieInProduction: string; - linkClickHere: string; - none: string; - notPartOfCollection: string; - noGenres: string; -}>('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; -}>('commands/tools:showsTitles'); -export const ShowsData = T<{ variableRuntime: string; unknownUserScore: string; noGenres: string }>('commands/tools:showsData'); -export const PriceDescription = T('commands/tools:priceDescription'); -export const PriceExtended = T('commands/tools:priceExtended'); -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 VoteContentNeeded = T('commands/tools:voteContentNeeded'); -export const VoteReactionBlocked = T('commands/tools:voteReactionBlocked'); -export const UrbanDescription = T('commands/tools:urbanDescription'); -export const UrbanExtended = T('commands/tools:urbanExtended'); -export const UrbanNoDefinition = FT<{ parameter: string }, string>('commands/tools:urbanNoDefinition'); -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 PriceCurrency = FT<{ fromCurrency: string; fromAmount: number; worths: string[] }, string>('commands/tools:priceCurrency'); -export const PriceCurrencyNotFound = T('commands/tools:priceCurrencyNotFound'); -export const WhoisMemberTitles = T<{ joined: string; createdAt: string }>('commands/tools:whoisMemberTitles'); -export const WhoisMemberFields = FT< - { - member: GuildMember; - memberCreatedAt: string; - memberCreatedAtOffset: string; - memberJoinedAt: string; - memberJoinedAtOffset: string; - }, - { - joinedUnknown: string; - joinedWithTimestamp: string; - createdAt: string; - footer: string; - } ->('commands/tools:whoisMemberFields'); -export const WhoisMemberRoles = FT<{ count: number }, string>('commands/tools:whoisMemberRoles'); -export const WhoisMemberRoleListAndMore = FT<{ count: number }, string>('commands/tools:whoisMemberRoleListAndMore'); -export const WhoisMemberPermissions = T('commands/tools:whoisMemberPermissions'); -export const WhoisMemberPermissionsAll = T('commands/tools:whoisMemberPermissionsAll'); -export const WhoisUserTitles = T<{ - createdAt: string; -}>('commands/tools:whoisUserTitles'); -export const WhoisUserFields = FT< - { - user: User; - userCreatedAt: string; - userCreatedAtOffset: string; - }, - { - createdAt: string; - footer: string; - } ->('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/i18n/languageKeys/keys/commands/Twitch.ts b/src/lib/i18n/languageKeys/keys/commands/Twitch.ts deleted file mode 100644 index f20639f6c05..00000000000 --- a/src/lib/i18n/languageKeys/keys/commands/Twitch.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import { FT, T } from '#lib/types'; - -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 }>('commands/twitch:followage'); -export const FollowageMissingEntries = T('commands/twitch:followageMissingEntries'); -export const TwitchNoEntries = T('commands/twitch:twitchNoEntries'); -export const TwitchTitles = T<{ followers: string; views: string; clickToVisit: string; partner: string }>('commands/twitch:twitchTitles'); -export const TwitchPartnershipWithoutAffiliate = T('commands/twitch:twitchPartnershipWithoutAffiliate'); -export const TwitchAffiliateStatus = T<{ affiliated: string; partnered: string }>('commands/twitch:twitchAffiliateStatus'); -export const TwitchSubscriptionStreamerNotFound = T('commands/twitch:twitchSubscriptionStreamerNotFound'); -export const TwitchSubscriptionStatusValues = T<[string, string]>('commands/twitch:twitchSubscriptionStatusValues'); -export const TwitchSubscriptionInvalidStatus = T('commands/twitch:twitchSubscriptionInvalidStatus'); -export const TwitchSubscriptionAddDuplicated = T('commands/twitch:twitchSubscriptionAddDuplicated'); -export const TwitchSubscriptionAddSuccessOffline = FT<{ name: string; channel: string }>('commands/twitch:twitchSubscriptionAddSuccessOffline'); -export const TwitchSubscriptionAddSuccessLive = FT<{ name: string; channel: string }>('commands/twitch:twitchSubscriptionAddSuccessLive'); -export const TwitchSubscriptionAddMessageForOfflineRequired = T('commands/twitch:twitchSubscriptionAddMessageForOfflineRequired'); -export const TwitchSubscriptionRemoveStreamerNotSubscribed = FT<{ streamer: string }>( - 'commands/twitch:twitchSubscriptionRemoveStreamerNotSubscribed' -); -export const TwitchSubscriptionRemoveNotToProvidedChannel = FT<{ channel: string }>('commands/twitch:twitchSubscriptionRemoveNotToProvidedChannel'); -export const TwitchSubscriptionRemoveStreamerStatusNotMatch = FT<{ streamer: string; status: string }>( - 'commands/twitch:twitchSubscriptionRemoveStreamerStatusNotMatch' -); -export const TwitchSubscriptionRemoveSuccessOffline = FT<{ name: string; channel: string }>('commands/twitch:twitchSubscriptionRemoveSuccessOffline'); -export const TwitchSubscriptionRemoveSuccessLive = FT<{ name: string; channel: string }>('commands/twitch:twitchSubscriptionRemoveSuccessLive'); -export const TwitchSubscriptionNoSubscriptions = T('commands/twitch:twitchSubscriptionNoSubscriptions'); -export const TwitchSubscriptionResetSuccess = FT<{ count: number }>('commands/twitch:twitchSubscriptionResetSuccess'); -export const TwitchSubscriptionShowStreamerNotSubscribed = T('commands/twitch:twitchSubscriptionShowStreamerNotSubscribed'); -export const TwitchSubscriptionShowStatus = T<{ live: string; offline: string }>('commands/twitch:twitchSubscriptionShowStatus'); -export const TwitchSubscriptionShowUnknownUser = T('commands/twitch:twitchSubscriptionShowUnknownUser'); diff --git a/src/lib/i18n/languageKeys/keys/events/twitch/All.ts b/src/lib/i18n/languageKeys/keys/events/twitch/All.ts deleted file mode 100644 index 6c264bbb604..00000000000 --- a/src/lib/i18n/languageKeys/keys/events/twitch/All.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FT, T } from '#lib/types'; - -export const EmbedDescription = FT<{ userName: string }, string>('events/twitch:embedDescription'); -export const EmbedDescriptionWithGame = FT<{ userName: string; gameName: string }, string>('events/twitch:embedDescriptionWithGame'); -export const OfflinePostfix = T('events/twitch:offlinePostfix'); diff --git a/src/lib/i18n/structures/Handler.ts b/src/lib/i18n/structures/Handler.ts deleted file mode 100644 index 688287181d8..00000000000 --- a/src/lib/i18n/structures/Handler.ts +++ /dev/null @@ -1,30 +0,0 @@ -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 dateTime: 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.dateTime = new Intl.DateTimeFormat(this.name, { timeZone: 'Etc/UTC', dateStyle: 'short', timeStyle: 'medium' }); - this.duration = new DurationFormatter(options.duration); - } - - public abstract ordinal(cardinal: number): string; -} - -export namespace Handler { - export interface Options { - name: string; - duration: DurationFormatAssetsTime; - } -} diff --git a/src/lib/i18n/translate.ts b/src/lib/i18n/translate.ts deleted file mode 100644 index e689ecdd540..00000000000 --- a/src/lib/i18n/translate.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { SkyraArgs } from '#lib/structures'; -import { DecoratorIdentifiers } from '@sapphire/decorators'; -import { Identifiers } from '@sapphire/framework'; -import type { TFunction } from '@sapphire/plugin-i18next'; -import { LanguageKeys } from './languageKeys'; - -export function translate(identifier: string): string { - switch (identifier) { - case Identifiers.ArgumentBooleanError: - case Identifiers.ArgumentChannelError: - case Identifiers.ArgumentDateError: - case Identifiers.ArgumentDateTooEarly: - case Identifiers.ArgumentDateTooFar: - case Identifiers.ArgumentDMChannelError: - case Identifiers.ArgumentFloatError: - case Identifiers.ArgumentFloatTooLarge: - case Identifiers.ArgumentFloatTooSmall: - case Identifiers.ArgumentGuildCategoryChannelError: - case Identifiers.ArgumentGuildChannelError: - case Identifiers.ArgumentGuildChannelMissingGuildError: - case Identifiers.ArgumentGuildNewsChannelError: - case Identifiers.ArgumentGuildNewsThreadChannelError: - case Identifiers.ArgumentGuildPrivateThreadChannelError: - case Identifiers.ArgumentGuildPublicThreadChannelError: - case Identifiers.ArgumentGuildStageVoiceChannelError: - case Identifiers.ArgumentGuildTextChannelError: - case Identifiers.ArgumentGuildThreadChannelError: - case Identifiers.ArgumentGuildVoiceChannelError: - case Identifiers.ArgumentHyperlinkError: - case Identifiers.ArgumentIntegerError: - case Identifiers.ArgumentIntegerTooLarge: - case Identifiers.ArgumentIntegerTooSmall: - case Identifiers.ArgumentMemberError: - case Identifiers.ArgumentMemberMissingGuild: - case Identifiers.ArgumentMessageError: - case Identifiers.ArgumentNumberError: - case Identifiers.ArgumentNumberTooLarge: - case Identifiers.ArgumentNumberTooSmall: - case Identifiers.ArgumentRoleError: - case Identifiers.ArgumentRoleMissingGuild: - case Identifiers.ArgumentStringTooLong: - case Identifiers.ArgumentStringTooShort: - case Identifiers.ArgumentUserError: - return `arguments:${identifier}`; - case Identifiers.ArgsUnavailable: - return LanguageKeys.Arguments.Unavailable; - case Identifiers.ArgsMissing: - return LanguageKeys.Arguments.Missing; - case Identifiers.CommandDisabled: - return LanguageKeys.Preconditions.DisabledGlobal; - case Identifiers.PreconditionCooldown: - return LanguageKeys.Preconditions.Cooldown; - case Identifiers.PreconditionDMOnly: - return LanguageKeys.Preconditions.DmOnly; - case Identifiers.PreconditionGuildNewsOnly: - return LanguageKeys.Preconditions.GuildNewsOnly; - case Identifiers.PreconditionGuildNewsThreadOnly: - return LanguageKeys.Preconditions.GuildNewsThreadOnly; - case Identifiers.PreconditionGuildOnly: - case DecoratorIdentifiers.RequiresClientPermissionsGuildOnly: - case DecoratorIdentifiers.RequiresUserPermissionsGuildOnly: - return LanguageKeys.Preconditions.GuildOnly; - case Identifiers.PreconditionGuildPrivateThreadOnly: - return LanguageKeys.Preconditions.GuildPrivateThreadOnly; - case Identifiers.PreconditionGuildPublicThreadOnly: - return LanguageKeys.Preconditions.GuildPublicThreadOnly; - case Identifiers.PreconditionGuildTextOnly: - return LanguageKeys.Preconditions.GuildTextOnly; - case Identifiers.PreconditionNSFW: - return LanguageKeys.Preconditions.Nsfw; - case Identifiers.PreconditionClientPermissions: - case DecoratorIdentifiers.RequiresClientPermissionsMissingPermissions: - return LanguageKeys.Preconditions.ClientPermissions; - case Identifiers.PreconditionUserPermissions: - case DecoratorIdentifiers.RequiresUserPermissionsMissingPermissions: - return LanguageKeys.Preconditions.UserPermissions; - case Identifiers.PreconditionThreadOnly: - return LanguageKeys.Preconditions.ThreadOnly; - default: - return identifier; - } -} - -export type TResolvable = SkyraArgs | TFunction; - -export function resolveT(t: TResolvable): TFunction { - return typeof t === 'function' ? t : t.t; -} diff --git a/src/lib/setup/Canvas.ts b/src/lib/setup/Canvas.ts deleted file mode 100644 index 7f497aa9bf6..00000000000 --- a/src/lib/setup/Canvas.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { assetsFolder } from '#utils/constants'; -import { loadFont } from 'canvas-constructor/napi-rs'; -import { join } from 'node:path'; - -loadFont(join(assetsFolder, 'fonts', 'Roboto-Regular.ttf'), 'RobotoRegular'); -loadFont(join(assetsFolder, 'fonts', 'NotoEmoji.ttf'), 'RobotoRegular'); -loadFont(join(assetsFolder, 'fonts', 'NotoSans-Regular.ttf'), 'RobotoRegular'); -loadFont(join(assetsFolder, 'fonts', 'Roboto-Light.ttf'), 'RobotoLight'); -loadFont(join(assetsFolder, 'fonts', 'Family-Friends.ttf'), 'FamilyFriends'); diff --git a/src/lib/setup/PaginatedMessage.ts b/src/lib/setup/PaginatedMessage.ts deleted file mode 100644 index 6e273105d74..00000000000 --- a/src/lib/setup/PaginatedMessage.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { userMention } from '@discordjs/builders'; -import { PaginatedMessage } from '@sapphire/discord.js-utilities'; -import { container } from '@sapphire/framework'; -import i18n from 'i18next'; - -PaginatedMessage.selectMenuOptions = async (pageIndex, internationalizationContext) => { - const languageForContext = await container.i18n.fetchLanguage(internationalizationContext); - - return { label: `${i18n.t(LanguageKeys.Globals.PaginatedMessagePage, { lng: languageForContext ?? 'en-US' })} ${pageIndex}` }; -}; - -PaginatedMessage.wrongUserInteractionReply = async (targetUser, _, internationalizationContext) => { - const languageForContext = await container.i18n.fetchLanguage(internationalizationContext); - - return { - content: i18n.t(LanguageKeys.Globals.PaginatedMessageWrongUserInteractionReply, { - lng: languageForContext ?? 'en-US', - user: userMention(targetUser.id) - }), - ephemeral: true, - allowedMentions: { users: [], roles: [] } - }; -}; diff --git a/src/lib/setup/index.ts b/src/lib/setup/index.ts deleted file mode 100644 index 13b8743bce4..00000000000 --- a/src/lib/setup/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Config must be the first to be loaded, as it sets the env: -import 'reflect-metadata'; -import '#root/config'; - -// Import everything else: -import '#utils/Sanitizer/initClean'; -import '@sapphire/plugin-api/register'; -import '@sapphire/plugin-i18next/register'; -import '@sapphire/plugin-logger/register'; -import '@sapphire/plugin-editable-commands/register'; -import './Canvas'; -import './PaginatedMessage'; - -import * as colorette from 'colorette'; -import { inspect } from 'node:util'; - -inspect.defaultOptions.depth = 1; -colorette.createColors({ useColor: true }); diff --git a/src/lib/structures/AnalyticsData.ts b/src/lib/structures/AnalyticsData.ts deleted file mode 100644 index 50902cf1269..00000000000 --- a/src/lib/structures/AnalyticsData.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { parseAnalytics } from '#root/config'; -import { InfluxDB, QueryApi, WriteApi } from '@influxdata/influxdb-client'; -import { envParseBoolean, envParseString } from '@skyra/env-utilities'; - -export class AnalyticsData { - public influx: InfluxDB | null = envParseBoolean('INFLUX_ENABLED') ? new InfluxDB(parseAnalytics()) : null; - - public writeApi!: WriteApi; - public queryApi!: QueryApi; - - public messageCount = 0; - - public constructor() { - this.writeApi = this.influx!.getWriteApi(envParseString('INFLUX_ORG'), envParseString('INFLUX_ORG_ANALYTICS_BUCKET'), 's'); - this.queryApi = this.influx!.getQueryApi(envParseString('INFLUX_ORG')); - } -} diff --git a/src/lib/structures/HelpPaginatedMessage.ts b/src/lib/structures/HelpPaginatedMessage.ts deleted file mode 100644 index 9ccb13eb215..00000000000 --- a/src/lib/structures/HelpPaginatedMessage.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { minutes } from '#utils/common'; -import { - isMessageButtonInteraction, - isMessageInstance, - PaginatedMessagePage, - runsOnInteraction, - type PaginatedMessageAction, - type PaginatedMessageOptions -} from '@sapphire/discord.js-utilities'; -import type { TFunction } from '@sapphire/plugin-i18next'; -import { isFunction } from '@sapphire/utilities'; -import { - Constants, - MessageActionRow, - MessageButton, - MessageSelectMenu, - type ButtonInteraction, - type CommandInteraction, - type Message, - type MessageOptions, - type SelectMenuInteraction, - type User, - type WebhookEditMessageOptions -} from 'discord.js'; -import { SkyraPaginatedMessage } from './SkyraPaginatedMessage'; - -export class HelpPaginatedMessage extends SkyraPaginatedMessage { - private language: TFunction; - - public constructor(language: TFunction, options: PaginatedMessageOptions = {}) { - super(options); - this.setIdle(minutes(10)); - this.language = language; - - this.setActions([ - { - customId: '@sapphire/paginated-messages.goToPage', - type: Constants.MessageComponentTypes.SELECT_MENU, - selectMenuIndex: 'set-1', - run: ({ handler, interaction }) => interaction.isSelectMenu() && (handler.index = parseInt(interaction.values[0], 10)) - }, - { - customId: '@sapphire/paginated-messages.goToPage-2', - type: Constants.MessageComponentTypes.SELECT_MENU, - selectMenuIndex: 'set-2', - run: ({ handler, interaction }) => interaction.isSelectMenu() && (handler.index = parseInt(interaction.values[0], 10)) - }, - { - customId: '@sapphire/paginated-messages.firstPage', - style: 'PRIMARY', - emoji: '⏪', - type: Constants.MessageComponentTypes.BUTTON, - run: ({ handler }) => (handler.index = 0) - }, - { - customId: '@sapphire/paginated-messages.previousPage', - style: 'PRIMARY', - emoji: '◀️', - type: Constants.MessageComponentTypes.BUTTON, - run: ({ handler }) => { - if (handler.index === 0) { - handler.index = handler.pages.length - 1; - } else { - --handler.index; - } - } - }, - { - customId: '@sapphire/paginated-messages.nextPage', - style: 'PRIMARY', - emoji: '▶️', - type: Constants.MessageComponentTypes.BUTTON, - run: ({ handler }) => { - if (handler.index === handler.pages.length - 1) { - handler.index = 0; - } else { - ++handler.index; - } - } - }, - { - customId: '@sapphire/paginated-messages.goToLastPage', - style: 'PRIMARY', - emoji: '⏩', - type: Constants.MessageComponentTypes.BUTTON, - run: ({ handler }) => (handler.index = handler.pages.length - 1) - }, - { - customId: '@sapphire/paginated-messages.stop', - style: 'DANGER', - emoji: '⏹️', - type: Constants.MessageComponentTypes.BUTTON, - run: ({ collector }) => { - collector.stop(); - } - } - ]); - } - - public override setActions(actions: HelpPaginatedMessageAction[]): this { - this.actions.clear(); - return this.addActions(actions); - } - - public override addPage(page: PaginatedMessagePage): this { - this.pages.push(page); - - return this; - } - - /** - * Sets up the message. - * - * @param messageOrInteraction The message or interaction that triggered this {@link PaginatedMessage}. - * Generally this will be the command message or an interaction - * (either a {@link CommandInteraction}, a {@link SelectMenuInteraction} or a {@link ButtonInteraction}), - * but it can also be another message from your client, i.e. to indicate a loading state. - * - * @param author The author the handler is for. - */ - protected async setUpMessage( - messageOrInteraction: Message | CommandInteraction | SelectMenuInteraction | ButtonInteraction, - targetUser: User - ): Promise { - // Get the current page - let page = this.messages[this.index]!; - - // If the page is a callback function such as with `addAsyncPageEmbed` then resolve it here - page = isFunction(page) ? await page(this.index, this.pages, this) : page; - - // Merge in the advanced options - page = { ...page, ...(this.paginatedMessageData ?? {}) }; - - // If we do not have more than 1 page then there is no reason to add message components - if (this.pages.length > 1) { - const messageComponents: (MessageButton | MessageSelectMenu)[] = []; - - for (const interaction of this.actions.values() as IterableIterator) { - if (isMessageButtonInteraction(interaction)) { - messageComponents.push(new MessageButton(interaction)); - } else if (interaction.selectMenuIndex === 'set-1') { - messageComponents.push( - new MessageSelectMenu({ - options: await Promise.all( - this.pages.slice(0, 25).map(async (_, index) => ({ - ...(await this.selectMenuOptions( - index + 1, - this.resolvePaginatedMessageInternationalizationContext(messageOrInteraction, targetUser) - )), - value: index.toString(), - description: `${this.language(LanguageKeys.Globals.PaginatedMessagePage)} ${index + 1}` - })) - ), - ...interaction - }) - ); - } else if (this.pages.slice(25).length) { - messageComponents.push( - new MessageSelectMenu({ - options: await Promise.all( - this.pages.slice(25).map(async (_, index) => ({ - ...(await this.selectMenuOptions( - index + 1 + 25, - this.resolvePaginatedMessageInternationalizationContext(messageOrInteraction, targetUser) - )), - value: (index + 25).toString(), - description: `${this.language(LanguageKeys.Globals.PaginatedMessagePage)} ${index + 1 + 25}` - })) - ), - ...interaction - }) - ); - } - } - - page.components = createPartitionedMessageRow(messageComponents); - } - - if (this.response) { - if (runsOnInteraction(this.response)) { - if (this.response.replied || this.response.deferred) { - await this.response.editReply(page as WebhookEditMessageOptions); - } else { - await this.response.reply(page as WebhookEditMessageOptions); - } - } else if (isMessageInstance(this.response)) { - await this.response.edit(page as WebhookEditMessageOptions); - } - } else if (runsOnInteraction(messageOrInteraction)) { - if (messageOrInteraction.replied || messageOrInteraction.deferred) { - this.response = await messageOrInteraction.editReply(page); - } else { - this.response = await messageOrInteraction.reply({ ...page, fetchReply: true, ephemeral: false }); - } - } else { - this.response = await messageOrInteraction.channel.send(page as MessageOptions); - } - } -} - -function createPartitionedMessageRow(components: (MessageButton | MessageSelectMenu)[]): MessageActionRow[] { - // Sort all buttons above select menus - components = components.sort((a, b) => (a.type === 'BUTTON' && b.type === 'SELECT_MENU' ? -1 : 0)); - - const buttons = components.slice(0, 5); - const selectMenu1 = components[5]; - const selectMenu2 = components[6]; - - // Map all the components to MessageActionRows - const actionRows: MessageActionRow[] = [ - new MessageActionRow().setComponents(buttons), // - new MessageActionRow().setComponents(selectMenu1) - ]; - - if (selectMenu2) { - actionRows.push(new MessageActionRow().setComponents(selectMenu2)); - } - - return actionRows; -} - -type HelpPaginatedMessageAction = PaginatedMessageAction & { - selectMenuIndex?: 'set-1' | 'set-2'; -}; diff --git a/src/lib/structures/SettingsMenu.ts b/src/lib/structures/SettingsMenu.ts deleted file mode 100644 index d2217006df7..00000000000 --- a/src/lib/structures/SettingsMenu.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { configurableGroups, isSchemaGroup, readSettings, remove, SchemaGroup, SchemaKey, set, writeSettings } from '#lib/database/settings'; -import { api } from '#lib/discord/Api'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildMessage } from '#lib/types'; -import { Events } from '#lib/types/Enums'; -import { floatPromise, minutes } from '#utils/common'; -import { ZeroWidthSpace } from '#utils/constants'; -import { deleteMessage } from '#utils/functions'; -import { LLRCData, LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import { sendLoadingMessage } from '#utils/util'; -import { container } from '@sapphire/framework'; -import { deepClone } from '@sapphire/utilities'; -import { RESTJSONErrorCodes } from 'discord-api-types/v9'; -import { DiscordAPIError, MessageCollector, MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; -import * as Lexure from 'lexure'; -import { SkyraArgs } from './commands/parsers/SkyraArgs'; -import type { SkyraCommand } from './commands/SkyraCommand'; - -const EMOJIS = { BACK: '◀', STOP: '⏹' }; -const TIMEOUT = minutes(15); - -const enum UpdateType { - Set, - Remove, - Reset, - Replace -} - -export class SettingsMenu { - private readonly message: GuildMessage; - private t: TFunction; - private schema: SchemaKey | SchemaGroup; - private messageCollector: MessageCollector | null = null; - private errorMessage: string | null = null; - private llrc: LongLivingReactionCollector | null = null; - private readonly embed: MessageEmbed; - private response: GuildMessage | null = null; - private oldValue: unknown = undefined; - - public constructor(message: GuildMessage, language: TFunction) { - this.message = message; - this.t = language; - this.schema = configurableGroups; - this.embed = new MessageEmbed().setAuthor({ - name: this.message.author.username, - iconURL: this.message.author.displayAvatarURL({ size: 128, format: 'png', dynamic: true }) - }); - } - - private get updatedValue(): boolean { - return this.oldValue !== undefined; - } - - public async init(context: SkyraCommand.Context): Promise { - this.response = await sendLoadingMessage(this.message, this.t); - await this.response.react(EMOJIS.STOP); - this.llrc = new LongLivingReactionCollector().setListener(this.onReaction.bind(this)).setEndListener(this.stop.bind(this)); - this.llrc.setTime(TIMEOUT); - this.messageCollector = this.response.channel.createMessageCollector({ - filter: (msg) => msg.author!.id === this.message.author.id - }); - this.messageCollector.on('collect', (msg) => this.onMessage(msg as GuildMessage, context)); - await this._renderResponse(); - } - - private async render() { - const { t } = this; - const description: string[] = []; - if (isSchemaGroup(this.schema)) { - description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderAtFolder, { path: this.schema.name })); - if (this.errorMessage) description.push(this.errorMessage); - const keys: string[] = []; - const folders: string[] = []; - for (const [key, value] of this.schema.entries()) { - if (value.dashboardOnly) continue; - if (isSchemaGroup(value)) folders.push(key); - else keys.push(key); - } - - if (!folders.length && !keys.length) description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderNokeys)); - else - description.push( - t(LanguageKeys.Commands.Admin.ConfMenuRenderSelect), - '', - ...folders.map((folder) => `📁 ${folder}`), - ...keys.map((key) => `⚙️ ${key}`) - ); - } else { - 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 readSettings(this.message.guild, (settings) => { - const language = settings.getLanguage(); - const key = this.schema as SchemaKey; - return [settings[key.property], key.display(settings, language), language]; - }); - this.t = language; - description.push(t(this.schema.description), '', t(LanguageKeys.Commands.Admin.ConfMenuRenderUpdate)); - if (this.schema.array && (value as unknown[]).length) description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderRemove)); - if (this.updatedValue) description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderReset)); - if (this.updatedValue) description.push(t(LanguageKeys.Commands.Admin.ConfMenuRenderUndo)); - description.push('', t(LanguageKeys.Commands.Admin.ConfMenuRenderCvalue, { value: serialized })); - } - - const { parent } = this.schema; - if (parent) floatPromise(this._reactResponse(EMOJIS.BACK)); - else floatPromise(this._removeReactionFromUser(EMOJIS.BACK, this.message.client.user!.id)); - - return this.embed - .setColor(await container.db.fetchColor(this.message)) - .setDescription(`${description.filter((v) => v !== null).join('\n')}\n${ZeroWidthSpace}`) - .setFooter({ text: parent ? t(LanguageKeys.Commands.Admin.ConfMenuRenderBack) : '' }) - .setTimestamp(); - } - - private async onMessage(message: GuildMessage, context: SkyraCommand.Context) { - // In case of messages that do not have a content, like attachments, ignore - if (!message.content) return; - - this.llrc?.setTime(TIMEOUT); - this.errorMessage = null; - if (isSchemaGroup(this.schema)) { - const schema = this.schema.get(message.content.toLowerCase()); - if (schema && !schema.dashboardOnly) { - this.schema = schema as SchemaKey | SchemaGroup; - this.oldValue = undefined; - } else { - this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfMenuInvalidKey); - } - } else { - // parser context - const conf = container.stores.get('commands').get('conf') as SkyraCommand; - // eslint-disable-next-line @typescript-eslint/dot-notation - const lexureParser = new Lexure.Parser(conf['lexer'].setInput(message.content).lex()); - const lexureArgs = new Lexure.Args(lexureParser.parse()); - const args = new SkyraArgs(this.message, conf, lexureArgs, context, this.t); - - const commandLowerCase = args.next().toLowerCase(); - if (commandLowerCase === 'set') await this.tryUpdate(UpdateType.Set, args); - else if (commandLowerCase === 'remove') await this.tryUpdate(UpdateType.Remove, args); - else if (commandLowerCase === 'reset') await this.tryUpdate(UpdateType.Reset); - else if (commandLowerCase === 'undo') await this.tryUndo(); - else this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfMenuInvalidAction); - } - - if (!this.errorMessage) floatPromise(deleteMessage(message)); - await this._renderResponse(); - } - - private async onReaction(reaction: LLRCData): Promise { - if (reaction.userId !== this.message.author.id) return; - this.llrc?.setTime(TIMEOUT); - if (reaction.emoji.name === EMOJIS.STOP) { - this.llrc?.end(); - } else if (reaction.emoji.name === EMOJIS.BACK) { - floatPromise(this._removeReactionFromUser(EMOJIS.BACK, reaction.userId)); - if (this.schema.parent) { - this.schema = this.schema.parent; - this.oldValue = undefined; - } - await this._renderResponse(); - } - } - - private async _removeReactionFromUser(reaction: string, userId: string) { - if (!this.response) return; - try { - return await api() - .channels(this.message.channel.id) - .messages(this.response.id) - .reactions(encodeURIComponent(reaction), userId === this.message.client.user!.id ? '@me' : userId) - .delete(); - } catch (error) { - if (error instanceof DiscordAPIError) { - if (error.code === RESTJSONErrorCodes.UnknownMessage) { - this.response = null; - this.llrc?.end(); - return this; - } - - if (error.code === RESTJSONErrorCodes.UnknownEmoji) { - return this; - } - } - - // Log any other error - this.message.client.emit(Events.Error, error as Error); - } - } - - private async _reactResponse(emoji: string) { - if (!this.response) return; - try { - await this.response.react(emoji); - } catch (error) { - if (error instanceof DiscordAPIError && error.code === RESTJSONErrorCodes.UnknownMessage) { - this.response = null; - this.llrc?.end(); - } else { - this.message.client.emit(Events.Error, error as Error); - } - } - } - - private async _renderResponse() { - if (!this.response) return; - try { - const embed = await this.render(); - await this.response.edit({ embeds: [embed] }); - } catch (error) { - if (error instanceof DiscordAPIError && error.code === RESTJSONErrorCodes.UnknownMessage) { - this.response = null; - this.llrc?.end(); - } else { - this.message.client.emit(Events.Error, error as Error); - } - } - } - - private async tryUpdate(action: UpdateType, args: SkyraArgs | null = null, value: unknown = null) { - try { - const key = this.schema as SchemaKey; - const [oldValue, skipped] = await writeSettings(this.message.guild, async (settings) => { - const oldValue = deepClone(settings[key.property]); - - switch (action) { - case UpdateType.Set: { - this.t = await set(settings, key, args!); - break; - } - case UpdateType.Remove: { - this.t = await remove(settings, key, args!); - break; - } - case UpdateType.Reset: { - Reflect.set(settings, key.property, key.default); - this.t = settings.getLanguage(); - break; - } - case UpdateType.Replace: { - Reflect.set(settings, key.property, value); - this.t = settings.getLanguage(); - break; - } - } - - return [oldValue, false]; - }); - - if (skipped) { - this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); - } else { - this.oldValue = oldValue; - } - } catch (error) { - this.errorMessage = String(error); - } - } - - private async tryUndo() { - if (this.updatedValue) { - await this.tryUpdate(UpdateType.Replace, null, this.oldValue); - } else { - const key = this.schema as SchemaKey; - this.errorMessage = this.t(LanguageKeys.Commands.Admin.ConfNochange, { key: key.name }); - } - } - - private stop(): void { - if (this.response) { - if (this.response.reactions.cache.size) { - floatPromise(this.response.reactions.removeAll()); - } - - const content = this.t(LanguageKeys.Commands.Admin.ConfMenuSaved); - floatPromise(this.response.edit({ content, embeds: [] })); - } - - if (!this.messageCollector!.ended) this.messageCollector!.stop(); - } -} diff --git a/src/lib/structures/SkyraLazyPaginatedMessage.ts b/src/lib/structures/SkyraLazyPaginatedMessage.ts deleted file mode 100644 index 2a6e1c7df2c..00000000000 --- a/src/lib/structures/SkyraLazyPaginatedMessage.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { minutes } from '#utils/common'; -import { LazyPaginatedMessage, PaginatedMessageOptions } from '@sapphire/discord.js-utilities'; - -export class SkyraLazyPaginatedMessage extends LazyPaginatedMessage { - public constructor(options: PaginatedMessageOptions = {}, idle = minutes(5)) { - super(options); - this.setIdle(idle); - } -} diff --git a/src/lib/structures/SkyraPaginatedMessage.ts b/src/lib/structures/SkyraPaginatedMessage.ts deleted file mode 100644 index 162cde90a5c..00000000000 --- a/src/lib/structures/SkyraPaginatedMessage.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { minutes } from '#utils/common'; -import { PaginatedMessage, PaginatedMessageOptions } from '@sapphire/discord.js-utilities'; - -export class SkyraPaginatedMessage extends PaginatedMessage { - public constructor(options: PaginatedMessageOptions = {}, idle = minutes(5)) { - super(options); - this.setIdle(idle); - } -} diff --git a/src/lib/structures/color/B10.ts b/src/lib/structures/color/B10.ts deleted file mode 100644 index 0f916fdfce9..00000000000 --- a/src/lib/structures/color/B10.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import type { ColorHandler } from './index'; - -export class B10 implements ColorHandler { - public value: number; - - /** - * B10 Parser. - * @param value Base10 (0 - 0xFFFFFF) - */ - public constructor(value: string | number) { - this.value = Number(value); - this.check(); - } - - public check() { - if (this.value < 0 || this.value > 0xffffff) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidBase10, context: { value: this.value } }); - } - } - - public get hex() { - const hex = this.value.toString(16).padStart(6, '0'); - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new HEX(hex.substring(0, 2), hex.substring(2, 4), hex.substring(4, 6)); - } - - public get rgb() { - return this.hex.rgb; - } - - public get hsl() { - return this.hex.hsl; - } - - public get b10() { - return this; - } - - public toString() { - return String(this.value); - } -} - -import { HEX } from './HEX'; diff --git a/src/lib/structures/color/HEX.ts b/src/lib/structures/color/HEX.ts deleted file mode 100644 index b1c2fe478bb..00000000000 --- a/src/lib/structures/color/HEX.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import type { ColorHandler } from './index'; - -export class HEX implements ColorHandler { - public r: string; - public g: string; - public b: string; - - /** - * HEX Parser. - * @param r Red value. ('00' - 'ff') - * @param g Green value. ('00' - 'ff') - * @param b Blue value. ('00' - 'ff') - */ - public constructor(r: string, g: string, b: string) { - this.r = r.padStart(2, '0'); - this.g = g.padStart(2, '0'); - this.b = b.padStart(2, '0'); - - this.check(); - } - - public check() { - if (Number.isNaN(parseInt(this.r, 16))) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHexRed, context: { value: this.r } }); - } - if (Number.isNaN(parseInt(this.g, 16))) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHexGreen, context: { value: this.g } }); - } - if (Number.isNaN(parseInt(this.b, 16))) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHexBlue, context: { value: this.b } }); - } - } - - public get hex() { - return this; - } - - public get rgb() { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new RGB(parseInt(this.r, 16), parseInt(this.g, 16), parseInt(this.b, 16)); - } - - public get hsl() { - return this.rgb.hsl; - } - - public get b10() { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new B10(parseInt(this.r + this.g + this.b, 16)); - } - - public toString() { - return `#${this.r}${this.g}${this.b}`; - } -} - -import { B10 } from './B10'; -import { RGB } from './RGB'; diff --git a/src/lib/structures/color/HSL.ts b/src/lib/structures/color/HSL.ts deleted file mode 100644 index 0a16f04aa95..00000000000 --- a/src/lib/structures/color/HSL.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import type { ColorHandler } from './index'; - -export class HSL implements ColorHandler { - public h: number; - public s: number; - public l: number; - - /** - * HSL Parser. - * @param h Hue. (0 - 360) - * @param s Saturation. (0 - 100) - * @param l Lightness. (0 - 100) - */ - public constructor(h: number | string, s: number | string, l: number | string) { - this.h = Number(h); - this.s = Number(s); - this.l = Number(l); - - this.check(); - } - - public check() { - if (this.h < 0 || this.h > 360) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHslHue, context: { value: this.h } }); - } - if (this.s < 0 || this.s > 100) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHslSaturation, context: { value: this.s } }); - } - if (this.l < 0 || this.l > 100) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidHslLightness, context: { value: this.l } }); - } - } - - public get hex() { - return this.rgb.hex; - } - - public get rgb() { - const h = this.h / 360; - const s = this.s / 100; - const l = this.l / 100; - /* Parse HSL to RGB */ - let r: number; - let g: number; - let b: number; - - if (s === 0) { - /* Achromatic */ - r = l; - g = l; - b = l; - } else { - const q = l < 0.5 ? l * (1 + s) : l + s - l * s; - const p = 2 * l - q; - r = HSL.hue2rgb(p, q, h + 1 / 3); - g = HSL.hue2rgb(p, q, h); - b = HSL.hue2rgb(p, q, h - 1 / 3); - } - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new RGB(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)); - } - - public get hsl() { - return this; - } - - public get b10() { - return this.hex.b10; - } - - public toString() { - return String(`hsl(${this.h}, ${this.s}, ${this.l})`); - } - - public static hue2rgb(p: number, q: number, t: number) { - if (t < 0) t += 1; - if (t > 1) t -= 1; - if (t < 1 / 6) return p + (q - p) * 6 * t; - if (t < 1 / 2) return q; - if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; - return p; - } -} - -import { RGB } from './RGB'; diff --git a/src/lib/structures/color/RGB.ts b/src/lib/structures/color/RGB.ts deleted file mode 100644 index 8a0ffb6784b..00000000000 --- a/src/lib/structures/color/RGB.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import type { ColorHandler } from './index'; - -export class RGB implements ColorHandler { - public r: number; - public g: number; - public b: number; - - /** - * RGB Parser. - * @param r Red value. (0 - 255) - * @param g Green value. (0 - 255) - * @param b Blue value. (0 - 255) - */ - public constructor(r: number | string, g: number | string, b: number | string) { - this.r = Number(r); - this.g = Number(g); - this.b = Number(b); - - this.check(); - } - - public check() { - if (this.r < 0 || this.r > 255) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidRgbRed, context: { value: this.r } }); - } - if (this.g < 0 || this.g > 255) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidRgbGreen, context: { value: this.g } }); - } - if (this.b < 0 || this.b > 255) { - throw new UserError({ identifier: LanguageKeys.Colors.InvalidRgbBlue, context: { value: this.b } }); - } - } - - public get hex() { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new HEX(this.r.toString(16), this.g.toString(16), this.b.toString(16)); - } - - public get rgb() { - return this; - } - - public get hsl() { - const r = this.r / 255; - const g = this.g / 255; - const b = this.b / 255; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); - let h: number; - let s: number; - const l = (max + min) / 2; - - if (max === min) { - /* Achromatic */ - h = 0; - s = 0; - } else { - const d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - // no default - } - h! /= 6; - } - // eslint-disable-next-line @typescript-eslint/no-use-before-define - return new HSL(Math.round(h! * 360), Math.round(s * 100), Math.round(l * 100)); - } - - public get b10() { - return this.hex.b10; - } - - public toString() { - return String(`rgb(${this.r}, ${this.g}, ${this.b})`); - } -} - -import { HEX } from './HEX'; -import { HSL } from './HSL'; diff --git a/src/lib/structures/color/index.ts b/src/lib/structures/color/index.ts deleted file mode 100644 index 1ba2ffc9a68..00000000000 --- a/src/lib/structures/color/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from './B10'; -export * from './HEX'; -export * from './HSL'; -export * from './RGB'; - -export interface ColorHandler { - check(): void; - toString(): string; - readonly hex: import('./HEX').HEX; - readonly rgb: import('./RGB').RGB; - readonly hsl: import('./HSL').HSL; - readonly b10: import('./B10').B10; -} diff --git a/src/lib/structures/commands/ChannelConfigurationCommand.ts b/src/lib/structures/commands/ChannelConfigurationCommand.ts deleted file mode 100644 index 77a334e8c0f..00000000000 --- a/src/lib/structures/commands/ChannelConfigurationCommand.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { GuildEntity } from '#lib/database'; -import { writeSettings } from '#lib/database/settings'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { CustomFunctionGet, GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { assertNonThread } from '#utils/functions'; -import { Args, CommandOptionsRunTypeEnum, container, IArgument, PieceContext } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Nullish, PickByValue } from '@sapphire/utilities'; -import type { TextChannel } from 'discord.js'; -import { SkyraCommand } from './SkyraCommand'; - -export abstract class ChannelConfigurationCommand extends SkyraCommand { - private readonly responseKey: CustomFunctionGet; - private readonly settingsKey: PickByValue; - - public constructor(context: PieceContext, options: ChannelConfigurationCommand.Options) { - super(context, { - permissionLevel: PermissionLevels.Administrator, - runIn: [CommandOptionsRunTypeEnum.GuildAny], - ...options - }); - - this.responseKey = options.responseKey; - this.settingsKey = options.settingsKey; - } - - public async messageRun(message: GuildMessage, args: SkyraCommand.Args) { - const channel = await args.pick(ChannelConfigurationCommand.hereOrTextChannelResolver); - - await writeSettings(message.guild, (settings) => { - // If it's the same value, throw: - if (settings[this.settingsKey] === channel.id) { - this.error(LanguageKeys.Misc.ConfigurationEquals); - } - - // Else set the new value: - Reflect.set(settings, this.settingsKey, channel.id); - }); - - const content = args.t(this.responseKey, { channel: channel.toString() }); - return send(message, content); - } - - private static hereOrTextChannelResolver = Args.make((argument, context) => { - if (argument === 'here') return Args.ok(assertNonThread(context.message.channel) as TextChannel); - return (container.stores.get('arguments').get('textChannelName') as IArgument).run(argument, context); - }); -} - -export namespace ChannelConfigurationCommand { - /** - * The ChannelConfigurationCommand Options - */ - export type Options = SkyraCommand.Options & { - responseKey: CustomFunctionGet; - settingsKey: PickByValue; - }; - - export type Args = SkyraCommand.Args; -} diff --git a/src/lib/structures/commands/PaginatedMessageCommand.ts b/src/lib/structures/commands/PaginatedMessageCommand.ts deleted file mode 100644 index 78e9353da37..00000000000 --- a/src/lib/structures/commands/PaginatedMessageCommand.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { seconds } from '#utils/common'; -import type { CommandContext, PieceContext } from '@sapphire/framework'; -import type { PermissionResolvable } from 'discord.js'; -import { SkyraCommand } from './SkyraCommand'; - -export abstract class PaginatedMessageCommand extends SkyraCommand { - public constructor(context: PieceContext, options: PaginatedMessageCommand.Options) { - super(context, { - cooldownDelay: seconds(15), - // Merge in all given options - ...options, - // Add all requiredPermissions set in the command, along EMBED_LINKS to send MessageEmbed's - requiredClientPermissions: [...((options.requiredClientPermissions as PermissionResolvable[] | undefined) ?? []), 'EMBED_LINKS'] - }); - } -} - -export namespace PaginatedMessageCommand { - /** - * The PaginatedMessageCommand Options - */ - export type Options = SkyraCommand.Options; - /** - * The PaginatedMessageCommand Args - */ - export type Args = SkyraCommand.Args; - - /** - * The PaginatedMessageCommand CommandContext - */ - export type Context = CommandContext; -} diff --git a/src/lib/structures/commands/SkyraCommand.ts b/src/lib/structures/commands/SkyraCommand.ts deleted file mode 100644 index 5d1f24b9006..00000000000 --- a/src/lib/structures/commands/SkyraCommand.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { LanguageHelpDisplayOptions } from '#lib/i18n/LanguageHelp'; -import type { CustomGet } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { OWNERS } from '#root/config'; -import { seconds } from '#utils/common'; -import { CommandContext, PieceContext, PreconditionContainerArray, UserError } from '@sapphire/framework'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { SubCommandPluginCommand } from '@sapphire/plugin-subcommands'; -import type { Message } from 'discord.js'; -import * as Lexure from 'lexure'; -import { SkyraArgs } from './parsers/SkyraArgs'; - -export abstract class SkyraCommand extends SubCommandPluginCommand { - public readonly guarded: boolean; - public readonly hidden: boolean; - public readonly permissionLevel: PermissionLevels; - public readonly description: CustomGet; - - public constructor(context: PieceContext, options: SkyraCommand.Options) { - super(context, { cooldownDelay: seconds(10), cooldownLimit: 2, cooldownFilteredUsers: OWNERS, generateDashLessAliases: true, ...options }); - - this.guarded = options.guarded ?? false; - this.hidden = options.hidden ?? false; - this.permissionLevel = options.permissionLevel ?? PermissionLevels.Everyone; - this.description = options.description; - } - - /** - * The pre-parse method. This method can be overridden by plugins to define their own argument parser. - * @param message The message that triggered the command. - * @param parameters The raw parameters as a single string. - * @param context The command-context used in this execution. - */ - public async preParse(message: Message, parameters: string, context: CommandContext): Promise { - const parser = new Lexure.Parser(this.lexer.setInput(parameters).lex()).setUnorderedStrategy(this.strategy); - const args = new Lexure.Args(parser.parse()); - return new SkyraArgs(message, this, args, context, await fetchT(message)); - } - - protected error(identifier: string | UserError, context?: unknown): never { - throw typeof identifier === 'string' ? new UserError({ identifier, context }) : identifier; - } - - protected parseConstructorPreConditions(options: SkyraCommand.Options): void { - super.parseConstructorPreConditions(options); - this.parseConstructorPreConditionsPermissionLevel(options); - } - - protected parseConstructorPreConditionsPermissionLevel(options: SkyraCommand.Options): void { - if (options.permissionLevel === PermissionLevels.BotOwner) { - this.preconditions.append('BotOwner'); - return; - } - - const container = new PreconditionContainerArray(['BotOwner'], this.preconditions); - switch (options.permissionLevel ?? PermissionLevels.Everyone) { - case PermissionLevels.Everyone: - container.append('Everyone'); - break; - case PermissionLevels.Moderator: - container.append('Moderator'); - break; - case PermissionLevels.Administrator: - container.append('Administrator'); - break; - case PermissionLevels.ServerOwner: - container.append('ServerOwner'); - break; - default: - throw new Error( - `SkyraCommand[${this.name}]: "permissionLevel" was specified as an invalid permission level (${options.permissionLevel}).` - ); - } - - this.preconditions.append(container); - } -} - -export interface SkyraCommand { - detailedDescription: CustomGet; -} - -export namespace SkyraCommand { - /** - * The SkyraCommand Options - */ - export type Options = SubCommandPluginCommand.Options & { - description: CustomGet; - detailedDescription: CustomGet; - guarded?: boolean; - hidden?: boolean; - permissionLevel?: number; - }; - - export type Args = SkyraArgs; - export type Context = CommandContext; -} diff --git a/src/lib/structures/commands/index.ts b/src/lib/structures/commands/index.ts deleted file mode 100644 index 3885cfa9070..00000000000 --- a/src/lib/structures/commands/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './ChannelConfigurationCommand'; -export * from './PaginatedMessageCommand'; -export * from './parsers'; -export * from './SkyraCommand'; diff --git a/src/lib/structures/commands/parsers/SkyraArgs.ts b/src/lib/structures/commands/parsers/SkyraArgs.ts deleted file mode 100644 index 3dfe8fbbe38..00000000000 --- a/src/lib/structures/commands/parsers/SkyraArgs.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { SkyraCommand } from '#lib/structures'; -import { Args, CommandContext, isOk, Result, UserError } from '@sapphire/framework'; -import type { Message } from 'discord.js'; -import type { TFunction } from 'i18next'; -import type { Args as LexureArgs } from 'lexure'; - -export class SkyraArgs extends Args { - public t: TFunction; - - public constructor(message: Message, command: SkyraCommand, parser: LexureArgs, context: CommandContext, t: TFunction) { - super(message, command, parser, context); - this.t = t; - } - - /** - * Consumes the entire parser and splits it by the delimiter, filtering out empty values. - * @param delimiter The delimiter to be used, defaults to `,`. - * @returns An array of values. - */ - public nextSplitResult({ delimiter = ',', times = Infinity }: SkyraArgs.NextSplitOptions = {}): Result { - if (this.parser.finished) return this.missingArguments(); - - const values: string[] = []; - const parts = this.parser - .many() - .reduce((acc, token) => `${acc}${token.value}${token.trailing}`, '') - .split(delimiter); - - for (const part of parts) { - const trimmed = part.trim(); - if (trimmed.length === 0) continue; - - values.push(trimmed); - if (values.length === times) break; - } - - return values.length > 0 ? Args.ok(values) : this.missingArguments(); - } - - /** - * Consumes the entire parser and splits it by the delimiter, filtering out empty values. - * @param delimiter The delimiter to be used, defaults to `,`. - * @returns An array of values. - */ - public nextSplit(options?: SkyraArgs.NextSplitOptions) { - const result = this.nextSplitResult(options); - if (isOk(result)) return result.value; - throw result.error; - } -} - -export interface SkyraArgs { - command: SkyraCommand; -} - -export namespace SkyraArgs { - export interface NextSplitOptions { - /** - * The delimiter to be used. - * @default ',' - */ - delimiter?: string; - - /** - * The maximum amount of entries to be read. - * @default Infinity - */ - times?: number; - } -} - -declare module '@sapphire/framework' { - export interface Args { - t: TFunction; - } -} diff --git a/src/lib/structures/commands/parsers/index.ts b/src/lib/structures/commands/parsers/index.ts deleted file mode 100644 index 486f38a64cc..00000000000 --- a/src/lib/structures/commands/parsers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './SkyraArgs'; diff --git a/src/lib/structures/index.ts b/src/lib/structures/index.ts deleted file mode 100644 index 8e75218d0a3..00000000000 --- a/src/lib/structures/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './AnalyticsData'; -export * from './color'; -export * from './commands'; -export * from './InviteStore'; -export * from './listeners'; -export * from './managers'; -export * from './preconditions'; -export * from './SettingsMenu'; -export * from './SkyraLazyPaginatedMessage'; -export * from './SkyraPaginatedMessage'; diff --git a/src/lib/structures/listeners/AnalyticsListener.ts b/src/lib/structures/listeners/AnalyticsListener.ts deleted file mode 100644 index b16c74d4c1b..00000000000 --- a/src/lib/structures/listeners/AnalyticsListener.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Tags } from '#lib/types/AnalyticsSchema'; -import type { Point } from '@influxdata/influxdb-client'; -import { Listener, ListenerOptions, PieceContext } from '@sapphire/framework'; -import { envParseBoolean } from '@skyra/env-utilities'; - -export abstract class AnalyticsListener extends Listener { - public tags: [Tags, string][] = []; - - public constructor(context: PieceContext, options?: AnalyticsListener.Options) { - super(context, { ...options, enabled: envParseBoolean('INFLUX_ENABLED') }); - } - - public onLoad() { - this.initTags(); - return super.onLoad(); - } - - public writePoint(point: Point) { - return this.container.client.analytics!.writeApi.writePoint(this.injectTags(point)); - } - - public writePoints(points: Point[]) { - points = points.map((point) => this.injectTags(point)); - return this.container.client.analytics!.writeApi.writePoints(points); - } - - protected injectTags(point: Point) { - for (const tag of this.tags) { - point.tag(tag[0], tag[1]); - } - return point; - } - - protected initTags() { - this.tags.push([Tags.Client, process.env.CLIENT_ID], [Tags.OriginEvent, this.event]); - } -} - -export namespace AnalyticsListener { - export type Options = Omit; -} diff --git a/src/lib/structures/listeners/ShardListener.ts b/src/lib/structures/listeners/ShardListener.ts deleted file mode 100644 index 6a5d51b3f50..00000000000 --- a/src/lib/structures/listeners/ShardListener.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Listener } from '@sapphire/framework'; -import { bold, magenta } from 'colorette'; - -export abstract class ShardListener extends Listener { - protected abstract readonly title: string; - - protected header(shardId: number): string { - return `${bold(magenta(`[SHARD ${shardId}]`))} ${this.title}`; - } -} diff --git a/src/lib/structures/listeners/index.ts b/src/lib/structures/listeners/index.ts deleted file mode 100644 index c9ed6d045be..00000000000 --- a/src/lib/structures/listeners/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AnalyticsListener'; -export * from './ShardListener'; diff --git a/src/lib/structures/preconditions/PermissionsPrecondition.ts b/src/lib/structures/preconditions/PermissionsPrecondition.ts deleted file mode 100644 index 73d2e55bc4e..00000000000 --- a/src/lib/structures/preconditions/PermissionsPrecondition.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { readSettings } from '#lib/database/settings'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { isAdmin, isGuildOwner } from '#utils/functions'; -import { - AsyncPreconditionResult, - Identifiers, - PieceContext, - Precondition, - PreconditionContext, - PreconditionOptions, - PreconditionResult -} from '@sapphire/framework'; -import type { SkyraCommand } from '../commands/SkyraCommand'; - -export abstract class PermissionsPrecondition extends Precondition { - private readonly guildOnly: boolean; - - public constructor(context: PieceContext, options: PermissionsPrecondition.Options = {}) { - super(context, options); - this.guildOnly = options.guildOnly ?? true; - } - - public async run(message: GuildMessage, command: SkyraCommand, context: PermissionsPrecondition.Context): PermissionsPrecondition.AsyncResult { - // If not in a guild, resolve on an error: - if (message.guild === null || message.member === null) { - return this.guildOnly ? this.error({ identifier: Identifiers.PreconditionGuildOnly }) : this.ok(); - } - - // If it should skip, go directly to handle: - if (await this.shouldRun(message, command)) { - const nodes = await readSettings(message.guild, (settings) => settings.permissionNodes); - const result = nodes.run(message.member, command); - if (result) return this.ok(); - if (result === false) return this.error({ identifier: LanguageKeys.Preconditions.PermissionNodes }); - } - - // Run the specific precondition's logic: - return this.handle(message, command, context); - } - - public abstract handle(message: GuildMessage, command: SkyraCommand, context: PermissionsPrecondition.Context): PermissionsPrecondition.Result; - - private async shouldRun(message: GuildMessage, command: SkyraCommand) { - // Guarded commands cannot be modified: - if (command.guarded) return false; - // Bot-owner commands cannot be modified: - if (command.permissionLevel === PermissionLevels.BotOwner) return false; - // If the author is owner of the guild, skip: - if (isGuildOwner(message.member)) return false; - // If the author is administrator of the guild, skip: - if (await isAdmin(message.member)) return false; - // In any other case, permission nodes should always run: - return true; - } -} - -export namespace PermissionsPrecondition { - export type Context = PreconditionContext; - export type Result = PreconditionResult; - export type AsyncResult = AsyncPreconditionResult; - export interface Options extends PreconditionOptions { - guildOnly?: boolean; - } -} diff --git a/src/lib/structures/preconditions/index.ts b/src/lib/structures/preconditions/index.ts deleted file mode 100644 index 751499287fd..00000000000 --- a/src/lib/structures/preconditions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './PermissionsPrecondition'; diff --git a/src/lib/types/AnalyticsSchema.ts b/src/lib/types/AnalyticsSchema.ts deleted file mode 100644 index 60dd3837790..00000000000 --- a/src/lib/types/AnalyticsSchema.ts +++ /dev/null @@ -1,49 +0,0 @@ -export const enum Points { - Guilds = 'guilds', - Users = 'users', - Commands = 'commands', - VoiceConnections = 'voice_connections', - Economy = 'economy', - TwitchSubscriptions = 'twitch_subscriptions', - TwitchSubscriptionHook = 'twitch_subscription_hook', - PerCoreCPULoad = 'per_core_cpu_load', - Memory = 'memory', - MessageCount = 'message_count' -} - -export const enum Tags { - Shard = 'shard', - Guild = 'guild_id', - User = 'user_id', - Client = 'client_id', - Action = 'action', - OriginEvent = 'origin_event', - MigrationName = 'migration_name', - ValueType = 'value_type', - TwitchStreamStatus = 'twitch_stream_status' -} - -export const enum CommandCategoryTypes { - Category = 'category' -} - -export const enum EconomyValueType { - Size = 'size' -} - -export const enum EconomyType { - Money = 'total_money', - Vault = 'total_vault' -} - -export const enum Actions { - Addition = 'addition', - Subtraction = 'subtraction', - Sync = 'sync', - Migration = 'migration' -} - -export const enum TwitchStreamStatus { - Online = 'online', - Offline = 'offline' -} diff --git a/src/lib/types/ArgumentTypes.ts b/src/lib/types/ArgumentTypes.ts deleted file mode 100644 index b593c21ec9d..00000000000 --- a/src/lib/types/ArgumentTypes.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const enum Scope { - Local, - Global -} diff --git a/src/lib/types/Augments.d.ts b/src/lib/types/Augments.d.ts deleted file mode 100644 index 27c65fd10ef..00000000000 --- a/src/lib/types/Augments.d.ts +++ /dev/null @@ -1,215 +0,0 @@ -/* eslint-disable @typescript-eslint/unified-signatures */ -import type { DbSet, GuildEntity, SettingsManager } from '#lib/database'; -import type { GuildMemberFetchQueue } from '#lib/discord/GuildMemberFetchQueue'; -import type { WorkerManager } from '#lib/moderation/workers/WorkerManager'; -import type { AnalyticsData, ColorHandler, InviteCodeValidEntry, InviteStore, ScheduleManager, SkyraCommand } from '#lib/structures'; -import type { TwitchStreamStatus } from '#lib/types/AnalyticsSchema'; -import type { O } from '#utils/constants'; -import type { EmojiObject } from '#utils/functions'; -import type { Leaderboard } from '#utils/Leaderboard'; -import type { LLRCData, LongLivingReactionCollector } from '#utils/LongLivingReactionCollector'; -import type { Twitch } from '#utils/Notifications/Twitch'; -import type { Piece, Store } from '@sapphire/framework'; -import type { Nullish, PickByValue } from '@sapphire/utilities'; -import type { ArrayString, BooleanString, IntegerString } from '@skyra/env-utilities'; -import type { Image } from 'canvas-constructor/napi-rs'; -import type { Guild, GuildChannel, Message, MessageEmbed, NewsChannel, Role, Snowflake, TextChannel, User } from 'discord.js'; -import type { TaskErrorPayload, TwitchEventSubEvent, TwitchEventSubOnlineEvent } from './definitions'; -import type { Scope } from './definitions/ArgumentTypes'; -import type { Events } from './Enums'; -import type { CustomFunctionGet, CustomGet } from './Utils'; - -declare module 'discord.js' { - interface Client { - readonly dev: boolean; - readonly analytics: AnalyticsData | null; - readonly guildMemberFetchQueue: GuildMemberFetchQueue; - readonly invites: InviteStore; - readonly leaderboard: Leaderboard; - readonly llrCollectors: Set; - readonly schedules: ScheduleManager; - readonly twitch: Twitch; - readonly version: string; - readonly webhookError: WebhookClient | null; - } - - interface ClientEvents { - [Events.TaskError]: [error: Error, payload: TaskErrorPayload]; - } - - interface ClientOptions { - nms?: { - role?: number; - everyone?: number; - }; - schedule?: { - interval: number; - }; - } -} - -declare module '@sapphire/pieces' { - interface Container { - db: DbSet; - schedule: ScheduleManager; - settings: SettingsManager; - workers: WorkerManager; - } -} - -declare module '@sapphire/framework' { - interface ArgType { - case: number; - channelName: GuildChannel; - cleanString: string; - color: ColorHandler; - command: SkyraCommand; - commandMatch: string; - commandName: SkyraCommand; - duration: Date; - emoji: EmojiObject; - image: Image; - invite: InviteCodeValidEntry; - language: string; - piece: Piece; - range: number[]; - reset: true; - roleName: Role; - scope: Scope; - shinyWager: number; - snowflake: Snowflake; - store: Store; - textChannelName: TextChannel; - textOrNewsChannelName: TextChannel | NewsChannel; - time: Date; - timespan: number; - userName: User; - } - - interface Preconditions { - Administrator: never; - BotOwner: never; - Everyone: never; - Moderator: never; - ServerOwner: never; - } - - interface SapphireClient { - emit(event: Events.Error, error: Error): boolean; - emit(event: Events.AnalyticsSync, guilds: number, users: number): boolean; - emit(event: Events.CommandUsageAnalytics, command: string, category: string): boolean; - emit( - event: Events.GuildMessageLog, - guild: Guild, - channelId: string | Nullish, - key: PickByValue, - makeMessage: () => Promise | MessageEmbed - ): boolean; - emit(event: Events.ReactionBlocked, data: LLRCData, emoji: string): boolean; - emit(event: Events.MoneyTransaction, target: User, moneyChange: number, moneyBeforeChange: number): boolean; - emit(event: Events.MoneyPayment, message: Message, user: User, target: User, money: number): boolean; - emit(event: Events.ResourceAnalyticsSync): boolean; - emit(event: Events.TwitchStreamHookedAnalytics, status: TwitchStreamStatus): boolean; - emit(events: Events.TwitchStreamOnline, event: TwitchEventSubOnlineEvent): boolean; - emit(events: Events.TwitchStreamOffline, event: TwitchEventSubEvent): boolean; - emit(event: Events.TaskError, error: Error, payload: TaskErrorPayload): boolean; - emit(event: string | symbol, ...args: any[]): boolean; - } -} - -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; - } -} - -declare module '@skyra/env-utilities' { - export interface Env { - CLIENT_NAME: string; - CLIENT_VERSION: string; - CLIENT_PREFIX: string; - CLIENT_REGEX_PREFIX: string; - CLIENT_OWNERS: ArrayString; - CLIENT_ID: string; - CLIENT_SHARDS: string; - - CLIENT_PRESENCE_NAME: string; - CLIENT_PRESENCE_TYPE: string; - - SISTER_CLIENTS: ArrayString; - - API_ENABLED: BooleanString; - API_ORIGIN: string; - API_PORT: IntegerString; - API_PREFIX: string; - - OAUTH_COOKIE: string; - OAUTH_DOMAIN_OVERWRITE: string; - OAUTH_REDIRECT_URI: string; - OAUTH_SCOPE: ArrayString; - OAUTH_SECRET: string; - - TWITCH_CALLBACK: string; - - PGSQL_DATABASE_NAME: string; - PGSQL_DATABASE_PASSWORD: string; - PGSQL_DATABASE_USER: string; - PGSQL_DATABASE_PORT: IntegerString; - PGSQL_DATABASE_HOST: string; - TYPEORM_DEBUG_LOGS: BooleanString; - - REDIS_HOST: string; - REDIS_ENABLED: BooleanString; - REDIS_PORT: IntegerString; - REDIS_DB: IntegerString; - REDIS_PASSWORD: string; - - INFLUX_ENABLED: BooleanString; - INFLUX_URL: string; - INFLUX_TOKEN: string; - INFLUX_ORG: string; - INFLUX_ORG_ANALYTICS_BUCKET: string; - - SAELEM_ENABLED: BooleanString; - SAELEM_URL: string; - - GRAPHQL_STARWARS_URL: string; - HASTEBIN_POST_URL: string; - HASTEBIN_GET_URL: string; - - WEBHOOK_ERROR_ID: string; - WEBHOOK_ERROR_TOKEN: string; - - WORKER_COUNT: IntegerString; - - DISCORD_TOKEN: string; - BOTLIST_SPACE_TOKEN: string; - BOTS_FOR_DISCORD_TOKEN: string; - BOTS_ON_DISCORD_TOKEN: string; - CRYPTOCOMPARE_TOKEN: string; - DISCORD_BOT_LIST_TOKEN: string; - DISCORD_BOTS_TOKEN: string; - GOOGLE_API_TOKEN: string; - KITSU_ID: string; - KITSU_TOKEN: string; - NINTENDO_ID: string; - NINTENDO_TOKEN: string; - OWLBOT_TOKEN: string; - SENTRY_URL: string; - THEMOVIEDATABASE_TOKEN: string; - TOP_GG_TOKEN: string; - TWITCH_CLIENT_ID: string; - TWITCH_EVENTSUB_SECRET: string; - TWITCH_TOKEN: string; - } -} diff --git a/src/lib/types/Discord.d.ts b/src/lib/types/Discord.d.ts deleted file mode 100644 index 2d1f5a32ced..00000000000 --- a/src/lib/types/Discord.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { GuildTextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import type { DMChannel, Guild, GuildMember, Message, TextChannel } from 'discord.js'; - -export interface GuildMessage extends Message { - channel: GuildTextBasedChannelTypes; - readonly guild: Guild; - readonly member: GuildMember; -} - -export interface DMMessage extends Message { - channel: DMChannel; - readonly guild: null; - readonly member: null; -} diff --git a/src/lib/types/Enums.ts b/src/lib/types/Enums.ts deleted file mode 100644 index 4a93be6cbc9..00000000000 --- a/src/lib/types/Enums.ts +++ /dev/null @@ -1,72 +0,0 @@ -export const enum Events { - AnalyticsSync = 'analyticsSync', - Error = 'error', - PreMessageParsed = 'preMessageParsed', - ArgumentError = 'argumentError', - CommandError = 'commandError', - CommandInhibited = 'commandInhibited', - CommandRun = 'commandRun', - CommandDenied = 'commandDenied', - CommandSuccess = 'commandSuccess', - CommandUnknown = 'commandUnknown', - CommandUsageAnalytics = 'commandUsageAnalytics', - CoreSettingsDelete = 'coreSettingsDelete', - CoreSettingsUpdate = 'coreSettingsUpdate', - Disconnect = 'disconnect', - EventError = 'eventError', - GuildBanAdd = 'guildBanAdd', - GuildBanRemove = 'guildBanRemove', - GuildCreate = 'guildCreate', - GuildDelete = 'guildDelete', - GuildMemberUpdate = 'guildMemberUpdate', - GuildMessageDelete = 'guildMessageDelete', - GuildMessageLog = 'guildMessageLog', - GuildMessageUpdate = 'guildMessageUpdate', - GuildUserMessage = 'guildUserMessage', - GuildUserMessageSocialPointsAddUser = 'guildUserMessageSocialPointsAddUser', - GuildUserMessageSocialPointsAddMember = 'guildUserMessageSocialPointsAddMember', - GuildUserMessageSocialPointsAddMemberReward = 'guildUserMessageSocialPointsAddMemberReward', - MentionSpamExceeded = 'mentionSpamExceeded', - MentionSpamWarning = 'mentionSpamWarning', - MessageCreate = 'messageCreate', - MessageDelete = 'messageDelete', - MessageDeleteBulk = 'messageDeleteBulk', - MessageUpdate = 'messageUpdate', - ModerationEntryAdd = 'moderationEntryAdd', - ModerationEntryEdit = 'moderationEntryEdit', - MoneyPayment = 'moneyPayment', - MoneyTransaction = 'moneyTransaction', - NotMutedMemberAdd = 'notMutedMemberAdd', - Raw = 'raw', - RawMemberAdd = 'rawMemberAdd', - RawMemberRemove = 'rawMemberRemove', - RawMessageCreate = 'rawMessageCreate', - RawMessageDelete = 'rawMessageDelete', - RawMessageDeleteBulk = 'rawMessageDeleteBulk', - RawReactionAdd = 'rawReactionAdd', - RawReactionRemove = 'rawReactionRemove', - ReactionBlocked = 'reactionBlocked', - Reconnecting = 'reconnecting', - ResourceAnalyticsSync = 'resourceAnalyticsSync', - SettingsUpdate = 'settingsUpdate', - TaskError = 'taskError', - TwitchStreamHookedAnalytics = 'twitchStreamHookedAnalytics', - TwitchStreamOffline = 'twitchStreamOffline', - TwitchStreamOnline = 'twitchStreamOnline', - UnhandledRejection = 'unhandledRejection', - UserMessage = 'userMessage' -} - -export const enum PermissionLevels { - Everyone = 0, - Moderator = 5, - Administrator = 6, - ServerOwner = 7, - BotOwner = 10 -} - -export const enum Schedules { - Poststats = 'poststats', - SyncResourceAnalytics = 'syncResourceAnalytics', - Reminder = 'reminder' -} diff --git a/src/lib/types/Utils.ts b/src/lib/types/Utils.ts deleted file mode 100644 index ead9bde05a5..00000000000 --- a/src/lib/types/Utils.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ - -export type CustomGet = K & { __type__: TCustom }; - -export function T(k: string): CustomGet { - return k as CustomGet; -} - -export type CustomFunctionGet = K & { __args__: TArgs; __return__: TReturn }; - -export function FT(k: string): CustomFunctionGet { - return k as CustomFunctionGet; -} - -export interface Value { - value: T; -} - -export interface Values { - values: readonly T[]; - count: number; -} - -export interface Difference { - previous: T; - next: T; -} diff --git a/src/lib/types/definitions/AlgoliaSearch.d.ts b/src/lib/types/definitions/AlgoliaSearch.d.ts deleted file mode 100644 index 780aef0eb52..00000000000 --- a/src/lib/types/definitions/AlgoliaSearch.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -export interface AlgoliaResult { - exhaustiveNbHits: boolean; - - exhaustiveTypo: boolean; - - hits: T[]; - - hitsPerPage: number; - - nbHits: number; - - nbPages: number; - - page: number; - - params: string; - - processingTimeMS: number; - - query: string; - - queryAfterRemoval: string; -} diff --git a/src/lib/types/definitions/AniList.ts b/src/lib/types/definitions/AniList.ts deleted file mode 100644 index aff615e606b..00000000000 --- a/src/lib/types/definitions/AniList.ts +++ /dev/null @@ -1,6958 +0,0 @@ -/** - * AUTO GENERATED FROM ANILIST API ENDPOINT. DO NOT MODIFY - */ - -import type { NonNullObject } from '@sapphire/utilities'; -import type { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -export type Maybe = T | null; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type Omit = Pick>; -export type RequireFields = { [X in Exclude]?: T[X] } & { [P in K]-?: NonNullable }; -/** All built-in and custom scalars, mapped to their actual values */ -export interface Scalars { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; - /** ISO 3166-1 alpha-2 country code */ - CountryCode: string; - /** 8 digit long date integer (YYYYMMDD). Unknown dates represented by 0. E.g. 2016: 20160000, May 1976: 19760500 */ - FuzzyDateInt: number; - Json: Record; -} - -/** Notification for when a activity is liked */ -export interface ActivityLikeNotification { - readonly __typename?: 'ActivityLikeNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who liked to the activity */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity which was liked */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly activity?: Maybe; - /** The user who liked the activity */ - readonly user?: Maybe; -} - -/** Notification for when authenticated user is @ mentioned in activity or reply */ -export interface ActivityMentionNotification { - readonly __typename?: 'ActivityMentionNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who mentioned the authenticated user */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity where mentioned */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly activity?: Maybe; - /** The user who mentioned the authenticated user */ - readonly user?: Maybe; -} - -/** Notification for when a user is send an activity message */ -export interface ActivityMessageNotification { - readonly __typename?: 'ActivityMessageNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The if of the user who send the message */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity message */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The message activity */ - readonly message?: Maybe; - /** The user who sent the message */ - readonly user?: Maybe; -} - -/** Replay to an activity item */ -export interface ActivityReply { - readonly __typename?: 'ActivityReply'; - /** The id of the reply */ - readonly id: Scalars['Int']; - /** The id of the replies creator */ - readonly userId?: Maybe; - /** The id of the parent activity */ - readonly activityId?: Maybe; - /** The reply text */ - readonly text?: Maybe; - /** The amount of likes the reply has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the reply */ - readonly isLiked?: Maybe; - /** The time the reply was created at */ - readonly createdAt: Scalars['Int']; - /** The user who created reply */ - readonly user?: Maybe; - /** The users who liked the reply */ - readonly likes?: Maybe>>; -} - -/** Replay to an activity item */ -export interface ActivityReplyTextArgs { - asHtml?: Maybe; -} - -/** Notification for when a activity reply is liked */ -export interface ActivityReplyLikeNotification { - readonly __typename?: 'ActivityReplyLikeNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who liked to the activity reply */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity where the reply which was liked */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly activity?: Maybe; - /** The user who liked the activity reply */ - readonly user?: Maybe; -} - -/** Notification for when a user replies to the authenticated users activity */ -export interface ActivityReplyNotification { - readonly __typename?: 'ActivityReplyNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who replied to the activity */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity which was replied too */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly activity?: Maybe; - /** The user who replied to the activity */ - readonly user?: Maybe; -} - -/** Notification for when a user replies to activity the authenticated user has replied to */ -export interface ActivityReplySubscribedNotification { - readonly __typename?: 'ActivityReplySubscribedNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who replied to the activity */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity which was replied too */ - readonly activityId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly activity?: Maybe; - /** The user who replied to the activity */ - readonly user?: Maybe; -} - -/** Activity sort enums */ -export const enum ActivitySort { - Id = 'ID', - IdDesc = 'ID_DESC' -} - -/** Activity type enum. */ -export const enum ActivityType { - /** A text activity */ - Text = 'TEXT', - /** A anime list update activity */ - AnimeList = 'ANIME_LIST', - /** A manga list update activity */ - MangaList = 'MANGA_LIST', - /** A text message activity sent to another user */ - Message = 'MESSAGE', - /** Anime & Manga list update, only used in query arguments */ - MediaList = 'MEDIA_LIST' -} - -/** Activity union type */ -export type ActivityUnion = TextActivity | ListActivity | MessageActivity; - -/** Notification for when an episode of anime airs */ -export interface AiringNotification { - readonly __typename?: 'AiringNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the aired anime */ - readonly animeId: Scalars['Int']; - /** The episode number that just aired */ - readonly episode: Scalars['Int']; - /** The notification context text */ - readonly contexts?: Maybe>>; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The associated media of the airing schedule */ - readonly media?: Maybe; -} - -/** Score & Watcher stats for airing anime by episode and mid-week */ -export interface AiringProgression { - readonly __typename?: 'AiringProgression'; - /** The episode the stats were recorded at. .5 is the mid point between 2 episodes airing dates. */ - readonly episode?: Maybe; - /** The average score for the media */ - readonly score?: Maybe; - /** The amount of users watching the anime */ - readonly watching?: Maybe; -} - -/** Media Airing Schedule. NOTE: We only aim to guarantee that FUTURE airing data is present and accurate. */ -export interface AiringSchedule { - readonly __typename?: 'AiringSchedule'; - /** The id of the airing schedule item */ - readonly id: Scalars['Int']; - /** The time the episode airs at */ - readonly airingAt: Scalars['Int']; - /** Seconds until episode starts airing */ - readonly timeUntilAiring: Scalars['Int']; - /** The airing episode number */ - readonly episode: Scalars['Int']; - /** The associate media id of the airing episode */ - readonly mediaId: Scalars['Int']; - /** The associate media of the airing episode */ - readonly media?: Maybe; -} - -export interface AiringScheduleConnection { - readonly __typename?: 'AiringScheduleConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** AiringSchedule connection edge */ -export interface AiringScheduleEdge { - readonly __typename?: 'AiringScheduleEdge'; - readonly node?: Maybe; - /** The id of the connection */ - readonly id?: Maybe; -} - -export interface AiringScheduleInput { - readonly airingAt?: Maybe; - readonly episode?: Maybe; - readonly timeUntilAiring?: Maybe; -} - -/** Airing schedule sort enums */ -export const enum AiringSort { - Id = 'ID', - IdDesc = 'ID_DESC', - MediaId = 'MEDIA_ID', - MediaIdDesc = 'MEDIA_ID_DESC', - Time = 'TIME', - TimeDesc = 'TIME_DESC', - Episode = 'EPISODE', - EpisodeDesc = 'EPISODE_DESC' -} - -export interface AniChartHighlightInput { - readonly mediaId?: Maybe; - readonly highlight?: Maybe; -} - -export interface AniChartUser { - readonly __typename?: 'AniChartUser'; - readonly user?: Maybe; - readonly settings?: Maybe; - readonly highlights?: Maybe; -} - -/** A character that features in an anime or manga */ -export interface Character { - readonly __typename?: 'Character'; - /** The id of the character */ - readonly id: Scalars['Int']; - /** The names of the character */ - readonly name?: Maybe; - /** Character images */ - readonly image?: Maybe; - /** A general description of the character */ - readonly description?: Maybe; - /** The character's gender. Usually Male, Female, or Non-binary but can be any string. */ - readonly gender?: Maybe; - /** The character's birth date */ - readonly dateOfBirth?: Maybe; - /** The character's age. Note this is a string, not an int, it may contain further text and additional ages. */ - readonly age?: Maybe; - /** The characters blood type */ - readonly bloodType?: Maybe; - /** If the character is marked as favourite by the currently authenticated user */ - readonly isFavourite: Scalars['Boolean']; - /** If the character is blocked from being added to favourites */ - readonly isFavouriteBlocked: Scalars['Boolean']; - /** The url for the character page on the AniList website */ - readonly siteUrl?: Maybe; - /** Media that includes the character */ - readonly media?: Maybe; - /** @deprecated No data available */ - readonly updatedAt?: Maybe; - /** The amount of user's who have favourited the character */ - readonly favourites?: Maybe; - /** Notes for site moderators */ - readonly modNotes?: Maybe; -} - -/** A character that features in an anime or manga */ -export interface CharacterDescriptionArgs { - asHtml?: Maybe; -} - -/** A character that features in an anime or manga */ -export interface CharacterMediaArgs { - sort?: Maybe>>; - type?: Maybe; - onList?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -export interface CharacterConnection { - readonly __typename?: 'CharacterConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Character connection edge */ -export interface CharacterEdge { - readonly __typename?: 'CharacterEdge'; - readonly node?: Maybe; - /** The id of the connection */ - readonly id?: Maybe; - /** The characters role in the media */ - readonly role?: Maybe; - /** Media specific character name */ - readonly name?: Maybe; - /** The voice actors of the character */ - readonly voiceActors?: Maybe>>; - /** The voice actors of the character with role date */ - readonly voiceActorRoles?: Maybe>>; - /** The media the character is in */ - readonly media?: Maybe>>; - /** The order the character should be displayed from the users favourites */ - readonly favouriteOrder?: Maybe; -} - -/** Character connection edge */ -export interface CharacterEdgeVoiceActorsArgs { - language?: Maybe; - sort?: Maybe>>; -} - -/** Character connection edge */ -export interface CharacterEdgeVoiceActorRolesArgs { - language?: Maybe; - sort?: Maybe>>; -} - -export interface CharacterImage { - readonly __typename?: 'CharacterImage'; - /** The character's image of media at its largest size */ - readonly large?: Maybe; - /** The character's image of media at medium size */ - readonly medium?: Maybe; -} - -/** The names of the character */ -export interface CharacterName { - readonly __typename?: 'CharacterName'; - /** The character's given name */ - readonly first?: Maybe; - /** The character's middle name */ - readonly middle?: Maybe; - /** The character's surname */ - readonly last?: Maybe; - /** The character's first and last name */ - readonly full?: Maybe; - /** The character's full name in their native language */ - readonly native?: Maybe; - /** Other names the character might be referred to as */ - readonly alternative?: Maybe>>; - /** Other names the character might be referred to as but are spoilers */ - readonly alternativeSpoiler?: Maybe>>; - /** The currently authenticated users preferred name language. Default romaji for non-authenticated */ - readonly userPreferred?: Maybe; -} - -/** The names of the character */ -export interface CharacterNameInput { - /** The character's given name */ - readonly first?: Maybe; - /** The character's middle name */ - readonly middle?: Maybe; - /** The character's surname */ - readonly last?: Maybe; - /** The character's full name in their native language */ - readonly native?: Maybe; - /** Other names the character might be referred by */ - readonly alternative?: Maybe>>; - /** Other names the character might be referred to as but are spoilers */ - readonly alternativeSpoiler?: Maybe>>; -} - -/** The role the character plays in the media */ -export const enum CharacterRole { - /** A primary character role in the media */ - Main = 'MAIN', - /** A supporting character role in the media */ - Supporting = 'SUPPORTING', - /** A background character in the media */ - Background = 'BACKGROUND' -} - -/** Character sort enums */ -export const enum CharacterSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Role = 'ROLE', - RoleDesc = 'ROLE_DESC', - SearchMatch = 'SEARCH_MATCH', - Favourites = 'FAVOURITES', - FavouritesDesc = 'FAVOURITES_DESC', - /** Order manually decided by moderators */ - Relevance = 'RELEVANCE' -} - -/** A submission for a character that features in an anime or manga */ -export interface CharacterSubmission { - readonly __typename?: 'CharacterSubmission'; - /** The id of the submission */ - readonly id: Scalars['Int']; - /** Character that the submission is referencing */ - readonly character?: Maybe; - /** The character submission changes */ - readonly submission?: Maybe; - /** Submitter for the submission */ - readonly submitter?: Maybe; - /** Status of the submission */ - readonly status?: Maybe; - /** Inner details of submission status */ - readonly notes?: Maybe; - readonly source?: Maybe; - readonly createdAt?: Maybe; -} - -export interface CharacterSubmissionConnection { - readonly __typename?: 'CharacterSubmissionConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** CharacterSubmission connection edge */ -export interface CharacterSubmissionEdge { - readonly __typename?: 'CharacterSubmissionEdge'; - readonly node?: Maybe; - /** The characters role in the media */ - readonly role?: Maybe; - /** The voice actors of the character */ - readonly voiceActors?: Maybe>>; - /** The submitted voice actors of the character */ - readonly submittedVoiceActors?: Maybe>>; -} - -/** Deleted data type */ -export interface Deleted { - readonly __typename?: 'Deleted'; - /** If an item has been successfully deleted */ - readonly deleted?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface Favourites { - readonly __typename?: 'Favourites'; - /** Favourite anime */ - readonly anime?: Maybe; - /** Favourite manga */ - readonly manga?: Maybe; - /** Favourite characters */ - readonly characters?: Maybe; - /** Favourite staff */ - readonly staff?: Maybe; - /** Favourite studios */ - readonly studios?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface FavouritesAnimeArgs { - page?: Maybe; - perPage?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface FavouritesMangaArgs { - page?: Maybe; - perPage?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface FavouritesCharactersArgs { - page?: Maybe; - perPage?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface FavouritesStaffArgs { - page?: Maybe; - perPage?: Maybe; -} - -/** User's favourite anime, manga, characters, staff & studios */ -export interface FavouritesStudiosArgs { - page?: Maybe; - perPage?: Maybe; -} - -/** Notification for when the authenticated user is followed by another user */ -export interface FollowingNotification { - readonly __typename?: 'FollowingNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who followed the authenticated user */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The liked activity */ - readonly user?: Maybe; -} - -/** User's format statistics */ -export interface FormatStats { - readonly __typename?: 'FormatStats'; - readonly format?: Maybe; - readonly amount?: Maybe; -} - -/** Date object that allows for incomplete date values (fuzzy) */ -export interface FuzzyDate { - readonly __typename?: 'FuzzyDate'; - /** Numeric Year (2017) */ - readonly year?: Maybe; - /** Numeric Month (3) */ - readonly month?: Maybe; - /** Numeric Day (24) */ - readonly day?: Maybe; -} - -/** Date object that allows for incomplete date values (fuzzy) */ -export interface FuzzyDateInput { - /** Numeric Year (2017) */ - readonly year?: Maybe; - /** Numeric Month (3) */ - readonly month?: Maybe; - /** Numeric Day (24) */ - readonly day?: Maybe; -} - -/** User's genre statistics */ -export interface GenreStats { - readonly __typename?: 'GenreStats'; - readonly genre?: Maybe; - readonly amount?: Maybe; - readonly meanScore?: Maybe; - /** The amount of time in minutes the genre has been watched by the user */ - readonly timeWatched?: Maybe; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPage { - readonly __typename?: 'InternalPage'; - readonly mediaSubmissions?: Maybe>>; - readonly characterSubmissions?: Maybe>>; - readonly staffSubmissions?: Maybe>>; - readonly revisionHistory?: Maybe>>; - readonly reports?: Maybe>>; - readonly modActions?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; - readonly users?: Maybe>>; - readonly media?: Maybe>>; - readonly characters?: Maybe>>; - readonly staff?: Maybe>>; - readonly studios?: Maybe>>; - readonly mediaList?: Maybe>>; - readonly airingSchedules?: Maybe>>; - readonly mediaTrends?: Maybe>>; - readonly notifications?: Maybe>>; - readonly followers?: Maybe>>; - readonly following?: Maybe>>; - readonly activities?: Maybe>>; - readonly activityReplies?: Maybe>>; - readonly threads?: Maybe>>; - readonly threadComments?: Maybe>>; - readonly reviews?: Maybe>>; - readonly recommendations?: Maybe>>; - readonly likes?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageMediaSubmissionsArgs { - mediaId?: Maybe; - submissionId?: Maybe; - userId?: Maybe; - status?: Maybe; - type?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageCharacterSubmissionsArgs { - characterId?: Maybe; - userId?: Maybe; - status?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageStaffSubmissionsArgs { - staffId?: Maybe; - userId?: Maybe; - status?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageRevisionHistoryArgs { - userId?: Maybe; - mediaId?: Maybe; - characterId?: Maybe; - staffId?: Maybe; - studioId?: Maybe; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageReportsArgs { - reporterId?: Maybe; - reportedId?: Maybe; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageModActionsArgs { - userId?: Maybe; - modId?: Maybe; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageUsersArgs { - id?: Maybe; - name?: Maybe; - isModerator?: Maybe; - search?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageMediaArgs { - id?: Maybe; - idMal?: Maybe; - startDate?: Maybe; - endDate?: Maybe; - season?: Maybe; - seasonYear?: Maybe; - type?: Maybe; - format?: Maybe; - status?: Maybe; - episodes?: Maybe; - duration?: Maybe; - chapters?: Maybe; - volumes?: Maybe; - isAdult?: Maybe; - genre?: Maybe; - tag?: Maybe; - minimumTagRank?: Maybe; - tagCategory?: Maybe; - onList?: Maybe; - licensedBy?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - source?: Maybe; - countryOfOrigin?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - idMal_not?: Maybe; - idMal_in?: Maybe>>; - idMal_not_in?: Maybe>>; - startDate_greater?: Maybe; - startDate_lesser?: Maybe; - startDate_like?: Maybe; - endDate_greater?: Maybe; - endDate_lesser?: Maybe; - endDate_like?: Maybe; - format_in?: Maybe>>; - format_not?: Maybe; - format_not_in?: Maybe>>; - status_in?: Maybe>>; - status_not?: Maybe; - status_not_in?: Maybe>>; - episodes_greater?: Maybe; - episodes_lesser?: Maybe; - duration_greater?: Maybe; - duration_lesser?: Maybe; - chapters_greater?: Maybe; - chapters_lesser?: Maybe; - volumes_greater?: Maybe; - volumes_lesser?: Maybe; - genre_in?: Maybe>>; - genre_not_in?: Maybe>>; - tag_in?: Maybe>>; - tag_not_in?: Maybe>>; - tagCategory_in?: Maybe>>; - tagCategory_not_in?: Maybe>>; - licensedBy_in?: Maybe>>; - averageScore_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - popularity_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - source_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageCharactersArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageStaffArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageStudiosArgs { - id?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageMediaListArgs { - id?: Maybe; - userId?: Maybe; - userName?: Maybe; - type?: Maybe; - status?: Maybe; - mediaId?: Maybe; - isFollowing?: Maybe; - notes?: Maybe; - startedAt?: Maybe; - completedAt?: Maybe; - compareWithAuthList?: Maybe; - userId_in?: Maybe>>; - status_in?: Maybe>>; - status_not_in?: Maybe>>; - status_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - notes_like?: Maybe; - startedAt_greater?: Maybe; - startedAt_lesser?: Maybe; - startedAt_like?: Maybe; - completedAt_greater?: Maybe; - completedAt_lesser?: Maybe; - completedAt_like?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageAiringSchedulesArgs { - id?: Maybe; - mediaId?: Maybe; - episode?: Maybe; - airingAt?: Maybe; - notYetAired?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - episode_not?: Maybe; - episode_in?: Maybe>>; - episode_not_in?: Maybe>>; - episode_greater?: Maybe; - episode_lesser?: Maybe; - airingAt_greater?: Maybe; - airingAt_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageMediaTrendsArgs { - mediaId?: Maybe; - date?: Maybe; - trending?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - episode?: Maybe; - releasing?: Maybe; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - date_greater?: Maybe; - date_lesser?: Maybe; - trending_greater?: Maybe; - trending_lesser?: Maybe; - trending_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - averageScore_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - popularity_not?: Maybe; - episode_greater?: Maybe; - episode_lesser?: Maybe; - episode_not?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageNotificationsArgs { - type?: Maybe; - resetNotificationCount?: Maybe; - type_in?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageFollowersArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageFollowingArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageActivitiesArgs { - id?: Maybe; - userId?: Maybe; - messengerId?: Maybe; - mediaId?: Maybe; - type?: Maybe; - isFollowing?: Maybe; - hasReplies?: Maybe; - hasRepliesOrTypeText?: Maybe; - createdAt?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - userId_not?: Maybe; - userId_in?: Maybe>>; - userId_not_in?: Maybe>>; - messengerId_not?: Maybe; - messengerId_in?: Maybe>>; - messengerId_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - type_not?: Maybe; - type_in?: Maybe>>; - type_not_in?: Maybe>>; - createdAt_greater?: Maybe; - createdAt_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageActivityRepliesArgs { - id?: Maybe; - activityId?: Maybe; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageThreadsArgs { - id?: Maybe; - userId?: Maybe; - replyUserId?: Maybe; - subscribed?: Maybe; - categoryId?: Maybe; - mediaCategoryId?: Maybe; - search?: Maybe; - id_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageThreadCommentsArgs { - id?: Maybe; - threadId?: Maybe; - userId?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageReviewsArgs { - id?: Maybe; - mediaId?: Maybe; - userId?: Maybe; - mediaType?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageRecommendationsArgs { - id?: Maybe; - mediaId?: Maybe; - mediaRecommendationId?: Maybe; - userId?: Maybe; - rating?: Maybe; - onList?: Maybe; - rating_greater?: Maybe; - rating_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data (Used for internal use only) */ -export interface InternalPageLikesArgs { - likeableId?: Maybe; - type?: Maybe; -} - -/** Types that can be liked */ -export const enum LikeableType { - Thread = 'THREAD', - ThreadComment = 'THREAD_COMMENT', - Activity = 'ACTIVITY', - ActivityReply = 'ACTIVITY_REPLY' -} - -/** Likeable union type */ -export type LikeableUnion = ListActivity | TextActivity | MessageActivity | ActivityReply | Thread | ThreadComment; - -/** User list activity (anime & manga updates) */ -export interface ListActivity { - readonly __typename?: 'ListActivity'; - /** The id of the activity */ - readonly id: Scalars['Int']; - /** The user id of the activity's creator */ - readonly userId?: Maybe; - /** The type of activity */ - readonly type?: Maybe; - /** The number of activity replies */ - readonly replyCount: Scalars['Int']; - /** The list item's textual status */ - readonly status?: Maybe; - /** The list progress made */ - readonly progress?: Maybe; - /** If the activity is locked and can receive replies */ - readonly isLocked?: Maybe; - /** If the currently authenticated user is subscribed to the activity */ - readonly isSubscribed?: Maybe; - /** The amount of likes the activity has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the activity */ - readonly isLiked?: Maybe; - /** The url for the activity page on the AniList website */ - readonly siteUrl?: Maybe; - /** The time the activity was created at */ - readonly createdAt: Scalars['Int']; - /** The owner of the activity */ - readonly user?: Maybe; - /** The associated media to the activity update */ - readonly media?: Maybe; - /** The written replies to the activity */ - readonly replies?: Maybe>>; - /** The users who liked the activity */ - readonly likes?: Maybe>>; -} - -/** User's list score statistics */ -export interface ListScoreStats { - readonly __typename?: 'ListScoreStats'; - readonly meanScore?: Maybe; - readonly standardDeviation?: Maybe; -} - -/** Anime or Manga */ -export interface Media { - readonly __typename?: 'Media'; - /** The id of the media */ - readonly id: Scalars['Int']; - /** The mal id of the media */ - readonly idMal?: Maybe; - /** The official titles of the media in various languages */ - readonly title?: Maybe; - /** The type of the media; anime or manga */ - readonly type?: Maybe; - /** The format the media was released in */ - readonly format?: Maybe; - /** The current releasing status of the media */ - readonly status?: Maybe; - /** Short description of the media's story and characters */ - readonly description?: Maybe; - /** The first official release date of the media */ - readonly startDate?: Maybe; - /** The last official release date of the media */ - readonly endDate?: Maybe; - /** The season the media was initially released in */ - readonly season?: Maybe; - /** The season year the media was initially released in */ - readonly seasonYear?: Maybe; - /** - * The year & season the media was initially released in - * @deprecated - */ - readonly seasonInt?: Maybe; - /** The amount of episodes the anime has when complete */ - readonly episodes?: Maybe; - /** The general length of each anime episode in minutes */ - readonly duration?: Maybe; - /** The amount of chapters the manga has when complete */ - readonly chapters?: Maybe; - /** The amount of volumes the manga has when complete */ - readonly volumes?: Maybe; - /** Where the media was created. (ISO 3166-1 alpha-2) */ - readonly countryOfOrigin?: Maybe; - /** If the media is officially licensed or a self-published doujin release */ - readonly isLicensed?: Maybe; - /** Source type the media was adapted from. */ - readonly source?: Maybe; - /** Official Twitter hashtags for the media */ - readonly hashtag?: Maybe; - /** Media trailer or advertisement */ - readonly trailer?: Maybe; - /** When the media's data was last updated */ - readonly updatedAt?: Maybe; - /** The cover images of the media */ - readonly coverImage?: Maybe; - /** The banner image of the media */ - readonly bannerImage?: Maybe; - /** The genres of the media */ - readonly genres?: Maybe>>; - /** Alternative titles of the media */ - readonly synonyms?: Maybe>>; - /** A weighted average score of all the user's scores of the media */ - readonly averageScore?: Maybe; - /** Mean score of all the user's scores of the media */ - readonly meanScore?: Maybe; - /** The number of users with the media on their list */ - readonly popularity?: Maybe; - /** Locked media may not be added to lists our favorited. This may be due to the entry pending for deletion or other reasons. */ - readonly isLocked?: Maybe; - /** The amount of related activity in the past hour */ - readonly trending?: Maybe; - /** The amount of user's who have favourited the media */ - readonly favourites?: Maybe; - /** List of tags that describes elements and themes of the media */ - readonly tags?: Maybe>>; - /** Other media in the same or connecting franchise */ - readonly relations?: Maybe; - /** The characters in the media */ - readonly characters?: Maybe; - /** The staff who produced the media */ - readonly staff?: Maybe; - /** The companies who produced the media */ - readonly studios?: Maybe; - /** If the media is marked as favourite by the current authenticated user */ - readonly isFavourite: Scalars['Boolean']; - /** If the media is intended only for 18+ adult audiences */ - readonly isAdult?: Maybe; - /** The media's next episode airing schedule */ - readonly nextAiringEpisode?: Maybe; - /** The media's entire airing schedule */ - readonly airingSchedule?: Maybe; - /** The media's daily trend stats */ - readonly trends?: Maybe; - /** External links to another site related to the media */ - readonly externalLinks?: Maybe>>; - /** Data and links to legal streaming episodes on external sites */ - readonly streamingEpisodes?: Maybe>>; - /** The ranking of the media in a particular time span and format compared to other media */ - readonly rankings?: Maybe>>; - /** The authenticated user's media list entry for the media */ - readonly mediaListEntry?: Maybe; - /** User reviews of the media */ - readonly reviews?: Maybe; - /** User recommendations for similar media */ - readonly recommendations?: Maybe; - readonly stats?: Maybe; - /** The url for the media page on the AniList website */ - readonly siteUrl?: Maybe; - /** If the media should have forum thread automatically created for it on airing episode release */ - readonly autoCreateForumThread?: Maybe; - /** If the media is blocked from being recommended to/from */ - readonly isRecommendationBlocked?: Maybe; - /** Notes for site moderators */ - readonly modNotes?: Maybe; -} - -/** Anime or Manga */ -export interface MediaStatusArgs { - version?: Maybe; -} - -/** Anime or Manga */ -export interface MediaDescriptionArgs { - asHtml?: Maybe; -} - -/** Anime or Manga */ -export interface MediaSourceArgs { - version?: Maybe; -} - -/** Anime or Manga */ -export interface MediaCharactersArgs { - sort?: Maybe>>; - role?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -/** Anime or Manga */ -export interface MediaStaffArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -/** Anime or Manga */ -export interface MediaStudiosArgs { - sort?: Maybe>>; - isMain?: Maybe; -} - -/** Anime or Manga */ -export interface MediaAiringScheduleArgs { - notYetAired?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -/** Anime or Manga */ -export interface MediaTrendsArgs { - sort?: Maybe>>; - releasing?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -/** Anime or Manga */ -export interface MediaReviewsArgs { - limit?: Maybe; - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -/** Anime or Manga */ -export interface MediaRecommendationsArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -/** Internal - Media characters separated */ -export interface MediaCharacter { - readonly __typename?: 'MediaCharacter'; - /** The id of the connection */ - readonly id?: Maybe; - /** The characters role in the media */ - readonly role?: Maybe; - readonly roleNotes?: Maybe; - readonly dubGroup?: Maybe; - /** Media specific character name */ - readonly characterName?: Maybe; - /** The characters in the media voiced by the parent actor */ - readonly character?: Maybe; - /** The voice actor of the character */ - readonly voiceActor?: Maybe; -} - -export interface MediaConnection { - readonly __typename?: 'MediaConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -export interface MediaCoverImage { - readonly __typename?: 'MediaCoverImage'; - /** The cover image url of the media at its largest size. If this size isn't available, large will be provided instead. */ - readonly extraLarge?: Maybe; - /** The cover image url of the media at a large size */ - readonly large?: Maybe; - /** The cover image url of the media at medium size */ - readonly medium?: Maybe; - /** Average #hex color of cover image */ - readonly color?: Maybe; -} - -/** Media connection edge */ -export interface MediaEdge { - readonly __typename?: 'MediaEdge'; - readonly node?: Maybe; - /** The id of the connection */ - readonly id?: Maybe; - /** The type of relation to the parent model */ - readonly relationType?: Maybe; - /** If the studio is the main animation studio of the media (For Studio->MediaConnection field only) */ - readonly isMainStudio: Scalars['Boolean']; - /** The characters in the media voiced by the parent actor */ - readonly characters?: Maybe>>; - /** The characters role in the media */ - readonly characterRole?: Maybe; - /** Media specific character name */ - readonly characterName?: Maybe; - /** Notes regarding the VA's role for the character */ - readonly roleNotes?: Maybe; - /** Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. */ - readonly dubGroup?: Maybe; - /** The role of the staff member in the production of the media */ - readonly staffRole?: Maybe; - /** The voice actors of the character */ - readonly voiceActors?: Maybe>>; - /** The voice actors of the character with role date */ - readonly voiceActorRoles?: Maybe>>; - /** The order the media should be displayed from the users favourites */ - readonly favouriteOrder?: Maybe; -} - -/** Media connection edge */ -export interface MediaEdgeRelationTypeArgs { - version?: Maybe; -} - -/** Media connection edge */ -export interface MediaEdgeVoiceActorsArgs { - language?: Maybe; - sort?: Maybe>>; -} - -/** Media connection edge */ -export interface MediaEdgeVoiceActorRolesArgs { - language?: Maybe; - sort?: Maybe>>; -} - -/** An external link to another site related to the media */ -export interface MediaExternalLink { - readonly __typename?: 'MediaExternalLink'; - /** The id of the external link */ - readonly id: Scalars['Int']; - /** The url of the external link */ - readonly url: Scalars['String']; - /** The site location of the external link */ - readonly site: Scalars['String']; -} - -/** An external link to another site related to the media */ -export interface MediaExternalLinkInput { - /** The id of the external link */ - readonly id: Scalars['Int']; - /** The url of the external link */ - readonly url: Scalars['String']; - /** The site location of the external link */ - readonly site: Scalars['String']; -} - -/** The format the media was released in */ -export const enum MediaFormat { - /** Anime broadcast on television */ - Tv = 'TV', - /** Anime which are under 15 minutes in length and broadcast on television */ - TvShort = 'TV_SHORT', - /** Anime movies with a theatrical release */ - Movie = 'MOVIE', - /** Special episodes that have been included in DVD/Blu-ray releases, picture dramas, pilots, etc */ - Special = 'SPECIAL', - /** (Original Video Animation) Anime that have been released directly on DVD/Blu-ray without originally going through a theatrical release or television broadcast */ - Ova = 'OVA', - /** (Original Net Animation) Anime that have been originally released online or are only available through streaming services. */ - Ona = 'ONA', - /** Short anime released as a music video */ - Music = 'MUSIC', - /** Professionally published manga with more than one chapter */ - Manga = 'MANGA', - /** Written books released as a series of light novels */ - Novel = 'NOVEL', - /** Manga with just one chapter */ - OneShot = 'ONE_SHOT' -} - -/** List of anime or manga */ -export interface MediaList { - readonly __typename?: 'MediaList'; - /** The id of the list entry */ - readonly id: Scalars['Int']; - /** The id of the user owner of the list entry */ - readonly userId: Scalars['Int']; - /** The id of the media */ - readonly mediaId: Scalars['Int']; - /** The watching/reading status */ - readonly status?: Maybe; - /** The score of the entry */ - readonly score?: Maybe; - /** The amount of episodes/chapters consumed by the user */ - readonly progress?: Maybe; - /** The amount of volumes read by the user */ - readonly progressVolumes?: Maybe; - /** The amount of times the user has rewatched/read the media */ - readonly repeat?: Maybe; - /** Priority of planning */ - readonly priority?: Maybe; - /** If the entry should only be visible to authenticated user */ - readonly private?: Maybe; - /** Text notes */ - readonly notes?: Maybe; - /** If the entry shown be hidden from non-custom lists */ - readonly hiddenFromStatusLists?: Maybe; - /** Map of booleans for which custom lists the entry are in */ - readonly customLists?: Maybe; - /** Map of advanced scores with name keys */ - readonly advancedScores?: Maybe; - /** When the entry was started by the user */ - readonly startedAt?: Maybe; - /** When the entry was completed by the user */ - readonly completedAt?: Maybe; - /** When the entry data was last updated */ - readonly updatedAt?: Maybe; - /** When the entry data was created */ - readonly createdAt?: Maybe; - readonly media?: Maybe; - readonly user?: Maybe; -} - -/** List of anime or manga */ -export interface MediaListScoreArgs { - format?: Maybe; -} - -/** List of anime or manga */ -export interface MediaListCustomListsArgs { - asArray?: Maybe; -} - -/** List of anime or manga */ -export interface MediaListCollection { - readonly __typename?: 'MediaListCollection'; - /** Grouped media list entries */ - readonly lists?: Maybe>>; - /** The owner of the list */ - readonly user?: Maybe; - /** If there is another chunk */ - readonly hasNextChunk?: Maybe; - /** - * A map of media list entry arrays grouped by status - * @deprecated Not GraphQL spec compliant, use lists field instead. - */ - readonly statusLists?: Maybe>>>>; - /** - * A map of media list entry arrays grouped by custom lists - * @deprecated Not GraphQL spec compliant, use lists field instead. - */ - readonly customLists?: Maybe>>>>; -} - -/** List of anime or manga */ -export interface MediaListCollectionStatusListsArgs { - asArray?: Maybe; -} - -/** List of anime or manga */ -export interface MediaListCollectionCustomListsArgs { - asArray?: Maybe; -} - -/** List group of anime or manga entries */ -export interface MediaListGroup { - readonly __typename?: 'MediaListGroup'; - /** Media list entries */ - readonly entries?: Maybe>>; - readonly name?: Maybe; - readonly isCustomList?: Maybe; - readonly isSplitCompletedList?: Maybe; - readonly status?: Maybe; -} - -/** A user's list options */ -export interface MediaListOptions { - readonly __typename?: 'MediaListOptions'; - /** The score format the user is using for media lists */ - readonly scoreFormat?: Maybe; - /** The default order list rows should be displayed in */ - readonly rowOrder?: Maybe; - /** @deprecated No longer used */ - readonly useLegacyLists?: Maybe; - /** The user's anime list options */ - readonly animeList?: Maybe; - /** The user's manga list options */ - readonly mangaList?: Maybe; - /** - * The list theme options for both lists - * @deprecated No longer used - */ - readonly sharedTheme?: Maybe; - /** - * If the shared theme should be used instead of the individual list themes - * @deprecated No longer used - */ - readonly sharedThemeEnabled?: Maybe; -} - -/** A user's list options for anime or manga lists */ -export interface MediaListOptionsInput { - /** The order each list should be displayed in */ - readonly sectionOrder?: Maybe>>; - /** If the completed sections of the list should be separated by format */ - readonly splitCompletedSectionByFormat?: Maybe; - /** The names of the user's custom lists */ - readonly customLists?: Maybe>>; - /** The names of the user's advanced scoring sections */ - readonly advancedScoring?: Maybe>>; - /** If advanced scoring is enabled */ - readonly advancedScoringEnabled?: Maybe; - /** list theme */ - readonly theme?: Maybe; -} - -/** Media list sort enums */ -export const enum MediaListSort { - MediaId = 'MEDIA_ID', - MediaIdDesc = 'MEDIA_ID_DESC', - Score = 'SCORE', - ScoreDesc = 'SCORE_DESC', - Status = 'STATUS', - StatusDesc = 'STATUS_DESC', - Progress = 'PROGRESS', - ProgressDesc = 'PROGRESS_DESC', - ProgressVolumes = 'PROGRESS_VOLUMES', - ProgressVolumesDesc = 'PROGRESS_VOLUMES_DESC', - Repeat = 'REPEAT', - RepeatDesc = 'REPEAT_DESC', - Priority = 'PRIORITY', - PriorityDesc = 'PRIORITY_DESC', - StartedOn = 'STARTED_ON', - StartedOnDesc = 'STARTED_ON_DESC', - FinishedOn = 'FINISHED_ON', - FinishedOnDesc = 'FINISHED_ON_DESC', - AddedTime = 'ADDED_TIME', - AddedTimeDesc = 'ADDED_TIME_DESC', - UpdatedTime = 'UPDATED_TIME', - UpdatedTimeDesc = 'UPDATED_TIME_DESC', - MediaTitleRomaji = 'MEDIA_TITLE_ROMAJI', - MediaTitleRomajiDesc = 'MEDIA_TITLE_ROMAJI_DESC', - MediaTitleEnglish = 'MEDIA_TITLE_ENGLISH', - MediaTitleEnglishDesc = 'MEDIA_TITLE_ENGLISH_DESC', - MediaTitleNative = 'MEDIA_TITLE_NATIVE', - MediaTitleNativeDesc = 'MEDIA_TITLE_NATIVE_DESC', - MediaPopularity = 'MEDIA_POPULARITY', - MediaPopularityDesc = 'MEDIA_POPULARITY_DESC' -} - -/** Media list watching/reading status enum. */ -export const enum MediaListStatus { - /** Currently watching/reading */ - Current = 'CURRENT', - /** Planning to watch/read */ - Planning = 'PLANNING', - /** Finished watching/reading */ - Completed = 'COMPLETED', - /** Stopped watching/reading before completing */ - Dropped = 'DROPPED', - /** Paused watching/reading */ - Paused = 'PAUSED', - /** Re-watching/reading */ - Repeating = 'REPEATING' -} - -/** A user's list options for anime or manga lists */ -export interface MediaListTypeOptions { - readonly __typename?: 'MediaListTypeOptions'; - /** The order each list should be displayed in */ - readonly sectionOrder?: Maybe>>; - /** If the completed sections of the list should be separated by format */ - readonly splitCompletedSectionByFormat?: Maybe; - /** - * The list theme options - * @deprecated This field has not yet been fully implemented and may change without warning - */ - readonly theme?: Maybe; - /** The names of the user's custom lists */ - readonly customLists?: Maybe>>; - /** The names of the user's advanced scoring sections */ - readonly advancedScoring?: Maybe>>; - /** If advanced scoring is enabled */ - readonly advancedScoringEnabled?: Maybe; -} - -/** The ranking of a media in a particular time span and format compared to other media */ -export interface MediaRank { - readonly __typename?: 'MediaRank'; - /** The id of the rank */ - readonly id: Scalars['Int']; - /** The numerical rank of the media */ - readonly rank: Scalars['Int']; - /** The type of ranking */ - readonly type: MediaRankType; - /** The format the media is ranked within */ - readonly format: MediaFormat; - /** The year the media is ranked within */ - readonly year?: Maybe; - /** The season the media is ranked within */ - readonly season?: Maybe; - /** If the ranking is based on all time instead of a season/year */ - readonly allTime?: Maybe; - /** String that gives context to the ranking type and time span */ - readonly context: Scalars['String']; -} - -/** The type of ranking */ -export const enum MediaRankType { - /** Ranking is based on the media's ratings/score */ - Rated = 'RATED', - /** Ranking is based on the media's popularity */ - Popular = 'POPULAR' -} - -/** Type of relation media has to its parent. */ -export const enum MediaRelation { - /** An adaption of this media into a different format */ - Adaptation = 'ADAPTATION', - /** Released before the relation */ - Prequel = 'PREQUEL', - /** Released after the relation */ - Sequel = 'SEQUEL', - /** The media a side story is from */ - Parent = 'PARENT', - /** A side story of the parent media */ - SideStory = 'SIDE_STORY', - /** Shares at least 1 character */ - Character = 'CHARACTER', - /** A shortened and summarized version */ - Summary = 'SUMMARY', - /** An alternative version of the same media */ - Alternative = 'ALTERNATIVE', - /** An alternative version of the media with a different primary focus */ - SpinOff = 'SPIN_OFF', - /** Other */ - Other = 'OTHER', - /** Version 2 only. The source material the media was adapted from */ - Source = 'SOURCE', - /** Version 2 only. */ - Compilation = 'COMPILATION', - /** Version 2 only. */ - Contains = 'CONTAINS' -} - -export const enum MediaSeason { - /** Months December to February */ - Winter = 'WINTER', - /** Months March to May */ - Spring = 'SPRING', - /** Months June to August */ - Summer = 'SUMMER', - /** Months September to November */ - Fall = 'FALL' -} - -/** Media sort enums */ -export const enum MediaSort { - Id = 'ID', - IdDesc = 'ID_DESC', - TitleRomaji = 'TITLE_ROMAJI', - TitleRomajiDesc = 'TITLE_ROMAJI_DESC', - TitleEnglish = 'TITLE_ENGLISH', - TitleEnglishDesc = 'TITLE_ENGLISH_DESC', - TitleNative = 'TITLE_NATIVE', - TitleNativeDesc = 'TITLE_NATIVE_DESC', - Type = 'TYPE', - TypeDesc = 'TYPE_DESC', - Format = 'FORMAT', - FormatDesc = 'FORMAT_DESC', - StartDate = 'START_DATE', - StartDateDesc = 'START_DATE_DESC', - EndDate = 'END_DATE', - EndDateDesc = 'END_DATE_DESC', - Score = 'SCORE', - ScoreDesc = 'SCORE_DESC', - Popularity = 'POPULARITY', - PopularityDesc = 'POPULARITY_DESC', - Trending = 'TRENDING', - TrendingDesc = 'TRENDING_DESC', - Episodes = 'EPISODES', - EpisodesDesc = 'EPISODES_DESC', - Duration = 'DURATION', - DurationDesc = 'DURATION_DESC', - Status = 'STATUS', - StatusDesc = 'STATUS_DESC', - Chapters = 'CHAPTERS', - ChaptersDesc = 'CHAPTERS_DESC', - Volumes = 'VOLUMES', - VolumesDesc = 'VOLUMES_DESC', - UpdatedAt = 'UPDATED_AT', - UpdatedAtDesc = 'UPDATED_AT_DESC', - SearchMatch = 'SEARCH_MATCH', - Favourites = 'FAVOURITES', - FavouritesDesc = 'FAVOURITES_DESC' -} - -/** Source type the media was adapted from */ -export const enum MediaSource { - /** An original production not based of another work */ - Original = 'ORIGINAL', - /** Asian comic book */ - Manga = 'MANGA', - /** Written work published in volumes */ - LightNovel = 'LIGHT_NOVEL', - /** Video game driven primary by text and narrative */ - VisualNovel = 'VISUAL_NOVEL', - /** Video game */ - VideoGame = 'VIDEO_GAME', - /** Other */ - Other = 'OTHER', - /** Version 2 only. Written works not published in volumes */ - Novel = 'NOVEL', - /** Version 2 only. Self-published works */ - Doujinshi = 'DOUJINSHI', - /** Version 2 only. Japanese Anime */ - Anime = 'ANIME' -} - -/** A media's statistics */ -export interface MediaStats { - readonly __typename?: 'MediaStats'; - readonly scoreDistribution?: Maybe>>; - readonly statusDistribution?: Maybe>>; - /** @deprecated Replaced by MediaTrends */ - readonly airingProgression?: Maybe>>; -} - -/** The current releasing status of the media */ -export const enum MediaStatus { - /** Has completed and is no longer being released */ - Finished = 'FINISHED', - /** Currently releasing */ - Releasing = 'RELEASING', - /** To be released at a later date */ - NotYetReleased = 'NOT_YET_RELEASED', - /** Ended before the work could be finished */ - Cancelled = 'CANCELLED', - /** Version 2 only. Is currently paused from releasing and will resume at a later date */ - Hiatus = 'HIATUS' -} - -/** Data and links to legal streaming episodes on external sites */ -export interface MediaStreamingEpisode { - readonly __typename?: 'MediaStreamingEpisode'; - /** Title of the episode */ - readonly title?: Maybe; - /** Url of episode image thumbnail */ - readonly thumbnail?: Maybe; - /** The url of the episode */ - readonly url?: Maybe; - /** The site location of the streaming episodes */ - readonly site?: Maybe; -} - -/** Media submission */ -export interface MediaSubmission { - readonly __typename?: 'MediaSubmission'; - /** The id of the submission */ - readonly id: Scalars['Int']; - /** User submitter of the submission */ - readonly submitter?: Maybe; - /** Status of the submission */ - readonly status?: Maybe; - readonly submitterStats?: Maybe; - readonly notes?: Maybe; - readonly source?: Maybe; - readonly changes?: Maybe>>; - readonly media?: Maybe; - readonly submission?: Maybe; - readonly characters?: Maybe>>; - readonly staff?: Maybe>>; - readonly studios?: Maybe>>; - readonly relations?: Maybe>>; - readonly externalLinks?: Maybe>>; - readonly createdAt?: Maybe; -} - -/** Media submission with comparison to current data */ -export interface MediaSubmissionComparison { - readonly __typename?: 'MediaSubmissionComparison'; - readonly submission?: Maybe; - readonly character?: Maybe; - readonly staff?: Maybe; - readonly studio?: Maybe; -} - -export interface MediaSubmissionEdge { - readonly __typename?: 'MediaSubmissionEdge'; - /** The id of the direct submission */ - readonly id?: Maybe; - readonly characterRole?: Maybe; - readonly staffRole?: Maybe; - readonly roleNotes?: Maybe; - readonly dubGroup?: Maybe; - readonly characterName?: Maybe; - readonly isMain?: Maybe; - readonly character?: Maybe; - readonly characterSubmission?: Maybe; - readonly voiceActor?: Maybe; - readonly voiceActorSubmission?: Maybe; - readonly staff?: Maybe; - readonly staffSubmission?: Maybe; - readonly studio?: Maybe; - readonly media?: Maybe; -} - -/** A tag that describes a theme or element of the media */ -export interface MediaTag { - readonly __typename?: 'MediaTag'; - /** The id of the tag */ - readonly id: Scalars['Int']; - /** The name of the tag */ - readonly name: Scalars['String']; - /** A general description of the tag */ - readonly description?: Maybe; - /** The categories of tags this tag belongs to */ - readonly category?: Maybe; - /** The relevance ranking of the tag out of the 100 for this media */ - readonly rank?: Maybe; - /** If the tag could be a spoiler for any media */ - readonly isGeneralSpoiler?: Maybe; - /** If the tag is a spoiler for this media */ - readonly isMediaSpoiler?: Maybe; - /** If the tag is only for adult 18+ media */ - readonly isAdult?: Maybe; -} - -/** The official titles of the media in various languages */ -export interface MediaTitle { - readonly __typename?: 'MediaTitle'; - /** The romanization of the native language title */ - readonly romaji?: Maybe; - /** The official english title */ - readonly english?: Maybe; - /** Official title in it's native language */ - readonly native?: Maybe; - /** The currently authenticated users preferred title language. Default romaji for non-authenticated */ - readonly userPreferred?: Maybe; -} - -/** The official titles of the media in various languages */ -export interface MediaTitleRomajiArgs { - stylised?: Maybe; -} - -/** The official titles of the media in various languages */ -export interface MediaTitleEnglishArgs { - stylised?: Maybe; -} - -/** The official titles of the media in various languages */ -export interface MediaTitleNativeArgs { - stylised?: Maybe; -} - -/** The official titles of the media in various languages */ -export interface MediaTitleInput { - /** The romanization of the native language title */ - readonly romaji?: Maybe; - /** The official english title */ - readonly english?: Maybe; - /** Official title in it's native language */ - readonly native?: Maybe; -} - -/** Media trailer or advertisement */ -export interface MediaTrailer { - readonly __typename?: 'MediaTrailer'; - /** The trailer video id */ - readonly id?: Maybe; - /** The site the video is hosted by (Currently either youtube or dailymotion) */ - readonly site?: Maybe; - /** The url for the thumbnail image of the video */ - readonly thumbnail?: Maybe; -} - -/** Daily media statistics */ -export interface MediaTrend { - readonly __typename?: 'MediaTrend'; - /** The id of the tag */ - readonly mediaId: Scalars['Int']; - /** The day the data was recorded (timestamp) */ - readonly date: Scalars['Int']; - /** The amount of media activity on the day */ - readonly trending: Scalars['Int']; - /** A weighted average score of all the user's scores of the media */ - readonly averageScore?: Maybe; - /** The number of users with the media on their list */ - readonly popularity?: Maybe; - /** The number of users with watching/reading the media */ - readonly inProgress?: Maybe; - /** If the media was being released at this time */ - readonly releasing: Scalars['Boolean']; - /** The episode number of the anime released on this day */ - readonly episode?: Maybe; - /** The related media */ - readonly media?: Maybe; -} - -export interface MediaTrendConnection { - readonly __typename?: 'MediaTrendConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Media trend connection edge */ -export interface MediaTrendEdge { - readonly __typename?: 'MediaTrendEdge'; - readonly node?: Maybe; -} - -/** Media trend sort enums */ -export const enum MediaTrendSort { - Id = 'ID', - IdDesc = 'ID_DESC', - MediaId = 'MEDIA_ID', - MediaIdDesc = 'MEDIA_ID_DESC', - Date = 'DATE', - DateDesc = 'DATE_DESC', - Score = 'SCORE', - ScoreDesc = 'SCORE_DESC', - Popularity = 'POPULARITY', - PopularityDesc = 'POPULARITY_DESC', - Trending = 'TRENDING', - TrendingDesc = 'TRENDING_DESC', - Episode = 'EPISODE', - EpisodeDesc = 'EPISODE_DESC' -} - -/** Media type enum, anime or manga. */ -export const enum MediaType { - /** Japanese Anime */ - Anime = 'ANIME', - /** Asian comic */ - Manga = 'MANGA' -} - -/** User message activity */ -export interface MessageActivity { - readonly __typename?: 'MessageActivity'; - /** The id of the activity */ - readonly id: Scalars['Int']; - /** The user id of the activity's recipient */ - readonly recipientId?: Maybe; - /** The user id of the activity's sender */ - readonly messengerId?: Maybe; - /** The type of the activity */ - readonly type?: Maybe; - /** The number of activity replies */ - readonly replyCount: Scalars['Int']; - /** The message text (Markdown) */ - readonly message?: Maybe; - /** If the activity is locked and can receive replies */ - readonly isLocked?: Maybe; - /** If the currently authenticated user is subscribed to the activity */ - readonly isSubscribed?: Maybe; - /** The amount of likes the activity has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the activity */ - readonly isLiked?: Maybe; - /** If the message is private and only viewable to the sender and recipients */ - readonly isPrivate?: Maybe; - /** The url for the activity page on the AniList website */ - readonly siteUrl?: Maybe; - /** The time the activity was created at */ - readonly createdAt: Scalars['Int']; - /** The user who the activity message was sent to */ - readonly recipient?: Maybe; - /** The user who sent the activity message */ - readonly messenger?: Maybe; - /** The written replies to the activity */ - readonly replies?: Maybe>>; - /** The users who liked the activity */ - readonly likes?: Maybe>>; -} - -/** User message activity */ -export interface MessageActivityMessageArgs { - asHtml?: Maybe; -} - -export interface ModAction { - readonly __typename?: 'ModAction'; - /** The id of the action */ - readonly id: Scalars['Int']; - readonly user?: Maybe; - readonly mod?: Maybe; - readonly type?: Maybe; - readonly objectId?: Maybe; - readonly objectType?: Maybe; - readonly data?: Maybe; - readonly createdAt: Scalars['Int']; -} - -export const enum ModActionType { - Note = 'NOTE', - Ban = 'BAN', - Delete = 'DELETE', - Edit = 'EDIT', - Expire = 'EXPIRE', - Report = 'REPORT', - Reset = 'RESET', - Anon = 'ANON' -} - -/** Mod role enums */ -export const enum ModRole { - /** An AniList administrator */ - Admin = 'ADMIN', - /** A head developer of AniList */ - LeadDeveloper = 'LEAD_DEVELOPER', - /** An AniList developer */ - Developer = 'DEVELOPER', - /** A lead community moderator */ - LeadCommunity = 'LEAD_COMMUNITY', - /** A community moderator */ - Community = 'COMMUNITY', - /** A discord community moderator */ - DiscordCommunity = 'DISCORD_COMMUNITY', - /** A lead anime data moderator */ - LeadAnimeData = 'LEAD_ANIME_DATA', - /** An anime data moderator */ - AnimeData = 'ANIME_DATA', - /** A lead manga data moderator */ - LeadMangaData = 'LEAD_MANGA_DATA', - /** A manga data moderator */ - MangaData = 'MANGA_DATA', - /** A lead social media moderator */ - LeadSocialMedia = 'LEAD_SOCIAL_MEDIA', - /** A social media moderator */ - SocialMedia = 'SOCIAL_MEDIA', - /** A retired moderator */ - Retired = 'RETIRED' -} - -export interface Mutation { - readonly __typename?: 'Mutation'; - readonly UpdateUser?: Maybe; - /** Create or update a media list entry */ - readonly SaveMediaListEntry?: Maybe; - /** Update multiple media list entries to the same values */ - readonly UpdateMediaListEntries?: Maybe>>; - /** Delete a media list entry */ - readonly DeleteMediaListEntry?: Maybe; - /** Delete a custom list and remove the list entries from it */ - readonly DeleteCustomList?: Maybe; - /** Create or update text activity for the currently authenticated user */ - readonly SaveTextActivity?: Maybe; - /** Create or update message activity for the currently authenticated user */ - readonly SaveMessageActivity?: Maybe; - /** Update list activity (Mod Only) */ - readonly SaveListActivity?: Maybe; - /** Delete an activity item of the authenticated users */ - readonly DeleteActivity?: Maybe; - /** Toggle the subscription of an activity item */ - readonly ToggleActivitySubscription?: Maybe; - /** Create or update an activity reply */ - readonly SaveActivityReply?: Maybe; - /** Delete an activity reply of the authenticated users */ - readonly DeleteActivityReply?: Maybe; - /** - * Add or remove a like from a likeable type. - * Returns all the users who liked the same model - */ - readonly ToggleLike?: Maybe>>; - /** Add or remove a like from a likeable type. */ - readonly ToggleLikeV2?: Maybe; - /** Toggle the un/following of a user */ - readonly ToggleFollow?: Maybe; - /** Favourite or unfavourite an anime, manga, character, staff member, or studio */ - readonly ToggleFavourite?: Maybe; - /** Update the order favourites are displayed in */ - readonly UpdateFavouriteOrder?: Maybe; - /** Create or update a review */ - readonly SaveReview?: Maybe; - /** Delete a review */ - readonly DeleteReview?: Maybe; - /** Rate a review */ - readonly RateReview?: Maybe; - /** Recommendation a media */ - readonly SaveRecommendation?: Maybe; - /** Create or update a forum thread */ - readonly SaveThread?: Maybe; - /** Delete a thread */ - readonly DeleteThread?: Maybe; - /** Toggle the subscription of a forum thread */ - readonly ToggleThreadSubscription?: Maybe; - /** Create or update a thread comment */ - readonly SaveThreadComment?: Maybe; - /** Delete a thread comment */ - readonly DeleteThreadComment?: Maybe; - readonly UpdateAniChartSettings?: Maybe; - readonly UpdateAniChartHighlights?: Maybe; -} - -export interface MutationUpdateUserArgs { - about?: Maybe; - titleLanguage?: Maybe; - displayAdultContent?: Maybe; - airingNotifications?: Maybe; - scoreFormat?: Maybe; - rowOrder?: Maybe; - profileColor?: Maybe; - donatorBadge?: Maybe; - notificationOptions?: Maybe>>; - timezone?: Maybe; - activityMergeTime?: Maybe; - animeListOptions?: Maybe; - mangaListOptions?: Maybe; - staffNameLanguage?: Maybe; -} - -export interface MutationSaveMediaListEntryArgs { - id?: Maybe; - mediaId?: Maybe; - status?: Maybe; - score?: Maybe; - scoreRaw?: Maybe; - progress?: Maybe; - progressVolumes?: Maybe; - repeat?: Maybe; - priority?: Maybe; - private?: Maybe; - notes?: Maybe; - hiddenFromStatusLists?: Maybe; - customLists?: Maybe>>; - advancedScores?: Maybe>>; - startedAt?: Maybe; - completedAt?: Maybe; -} - -export interface MutationUpdateMediaListEntriesArgs { - status?: Maybe; - score?: Maybe; - scoreRaw?: Maybe; - progress?: Maybe; - progressVolumes?: Maybe; - repeat?: Maybe; - priority?: Maybe; - private?: Maybe; - notes?: Maybe; - hiddenFromStatusLists?: Maybe; - advancedScores?: Maybe>>; - startedAt?: Maybe; - completedAt?: Maybe; - ids?: Maybe>>; -} - -export interface MutationDeleteMediaListEntryArgs { - id?: Maybe; -} - -export interface MutationDeleteCustomListArgs { - customList?: Maybe; - type?: Maybe; -} - -export interface MutationSaveTextActivityArgs { - id?: Maybe; - text?: Maybe; - locked?: Maybe; -} - -export interface MutationSaveMessageActivityArgs { - id?: Maybe; - message?: Maybe; - recipientId?: Maybe; - private?: Maybe; - locked?: Maybe; - asMod?: Maybe; -} - -export interface MutationSaveListActivityArgs { - id?: Maybe; - locked?: Maybe; -} - -export interface MutationDeleteActivityArgs { - id?: Maybe; -} - -export interface MutationToggleActivitySubscriptionArgs { - activityId?: Maybe; - subscribe?: Maybe; -} - -export interface MutationSaveActivityReplyArgs { - id?: Maybe; - activityId?: Maybe; - text?: Maybe; - asMod?: Maybe; -} - -export interface MutationDeleteActivityReplyArgs { - id?: Maybe; -} - -export interface MutationToggleLikeArgs { - id?: Maybe; - type?: Maybe; -} - -export interface MutationToggleLikeV2Args { - id?: Maybe; - type?: Maybe; -} - -export interface MutationToggleFollowArgs { - userId?: Maybe; -} - -export interface MutationToggleFavouriteArgs { - animeId?: Maybe; - mangaId?: Maybe; - characterId?: Maybe; - staffId?: Maybe; - studioId?: Maybe; -} - -export interface MutationUpdateFavouriteOrderArgs { - animeIds?: Maybe>>; - mangaIds?: Maybe>>; - characterIds?: Maybe>>; - staffIds?: Maybe>>; - studioIds?: Maybe>>; - animeOrder?: Maybe>>; - mangaOrder?: Maybe>>; - characterOrder?: Maybe>>; - staffOrder?: Maybe>>; - studioOrder?: Maybe>>; -} - -export interface MutationSaveReviewArgs { - id?: Maybe; - mediaId?: Maybe; - body?: Maybe; - summary?: Maybe; - score?: Maybe; - private?: Maybe; -} - -export interface MutationDeleteReviewArgs { - id?: Maybe; -} - -export interface MutationRateReviewArgs { - reviewId?: Maybe; - rating?: Maybe; -} - -export interface MutationSaveRecommendationArgs { - mediaId?: Maybe; - mediaRecommendationId?: Maybe; - rating?: Maybe; -} - -export interface MutationSaveThreadArgs { - id?: Maybe; - title?: Maybe; - body?: Maybe; - categories?: Maybe>>; - mediaCategories?: Maybe>>; - sticky?: Maybe; - locked?: Maybe; -} - -export interface MutationDeleteThreadArgs { - id?: Maybe; -} - -export interface MutationToggleThreadSubscriptionArgs { - threadId?: Maybe; - subscribe?: Maybe; -} - -export interface MutationSaveThreadCommentArgs { - id?: Maybe; - threadId?: Maybe; - parentCommentId?: Maybe; - comment?: Maybe; -} - -export interface MutationDeleteThreadCommentArgs { - id?: Maybe; -} - -export interface MutationUpdateAniChartSettingsArgs { - titleLanguage?: Maybe; - outgoingLinkProvider?: Maybe; - theme?: Maybe; - sort?: Maybe; -} - -export interface MutationUpdateAniChartHighlightsArgs { - highlights?: Maybe>>; -} - -/** Notification option */ -export interface NotificationOption { - readonly __typename?: 'NotificationOption'; - /** The type of notification */ - readonly type?: Maybe; - /** Whether this type of notification is enabled */ - readonly enabled?: Maybe; -} - -/** Notification option input */ -export interface NotificationOptionInput { - /** The type of notification */ - readonly type?: Maybe; - /** Whether this type of notification is enabled */ - readonly enabled?: Maybe; -} - -/** Notification type enum */ -export const enum NotificationType { - /** A user has sent you message */ - ActivityMessage = 'ACTIVITY_MESSAGE', - /** A user has replied to your activity */ - ActivityReply = 'ACTIVITY_REPLY', - /** A user has followed you */ - Following = 'FOLLOWING', - /** A user has mentioned you in their activity */ - ActivityMention = 'ACTIVITY_MENTION', - /** A user has mentioned you in a forum comment */ - ThreadCommentMention = 'THREAD_COMMENT_MENTION', - /** A user has commented in one of your subscribed forum threads */ - ThreadSubscribed = 'THREAD_SUBSCRIBED', - /** A user has replied to your forum comment */ - ThreadCommentReply = 'THREAD_COMMENT_REPLY', - /** An anime you are currently watching has aired */ - Airing = 'AIRING', - /** A user has liked your activity */ - ActivityLike = 'ACTIVITY_LIKE', - /** A user has liked your activity reply */ - ActivityReplyLike = 'ACTIVITY_REPLY_LIKE', - /** A user has liked your forum thread */ - ThreadLike = 'THREAD_LIKE', - /** A user has liked your forum comment */ - ThreadCommentLike = 'THREAD_COMMENT_LIKE', - /** A user has replied to activity you have also replied to */ - ActivityReplySubscribed = 'ACTIVITY_REPLY_SUBSCRIBED', - /** A new anime or manga has been added to the site where its related media is on the user's list */ - RelatedMediaAddition = 'RELATED_MEDIA_ADDITION' -} - -/** Notification union type */ -export type NotificationUnion = - | AiringNotification - | FollowingNotification - | ActivityMessageNotification - | ActivityMentionNotification - | ActivityReplyNotification - | ActivityReplySubscribedNotification - | ActivityLikeNotification - | ActivityReplyLikeNotification - | ThreadCommentMentionNotification - | ThreadCommentReplyNotification - | ThreadCommentSubscribedNotification - | ThreadCommentLikeNotification - | ThreadLikeNotification - | RelatedMediaAdditionNotification; - -/** Page of data */ -export interface Page { - readonly __typename?: 'Page'; - /** The pagination information */ - readonly pageInfo?: Maybe; - readonly users?: Maybe>>; - readonly media?: Maybe>>; - readonly characters?: Maybe>>; - readonly staff?: Maybe>>; - readonly studios?: Maybe>>; - readonly mediaList?: Maybe>>; - readonly airingSchedules?: Maybe>>; - readonly mediaTrends?: Maybe>>; - readonly notifications?: Maybe>>; - readonly followers?: Maybe>>; - readonly following?: Maybe>>; - readonly activities?: Maybe>>; - readonly activityReplies?: Maybe>>; - readonly threads?: Maybe>>; - readonly threadComments?: Maybe>>; - readonly reviews?: Maybe>>; - readonly recommendations?: Maybe>>; - readonly likes?: Maybe>>; -} - -/** Page of data */ -export interface PageUsersArgs { - id?: Maybe; - name?: Maybe; - isModerator?: Maybe; - search?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageMediaArgs { - id?: Maybe; - idMal?: Maybe; - startDate?: Maybe; - endDate?: Maybe; - season?: Maybe; - seasonYear?: Maybe; - type?: Maybe; - format?: Maybe; - status?: Maybe; - episodes?: Maybe; - duration?: Maybe; - chapters?: Maybe; - volumes?: Maybe; - isAdult?: Maybe; - genre?: Maybe; - tag?: Maybe; - minimumTagRank?: Maybe; - tagCategory?: Maybe; - onList?: Maybe; - licensedBy?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - source?: Maybe; - countryOfOrigin?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - idMal_not?: Maybe; - idMal_in?: Maybe>>; - idMal_not_in?: Maybe>>; - startDate_greater?: Maybe; - startDate_lesser?: Maybe; - startDate_like?: Maybe; - endDate_greater?: Maybe; - endDate_lesser?: Maybe; - endDate_like?: Maybe; - format_in?: Maybe>>; - format_not?: Maybe; - format_not_in?: Maybe>>; - status_in?: Maybe>>; - status_not?: Maybe; - status_not_in?: Maybe>>; - episodes_greater?: Maybe; - episodes_lesser?: Maybe; - duration_greater?: Maybe; - duration_lesser?: Maybe; - chapters_greater?: Maybe; - chapters_lesser?: Maybe; - volumes_greater?: Maybe; - volumes_lesser?: Maybe; - genre_in?: Maybe>>; - genre_not_in?: Maybe>>; - tag_in?: Maybe>>; - tag_not_in?: Maybe>>; - tagCategory_in?: Maybe>>; - tagCategory_not_in?: Maybe>>; - licensedBy_in?: Maybe>>; - averageScore_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - popularity_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - source_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageCharactersArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageStaffArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageStudiosArgs { - id?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageMediaListArgs { - id?: Maybe; - userId?: Maybe; - userName?: Maybe; - type?: Maybe; - status?: Maybe; - mediaId?: Maybe; - isFollowing?: Maybe; - notes?: Maybe; - startedAt?: Maybe; - completedAt?: Maybe; - compareWithAuthList?: Maybe; - userId_in?: Maybe>>; - status_in?: Maybe>>; - status_not_in?: Maybe>>; - status_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - notes_like?: Maybe; - startedAt_greater?: Maybe; - startedAt_lesser?: Maybe; - startedAt_like?: Maybe; - completedAt_greater?: Maybe; - completedAt_lesser?: Maybe; - completedAt_like?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageAiringSchedulesArgs { - id?: Maybe; - mediaId?: Maybe; - episode?: Maybe; - airingAt?: Maybe; - notYetAired?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - episode_not?: Maybe; - episode_in?: Maybe>>; - episode_not_in?: Maybe>>; - episode_greater?: Maybe; - episode_lesser?: Maybe; - airingAt_greater?: Maybe; - airingAt_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageMediaTrendsArgs { - mediaId?: Maybe; - date?: Maybe; - trending?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - episode?: Maybe; - releasing?: Maybe; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - date_greater?: Maybe; - date_lesser?: Maybe; - trending_greater?: Maybe; - trending_lesser?: Maybe; - trending_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - averageScore_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - popularity_not?: Maybe; - episode_greater?: Maybe; - episode_lesser?: Maybe; - episode_not?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageNotificationsArgs { - type?: Maybe; - resetNotificationCount?: Maybe; - type_in?: Maybe>>; -} - -/** Page of data */ -export interface PageFollowersArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageFollowingArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageActivitiesArgs { - id?: Maybe; - userId?: Maybe; - messengerId?: Maybe; - mediaId?: Maybe; - type?: Maybe; - isFollowing?: Maybe; - hasReplies?: Maybe; - hasRepliesOrTypeText?: Maybe; - createdAt?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - userId_not?: Maybe; - userId_in?: Maybe>>; - userId_not_in?: Maybe>>; - messengerId_not?: Maybe; - messengerId_in?: Maybe>>; - messengerId_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - type_not?: Maybe; - type_in?: Maybe>>; - type_not_in?: Maybe>>; - createdAt_greater?: Maybe; - createdAt_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageActivityRepliesArgs { - id?: Maybe; - activityId?: Maybe; -} - -/** Page of data */ -export interface PageThreadsArgs { - id?: Maybe; - userId?: Maybe; - replyUserId?: Maybe; - subscribed?: Maybe; - categoryId?: Maybe; - mediaCategoryId?: Maybe; - search?: Maybe; - id_in?: Maybe>>; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageThreadCommentsArgs { - id?: Maybe; - threadId?: Maybe; - userId?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageReviewsArgs { - id?: Maybe; - mediaId?: Maybe; - userId?: Maybe; - mediaType?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageRecommendationsArgs { - id?: Maybe; - mediaId?: Maybe; - mediaRecommendationId?: Maybe; - userId?: Maybe; - rating?: Maybe; - onList?: Maybe; - rating_greater?: Maybe; - rating_lesser?: Maybe; - sort?: Maybe>>; -} - -/** Page of data */ -export interface PageLikesArgs { - likeableId?: Maybe; - type?: Maybe; -} - -export interface PageInfo { - readonly __typename?: 'PageInfo'; - /** The total number of items */ - readonly total?: Maybe; - /** The count on a page */ - readonly perPage?: Maybe; - /** The current page */ - readonly currentPage?: Maybe; - /** The last page */ - readonly lastPage?: Maybe; - /** If there is another page */ - readonly hasNextPage?: Maybe; -} - -/** Provides the parsed markdown as html */ -export interface ParsedMarkdown { - readonly __typename?: 'ParsedMarkdown'; - /** The parsed markdown as html */ - readonly html?: Maybe; -} - -export interface Query { - readonly __typename?: 'Query'; - readonly Page?: Maybe; - /** Media query */ - readonly Media?: Maybe; - /** Media Trend query */ - readonly MediaTrend?: Maybe; - /** Airing schedule query */ - readonly AiringSchedule?: Maybe; - /** Character query */ - readonly Character?: Maybe; - /** Staff query */ - readonly Staff?: Maybe; - /** Media list query */ - readonly MediaList?: Maybe; - /** Media list collection query, provides list pre-grouped by status & custom lists. User ID and Media Type arguments required. */ - readonly MediaListCollection?: Maybe; - /** Collection of all the possible media genres */ - readonly GenreCollection?: Maybe>>; - /** Collection of all the possible media tags */ - readonly MediaTagCollection?: Maybe>>; - /** User query */ - readonly User?: Maybe; - /** Get the currently authenticated user */ - readonly Viewer?: Maybe; - /** Notification query */ - readonly Notification?: Maybe; - /** Studio query */ - readonly Studio?: Maybe; - /** Review query */ - readonly Review?: Maybe; - /** Activity query */ - readonly Activity?: Maybe; - /** Activity reply query */ - readonly ActivityReply?: Maybe; - /** Follow query */ - readonly Following?: Maybe; - /** Follow query */ - readonly Follower?: Maybe; - /** Thread query */ - readonly Thread?: Maybe; - /** Comment query */ - readonly ThreadComment?: Maybe>>; - /** Recommendation query */ - readonly Recommendation?: Maybe; - /** Like query */ - readonly Like?: Maybe; - /** Provide AniList markdown to be converted to html (Requires auth) */ - readonly Markdown?: Maybe; - readonly AniChartUser?: Maybe; - /** Site statistics query */ - readonly SiteStatistics?: Maybe; - /** Get the user who added a tag to a media */ - readonly MediaTagUser?: Maybe; -} - -export interface QueryPageArgs { - page?: Maybe; - perPage?: Maybe; -} - -export interface QueryMediaArgs { - id?: Maybe; - idMal?: Maybe; - startDate?: Maybe; - endDate?: Maybe; - season?: Maybe; - seasonYear?: Maybe; - type?: Maybe; - format?: Maybe; - status?: Maybe; - episodes?: Maybe; - duration?: Maybe; - chapters?: Maybe; - volumes?: Maybe; - isAdult?: Maybe; - genre?: Maybe; - tag?: Maybe; - minimumTagRank?: Maybe; - tagCategory?: Maybe; - onList?: Maybe; - licensedBy?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - source?: Maybe; - countryOfOrigin?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - idMal_not?: Maybe; - idMal_in?: Maybe>>; - idMal_not_in?: Maybe>>; - startDate_greater?: Maybe; - startDate_lesser?: Maybe; - startDate_like?: Maybe; - endDate_greater?: Maybe; - endDate_lesser?: Maybe; - endDate_like?: Maybe; - format_in?: Maybe>>; - format_not?: Maybe; - format_not_in?: Maybe>>; - status_in?: Maybe>>; - status_not?: Maybe; - status_not_in?: Maybe>>; - episodes_greater?: Maybe; - episodes_lesser?: Maybe; - duration_greater?: Maybe; - duration_lesser?: Maybe; - chapters_greater?: Maybe; - chapters_lesser?: Maybe; - volumes_greater?: Maybe; - volumes_lesser?: Maybe; - genre_in?: Maybe>>; - genre_not_in?: Maybe>>; - tag_in?: Maybe>>; - tag_not_in?: Maybe>>; - tagCategory_in?: Maybe>>; - tagCategory_not_in?: Maybe>>; - licensedBy_in?: Maybe>>; - averageScore_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - popularity_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - source_in?: Maybe>>; - sort?: Maybe>>; -} - -export interface QueryMediaTrendArgs { - mediaId?: Maybe; - date?: Maybe; - trending?: Maybe; - averageScore?: Maybe; - popularity?: Maybe; - episode?: Maybe; - releasing?: Maybe; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - date_greater?: Maybe; - date_lesser?: Maybe; - trending_greater?: Maybe; - trending_lesser?: Maybe; - trending_not?: Maybe; - averageScore_greater?: Maybe; - averageScore_lesser?: Maybe; - averageScore_not?: Maybe; - popularity_greater?: Maybe; - popularity_lesser?: Maybe; - popularity_not?: Maybe; - episode_greater?: Maybe; - episode_lesser?: Maybe; - episode_not?: Maybe; - sort?: Maybe>>; -} - -export interface QueryAiringScheduleArgs { - id?: Maybe; - mediaId?: Maybe; - episode?: Maybe; - airingAt?: Maybe; - notYetAired?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - episode_not?: Maybe; - episode_in?: Maybe>>; - episode_not_in?: Maybe>>; - episode_greater?: Maybe; - episode_lesser?: Maybe; - airingAt_greater?: Maybe; - airingAt_lesser?: Maybe; - sort?: Maybe>>; -} - -export interface QueryCharacterArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -export interface QueryStaffArgs { - id?: Maybe; - isBirthday?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -export interface QueryMediaListArgs { - id?: Maybe; - userId?: Maybe; - userName?: Maybe; - type?: Maybe; - status?: Maybe; - mediaId?: Maybe; - isFollowing?: Maybe; - notes?: Maybe; - startedAt?: Maybe; - completedAt?: Maybe; - compareWithAuthList?: Maybe; - userId_in?: Maybe>>; - status_in?: Maybe>>; - status_not_in?: Maybe>>; - status_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - notes_like?: Maybe; - startedAt_greater?: Maybe; - startedAt_lesser?: Maybe; - startedAt_like?: Maybe; - completedAt_greater?: Maybe; - completedAt_lesser?: Maybe; - completedAt_like?: Maybe; - sort?: Maybe>>; -} - -export interface QueryMediaListCollectionArgs { - userId?: Maybe; - userName?: Maybe; - type?: Maybe; - status?: Maybe; - notes?: Maybe; - startedAt?: Maybe; - completedAt?: Maybe; - forceSingleCompletedList?: Maybe; - chunk?: Maybe; - perChunk?: Maybe; - status_in?: Maybe>>; - status_not_in?: Maybe>>; - status_not?: Maybe; - notes_like?: Maybe; - startedAt_greater?: Maybe; - startedAt_lesser?: Maybe; - startedAt_like?: Maybe; - completedAt_greater?: Maybe; - completedAt_lesser?: Maybe; - completedAt_like?: Maybe; - sort?: Maybe>>; -} - -export interface QueryMediaTagCollectionArgs { - status?: Maybe; -} - -export interface QueryUserArgs { - id?: Maybe; - name?: Maybe; - isModerator?: Maybe; - search?: Maybe; - sort?: Maybe>>; -} - -export interface QueryNotificationArgs { - type?: Maybe; - resetNotificationCount?: Maybe; - type_in?: Maybe>>; -} - -export interface QueryStudioArgs { - id?: Maybe; - search?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - sort?: Maybe>>; -} - -export interface QueryReviewArgs { - id?: Maybe; - mediaId?: Maybe; - userId?: Maybe; - mediaType?: Maybe; - sort?: Maybe>>; -} - -export interface QueryActivityArgs { - id?: Maybe; - userId?: Maybe; - messengerId?: Maybe; - mediaId?: Maybe; - type?: Maybe; - isFollowing?: Maybe; - hasReplies?: Maybe; - hasRepliesOrTypeText?: Maybe; - createdAt?: Maybe; - id_not?: Maybe; - id_in?: Maybe>>; - id_not_in?: Maybe>>; - userId_not?: Maybe; - userId_in?: Maybe>>; - userId_not_in?: Maybe>>; - messengerId_not?: Maybe; - messengerId_in?: Maybe>>; - messengerId_not_in?: Maybe>>; - mediaId_not?: Maybe; - mediaId_in?: Maybe>>; - mediaId_not_in?: Maybe>>; - type_not?: Maybe; - type_in?: Maybe>>; - type_not_in?: Maybe>>; - createdAt_greater?: Maybe; - createdAt_lesser?: Maybe; - sort?: Maybe>>; -} - -export interface QueryActivityReplyArgs { - id?: Maybe; - activityId?: Maybe; -} - -export interface QueryFollowingArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -export interface QueryFollowerArgs { - userId: Scalars['Int']; - sort?: Maybe>>; -} - -export interface QueryThreadArgs { - id?: Maybe; - userId?: Maybe; - replyUserId?: Maybe; - subscribed?: Maybe; - categoryId?: Maybe; - mediaCategoryId?: Maybe; - search?: Maybe; - id_in?: Maybe>>; - sort?: Maybe>>; -} - -export interface QueryThreadCommentArgs { - id?: Maybe; - threadId?: Maybe; - userId?: Maybe; - sort?: Maybe>>; -} - -export interface QueryRecommendationArgs { - id?: Maybe; - mediaId?: Maybe; - mediaRecommendationId?: Maybe; - userId?: Maybe; - rating?: Maybe; - onList?: Maybe; - rating_greater?: Maybe; - rating_lesser?: Maybe; - sort?: Maybe>>; -} - -export interface QueryLikeArgs { - likeableId?: Maybe; - type?: Maybe; -} - -export interface QueryMarkdownArgs { - markdown: Scalars['String']; -} - -export interface QueryMediaTagUserArgs { - tagId?: Maybe; - mediaId?: Maybe; -} - -/** Media recommendation */ -export interface Recommendation { - readonly __typename?: 'Recommendation'; - /** The id of the recommendation */ - readonly id: Scalars['Int']; - /** Users rating of the recommendation */ - readonly rating?: Maybe; - /** The rating of the recommendation by currently authenticated user */ - readonly userRating?: Maybe; - /** The media the recommendation is from */ - readonly media?: Maybe; - /** The recommended media */ - readonly mediaRecommendation?: Maybe; - /** The user that first created the recommendation */ - readonly user?: Maybe; -} - -export interface RecommendationConnection { - readonly __typename?: 'RecommendationConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Recommendation connection edge */ -export interface RecommendationEdge { - readonly __typename?: 'RecommendationEdge'; - readonly node?: Maybe; -} - -/** Recommendation rating enums */ -export const enum RecommendationRating { - NoRating = 'NO_RATING', - RateUp = 'RATE_UP', - RateDown = 'RATE_DOWN' -} - -/** Recommendation sort enums */ -export const enum RecommendationSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Rating = 'RATING', - RatingDesc = 'RATING_DESC' -} - -/** Notification for when new media is added to the site */ -export interface RelatedMediaAdditionNotification { - readonly __typename?: 'RelatedMediaAdditionNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the new media */ - readonly mediaId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The associated media of the airing schedule */ - readonly media?: Maybe; -} - -export interface Report { - readonly __typename?: 'Report'; - readonly id: Scalars['Int']; - readonly reporter?: Maybe; - readonly reported?: Maybe; - readonly reason?: Maybe; - /** When the entry data was created */ - readonly createdAt?: Maybe; - readonly cleared?: Maybe; -} - -/** A Review that features in an anime or manga */ -export interface Review { - readonly __typename?: 'Review'; - /** The id of the review */ - readonly id: Scalars['Int']; - /** The id of the review's creator */ - readonly userId: Scalars['Int']; - /** The id of the review's media */ - readonly mediaId: Scalars['Int']; - /** For which type of media the review is for */ - readonly mediaType?: Maybe; - /** A short summary of the review */ - readonly summary?: Maybe; - /** The main review body text */ - readonly body?: Maybe; - /** The total user rating of the review */ - readonly rating?: Maybe; - /** The amount of user ratings of the review */ - readonly ratingAmount?: Maybe; - /** The rating of the review by currently authenticated user */ - readonly userRating?: Maybe; - /** The review score of the media */ - readonly score?: Maybe; - /** If the review is not yet publicly published and is only viewable by creator */ - readonly private?: Maybe; - /** The url for the review page on the AniList website */ - readonly siteUrl?: Maybe; - /** The time of the thread creation */ - readonly createdAt: Scalars['Int']; - /** The time of the thread last update */ - readonly updatedAt: Scalars['Int']; - /** The creator of the review */ - readonly user?: Maybe; - /** The media the review is of */ - readonly media?: Maybe; -} - -/** A Review that features in an anime or manga */ -export interface ReviewBodyArgs { - asHtml?: Maybe; -} - -export interface ReviewConnection { - readonly __typename?: 'ReviewConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Review connection edge */ -export interface ReviewEdge { - readonly __typename?: 'ReviewEdge'; - readonly node?: Maybe; -} - -/** Review rating enums */ -export const enum ReviewRating { - NoVote = 'NO_VOTE', - UpVote = 'UP_VOTE', - DownVote = 'DOWN_VOTE' -} - -/** Review sort enums */ -export const enum ReviewSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Score = 'SCORE', - ScoreDesc = 'SCORE_DESC', - Rating = 'RATING', - RatingDesc = 'RATING_DESC', - CreatedAt = 'CREATED_AT', - CreatedAtDesc = 'CREATED_AT_DESC', - UpdatedAt = 'UPDATED_AT', - UpdatedAtDesc = 'UPDATED_AT_DESC' -} - -/** Feed of mod edit activity */ -export interface RevisionHistory { - readonly __typename?: 'RevisionHistory'; - /** The id of the media */ - readonly id: Scalars['Int']; - /** The action taken on the objects */ - readonly action?: Maybe; - /** A JSON object of the fields that changed */ - readonly changes?: Maybe; - /** The user who made the edit to the object */ - readonly user?: Maybe; - /** The media the mod feed entry references */ - readonly media?: Maybe; - /** The character the mod feed entry references */ - readonly character?: Maybe; - /** The staff member the mod feed entry references */ - readonly staff?: Maybe; - /** The studio the mod feed entry references */ - readonly studio?: Maybe; - /** When the mod feed entry was created */ - readonly createdAt?: Maybe; -} - -/** Revision history actions */ -export const enum RevisionHistoryAction { - Create = 'CREATE', - Edit = 'EDIT' -} - -/** A user's list score distribution. */ -export interface ScoreDistribution { - readonly __typename?: 'ScoreDistribution'; - readonly score?: Maybe; - /** The amount of list entries with this score */ - readonly amount?: Maybe; -} - -/** Media list scoring type */ -export const enum ScoreFormat { - /** An integer from 0-100 */ - Point_100 = 'POINT_100', - /** A float from 0-10 with 1 decimal place */ - Point_10Decimal = 'POINT_10_DECIMAL', - /** An integer from 0-10 */ - Point_10 = 'POINT_10', - /** An integer from 0-5. Should be represented in Stars */ - Point_5 = 'POINT_5', - /** An integer from 0-3. Should be represented in Smileys. 0 => No Score, 1 => :(, 2 => :|, 3 => :) */ - Point_3 = 'POINT_3' -} - -export interface SiteStatistics { - readonly __typename?: 'SiteStatistics'; - readonly users?: Maybe; - readonly anime?: Maybe; - readonly manga?: Maybe; - readonly characters?: Maybe; - readonly staff?: Maybe; - readonly studios?: Maybe; - readonly reviews?: Maybe; -} - -export interface SiteStatisticsUsersArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsAnimeArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsMangaArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsCharactersArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsStaffArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsStudiosArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -export interface SiteStatisticsReviewsArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -/** Daily site statistics */ -export interface SiteTrend { - readonly __typename?: 'SiteTrend'; - /** The day the data was recorded (timestamp) */ - readonly date: Scalars['Int']; - readonly count: Scalars['Int']; - /** The change from yesterday */ - readonly change: Scalars['Int']; -} - -export interface SiteTrendConnection { - readonly __typename?: 'SiteTrendConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Site trend connection edge */ -export interface SiteTrendEdge { - readonly __typename?: 'SiteTrendEdge'; - readonly node?: Maybe; -} - -/** Site trend sort enums */ -export const enum SiteTrendSort { - Date = 'DATE', - DateDesc = 'DATE_DESC', - Count = 'COUNT', - CountDesc = 'COUNT_DESC', - Change = 'CHANGE', - ChangeDesc = 'CHANGE_DESC' -} - -/** Voice actors or production staff */ -export interface Staff { - readonly __typename?: 'Staff'; - /** The id of the staff member */ - readonly id: Scalars['Int']; - /** The names of the staff member */ - readonly name?: Maybe; - /** - * The primary language the staff member dub's in - * @deprecated Replaced with languageV2 - */ - readonly language?: Maybe; - /** The primary language of the staff member. Current values: Japanese, English, Korean, Italian, Spanish, Portuguese, French, German, Hebrew, Hungarian, Chinese, Arabic, Filipino, Catalan */ - readonly languageV2?: Maybe; - /** The staff images */ - readonly image?: Maybe; - /** A general description of the staff member */ - readonly description?: Maybe; - /** The person's primary occupations */ - readonly primaryOccupations?: Maybe>>; - /** The staff's gender. Usually Male, Female, or Non-binary but can be any string. */ - readonly gender?: Maybe; - readonly dateOfBirth?: Maybe; - readonly dateOfDeath?: Maybe; - /** The person's age in years */ - readonly age?: Maybe; - /** [startYear, endYear] (If the 2nd value is not present staff is still active) */ - readonly yearsActive?: Maybe>>; - /** The persons birthplace or hometown */ - readonly homeTown?: Maybe; - /** The persons blood type */ - readonly bloodType?: Maybe; - /** If the staff member is marked as favourite by the currently authenticated user */ - readonly isFavourite: Scalars['Boolean']; - /** If the staff member is blocked from being added to favourites */ - readonly isFavouriteBlocked: Scalars['Boolean']; - /** The url for the staff page on the AniList website */ - readonly siteUrl?: Maybe; - /** Media where the staff member has a production role */ - readonly staffMedia?: Maybe; - /** Characters voiced by the actor */ - readonly characters?: Maybe; - /** Media the actor voiced characters in. (Same data as characters with media as node instead of characters) */ - readonly characterMedia?: Maybe; - /** @deprecated No data available */ - readonly updatedAt?: Maybe; - /** Staff member that the submission is referencing */ - readonly staff?: Maybe; - /** Submitter for the submission */ - readonly submitter?: Maybe; - /** Status of the submission */ - readonly submissionStatus?: Maybe; - /** Inner details of submission status */ - readonly submissionNotes?: Maybe; - /** The amount of user's who have favourited the staff member */ - readonly favourites?: Maybe; - /** Notes for site moderators */ - readonly modNotes?: Maybe; -} - -/** Voice actors or production staff */ -export interface StaffDescriptionArgs { - asHtml?: Maybe; -} - -/** Voice actors or production staff */ -export interface StaffStaffMediaArgs { - sort?: Maybe>>; - type?: Maybe; - onList?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -/** Voice actors or production staff */ -export interface StaffCharactersArgs { - sort?: Maybe>>; - page?: Maybe; - perPage?: Maybe; -} - -/** Voice actors or production staff */ -export interface StaffCharacterMediaArgs { - sort?: Maybe>>; - onList?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -export interface StaffConnection { - readonly __typename?: 'StaffConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Staff connection edge */ -export interface StaffEdge { - readonly __typename?: 'StaffEdge'; - readonly node?: Maybe; - /** The id of the connection */ - readonly id?: Maybe; - /** The role of the staff member in the production of the media */ - readonly role?: Maybe; - /** The order the staff should be displayed from the users favourites */ - readonly favouriteOrder?: Maybe; -} - -export interface StaffImage { - readonly __typename?: 'StaffImage'; - /** The person's image of media at its largest size */ - readonly large?: Maybe; - /** The person's image of media at medium size */ - readonly medium?: Maybe; -} - -/** The primary language of the voice actor */ -export const enum StaffLanguage { - /** Japanese */ - Japanese = 'JAPANESE', - /** English */ - English = 'ENGLISH', - /** Korean */ - Korean = 'KOREAN', - /** Italian */ - Italian = 'ITALIAN', - /** Spanish */ - Spanish = 'SPANISH', - /** Portuguese */ - Portuguese = 'PORTUGUESE', - /** French */ - French = 'FRENCH', - /** German */ - German = 'GERMAN', - /** Hebrew */ - Hebrew = 'HEBREW', - /** Hungarian */ - Hungarian = 'HUNGARIAN' -} - -/** The names of the staff member */ -export interface StaffName { - readonly __typename?: 'StaffName'; - /** The person's given name */ - readonly first?: Maybe; - /** The person's middle name */ - readonly middle?: Maybe; - /** The person's surname */ - readonly last?: Maybe; - /** The person's first and last name */ - readonly full?: Maybe; - /** The person's full name in their native language */ - readonly native?: Maybe; - /** Other names the staff member might be referred to as (pen names) */ - readonly alternative?: Maybe>>; - /** The currently authenticated users preferred name language. Default romaji for non-authenticated */ - readonly userPreferred?: Maybe; -} - -/** The names of the staff member */ -export interface StaffNameInput { - /** The person's given name */ - readonly first?: Maybe; - /** The person's middle name */ - readonly middle?: Maybe; - /** The person's surname */ - readonly last?: Maybe; - /** The person's full name in their native language */ - readonly native?: Maybe; - /** Other names the character might be referred by */ - readonly alternative?: Maybe>>; -} - -/** Voice actor role for a character */ -export interface StaffRoleType { - readonly __typename?: 'StaffRoleType'; - /** The voice actors of the character */ - readonly voiceActor?: Maybe; - /** Notes regarding the VA's role for the character */ - readonly roleNotes?: Maybe; - /** Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. */ - readonly dubGroup?: Maybe; -} - -/** Staff sort enums */ -export const enum StaffSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Role = 'ROLE', - RoleDesc = 'ROLE_DESC', - Language = 'LANGUAGE', - LanguageDesc = 'LANGUAGE_DESC', - SearchMatch = 'SEARCH_MATCH', - Favourites = 'FAVOURITES', - FavouritesDesc = 'FAVOURITES_DESC', - /** Order manually decided by moderators */ - Relevance = 'RELEVANCE' -} - -/** User's staff statistics */ -export interface StaffStats { - readonly __typename?: 'StaffStats'; - readonly staff?: Maybe; - readonly amount?: Maybe; - readonly meanScore?: Maybe; - /** The amount of time in minutes the staff member has been watched by the user */ - readonly timeWatched?: Maybe; -} - -/** A submission for a staff that features in an anime or manga */ -export interface StaffSubmission { - readonly __typename?: 'StaffSubmission'; - /** The id of the submission */ - readonly id: Scalars['Int']; - /** Staff that the submission is referencing */ - readonly staff?: Maybe; - /** The staff submission changes */ - readonly submission?: Maybe; - /** Submitter for the submission */ - readonly submitter?: Maybe; - /** Status of the submission */ - readonly status?: Maybe; - /** Inner details of submission status */ - readonly notes?: Maybe; - readonly source?: Maybe; - readonly createdAt?: Maybe; -} - -/** The distribution of the watching/reading status of media or a user's list */ -export interface StatusDistribution { - readonly __typename?: 'StatusDistribution'; - /** The day the activity took place (Unix timestamp) */ - readonly status?: Maybe; - /** The amount of entries with this status */ - readonly amount?: Maybe; -} - -/** Animation or production company */ -export interface Studio { - readonly __typename?: 'Studio'; - /** The id of the studio */ - readonly id: Scalars['Int']; - /** The name of the studio */ - readonly name: Scalars['String']; - /** If the studio is an animation studio or a different kind of company */ - readonly isAnimationStudio: Scalars['Boolean']; - /** The media the studio has worked on */ - readonly media?: Maybe; - /** The url for the studio page on the AniList website */ - readonly siteUrl?: Maybe; - /** If the studio is marked as favourite by the currently authenticated user */ - readonly isFavourite: Scalars['Boolean']; - /** The amount of user's who have favourited the studio */ - readonly favourites?: Maybe; -} - -/** Animation or production company */ -export interface StudioMediaArgs { - sort?: Maybe>>; - isMain?: Maybe; - onList?: Maybe; - page?: Maybe; - perPage?: Maybe; -} - -export interface StudioConnection { - readonly __typename?: 'StudioConnection'; - readonly edges?: Maybe>>; - readonly nodes?: Maybe>>; - /** The pagination information */ - readonly pageInfo?: Maybe; -} - -/** Studio connection edge */ -export interface StudioEdge { - readonly __typename?: 'StudioEdge'; - readonly node?: Maybe; - /** The id of the connection */ - readonly id?: Maybe; - /** If the studio is the main animation studio of the anime */ - readonly isMain: Scalars['Boolean']; - /** The order the character should be displayed from the users favourites */ - readonly favouriteOrder?: Maybe; -} - -/** Studio sort enums */ -export const enum StudioSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Name = 'NAME', - NameDesc = 'NAME_DESC', - SearchMatch = 'SEARCH_MATCH', - Favourites = 'FAVOURITES', - FavouritesDesc = 'FAVOURITES_DESC' -} - -/** User's studio statistics */ -export interface StudioStats { - readonly __typename?: 'StudioStats'; - readonly studio?: Maybe; - readonly amount?: Maybe; - readonly meanScore?: Maybe; - /** The amount of time in minutes the studio's works have been watched by the user */ - readonly timeWatched?: Maybe; -} - -/** Submission sort enums */ -export const enum SubmissionSort { - Id = 'ID', - IdDesc = 'ID_DESC' -} - -/** Submission status */ -export const enum SubmissionStatus { - Pending = 'PENDING', - Rejected = 'REJECTED', - PartiallyAccepted = 'PARTIALLY_ACCEPTED', - Accepted = 'ACCEPTED' -} - -/** User's tag statistics */ -export interface TagStats { - readonly __typename?: 'TagStats'; - readonly tag?: Maybe; - readonly amount?: Maybe; - readonly meanScore?: Maybe; - /** The amount of time in minutes the tag has been watched by the user */ - readonly timeWatched?: Maybe; -} - -/** User text activity */ -export interface TextActivity { - readonly __typename?: 'TextActivity'; - /** The id of the activity */ - readonly id: Scalars['Int']; - /** The user id of the activity's creator */ - readonly userId?: Maybe; - /** The type of activity */ - readonly type?: Maybe; - /** The number of activity replies */ - readonly replyCount: Scalars['Int']; - /** The status text (Markdown) */ - readonly text?: Maybe; - /** The url for the activity page on the AniList website */ - readonly siteUrl?: Maybe; - /** If the activity is locked and can receive replies */ - readonly isLocked?: Maybe; - /** If the currently authenticated user is subscribed to the activity */ - readonly isSubscribed?: Maybe; - /** The amount of likes the activity has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the activity */ - readonly isLiked?: Maybe; - /** The time the activity was created at */ - readonly createdAt: Scalars['Int']; - /** The user who created the activity */ - readonly user?: Maybe; - /** The written replies to the activity */ - readonly replies?: Maybe>>; - /** The users who liked the activity */ - readonly likes?: Maybe>>; -} - -/** User text activity */ -export interface TextActivityTextArgs { - asHtml?: Maybe; -} - -/** Forum Thread */ -export interface Thread { - readonly __typename?: 'Thread'; - /** The id of the thread */ - readonly id: Scalars['Int']; - /** The title of the thread */ - readonly title?: Maybe; - /** The text body of the thread (Markdown) */ - readonly body?: Maybe; - /** The id of the thread owner user */ - readonly userId: Scalars['Int']; - /** The id of the user who most recently commented on the thread */ - readonly replyUserId?: Maybe; - /** The id of the most recent comment on the thread */ - readonly replyCommentId?: Maybe; - /** The number of comments on the thread */ - readonly replyCount?: Maybe; - /** The number of times users have viewed the thread */ - readonly viewCount?: Maybe; - /** If the thread is locked and can receive comments */ - readonly isLocked?: Maybe; - /** If the thread is stickied and should be displayed at the top of the page */ - readonly isSticky?: Maybe; - /** If the currently authenticated user is subscribed to the thread */ - readonly isSubscribed?: Maybe; - /** The amount of likes the thread has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the thread */ - readonly isLiked?: Maybe; - /** The time of the last reply */ - readonly repliedAt?: Maybe; - /** The time of the thread creation */ - readonly createdAt: Scalars['Int']; - /** The time of the thread last update */ - readonly updatedAt: Scalars['Int']; - /** The owner of the thread */ - readonly user?: Maybe; - /** The user to last reply to the thread */ - readonly replyUser?: Maybe; - /** The users who liked the thread */ - readonly likes?: Maybe>>; - /** The url for the thread page on the AniList website */ - readonly siteUrl?: Maybe; - /** The categories of the thread */ - readonly categories?: Maybe>>; - /** The media categories of the thread */ - readonly mediaCategories?: Maybe>>; -} - -/** Forum Thread */ -export interface ThreadBodyArgs { - asHtml?: Maybe; -} - -/** A forum thread category */ -export interface ThreadCategory { - readonly __typename?: 'ThreadCategory'; - /** The id of the category */ - readonly id: Scalars['Int']; - /** The name of the category */ - readonly name: Scalars['String']; -} - -/** Forum Thread Comment */ -export interface ThreadComment { - readonly __typename?: 'ThreadComment'; - /** The id of the comment */ - readonly id: Scalars['Int']; - /** The user id of the comment's owner */ - readonly userId?: Maybe; - /** The id of thread the comment belongs to */ - readonly threadId?: Maybe; - /** The text content of the comment (Markdown) */ - readonly comment?: Maybe; - /** The amount of likes the comment has */ - readonly likeCount: Scalars['Int']; - /** If the currently authenticated user liked the comment */ - readonly isLiked?: Maybe; - /** The url for the comment page on the AniList website */ - readonly siteUrl?: Maybe; - /** The time of the comments creation */ - readonly createdAt: Scalars['Int']; - /** The time of the comments last update */ - readonly updatedAt: Scalars['Int']; - /** The thread the comment belongs to */ - readonly thread?: Maybe; - /** The user who created the comment */ - readonly user?: Maybe; - /** The users who liked the comment */ - readonly likes?: Maybe>>; - /** The comment's child reply comments */ - readonly childComments?: Maybe; -} - -/** Forum Thread Comment */ -export interface ThreadCommentCommentArgs { - asHtml?: Maybe; -} - -/** Notification for when a thread comment is liked */ -export interface ThreadCommentLikeNotification { - readonly __typename?: 'ThreadCommentLikeNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who liked to the activity */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the activity which was liked */ - readonly commentId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The thread that the relevant comment belongs to */ - readonly thread?: Maybe; - /** The thread comment that was liked */ - readonly comment?: Maybe; - /** The user who liked the activity */ - readonly user?: Maybe; -} - -/** Notification for when authenticated user is @ mentioned in a forum thread comment */ -export interface ThreadCommentMentionNotification { - readonly __typename?: 'ThreadCommentMentionNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who mentioned the authenticated user */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the comment where mentioned */ - readonly commentId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The thread that the relevant comment belongs to */ - readonly thread?: Maybe; - /** The thread comment that included the @ mention */ - readonly comment?: Maybe; - /** The user who mentioned the authenticated user */ - readonly user?: Maybe; -} - -/** Notification for when a user replies to your forum thread comment */ -export interface ThreadCommentReplyNotification { - readonly __typename?: 'ThreadCommentReplyNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who create the comment reply */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the reply comment */ - readonly commentId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The thread that the relevant comment belongs to */ - readonly thread?: Maybe; - /** The reply thread comment */ - readonly comment?: Maybe; - /** The user who replied to the activity */ - readonly user?: Maybe; -} - -/** Thread comments sort enums */ -export const enum ThreadCommentSort { - Id = 'ID', - IdDesc = 'ID_DESC' -} - -/** Notification for when a user replies to a subscribed forum thread */ -export interface ThreadCommentSubscribedNotification { - readonly __typename?: 'ThreadCommentSubscribedNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who commented on the thread */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the new comment in the subscribed thread */ - readonly commentId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The thread that the relevant comment belongs to */ - readonly thread?: Maybe; - /** The reply thread comment */ - readonly comment?: Maybe; - /** The user who replied to the subscribed thread */ - readonly user?: Maybe; -} - -/** Notification for when a thread is liked */ -export interface ThreadLikeNotification { - readonly __typename?: 'ThreadLikeNotification'; - /** The id of the Notification */ - readonly id: Scalars['Int']; - /** The id of the user who liked to the activity */ - readonly userId: Scalars['Int']; - /** The type of notification */ - readonly type?: Maybe; - /** The id of the thread which was liked */ - readonly threadId: Scalars['Int']; - /** The notification context text */ - readonly context?: Maybe; - /** The time the notification was created at */ - readonly createdAt?: Maybe; - /** The thread that the relevant comment belongs to */ - readonly thread?: Maybe; - /** The liked thread comment */ - readonly comment?: Maybe; - /** The user who liked the activity */ - readonly user?: Maybe; -} - -/** Thread sort enums */ -export const enum ThreadSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Title = 'TITLE', - TitleDesc = 'TITLE_DESC', - CreatedAt = 'CREATED_AT', - CreatedAtDesc = 'CREATED_AT_DESC', - UpdatedAt = 'UPDATED_AT', - UpdatedAtDesc = 'UPDATED_AT_DESC', - RepliedAt = 'REPLIED_AT', - RepliedAtDesc = 'REPLIED_AT_DESC', - ReplyCount = 'REPLY_COUNT', - ReplyCountDesc = 'REPLY_COUNT_DESC', - ViewCount = 'VIEW_COUNT', - ViewCountDesc = 'VIEW_COUNT_DESC', - IsSticky = 'IS_STICKY', - SearchMatch = 'SEARCH_MATCH' -} - -/** A user */ -export interface User { - readonly __typename?: 'User'; - /** The id of the user */ - readonly id: Scalars['Int']; - /** The name of the user */ - readonly name: Scalars['String']; - /** The bio written by user (Markdown) */ - readonly about?: Maybe; - /** The user's avatar images */ - readonly avatar?: Maybe; - /** The user's banner images */ - readonly bannerImage?: Maybe; - /** If the authenticated user if following this user */ - readonly isFollowing?: Maybe; - /** If this user if following the authenticated user */ - readonly isFollower?: Maybe; - /** If the user is blocked by the authenticated user */ - readonly isBlocked?: Maybe; - readonly bans?: Maybe; - /** The user's general options */ - readonly options?: Maybe; - /** The user's media list options */ - readonly mediaListOptions?: Maybe; - /** The users favourites */ - readonly favourites?: Maybe; - /** The users anime & manga list statistics */ - readonly statistics?: Maybe; - /** The number of unread notifications the user has */ - readonly unreadNotificationCount?: Maybe; - /** The url for the user page on the AniList website */ - readonly siteUrl?: Maybe; - /** The donation tier of the user */ - readonly donatorTier?: Maybe; - /** Custom donation badge text */ - readonly donatorBadge?: Maybe; - /** The user's moderator roles if they are a site moderator */ - readonly moderatorRoles?: Maybe>>; - /** When the user's account was created. (Does not exist for accounts created before 2020) */ - readonly createdAt?: Maybe; - /** When the user's data was last updated */ - readonly updatedAt?: Maybe; - /** - * The user's statistics - * @deprecated Deprecated. Replaced with statistics field. - */ - readonly stats?: Maybe; - /** - * If the user is a moderator or data moderator - * @deprecated Deprecated. Replaced with moderatorRoles field. - */ - readonly moderatorStatus?: Maybe; - /** The user's previously used names. */ - readonly previousNames?: Maybe>>; -} - -/** A user */ -export interface UserAboutArgs { - asHtml?: Maybe; -} - -/** A user */ -export interface UserFavouritesArgs { - page?: Maybe; -} - -/** A user's activity history stats. */ -export interface UserActivityHistory { - readonly __typename?: 'UserActivityHistory'; - /** The day the activity took place (Unix timestamp) */ - readonly date?: Maybe; - /** The amount of activity on the day */ - readonly amount?: Maybe; - /** The level of activity represented on a 1-10 scale */ - readonly level?: Maybe; -} - -/** A user's avatars */ -export interface UserAvatar { - readonly __typename?: 'UserAvatar'; - /** The avatar of user at its largest size */ - readonly large?: Maybe; - /** The avatar of user at medium size */ - readonly medium?: Maybe; -} - -export interface UserCountryStatistic { - readonly __typename?: 'UserCountryStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly country?: Maybe; -} - -export interface UserFormatStatistic { - readonly __typename?: 'UserFormatStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly format?: Maybe; -} - -export interface UserGenreStatistic { - readonly __typename?: 'UserGenreStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly genre?: Maybe; -} - -export interface UserLengthStatistic { - readonly __typename?: 'UserLengthStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly length?: Maybe; -} - -/** User data for moderators */ -export interface UserModData { - readonly __typename?: 'UserModData'; - readonly alts?: Maybe>>; - readonly bans?: Maybe; - readonly ip?: Maybe; - readonly counts?: Maybe; - readonly privacy?: Maybe; - readonly email?: Maybe; -} - -/** A user's general options */ -export interface UserOptions { - readonly __typename?: 'UserOptions'; - /** The language the user wants to see media titles in */ - readonly titleLanguage?: Maybe; - /** Whether the user has enabled viewing of 18+ content */ - readonly displayAdultContent?: Maybe; - /** Whether the user receives notifications when a show they are watching aires */ - readonly airingNotifications?: Maybe; - /** Profile highlight color (blue, purple, pink, orange, red, green, gray) */ - readonly profileColor?: Maybe; - /** Notification options */ - readonly notificationOptions?: Maybe>>; - /** The user's timezone offset (Auth user only) */ - readonly timezone?: Maybe; - /** Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. */ - readonly activityMergeTime?: Maybe; - /** The language the user wants to see staff and character names in */ - readonly staffNameLanguage?: Maybe; -} - -/** A user's previous name */ -export interface UserPreviousName { - readonly __typename?: 'UserPreviousName'; - /** A previous name of the user. */ - readonly name?: Maybe; - /** When the user first changed from this name. */ - readonly createdAt?: Maybe; - /** When the user most recently changed from this name. */ - readonly updatedAt?: Maybe; -} - -export interface UserReleaseYearStatistic { - readonly __typename?: 'UserReleaseYearStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly releaseYear?: Maybe; -} - -export interface UserScoreStatistic { - readonly __typename?: 'UserScoreStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly score?: Maybe; -} - -/** User sort enums */ -export const enum UserSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Username = 'USERNAME', - UsernameDesc = 'USERNAME_DESC', - WatchedTime = 'WATCHED_TIME', - WatchedTimeDesc = 'WATCHED_TIME_DESC', - ChaptersRead = 'CHAPTERS_READ', - ChaptersReadDesc = 'CHAPTERS_READ_DESC', - SearchMatch = 'SEARCH_MATCH' -} - -/** The language the user wants to see staff and character names in */ -export const enum UserStaffNameLanguage { - /** The romanization of the staff or character's native name, with western name ordering */ - RomajiWestern = 'ROMAJI_WESTERN', - /** The romanization of the staff or character's native name */ - Romaji = 'ROMAJI', - /** The staff or character's name in their native language */ - Native = 'NATIVE' -} - -export interface UserStaffStatistic { - readonly __typename?: 'UserStaffStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly staff?: Maybe; -} - -export interface UserStartYearStatistic { - readonly __typename?: 'UserStartYearStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly startYear?: Maybe; -} - -export interface UserStatisticTypes { - readonly __typename?: 'UserStatisticTypes'; - readonly anime?: Maybe; - readonly manga?: Maybe; -} - -export interface UserStatistics { - readonly __typename?: 'UserStatistics'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly standardDeviation: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly episodesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly volumesRead: Scalars['Int']; - readonly formats?: Maybe>>; - readonly statuses?: Maybe>>; - readonly scores?: Maybe>>; - readonly lengths?: Maybe>>; - readonly releaseYears?: Maybe>>; - readonly startYears?: Maybe>>; - readonly genres?: Maybe>>; - readonly tags?: Maybe>>; - readonly countries?: Maybe>>; - readonly voiceActors?: Maybe>>; - readonly staff?: Maybe>>; - readonly studios?: Maybe>>; -} - -export interface UserStatisticsFormatsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsStatusesArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsScoresArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsLengthsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsReleaseYearsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsStartYearsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsGenresArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsTagsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsCountriesArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsVoiceActorsArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsStaffArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -export interface UserStatisticsStudiosArgs { - limit?: Maybe; - sort?: Maybe>>; -} - -/** User statistics sort enum */ -export const enum UserStatisticsSort { - Id = 'ID', - IdDesc = 'ID_DESC', - Count = 'COUNT', - CountDesc = 'COUNT_DESC', - Progress = 'PROGRESS', - ProgressDesc = 'PROGRESS_DESC', - MeanScore = 'MEAN_SCORE', - MeanScoreDesc = 'MEAN_SCORE_DESC' -} - -/** A user's statistics */ -export interface UserStats { - readonly __typename?: 'UserStats'; - /** The amount of anime the user has watched in minutes */ - readonly watchedTime?: Maybe; - /** The amount of manga chapters the user has read */ - readonly chaptersRead?: Maybe; - readonly activityHistory?: Maybe>>; - readonly animeStatusDistribution?: Maybe>>; - readonly mangaStatusDistribution?: Maybe>>; - readonly animeScoreDistribution?: Maybe>>; - readonly mangaScoreDistribution?: Maybe>>; - readonly animeListScores?: Maybe; - readonly mangaListScores?: Maybe; - readonly favouredGenresOverview?: Maybe>>; - readonly favouredGenres?: Maybe>>; - readonly favouredTags?: Maybe>>; - readonly favouredActors?: Maybe>>; - readonly favouredStaff?: Maybe>>; - readonly favouredStudios?: Maybe>>; - readonly favouredYears?: Maybe>>; - readonly favouredFormats?: Maybe>>; -} - -export interface UserStatusStatistic { - readonly __typename?: 'UserStatusStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly status?: Maybe; -} - -export interface UserStudioStatistic { - readonly __typename?: 'UserStudioStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly studio?: Maybe; -} - -export interface UserTagStatistic { - readonly __typename?: 'UserTagStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly tag?: Maybe; -} - -/** The language the user wants to see media titles in */ -export const enum UserTitleLanguage { - /** The romanization of the native language title */ - Romaji = 'ROMAJI', - /** The official english title */ - English = 'ENGLISH', - /** Official title in it's native language */ - Native = 'NATIVE', - /** The romanization of the native language title, stylised by media creator */ - RomajiStylised = 'ROMAJI_STYLISED', - /** The official english title, stylised by media creator */ - EnglishStylised = 'ENGLISH_STYLISED', - /** Official title in it's native language, stylised by media creator */ - NativeStylised = 'NATIVE_STYLISED' -} - -export interface UserVoiceActorStatistic { - readonly __typename?: 'UserVoiceActorStatistic'; - readonly count: Scalars['Int']; - readonly meanScore: Scalars['Float']; - readonly minutesWatched: Scalars['Int']; - readonly chaptersRead: Scalars['Int']; - readonly mediaIds: ReadonlyArray>; - readonly voiceActor?: Maybe; - readonly characterIds: ReadonlyArray>; -} - -/** User's year statistics */ -export interface YearStats { - readonly __typename?: 'YearStats'; - readonly year?: Maybe; - readonly amount?: Maybe; - readonly meanScore?: Maybe; -} - -export type ResolverTypeWrapper = Promise | T; - -export interface ResolverWithResolve { - resolve: ResolverFn; -} - -export interface LegacyStitchingResolver { - fragment: string; - resolve: ResolverFn; -} - -export interface NewStitchingResolver { - selectionSet: string; - resolve: ResolverFn; -} -export type StitchingResolver = - | LegacyStitchingResolver - | NewStitchingResolver; -export type Resolver = - | ResolverFn - | ResolverWithResolve - | StitchingResolver; - -export type ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => Promise | TResult; - -export type SubscriptionSubscribeFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => AsyncIterator | Promise>; - -export type SubscriptionResolveFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => TResult | Promise; - -export interface SubscriptionSubscriberObject { - subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; - resolve?: SubscriptionResolveFn; -} - -export interface SubscriptionResolverObject { - subscribe: SubscriptionSubscribeFn; - resolve: SubscriptionResolveFn; -} - -export type SubscriptionObject = - | SubscriptionSubscriberObject - | SubscriptionResolverObject; - -export type SubscriptionResolver = - | ((...args: any[]) => SubscriptionObject) - | SubscriptionObject; - -export type TypeResolveFn = ( - parent: TParent, - context: TContext, - info: GraphQLResolveInfo -) => Maybe | Promise>; - -export type IsTypeOfResolverFn = ( - obj: T, - context: TContext, - info: GraphQLResolveInfo -) => boolean | Promise; - -export type NextResolverFn = () => Promise; - -export type DirectiveResolverFn = ( - next: NextResolverFn, - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => TResult | Promise; - -/** Mapping between all available schema types and the resolvers types */ -export interface ResolversTypes { - ActivityLikeNotification: ResolverTypeWrapper & { activity?: Maybe }>; - Int: ResolverTypeWrapper; - String: ResolverTypeWrapper; - ActivityMentionNotification: ResolverTypeWrapper< - Omit & { activity?: Maybe } - >; - ActivityMessageNotification: ResolverTypeWrapper; - ActivityReply: ResolverTypeWrapper; - Boolean: ResolverTypeWrapper; - ActivityReplyLikeNotification: ResolverTypeWrapper< - Omit & { activity?: Maybe } - >; - ActivityReplyNotification: ResolverTypeWrapper< - Omit & { activity?: Maybe } - >; - ActivityReplySubscribedNotification: ResolverTypeWrapper< - Omit & { activity?: Maybe } - >; - ActivitySort: ActivitySort; - ActivityType: ActivityType; - ActivityUnion: ResolversTypes['TextActivity'] | ResolversTypes['ListActivity'] | ResolversTypes['MessageActivity']; - AiringNotification: ResolverTypeWrapper; - AiringProgression: ResolverTypeWrapper; - Float: ResolverTypeWrapper; - AiringSchedule: ResolverTypeWrapper; - AiringScheduleConnection: ResolverTypeWrapper; - AiringScheduleEdge: ResolverTypeWrapper; - AiringScheduleInput: AiringScheduleInput; - AiringSort: AiringSort; - AniChartHighlightInput: AniChartHighlightInput; - AniChartUser: ResolverTypeWrapper; - Character: ResolverTypeWrapper; - CharacterConnection: ResolverTypeWrapper; - CharacterEdge: ResolverTypeWrapper; - CharacterImage: ResolverTypeWrapper; - CharacterName: ResolverTypeWrapper; - CharacterNameInput: CharacterNameInput; - CharacterRole: CharacterRole; - CharacterSort: CharacterSort; - CharacterSubmission: ResolverTypeWrapper; - CharacterSubmissionConnection: ResolverTypeWrapper; - CharacterSubmissionEdge: ResolverTypeWrapper; - CountryCode: ResolverTypeWrapper; - Deleted: ResolverTypeWrapper; - Favourites: ResolverTypeWrapper; - FollowingNotification: ResolverTypeWrapper; - FormatStats: ResolverTypeWrapper; - FuzzyDate: ResolverTypeWrapper; - FuzzyDateInput: FuzzyDateInput; - FuzzyDateInt: ResolverTypeWrapper; - GenreStats: ResolverTypeWrapper; - InternalPage: ResolverTypeWrapper< - Omit & { - notifications?: Maybe>>; - activities?: Maybe>>; - } - >; - Json: ResolverTypeWrapper; - LikeableType: LikeableType; - LikeableUnion: - | ResolversTypes['ListActivity'] - | ResolversTypes['TextActivity'] - | ResolversTypes['MessageActivity'] - | ResolversTypes['ActivityReply'] - | ResolversTypes['Thread'] - | ResolversTypes['ThreadComment']; - ListActivity: ResolverTypeWrapper; - ListScoreStats: ResolverTypeWrapper; - Media: ResolverTypeWrapper; - MediaCharacter: ResolverTypeWrapper; - MediaConnection: ResolverTypeWrapper; - MediaCoverImage: ResolverTypeWrapper; - MediaEdge: ResolverTypeWrapper; - MediaExternalLink: ResolverTypeWrapper; - MediaExternalLinkInput: MediaExternalLinkInput; - MediaFormat: MediaFormat; - MediaList: ResolverTypeWrapper; - MediaListCollection: ResolverTypeWrapper; - MediaListGroup: ResolverTypeWrapper; - MediaListOptions: ResolverTypeWrapper; - MediaListOptionsInput: MediaListOptionsInput; - MediaListSort: MediaListSort; - MediaListStatus: MediaListStatus; - MediaListTypeOptions: ResolverTypeWrapper; - MediaRank: ResolverTypeWrapper; - MediaRankType: MediaRankType; - MediaRelation: MediaRelation; - MediaSeason: MediaSeason; - MediaSort: MediaSort; - MediaSource: MediaSource; - MediaStats: ResolverTypeWrapper; - MediaStatus: MediaStatus; - MediaStreamingEpisode: ResolverTypeWrapper; - MediaSubmission: ResolverTypeWrapper; - MediaSubmissionComparison: ResolverTypeWrapper; - MediaSubmissionEdge: ResolverTypeWrapper; - MediaTag: ResolverTypeWrapper; - MediaTitle: ResolverTypeWrapper; - MediaTitleInput: MediaTitleInput; - MediaTrailer: ResolverTypeWrapper; - MediaTrend: ResolverTypeWrapper; - MediaTrendConnection: ResolverTypeWrapper; - MediaTrendEdge: ResolverTypeWrapper; - MediaTrendSort: MediaTrendSort; - MediaType: MediaType; - MessageActivity: ResolverTypeWrapper; - ModAction: ResolverTypeWrapper; - ModActionType: ModActionType; - ModRole: ModRole; - Mutation: ResolverTypeWrapper; - NotificationOption: ResolverTypeWrapper; - NotificationOptionInput: NotificationOptionInput; - NotificationType: NotificationType; - NotificationUnion: - | ResolversTypes['AiringNotification'] - | ResolversTypes['FollowingNotification'] - | ResolversTypes['ActivityMessageNotification'] - | ResolversTypes['ActivityMentionNotification'] - | ResolversTypes['ActivityReplyNotification'] - | ResolversTypes['ActivityReplySubscribedNotification'] - | ResolversTypes['ActivityLikeNotification'] - | ResolversTypes['ActivityReplyLikeNotification'] - | ResolversTypes['ThreadCommentMentionNotification'] - | ResolversTypes['ThreadCommentReplyNotification'] - | ResolversTypes['ThreadCommentSubscribedNotification'] - | ResolversTypes['ThreadCommentLikeNotification'] - | ResolversTypes['ThreadLikeNotification'] - | ResolversTypes['RelatedMediaAdditionNotification']; - Page: ResolverTypeWrapper< - Omit & { - notifications?: Maybe>>; - activities?: Maybe>>; - } - >; - PageInfo: ResolverTypeWrapper; - ParsedMarkdown: ResolverTypeWrapper; - Query: ResolverTypeWrapper; - Recommendation: ResolverTypeWrapper; - RecommendationConnection: ResolverTypeWrapper; - RecommendationEdge: ResolverTypeWrapper; - RecommendationRating: RecommendationRating; - RecommendationSort: RecommendationSort; - RelatedMediaAdditionNotification: ResolverTypeWrapper; - Report: ResolverTypeWrapper; - Review: ResolverTypeWrapper; - ReviewConnection: ResolverTypeWrapper; - ReviewEdge: ResolverTypeWrapper; - ReviewRating: ReviewRating; - ReviewSort: ReviewSort; - RevisionHistory: ResolverTypeWrapper; - RevisionHistoryAction: RevisionHistoryAction; - ScoreDistribution: ResolverTypeWrapper; - ScoreFormat: ScoreFormat; - SiteStatistics: ResolverTypeWrapper; - SiteTrend: ResolverTypeWrapper; - SiteTrendConnection: ResolverTypeWrapper; - SiteTrendEdge: ResolverTypeWrapper; - SiteTrendSort: SiteTrendSort; - Staff: ResolverTypeWrapper; - StaffConnection: ResolverTypeWrapper; - StaffEdge: ResolverTypeWrapper; - StaffImage: ResolverTypeWrapper; - StaffLanguage: StaffLanguage; - StaffName: ResolverTypeWrapper; - StaffNameInput: StaffNameInput; - StaffRoleType: ResolverTypeWrapper; - StaffSort: StaffSort; - StaffStats: ResolverTypeWrapper; - StaffSubmission: ResolverTypeWrapper; - StatusDistribution: ResolverTypeWrapper; - Studio: ResolverTypeWrapper; - StudioConnection: ResolverTypeWrapper; - StudioEdge: ResolverTypeWrapper; - StudioSort: StudioSort; - StudioStats: ResolverTypeWrapper; - SubmissionSort: SubmissionSort; - SubmissionStatus: SubmissionStatus; - TagStats: ResolverTypeWrapper; - TextActivity: ResolverTypeWrapper; - Thread: ResolverTypeWrapper; - ThreadCategory: ResolverTypeWrapper; - ThreadComment: ResolverTypeWrapper; - ThreadCommentLikeNotification: ResolverTypeWrapper; - ThreadCommentMentionNotification: ResolverTypeWrapper; - ThreadCommentReplyNotification: ResolverTypeWrapper; - ThreadCommentSort: ThreadCommentSort; - ThreadCommentSubscribedNotification: ResolverTypeWrapper; - ThreadLikeNotification: ResolverTypeWrapper; - ThreadSort: ThreadSort; - User: ResolverTypeWrapper; - UserActivityHistory: ResolverTypeWrapper; - UserAvatar: ResolverTypeWrapper; - UserCountryStatistic: ResolverTypeWrapper; - UserFormatStatistic: ResolverTypeWrapper; - UserGenreStatistic: ResolverTypeWrapper; - UserLengthStatistic: ResolverTypeWrapper; - UserModData: ResolverTypeWrapper; - UserOptions: ResolverTypeWrapper; - UserPreviousName: ResolverTypeWrapper; - UserReleaseYearStatistic: ResolverTypeWrapper; - UserScoreStatistic: ResolverTypeWrapper; - UserSort: UserSort; - UserStaffNameLanguage: UserStaffNameLanguage; - UserStaffStatistic: ResolverTypeWrapper; - UserStartYearStatistic: ResolverTypeWrapper; - UserStatisticTypes: ResolverTypeWrapper; - UserStatistics: ResolverTypeWrapper; - UserStatisticsSort: UserStatisticsSort; - UserStats: ResolverTypeWrapper; - UserStatusStatistic: ResolverTypeWrapper; - UserStudioStatistic: ResolverTypeWrapper; - UserTagStatistic: ResolverTypeWrapper; - UserTitleLanguage: UserTitleLanguage; - UserVoiceActorStatistic: ResolverTypeWrapper; - YearStats: ResolverTypeWrapper; -} - -/** Mapping between all available schema types and the resolvers parents */ -export interface ResolversParentTypes { - ActivityLikeNotification: Omit & { activity?: Maybe }; - Int: Scalars['Int']; - String: Scalars['String']; - ActivityMentionNotification: Omit & { activity?: Maybe }; - ActivityMessageNotification: ActivityMessageNotification; - ActivityReply: ActivityReply; - Boolean: Scalars['Boolean']; - ActivityReplyLikeNotification: Omit & { activity?: Maybe }; - ActivityReplyNotification: Omit & { activity?: Maybe }; - ActivityReplySubscribedNotification: Omit & { - activity?: Maybe; - }; - ActivityUnion: ResolversParentTypes['TextActivity'] | ResolversParentTypes['ListActivity'] | ResolversParentTypes['MessageActivity']; - AiringNotification: AiringNotification; - AiringProgression: AiringProgression; - Float: Scalars['Float']; - AiringSchedule: AiringSchedule; - AiringScheduleConnection: AiringScheduleConnection; - AiringScheduleEdge: AiringScheduleEdge; - AiringScheduleInput: AiringScheduleInput; - AniChartHighlightInput: AniChartHighlightInput; - AniChartUser: AniChartUser; - Character: Character; - CharacterConnection: CharacterConnection; - CharacterEdge: CharacterEdge; - CharacterImage: CharacterImage; - CharacterName: CharacterName; - CharacterNameInput: CharacterNameInput; - CharacterSubmission: CharacterSubmission; - CharacterSubmissionConnection: CharacterSubmissionConnection; - CharacterSubmissionEdge: CharacterSubmissionEdge; - CountryCode: Scalars['CountryCode']; - Deleted: Deleted; - Favourites: Favourites; - FollowingNotification: FollowingNotification; - FormatStats: FormatStats; - FuzzyDate: FuzzyDate; - FuzzyDateInput: FuzzyDateInput; - FuzzyDateInt: Scalars['FuzzyDateInt']; - GenreStats: GenreStats; - InternalPage: Omit & { - notifications?: Maybe>>; - activities?: Maybe>>; - }; - Json: Scalars['Json']; - LikeableUnion: - | ResolversParentTypes['ListActivity'] - | ResolversParentTypes['TextActivity'] - | ResolversParentTypes['MessageActivity'] - | ResolversParentTypes['ActivityReply'] - | ResolversParentTypes['Thread'] - | ResolversParentTypes['ThreadComment']; - ListActivity: ListActivity; - ListScoreStats: ListScoreStats; - Media: Media; - MediaCharacter: MediaCharacter; - MediaConnection: MediaConnection; - MediaCoverImage: MediaCoverImage; - MediaEdge: MediaEdge; - MediaExternalLink: MediaExternalLink; - MediaExternalLinkInput: MediaExternalLinkInput; - MediaList: MediaList; - MediaListCollection: MediaListCollection; - MediaListGroup: MediaListGroup; - MediaListOptions: MediaListOptions; - MediaListOptionsInput: MediaListOptionsInput; - MediaListTypeOptions: MediaListTypeOptions; - MediaRank: MediaRank; - MediaStats: MediaStats; - MediaStreamingEpisode: MediaStreamingEpisode; - MediaSubmission: MediaSubmission; - MediaSubmissionComparison: MediaSubmissionComparison; - MediaSubmissionEdge: MediaSubmissionEdge; - MediaTag: MediaTag; - MediaTitle: MediaTitle; - MediaTitleInput: MediaTitleInput; - MediaTrailer: MediaTrailer; - MediaTrend: MediaTrend; - MediaTrendConnection: MediaTrendConnection; - MediaTrendEdge: MediaTrendEdge; - MessageActivity: MessageActivity; - ModAction: ModAction; - Mutation: NonNullObject; - NotificationOption: NotificationOption; - NotificationOptionInput: NotificationOptionInput; - NotificationUnion: - | ResolversParentTypes['AiringNotification'] - | ResolversParentTypes['FollowingNotification'] - | ResolversParentTypes['ActivityMessageNotification'] - | ResolversParentTypes['ActivityMentionNotification'] - | ResolversParentTypes['ActivityReplyNotification'] - | ResolversParentTypes['ActivityReplySubscribedNotification'] - | ResolversParentTypes['ActivityLikeNotification'] - | ResolversParentTypes['ActivityReplyLikeNotification'] - | ResolversParentTypes['ThreadCommentMentionNotification'] - | ResolversParentTypes['ThreadCommentReplyNotification'] - | ResolversParentTypes['ThreadCommentSubscribedNotification'] - | ResolversParentTypes['ThreadCommentLikeNotification'] - | ResolversParentTypes['ThreadLikeNotification'] - | ResolversParentTypes['RelatedMediaAdditionNotification']; - Page: Omit & { - notifications?: Maybe>>; - activities?: Maybe>>; - }; - PageInfo: PageInfo; - ParsedMarkdown: ParsedMarkdown; - Query: NonNullObject; - Recommendation: Recommendation; - RecommendationConnection: RecommendationConnection; - RecommendationEdge: RecommendationEdge; - RelatedMediaAdditionNotification: RelatedMediaAdditionNotification; - Report: Report; - Review: Review; - ReviewConnection: ReviewConnection; - ReviewEdge: ReviewEdge; - RevisionHistory: RevisionHistory; - ScoreDistribution: ScoreDistribution; - SiteStatistics: SiteStatistics; - SiteTrend: SiteTrend; - SiteTrendConnection: SiteTrendConnection; - SiteTrendEdge: SiteTrendEdge; - Staff: Staff; - StaffConnection: StaffConnection; - StaffEdge: StaffEdge; - StaffImage: StaffImage; - StaffName: StaffName; - StaffNameInput: StaffNameInput; - StaffRoleType: StaffRoleType; - StaffStats: StaffStats; - StaffSubmission: StaffSubmission; - StatusDistribution: StatusDistribution; - Studio: Studio; - StudioConnection: StudioConnection; - StudioEdge: StudioEdge; - StudioStats: StudioStats; - TagStats: TagStats; - TextActivity: TextActivity; - Thread: Thread; - ThreadCategory: ThreadCategory; - ThreadComment: ThreadComment; - ThreadCommentLikeNotification: ThreadCommentLikeNotification; - ThreadCommentMentionNotification: ThreadCommentMentionNotification; - ThreadCommentReplyNotification: ThreadCommentReplyNotification; - ThreadCommentSubscribedNotification: ThreadCommentSubscribedNotification; - ThreadLikeNotification: ThreadLikeNotification; - User: User; - UserActivityHistory: UserActivityHistory; - UserAvatar: UserAvatar; - UserCountryStatistic: UserCountryStatistic; - UserFormatStatistic: UserFormatStatistic; - UserGenreStatistic: UserGenreStatistic; - UserLengthStatistic: UserLengthStatistic; - UserModData: UserModData; - UserOptions: UserOptions; - UserPreviousName: UserPreviousName; - UserReleaseYearStatistic: UserReleaseYearStatistic; - UserScoreStatistic: UserScoreStatistic; - UserStaffStatistic: UserStaffStatistic; - UserStartYearStatistic: UserStartYearStatistic; - UserStatisticTypes: UserStatisticTypes; - UserStatistics: UserStatistics; - UserStats: UserStats; - UserStatusStatistic: UserStatusStatistic; - UserStudioStatistic: UserStudioStatistic; - UserTagStatistic: UserTagStatistic; - UserVoiceActorStatistic: UserVoiceActorStatistic; - YearStats: YearStats; -} - -export interface ActivityLikeNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityLikeNotification'] = ResolversParentTypes['ActivityLikeNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - activity?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityMentionNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityMentionNotification'] = ResolversParentTypes['ActivityMentionNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - activity?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityMessageNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityMessageNotification'] = ResolversParentTypes['ActivityMessageNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - message?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityReplyResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityReply'] = ResolversParentTypes['ActivityReply'] -> { - id?: Resolver; - userId?: Resolver, ParentType, ContextType>; - activityId?: Resolver, ParentType, ContextType>; - text?: Resolver, ParentType, ContextType, RequireFields>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - user?: Resolver, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityReplyLikeNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityReplyLikeNotification'] = ResolversParentTypes['ActivityReplyLikeNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - activity?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityReplyNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityReplyNotification'] = ResolversParentTypes['ActivityReplyNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - activity?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityReplySubscribedNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityReplySubscribedNotification'] = ResolversParentTypes['ActivityReplySubscribedNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - activityId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - activity?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ActivityUnionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ActivityUnion'] = ResolversParentTypes['ActivityUnion'] -> { - __resolveType: TypeResolveFn<'TextActivity' | 'ListActivity' | 'MessageActivity', ParentType, ContextType>; -} - -export interface AiringNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AiringNotification'] = ResolversParentTypes['AiringNotification'] -> { - id?: Resolver; - type?: Resolver, ParentType, ContextType>; - animeId?: Resolver; - episode?: Resolver; - contexts?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface AiringProgressionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AiringProgression'] = ResolversParentTypes['AiringProgression'] -> { - episode?: Resolver, ParentType, ContextType>; - score?: Resolver, ParentType, ContextType>; - watching?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface AiringScheduleResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AiringSchedule'] = ResolversParentTypes['AiringSchedule'] -> { - id?: Resolver; - airingAt?: Resolver; - timeUntilAiring?: Resolver; - episode?: Resolver; - mediaId?: Resolver; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface AiringScheduleConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AiringScheduleConnection'] = ResolversParentTypes['AiringScheduleConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface AiringScheduleEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AiringScheduleEdge'] = ResolversParentTypes['AiringScheduleEdge'] -> { - node?: Resolver, ParentType, ContextType>; - id?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface AniChartUserResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['AniChartUser'] = ResolversParentTypes['AniChartUser'] -> { - user?: Resolver, ParentType, ContextType>; - settings?: Resolver, ParentType, ContextType>; - highlights?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterResolvers { - id?: Resolver; - name?: Resolver, ParentType, ContextType>; - image?: Resolver, ParentType, ContextType>; - description?: Resolver, ParentType, ContextType, RequireFields>; - gender?: Resolver, ParentType, ContextType>; - dateOfBirth?: Resolver, ParentType, ContextType>; - age?: Resolver, ParentType, ContextType>; - bloodType?: Resolver, ParentType, ContextType>; - isFavourite?: Resolver; - isFavouriteBlocked?: Resolver; - siteUrl?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType, RequireFields>; - updatedAt?: Resolver, ParentType, ContextType>; - favourites?: Resolver, ParentType, ContextType>; - modNotes?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterConnection'] = ResolversParentTypes['CharacterConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterEdge'] = ResolversParentTypes['CharacterEdge'] -> { - node?: Resolver, ParentType, ContextType>; - id?: Resolver, ParentType, ContextType>; - role?: Resolver, ParentType, ContextType>; - name?: Resolver, ParentType, ContextType>; - voiceActors?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - voiceActorRoles?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - media?: Resolver>>, ParentType, ContextType>; - favouriteOrder?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterImageResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterImage'] = ResolversParentTypes['CharacterImage'] -> { - large?: Resolver, ParentType, ContextType>; - medium?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterNameResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterName'] = ResolversParentTypes['CharacterName'] -> { - first?: Resolver, ParentType, ContextType>; - middle?: Resolver, ParentType, ContextType>; - last?: Resolver, ParentType, ContextType>; - full?: Resolver, ParentType, ContextType>; - native?: Resolver, ParentType, ContextType>; - alternative?: Resolver>>, ParentType, ContextType>; - alternativeSpoiler?: Resolver>>, ParentType, ContextType>; - userPreferred?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterSubmissionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterSubmission'] = ResolversParentTypes['CharacterSubmission'] -> { - id?: Resolver; - character?: Resolver, ParentType, ContextType>; - submission?: Resolver, ParentType, ContextType>; - submitter?: Resolver, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType>; - notes?: Resolver, ParentType, ContextType>; - source?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterSubmissionConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterSubmissionConnection'] = ResolversParentTypes['CharacterSubmissionConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CharacterSubmissionEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['CharacterSubmissionEdge'] = ResolversParentTypes['CharacterSubmissionEdge'] -> { - node?: Resolver, ParentType, ContextType>; - role?: Resolver, ParentType, ContextType>; - voiceActors?: Resolver>>, ParentType, ContextType>; - submittedVoiceActors?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface CountryCodeScalarConfig extends GraphQLScalarTypeConfig { - name: 'CountryCode'; -} - -export interface DeletedResolvers { - deleted?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface FavouritesResolvers { - anime?: Resolver, ParentType, ContextType, RequireFields>; - manga?: Resolver, ParentType, ContextType, RequireFields>; - characters?: Resolver, ParentType, ContextType, RequireFields>; - staff?: Resolver, ParentType, ContextType, RequireFields>; - studios?: Resolver, ParentType, ContextType, RequireFields>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface FollowingNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['FollowingNotification'] = ResolversParentTypes['FollowingNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface FormatStatsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['FormatStats'] = ResolversParentTypes['FormatStats'] -> { - format?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface FuzzyDateResolvers { - year?: Resolver, ParentType, ContextType>; - month?: Resolver, ParentType, ContextType>; - day?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface FuzzyDateIntScalarConfig extends GraphQLScalarTypeConfig { - name: 'FuzzyDateInt'; -} - -export interface GenreStatsResolvers { - genre?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - timeWatched?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface InternalPageResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['InternalPage'] = ResolversParentTypes['InternalPage'] -> { - mediaSubmissions?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - characterSubmissions?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - staffSubmissions?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - revisionHistory?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - reports?: Resolver>>, ParentType, ContextType, RequireFields>; - modActions?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - pageInfo?: Resolver, ParentType, ContextType>; - users?: Resolver>>, ParentType, ContextType, RequireFields>; - media?: Resolver>>, ParentType, ContextType, RequireFields>; - characters?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - staff?: Resolver>>, ParentType, ContextType, RequireFields>; - studios?: Resolver>>, ParentType, ContextType, RequireFields>; - mediaList?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - airingSchedules?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - mediaTrends?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - notifications?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - followers?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - following?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - activities?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - activityReplies?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - threads?: Resolver>>, ParentType, ContextType, RequireFields>; - threadComments?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - reviews?: Resolver>>, ParentType, ContextType, RequireFields>; - recommendations?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - likes?: Resolver>>, ParentType, ContextType, RequireFields>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface JsonScalarConfig extends GraphQLScalarTypeConfig { - name: 'Json'; -} - -export interface LikeableUnionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['LikeableUnion'] = ResolversParentTypes['LikeableUnion'] -> { - __resolveType: TypeResolveFn< - 'ListActivity' | 'TextActivity' | 'MessageActivity' | 'ActivityReply' | 'Thread' | 'ThreadComment', - ParentType, - ContextType - >; -} - -export interface ListActivityResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ListActivity'] = ResolversParentTypes['ListActivity'] -> { - id?: Resolver; - userId?: Resolver, ParentType, ContextType>; - type?: Resolver, ParentType, ContextType>; - replyCount?: Resolver; - status?: Resolver, ParentType, ContextType>; - progress?: Resolver, ParentType, ContextType>; - isLocked?: Resolver, ParentType, ContextType>; - isSubscribed?: Resolver, ParentType, ContextType>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - user?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - replies?: Resolver>>, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ListScoreStatsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ListScoreStats'] = ResolversParentTypes['ListScoreStats'] -> { - meanScore?: Resolver, ParentType, ContextType>; - standardDeviation?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaResolvers { - id?: Resolver; - idMal?: Resolver, ParentType, ContextType>; - title?: Resolver, ParentType, ContextType>; - type?: Resolver, ParentType, ContextType>; - format?: Resolver, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType, RequireFields>; - description?: Resolver, ParentType, ContextType, RequireFields>; - startDate?: Resolver, ParentType, ContextType>; - endDate?: Resolver, ParentType, ContextType>; - season?: Resolver, ParentType, ContextType>; - seasonYear?: Resolver, ParentType, ContextType>; - seasonInt?: Resolver, ParentType, ContextType>; - episodes?: Resolver, ParentType, ContextType>; - duration?: Resolver, ParentType, ContextType>; - chapters?: Resolver, ParentType, ContextType>; - volumes?: Resolver, ParentType, ContextType>; - countryOfOrigin?: Resolver, ParentType, ContextType>; - isLicensed?: Resolver, ParentType, ContextType>; - source?: Resolver, ParentType, ContextType, RequireFields>; - hashtag?: Resolver, ParentType, ContextType>; - trailer?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver, ParentType, ContextType>; - coverImage?: Resolver, ParentType, ContextType>; - bannerImage?: Resolver, ParentType, ContextType>; - genres?: Resolver>>, ParentType, ContextType>; - synonyms?: Resolver>>, ParentType, ContextType>; - averageScore?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - popularity?: Resolver, ParentType, ContextType>; - isLocked?: Resolver, ParentType, ContextType>; - trending?: Resolver, ParentType, ContextType>; - favourites?: Resolver, ParentType, ContextType>; - tags?: Resolver>>, ParentType, ContextType>; - relations?: Resolver, ParentType, ContextType>; - characters?: Resolver, ParentType, ContextType, RequireFields>; - staff?: Resolver, ParentType, ContextType, RequireFields>; - studios?: Resolver, ParentType, ContextType, RequireFields>; - isFavourite?: Resolver; - isAdult?: Resolver, ParentType, ContextType>; - nextAiringEpisode?: Resolver, ParentType, ContextType>; - airingSchedule?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - trends?: Resolver, ParentType, ContextType, RequireFields>; - externalLinks?: Resolver>>, ParentType, ContextType>; - streamingEpisodes?: Resolver>>, ParentType, ContextType>; - rankings?: Resolver>>, ParentType, ContextType>; - mediaListEntry?: Resolver, ParentType, ContextType>; - reviews?: Resolver, ParentType, ContextType, RequireFields>; - recommendations?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - stats?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - autoCreateForumThread?: Resolver, ParentType, ContextType>; - isRecommendationBlocked?: Resolver, ParentType, ContextType>; - modNotes?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaCharacterResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaCharacter'] = ResolversParentTypes['MediaCharacter'] -> { - id?: Resolver, ParentType, ContextType>; - role?: Resolver, ParentType, ContextType>; - roleNotes?: Resolver, ParentType, ContextType>; - dubGroup?: Resolver, ParentType, ContextType>; - characterName?: Resolver, ParentType, ContextType>; - character?: Resolver, ParentType, ContextType>; - voiceActor?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaConnection'] = ResolversParentTypes['MediaConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaCoverImageResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaCoverImage'] = ResolversParentTypes['MediaCoverImage'] -> { - extraLarge?: Resolver, ParentType, ContextType>; - large?: Resolver, ParentType, ContextType>; - medium?: Resolver, ParentType, ContextType>; - color?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaEdgeResolvers { - node?: Resolver, ParentType, ContextType>; - id?: Resolver, ParentType, ContextType>; - relationType?: Resolver, ParentType, ContextType, RequireFields>; - isMainStudio?: Resolver; - characters?: Resolver>>, ParentType, ContextType>; - characterRole?: Resolver, ParentType, ContextType>; - characterName?: Resolver, ParentType, ContextType>; - roleNotes?: Resolver, ParentType, ContextType>; - dubGroup?: Resolver, ParentType, ContextType>; - staffRole?: Resolver, ParentType, ContextType>; - voiceActors?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - voiceActorRoles?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - favouriteOrder?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaExternalLinkResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaExternalLink'] = ResolversParentTypes['MediaExternalLink'] -> { - id?: Resolver; - url?: Resolver; - site?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaListResolvers { - id?: Resolver; - userId?: Resolver; - mediaId?: Resolver; - status?: Resolver, ParentType, ContextType>; - score?: Resolver, ParentType, ContextType, RequireFields>; - progress?: Resolver, ParentType, ContextType>; - progressVolumes?: Resolver, ParentType, ContextType>; - repeat?: Resolver, ParentType, ContextType>; - priority?: Resolver, ParentType, ContextType>; - private?: Resolver, ParentType, ContextType>; - notes?: Resolver, ParentType, ContextType>; - hiddenFromStatusLists?: Resolver, ParentType, ContextType>; - customLists?: Resolver, ParentType, ContextType, RequireFields>; - advancedScores?: Resolver, ParentType, ContextType>; - startedAt?: Resolver, ParentType, ContextType>; - completedAt?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaListCollectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaListCollection'] = ResolversParentTypes['MediaListCollection'] -> { - lists?: Resolver>>, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - hasNextChunk?: Resolver, ParentType, ContextType>; - statusLists?: Resolver< - Maybe>>>>, - ParentType, - ContextType, - RequireFields - >; - customLists?: Resolver< - Maybe>>>>, - ParentType, - ContextType, - RequireFields - >; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaListGroupResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaListGroup'] = ResolversParentTypes['MediaListGroup'] -> { - entries?: Resolver>>, ParentType, ContextType>; - name?: Resolver, ParentType, ContextType>; - isCustomList?: Resolver, ParentType, ContextType>; - isSplitCompletedList?: Resolver, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaListOptionsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaListOptions'] = ResolversParentTypes['MediaListOptions'] -> { - scoreFormat?: Resolver, ParentType, ContextType>; - rowOrder?: Resolver, ParentType, ContextType>; - useLegacyLists?: Resolver, ParentType, ContextType>; - animeList?: Resolver, ParentType, ContextType>; - mangaList?: Resolver, ParentType, ContextType>; - sharedTheme?: Resolver, ParentType, ContextType>; - sharedThemeEnabled?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaListTypeOptionsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaListTypeOptions'] = ResolversParentTypes['MediaListTypeOptions'] -> { - sectionOrder?: Resolver>>, ParentType, ContextType>; - splitCompletedSectionByFormat?: Resolver, ParentType, ContextType>; - theme?: Resolver, ParentType, ContextType>; - customLists?: Resolver>>, ParentType, ContextType>; - advancedScoring?: Resolver>>, ParentType, ContextType>; - advancedScoringEnabled?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaRankResolvers { - id?: Resolver; - rank?: Resolver; - type?: Resolver; - format?: Resolver; - year?: Resolver, ParentType, ContextType>; - season?: Resolver, ParentType, ContextType>; - allTime?: Resolver, ParentType, ContextType>; - context?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaStatsResolvers { - scoreDistribution?: Resolver>>, ParentType, ContextType>; - statusDistribution?: Resolver>>, ParentType, ContextType>; - airingProgression?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaStreamingEpisodeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaStreamingEpisode'] = ResolversParentTypes['MediaStreamingEpisode'] -> { - title?: Resolver, ParentType, ContextType>; - thumbnail?: Resolver, ParentType, ContextType>; - url?: Resolver, ParentType, ContextType>; - site?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaSubmissionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaSubmission'] = ResolversParentTypes['MediaSubmission'] -> { - id?: Resolver; - submitter?: Resolver, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType>; - submitterStats?: Resolver, ParentType, ContextType>; - notes?: Resolver, ParentType, ContextType>; - source?: Resolver, ParentType, ContextType>; - changes?: Resolver>>, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - submission?: Resolver, ParentType, ContextType>; - characters?: Resolver>>, ParentType, ContextType>; - staff?: Resolver>>, ParentType, ContextType>; - studios?: Resolver>>, ParentType, ContextType>; - relations?: Resolver>>, ParentType, ContextType>; - externalLinks?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaSubmissionComparisonResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaSubmissionComparison'] = ResolversParentTypes['MediaSubmissionComparison'] -> { - submission?: Resolver, ParentType, ContextType>; - character?: Resolver, ParentType, ContextType>; - staff?: Resolver, ParentType, ContextType>; - studio?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaSubmissionEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaSubmissionEdge'] = ResolversParentTypes['MediaSubmissionEdge'] -> { - id?: Resolver, ParentType, ContextType>; - characterRole?: Resolver, ParentType, ContextType>; - staffRole?: Resolver, ParentType, ContextType>; - roleNotes?: Resolver, ParentType, ContextType>; - dubGroup?: Resolver, ParentType, ContextType>; - characterName?: Resolver, ParentType, ContextType>; - isMain?: Resolver, ParentType, ContextType>; - character?: Resolver, ParentType, ContextType>; - characterSubmission?: Resolver, ParentType, ContextType>; - voiceActor?: Resolver, ParentType, ContextType>; - voiceActorSubmission?: Resolver, ParentType, ContextType>; - staff?: Resolver, ParentType, ContextType>; - staffSubmission?: Resolver, ParentType, ContextType>; - studio?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTagResolvers { - id?: Resolver; - name?: Resolver; - description?: Resolver, ParentType, ContextType>; - category?: Resolver, ParentType, ContextType>; - rank?: Resolver, ParentType, ContextType>; - isGeneralSpoiler?: Resolver, ParentType, ContextType>; - isMediaSpoiler?: Resolver, ParentType, ContextType>; - isAdult?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTitleResolvers { - romaji?: Resolver, ParentType, ContextType, RequireFields>; - english?: Resolver, ParentType, ContextType, RequireFields>; - native?: Resolver, ParentType, ContextType, RequireFields>; - userPreferred?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTrailerResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaTrailer'] = ResolversParentTypes['MediaTrailer'] -> { - id?: Resolver, ParentType, ContextType>; - site?: Resolver, ParentType, ContextType>; - thumbnail?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTrendResolvers { - mediaId?: Resolver; - date?: Resolver; - trending?: Resolver; - averageScore?: Resolver, ParentType, ContextType>; - popularity?: Resolver, ParentType, ContextType>; - inProgress?: Resolver, ParentType, ContextType>; - releasing?: Resolver; - episode?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTrendConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaTrendConnection'] = ResolversParentTypes['MediaTrendConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MediaTrendEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MediaTrendEdge'] = ResolversParentTypes['MediaTrendEdge'] -> { - node?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MessageActivityResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['MessageActivity'] = ResolversParentTypes['MessageActivity'] -> { - id?: Resolver; - recipientId?: Resolver, ParentType, ContextType>; - messengerId?: Resolver, ParentType, ContextType>; - type?: Resolver, ParentType, ContextType>; - replyCount?: Resolver; - message?: Resolver, ParentType, ContextType, RequireFields>; - isLocked?: Resolver, ParentType, ContextType>; - isSubscribed?: Resolver, ParentType, ContextType>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - isPrivate?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - recipient?: Resolver, ParentType, ContextType>; - messenger?: Resolver, ParentType, ContextType>; - replies?: Resolver>>, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ModActionResolvers { - id?: Resolver; - user?: Resolver, ParentType, ContextType>; - mod?: Resolver, ParentType, ContextType>; - type?: Resolver, ParentType, ContextType>; - objectId?: Resolver, ParentType, ContextType>; - objectType?: Resolver, ParentType, ContextType>; - data?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface MutationResolvers { - UpdateUser?: Resolver, ParentType, ContextType, RequireFields>; - SaveMediaListEntry?: Resolver, ParentType, ContextType, RequireFields>; - UpdateMediaListEntries?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - DeleteMediaListEntry?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - DeleteCustomList?: Resolver, ParentType, ContextType, RequireFields>; - SaveTextActivity?: Resolver, ParentType, ContextType, RequireFields>; - SaveMessageActivity?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - SaveListActivity?: Resolver, ParentType, ContextType, RequireFields>; - DeleteActivity?: Resolver, ParentType, ContextType, RequireFields>; - ToggleActivitySubscription?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - SaveActivityReply?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - DeleteActivityReply?: Resolver, ParentType, ContextType, RequireFields>; - ToggleLike?: Resolver>>, ParentType, ContextType, RequireFields>; - ToggleLikeV2?: Resolver, ParentType, ContextType, RequireFields>; - ToggleFollow?: Resolver, ParentType, ContextType, RequireFields>; - ToggleFavourite?: Resolver, ParentType, ContextType, RequireFields>; - UpdateFavouriteOrder?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - SaveReview?: Resolver, ParentType, ContextType, RequireFields>; - DeleteReview?: Resolver, ParentType, ContextType, RequireFields>; - RateReview?: Resolver, ParentType, ContextType, RequireFields>; - SaveRecommendation?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - SaveThread?: Resolver, ParentType, ContextType, RequireFields>; - DeleteThread?: Resolver, ParentType, ContextType, RequireFields>; - ToggleThreadSubscription?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - SaveThreadComment?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - DeleteThreadComment?: Resolver, ParentType, ContextType, RequireFields>; - UpdateAniChartSettings?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - UpdateAniChartHighlights?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; -} - -export interface NotificationOptionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['NotificationOption'] = ResolversParentTypes['NotificationOption'] -> { - type?: Resolver, ParentType, ContextType>; - enabled?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface NotificationUnionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['NotificationUnion'] = ResolversParentTypes['NotificationUnion'] -> { - __resolveType: TypeResolveFn< - | 'AiringNotification' - | 'FollowingNotification' - | 'ActivityMessageNotification' - | 'ActivityMentionNotification' - | 'ActivityReplyNotification' - | 'ActivityReplySubscribedNotification' - | 'ActivityLikeNotification' - | 'ActivityReplyLikeNotification' - | 'ThreadCommentMentionNotification' - | 'ThreadCommentReplyNotification' - | 'ThreadCommentSubscribedNotification' - | 'ThreadCommentLikeNotification' - | 'ThreadLikeNotification' - | 'RelatedMediaAdditionNotification', - ParentType, - ContextType - >; -} - -export interface PageResolvers { - pageInfo?: Resolver, ParentType, ContextType>; - users?: Resolver>>, ParentType, ContextType, RequireFields>; - media?: Resolver>>, ParentType, ContextType, RequireFields>; - characters?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - staff?: Resolver>>, ParentType, ContextType, RequireFields>; - studios?: Resolver>>, ParentType, ContextType, RequireFields>; - mediaList?: Resolver>>, ParentType, ContextType, RequireFields>; - airingSchedules?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - mediaTrends?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - notifications?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - followers?: Resolver>>, ParentType, ContextType, RequireFields>; - following?: Resolver>>, ParentType, ContextType, RequireFields>; - activities?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - activityReplies?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - threads?: Resolver>>, ParentType, ContextType, RequireFields>; - threadComments?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - reviews?: Resolver>>, ParentType, ContextType, RequireFields>; - recommendations?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - likes?: Resolver>>, ParentType, ContextType, RequireFields>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface PageInfoResolvers { - total?: Resolver, ParentType, ContextType>; - perPage?: Resolver, ParentType, ContextType>; - currentPage?: Resolver, ParentType, ContextType>; - lastPage?: Resolver, ParentType, ContextType>; - hasNextPage?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ParsedMarkdownResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ParsedMarkdown'] = ResolversParentTypes['ParsedMarkdown'] -> { - html?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface QueryResolvers { - Page?: Resolver, ParentType, ContextType, RequireFields>; - Media?: Resolver, ParentType, ContextType, RequireFields>; - MediaTrend?: Resolver, ParentType, ContextType, RequireFields>; - AiringSchedule?: Resolver, ParentType, ContextType, RequireFields>; - Character?: Resolver, ParentType, ContextType, RequireFields>; - Staff?: Resolver, ParentType, ContextType, RequireFields>; - MediaList?: Resolver, ParentType, ContextType, RequireFields>; - MediaListCollection?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - >; - GenreCollection?: Resolver>>, ParentType, ContextType>; - MediaTagCollection?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - User?: Resolver, ParentType, ContextType, RequireFields>; - Viewer?: Resolver, ParentType, ContextType>; - Notification?: Resolver, ParentType, ContextType, RequireFields>; - Studio?: Resolver, ParentType, ContextType, RequireFields>; - Review?: Resolver, ParentType, ContextType, RequireFields>; - Activity?: Resolver, ParentType, ContextType, RequireFields>; - ActivityReply?: Resolver, ParentType, ContextType, RequireFields>; - Following?: Resolver, ParentType, ContextType, RequireFields>; - Follower?: Resolver, ParentType, ContextType, RequireFields>; - Thread?: Resolver, ParentType, ContextType, RequireFields>; - ThreadComment?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - Recommendation?: Resolver, ParentType, ContextType, RequireFields>; - Like?: Resolver, ParentType, ContextType, RequireFields>; - Markdown?: Resolver, ParentType, ContextType, RequireFields>; - AniChartUser?: Resolver, ParentType, ContextType>; - SiteStatistics?: Resolver, ParentType, ContextType>; - MediaTagUser?: Resolver, ParentType, ContextType, RequireFields>; -} - -export interface RecommendationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Recommendation'] = ResolversParentTypes['Recommendation'] -> { - id?: Resolver; - rating?: Resolver, ParentType, ContextType>; - userRating?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - mediaRecommendation?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface RecommendationConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['RecommendationConnection'] = ResolversParentTypes['RecommendationConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface RecommendationEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['RecommendationEdge'] = ResolversParentTypes['RecommendationEdge'] -> { - node?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface RelatedMediaAdditionNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['RelatedMediaAdditionNotification'] = ResolversParentTypes['RelatedMediaAdditionNotification'] -> { - id?: Resolver; - type?: Resolver, ParentType, ContextType>; - mediaId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ReportResolvers { - id?: Resolver; - reporter?: Resolver, ParentType, ContextType>; - reported?: Resolver, ParentType, ContextType>; - reason?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - cleared?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ReviewResolvers { - id?: Resolver; - userId?: Resolver; - mediaId?: Resolver; - mediaType?: Resolver, ParentType, ContextType>; - summary?: Resolver, ParentType, ContextType>; - body?: Resolver, ParentType, ContextType, RequireFields>; - rating?: Resolver, ParentType, ContextType>; - ratingAmount?: Resolver, ParentType, ContextType>; - userRating?: Resolver, ParentType, ContextType>; - score?: Resolver, ParentType, ContextType>; - private?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - updatedAt?: Resolver; - user?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ReviewConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ReviewConnection'] = ResolversParentTypes['ReviewConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ReviewEdgeResolvers { - node?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface RevisionHistoryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['RevisionHistory'] = ResolversParentTypes['RevisionHistory'] -> { - id?: Resolver; - action?: Resolver, ParentType, ContextType>; - changes?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - media?: Resolver, ParentType, ContextType>; - character?: Resolver, ParentType, ContextType>; - staff?: Resolver, ParentType, ContextType>; - studio?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ScoreDistributionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ScoreDistribution'] = ResolversParentTypes['ScoreDistribution'] -> { - score?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface SiteStatisticsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['SiteStatistics'] = ResolversParentTypes['SiteStatistics'] -> { - users?: Resolver, ParentType, ContextType, RequireFields>; - anime?: Resolver, ParentType, ContextType, RequireFields>; - manga?: Resolver, ParentType, ContextType, RequireFields>; - characters?: Resolver, ParentType, ContextType, RequireFields>; - staff?: Resolver, ParentType, ContextType, RequireFields>; - studios?: Resolver, ParentType, ContextType, RequireFields>; - reviews?: Resolver, ParentType, ContextType, RequireFields>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface SiteTrendResolvers { - date?: Resolver; - count?: Resolver; - change?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface SiteTrendConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['SiteTrendConnection'] = ResolversParentTypes['SiteTrendConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface SiteTrendEdgeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['SiteTrendEdge'] = ResolversParentTypes['SiteTrendEdge'] -> { - node?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffResolvers { - id?: Resolver; - name?: Resolver, ParentType, ContextType>; - language?: Resolver, ParentType, ContextType>; - languageV2?: Resolver, ParentType, ContextType>; - image?: Resolver, ParentType, ContextType>; - description?: Resolver, ParentType, ContextType, RequireFields>; - primaryOccupations?: Resolver>>, ParentType, ContextType>; - gender?: Resolver, ParentType, ContextType>; - dateOfBirth?: Resolver, ParentType, ContextType>; - dateOfDeath?: Resolver, ParentType, ContextType>; - age?: Resolver, ParentType, ContextType>; - yearsActive?: Resolver>>, ParentType, ContextType>; - homeTown?: Resolver, ParentType, ContextType>; - bloodType?: Resolver, ParentType, ContextType>; - isFavourite?: Resolver; - isFavouriteBlocked?: Resolver; - siteUrl?: Resolver, ParentType, ContextType>; - staffMedia?: Resolver, ParentType, ContextType, RequireFields>; - characters?: Resolver, ParentType, ContextType, RequireFields>; - characterMedia?: Resolver, ParentType, ContextType, RequireFields>; - updatedAt?: Resolver, ParentType, ContextType>; - staff?: Resolver, ParentType, ContextType>; - submitter?: Resolver, ParentType, ContextType>; - submissionStatus?: Resolver, ParentType, ContextType>; - submissionNotes?: Resolver, ParentType, ContextType>; - favourites?: Resolver, ParentType, ContextType>; - modNotes?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StaffConnection'] = ResolversParentTypes['StaffConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffEdgeResolvers { - node?: Resolver, ParentType, ContextType>; - id?: Resolver, ParentType, ContextType>; - role?: Resolver, ParentType, ContextType>; - favouriteOrder?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffImageResolvers { - large?: Resolver, ParentType, ContextType>; - medium?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffNameResolvers { - first?: Resolver, ParentType, ContextType>; - middle?: Resolver, ParentType, ContextType>; - last?: Resolver, ParentType, ContextType>; - full?: Resolver, ParentType, ContextType>; - native?: Resolver, ParentType, ContextType>; - alternative?: Resolver>>, ParentType, ContextType>; - userPreferred?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffRoleTypeResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StaffRoleType'] = ResolversParentTypes['StaffRoleType'] -> { - voiceActor?: Resolver, ParentType, ContextType>; - roleNotes?: Resolver, ParentType, ContextType>; - dubGroup?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffStatsResolvers { - staff?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - timeWatched?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StaffSubmissionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StaffSubmission'] = ResolversParentTypes['StaffSubmission'] -> { - id?: Resolver; - staff?: Resolver, ParentType, ContextType>; - submission?: Resolver, ParentType, ContextType>; - submitter?: Resolver, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType>; - notes?: Resolver, ParentType, ContextType>; - source?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StatusDistributionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StatusDistribution'] = ResolversParentTypes['StatusDistribution'] -> { - status?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StudioResolvers { - id?: Resolver; - name?: Resolver; - isAnimationStudio?: Resolver; - media?: Resolver, ParentType, ContextType, RequireFields>; - siteUrl?: Resolver, ParentType, ContextType>; - isFavourite?: Resolver; - favourites?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StudioConnectionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StudioConnection'] = ResolversParentTypes['StudioConnection'] -> { - edges?: Resolver>>, ParentType, ContextType>; - nodes?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StudioEdgeResolvers { - node?: Resolver, ParentType, ContextType>; - id?: Resolver, ParentType, ContextType>; - isMain?: Resolver; - favouriteOrder?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface StudioStatsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StudioStats'] = ResolversParentTypes['StudioStats'] -> { - studio?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - timeWatched?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface TagStatsResolvers { - tag?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - timeWatched?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface TextActivityResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TextActivity'] = ResolversParentTypes['TextActivity'] -> { - id?: Resolver; - userId?: Resolver, ParentType, ContextType>; - type?: Resolver, ParentType, ContextType>; - replyCount?: Resolver; - text?: Resolver, ParentType, ContextType, RequireFields>; - siteUrl?: Resolver, ParentType, ContextType>; - isLocked?: Resolver, ParentType, ContextType>; - isSubscribed?: Resolver, ParentType, ContextType>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - user?: Resolver, ParentType, ContextType>; - replies?: Resolver>>, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadResolvers { - id?: Resolver; - title?: Resolver, ParentType, ContextType>; - body?: Resolver, ParentType, ContextType, RequireFields>; - userId?: Resolver; - replyUserId?: Resolver, ParentType, ContextType>; - replyCommentId?: Resolver, ParentType, ContextType>; - replyCount?: Resolver, ParentType, ContextType>; - viewCount?: Resolver, ParentType, ContextType>; - isLocked?: Resolver, ParentType, ContextType>; - isSticky?: Resolver, ParentType, ContextType>; - isSubscribed?: Resolver, ParentType, ContextType>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - repliedAt?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - updatedAt?: Resolver; - user?: Resolver, ParentType, ContextType>; - replyUser?: Resolver, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - categories?: Resolver>>, ParentType, ContextType>; - mediaCategories?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCategoryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadCategory'] = ResolversParentTypes['ThreadCategory'] -> { - id?: Resolver; - name?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCommentResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadComment'] = ResolversParentTypes['ThreadComment'] -> { - id?: Resolver; - userId?: Resolver, ParentType, ContextType>; - threadId?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType, RequireFields>; - likeCount?: Resolver; - isLiked?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - updatedAt?: Resolver; - thread?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - likes?: Resolver>>, ParentType, ContextType>; - childComments?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCommentLikeNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadCommentLikeNotification'] = ResolversParentTypes['ThreadCommentLikeNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - commentId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - thread?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCommentMentionNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadCommentMentionNotification'] = ResolversParentTypes['ThreadCommentMentionNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - commentId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - thread?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCommentReplyNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadCommentReplyNotification'] = ResolversParentTypes['ThreadCommentReplyNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - commentId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - thread?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadCommentSubscribedNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadCommentSubscribedNotification'] = ResolversParentTypes['ThreadCommentSubscribedNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - commentId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - thread?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface ThreadLikeNotificationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['ThreadLikeNotification'] = ResolversParentTypes['ThreadLikeNotification'] -> { - id?: Resolver; - userId?: Resolver; - type?: Resolver, ParentType, ContextType>; - threadId?: Resolver; - context?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - thread?: Resolver, ParentType, ContextType>; - comment?: Resolver, ParentType, ContextType>; - user?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserResolvers { - id?: Resolver; - name?: Resolver; - about?: Resolver, ParentType, ContextType, RequireFields>; - avatar?: Resolver, ParentType, ContextType>; - bannerImage?: Resolver, ParentType, ContextType>; - isFollowing?: Resolver, ParentType, ContextType>; - isFollower?: Resolver, ParentType, ContextType>; - isBlocked?: Resolver, ParentType, ContextType>; - bans?: Resolver, ParentType, ContextType>; - options?: Resolver, ParentType, ContextType>; - mediaListOptions?: Resolver, ParentType, ContextType>; - favourites?: Resolver, ParentType, ContextType, RequireFields>; - statistics?: Resolver, ParentType, ContextType>; - unreadNotificationCount?: Resolver, ParentType, ContextType>; - siteUrl?: Resolver, ParentType, ContextType>; - donatorTier?: Resolver, ParentType, ContextType>; - donatorBadge?: Resolver, ParentType, ContextType>; - moderatorRoles?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver, ParentType, ContextType>; - stats?: Resolver, ParentType, ContextType>; - moderatorStatus?: Resolver, ParentType, ContextType>; - previousNames?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserActivityHistoryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserActivityHistory'] = ResolversParentTypes['UserActivityHistory'] -> { - date?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - level?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserAvatarResolvers { - large?: Resolver, ParentType, ContextType>; - medium?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserCountryStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserCountryStatistic'] = ResolversParentTypes['UserCountryStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - country?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserFormatStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserFormatStatistic'] = ResolversParentTypes['UserFormatStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - format?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserGenreStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserGenreStatistic'] = ResolversParentTypes['UserGenreStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - genre?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserLengthStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserLengthStatistic'] = ResolversParentTypes['UserLengthStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - length?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserModDataResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserModData'] = ResolversParentTypes['UserModData'] -> { - alts?: Resolver>>, ParentType, ContextType>; - bans?: Resolver, ParentType, ContextType>; - ip?: Resolver, ParentType, ContextType>; - counts?: Resolver, ParentType, ContextType>; - privacy?: Resolver, ParentType, ContextType>; - email?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserOptionsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserOptions'] = ResolversParentTypes['UserOptions'] -> { - titleLanguage?: Resolver, ParentType, ContextType>; - displayAdultContent?: Resolver, ParentType, ContextType>; - airingNotifications?: Resolver, ParentType, ContextType>; - profileColor?: Resolver, ParentType, ContextType>; - notificationOptions?: Resolver>>, ParentType, ContextType>; - timezone?: Resolver, ParentType, ContextType>; - activityMergeTime?: Resolver, ParentType, ContextType>; - staffNameLanguage?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserPreviousNameResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserPreviousName'] = ResolversParentTypes['UserPreviousName'] -> { - name?: Resolver, ParentType, ContextType>; - createdAt?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserReleaseYearStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserReleaseYearStatistic'] = ResolversParentTypes['UserReleaseYearStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - releaseYear?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserScoreStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserScoreStatistic'] = ResolversParentTypes['UserScoreStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - score?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStaffStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStaffStatistic'] = ResolversParentTypes['UserStaffStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - staff?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStartYearStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStartYearStatistic'] = ResolversParentTypes['UserStartYearStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - startYear?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStatisticTypesResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStatisticTypes'] = ResolversParentTypes['UserStatisticTypes'] -> { - anime?: Resolver, ParentType, ContextType>; - manga?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStatisticsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStatistics'] = ResolversParentTypes['UserStatistics'] -> { - count?: Resolver; - meanScore?: Resolver; - standardDeviation?: Resolver; - minutesWatched?: Resolver; - episodesWatched?: Resolver; - chaptersRead?: Resolver; - volumesRead?: Resolver; - formats?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - statuses?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - scores?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - lengths?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - releaseYears?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - startYears?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - genres?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - tags?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - countries?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - voiceActors?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - staff?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - studios?: Resolver< - Maybe>>, - ParentType, - ContextType, - RequireFields - >; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStatsResolvers { - watchedTime?: Resolver, ParentType, ContextType>; - chaptersRead?: Resolver, ParentType, ContextType>; - activityHistory?: Resolver>>, ParentType, ContextType>; - animeStatusDistribution?: Resolver>>, ParentType, ContextType>; - mangaStatusDistribution?: Resolver>>, ParentType, ContextType>; - animeScoreDistribution?: Resolver>>, ParentType, ContextType>; - mangaScoreDistribution?: Resolver>>, ParentType, ContextType>; - animeListScores?: Resolver, ParentType, ContextType>; - mangaListScores?: Resolver, ParentType, ContextType>; - favouredGenresOverview?: Resolver>>, ParentType, ContextType>; - favouredGenres?: Resolver>>, ParentType, ContextType>; - favouredTags?: Resolver>>, ParentType, ContextType>; - favouredActors?: Resolver>>, ParentType, ContextType>; - favouredStaff?: Resolver>>, ParentType, ContextType>; - favouredStudios?: Resolver>>, ParentType, ContextType>; - favouredYears?: Resolver>>, ParentType, ContextType>; - favouredFormats?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStatusStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStatusStatistic'] = ResolversParentTypes['UserStatusStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - status?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserStudioStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserStudioStatistic'] = ResolversParentTypes['UserStudioStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - studio?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserTagStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserTagStatistic'] = ResolversParentTypes['UserTagStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - tag?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface UserVoiceActorStatisticResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['UserVoiceActorStatistic'] = ResolversParentTypes['UserVoiceActorStatistic'] -> { - count?: Resolver; - meanScore?: Resolver; - minutesWatched?: Resolver; - chaptersRead?: Resolver; - mediaIds?: Resolver>, ParentType, ContextType>; - voiceActor?: Resolver, ParentType, ContextType>; - characterIds?: Resolver>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface YearStatsResolvers { - year?: Resolver, ParentType, ContextType>; - amount?: Resolver, ParentType, ContextType>; - meanScore?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -} - -export interface Resolvers { - ActivityLikeNotification?: ActivityLikeNotificationResolvers; - ActivityMentionNotification?: ActivityMentionNotificationResolvers; - ActivityMessageNotification?: ActivityMessageNotificationResolvers; - ActivityReply?: ActivityReplyResolvers; - ActivityReplyLikeNotification?: ActivityReplyLikeNotificationResolvers; - ActivityReplyNotification?: ActivityReplyNotificationResolvers; - ActivityReplySubscribedNotification?: ActivityReplySubscribedNotificationResolvers; - ActivityUnion?: ActivityUnionResolvers; - AiringNotification?: AiringNotificationResolvers; - AiringProgression?: AiringProgressionResolvers; - AiringSchedule?: AiringScheduleResolvers; - AiringScheduleConnection?: AiringScheduleConnectionResolvers; - AiringScheduleEdge?: AiringScheduleEdgeResolvers; - AniChartUser?: AniChartUserResolvers; - Character?: CharacterResolvers; - CharacterConnection?: CharacterConnectionResolvers; - CharacterEdge?: CharacterEdgeResolvers; - CharacterImage?: CharacterImageResolvers; - CharacterName?: CharacterNameResolvers; - CharacterSubmission?: CharacterSubmissionResolvers; - CharacterSubmissionConnection?: CharacterSubmissionConnectionResolvers; - CharacterSubmissionEdge?: CharacterSubmissionEdgeResolvers; - CountryCode?: GraphQLScalarType; - Deleted?: DeletedResolvers; - Favourites?: FavouritesResolvers; - FollowingNotification?: FollowingNotificationResolvers; - FormatStats?: FormatStatsResolvers; - FuzzyDate?: FuzzyDateResolvers; - FuzzyDateInt?: GraphQLScalarType; - GenreStats?: GenreStatsResolvers; - InternalPage?: InternalPageResolvers; - Json?: GraphQLScalarType; - LikeableUnion?: LikeableUnionResolvers; - ListActivity?: ListActivityResolvers; - ListScoreStats?: ListScoreStatsResolvers; - Media?: MediaResolvers; - MediaCharacter?: MediaCharacterResolvers; - MediaConnection?: MediaConnectionResolvers; - MediaCoverImage?: MediaCoverImageResolvers; - MediaEdge?: MediaEdgeResolvers; - MediaExternalLink?: MediaExternalLinkResolvers; - MediaList?: MediaListResolvers; - MediaListCollection?: MediaListCollectionResolvers; - MediaListGroup?: MediaListGroupResolvers; - MediaListOptions?: MediaListOptionsResolvers; - MediaListTypeOptions?: MediaListTypeOptionsResolvers; - MediaRank?: MediaRankResolvers; - MediaStats?: MediaStatsResolvers; - MediaStreamingEpisode?: MediaStreamingEpisodeResolvers; - MediaSubmission?: MediaSubmissionResolvers; - MediaSubmissionComparison?: MediaSubmissionComparisonResolvers; - MediaSubmissionEdge?: MediaSubmissionEdgeResolvers; - MediaTag?: MediaTagResolvers; - MediaTitle?: MediaTitleResolvers; - MediaTrailer?: MediaTrailerResolvers; - MediaTrend?: MediaTrendResolvers; - MediaTrendConnection?: MediaTrendConnectionResolvers; - MediaTrendEdge?: MediaTrendEdgeResolvers; - MessageActivity?: MessageActivityResolvers; - ModAction?: ModActionResolvers; - Mutation?: MutationResolvers; - NotificationOption?: NotificationOptionResolvers; - NotificationUnion?: NotificationUnionResolvers; - Page?: PageResolvers; - PageInfo?: PageInfoResolvers; - ParsedMarkdown?: ParsedMarkdownResolvers; - Query?: QueryResolvers; - Recommendation?: RecommendationResolvers; - RecommendationConnection?: RecommendationConnectionResolvers; - RecommendationEdge?: RecommendationEdgeResolvers; - RelatedMediaAdditionNotification?: RelatedMediaAdditionNotificationResolvers; - Report?: ReportResolvers; - Review?: ReviewResolvers; - ReviewConnection?: ReviewConnectionResolvers; - ReviewEdge?: ReviewEdgeResolvers; - RevisionHistory?: RevisionHistoryResolvers; - ScoreDistribution?: ScoreDistributionResolvers; - SiteStatistics?: SiteStatisticsResolvers; - SiteTrend?: SiteTrendResolvers; - SiteTrendConnection?: SiteTrendConnectionResolvers; - SiteTrendEdge?: SiteTrendEdgeResolvers; - Staff?: StaffResolvers; - StaffConnection?: StaffConnectionResolvers; - StaffEdge?: StaffEdgeResolvers; - StaffImage?: StaffImageResolvers; - StaffName?: StaffNameResolvers; - StaffRoleType?: StaffRoleTypeResolvers; - StaffStats?: StaffStatsResolvers; - StaffSubmission?: StaffSubmissionResolvers; - StatusDistribution?: StatusDistributionResolvers; - Studio?: StudioResolvers; - StudioConnection?: StudioConnectionResolvers; - StudioEdge?: StudioEdgeResolvers; - StudioStats?: StudioStatsResolvers; - TagStats?: TagStatsResolvers; - TextActivity?: TextActivityResolvers; - Thread?: ThreadResolvers; - ThreadCategory?: ThreadCategoryResolvers; - ThreadComment?: ThreadCommentResolvers; - ThreadCommentLikeNotification?: ThreadCommentLikeNotificationResolvers; - ThreadCommentMentionNotification?: ThreadCommentMentionNotificationResolvers; - ThreadCommentReplyNotification?: ThreadCommentReplyNotificationResolvers; - ThreadCommentSubscribedNotification?: ThreadCommentSubscribedNotificationResolvers; - ThreadLikeNotification?: ThreadLikeNotificationResolvers; - User?: UserResolvers; - UserActivityHistory?: UserActivityHistoryResolvers; - UserAvatar?: UserAvatarResolvers; - UserCountryStatistic?: UserCountryStatisticResolvers; - UserFormatStatistic?: UserFormatStatisticResolvers; - UserGenreStatistic?: UserGenreStatisticResolvers; - UserLengthStatistic?: UserLengthStatisticResolvers; - UserModData?: UserModDataResolvers; - UserOptions?: UserOptionsResolvers; - UserPreviousName?: UserPreviousNameResolvers; - UserReleaseYearStatistic?: UserReleaseYearStatisticResolvers; - UserScoreStatistic?: UserScoreStatisticResolvers; - UserStaffStatistic?: UserStaffStatisticResolvers; - UserStartYearStatistic?: UserStartYearStatisticResolvers; - UserStatisticTypes?: UserStatisticTypesResolvers; - UserStatistics?: UserStatisticsResolvers; - UserStats?: UserStatsResolvers; - UserStatusStatistic?: UserStatusStatisticResolvers; - UserStudioStatistic?: UserStudioStatisticResolvers; - UserTagStatistic?: UserTagStatisticResolvers; - UserVoiceActorStatistic?: UserVoiceActorStatisticResolvers; - YearStats?: YearStatsResolvers; -} - -/** - * @deprecated - * Use "Resolvers" root object instead. If you wish to get "IResolvers", add "typesPrefix: I" to your config. - */ -export type IResolvers = Resolvers; diff --git a/src/lib/types/definitions/ArgumentTypes.ts b/src/lib/types/definitions/ArgumentTypes.ts deleted file mode 100644 index b593c21ec9d..00000000000 --- a/src/lib/types/definitions/ArgumentTypes.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const enum Scope { - Local, - Global -} diff --git a/src/lib/types/definitions/Igdb.ts b/src/lib/types/definitions/Igdb.ts deleted file mode 100644 index c640cac01b4..00000000000 --- a/src/lib/types/definitions/Igdb.ts +++ /dev/null @@ -1,915 +0,0 @@ -/** - * MIT License - * - * Copyright (c) 2019 IGDB.com - * - * 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. - */ - -/** ApiObject Type, id and other key:value pairs */ -declare interface ApiObject extends Record { - id: number; -} - -/** Possible types of an ApiObject's properties */ -declare type ApiObjectProperty = ApiObject[] | ApiObject | number[] | number | string | string[] | boolean | undefined; - -declare interface AgeRating extends ApiObject { - id: number; - category?: AgeRatingCategoryEnum; - content_descriptions?: Array | number[]; - rating?: AgeRatingRatingEnum; - rating_cover_url?: string; - synopsis?: string; -} - -declare interface AgeRatingContentDescription extends ApiObject { - id: number; - category?: AgeRatingRatingEnum; - description?: string; -} - -declare interface AlternativeName extends ApiObject { - id: number; - comment?: string; - game?: Game | number; - name?: string; -} - -declare interface Artwork extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - game?: Game | number; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface Character extends ApiObject { - id: number; - akas?: Array | number[]; - country_name?: string; - created_at?: number; - description?: string; - games?: Array | number[]; - gender?: GenderGenderEnum; - mug_shot?: CharacterMugShot | number; - name?: string; - people?: Array | number[]; - slug?: string; - species?: CharacterSpeciesEnum; - updated_at?: number; - url?: string; -} - -declare interface CharacterMugShot extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface Collection extends ApiObject { - id: number; - created_at?: number; - games?: Array | number[]; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -export interface Company extends ApiObject { - id: number; - change_date?: number; - change_date_category?: DateFormatStartDateCategoryEnum; - changed_company_id?: Company | number; - country?: number; - created_at?: number; - description?: string; - developed?: Array | number[]; - logo?: CompanyLogo | number; - name?: string; - parent?: Company | number; - published?: Array | number[]; - slug?: string; - start_date?: number; - start_date_category?: DateFormatStartDateCategoryEnum; - updated_at?: number; - url?: string; - websites?: Array | number[]; -} - -declare interface CompanyLogo extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface CompanyWebsite extends ApiObject { - id: number; - category?: WebsiteCategoryEnum; - trusted?: boolean; - url?: string; -} - -declare interface Cover extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - game?: Game | number; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface ExternalGame extends ApiObject { - id: number; - category?: ExternalGameCategoryEnum; - created_at?: number; - game?: Game | number; - name?: string; - uid?: string; - updated_at?: number; - url?: string; - year?: number; -} - -declare interface Feed extends ApiObject { - id: number; - category?: FeedCategoryEnum; - content?: string; - created_at?: number; - feed_likes_count?: number; - feed_video?: GameVideo | number; - games?: Array | number[]; - meta?: string; - published_at?: number; - pulse?: Pulse | number; - slug?: string; - title?: string; - uid?: string; - updated_at?: number; - url?: string; - user?: number; -} - -declare interface Franchise extends ApiObject { - id: number; - created_at?: number; - games?: Array | number[]; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -export interface Game extends ApiObject { - id: number; - age_ratings?: Array | number[]; - aggregated_rating?: number; - aggregated_rating_count?: number; - alternative_names?: Array | number[]; - artworks?: Array | number[]; - bundles?: Array | number[]; - category?: GameCategoryEnum; - collection?: Collection | number; - cover?: Cover | number; - created_at?: number; - dlcs?: Array | number[]; - expansions?: Array | number[]; - external_games?: Array | number[]; - first_release_date?: number; - follows?: number; - franchise?: Franchise | number; - franchises?: Array | number[]; - game_engines?: Array | number[]; - game_modes?: Array | number[]; - genres?: Array | number[]; - hypes?: number; - involved_companies?: Array | number[]; - keywords?: Array | number[]; - multiplayer_modes?: Array | number[]; - name?: string; - parent_game?: Game | number; - platforms?: Array | number[]; - player_perspectives?: Array | number[]; - popularity?: number; - pulse_count?: number; - rating?: number; - rating_count?: number; - release_dates?: Array | number[]; - screenshots?: Array | number[]; - similar_games?: Array | number[]; - slug?: string; - standalone_expansions?: Array | number[]; - status?: GameStatusEnum; - storyline?: string; - summary?: string; - tags?: Array; - themes?: Array | number[]; - time_to_beat?: TimeToBeat | number; - total_rating?: number; - total_rating_count?: number; - updated_at?: number; - url?: string; - version_parent?: Game | number; - version_title?: string; - videos?: Array | number[]; - websites?: Array | number[]; -} - -declare interface GameEngine extends ApiObject { - id: number; - companies?: Array | number[]; - created_at?: number; - description?: string; - logo?: GameEngineLogo | number; - name?: string; - platforms?: Array | number[]; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface GameEngineLogo extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface GameMode extends ApiObject { - id: number; - created_at?: number; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface GameVersionFeature extends ApiObject { - id: number; - category?: GameVersionFeatureCategoryEnum; - description?: string; - position?: number; - title?: string; - values?: Array | number[]; -} - -declare interface GameVersionFeatureValue extends ApiObject { - id: number; - game?: Game | number; - game_feature?: GameVersionFeature | number; - included_feature?: GameVersionFeatureValueIncludedFeatureEnum; - note?: string; -} - -declare interface GameVideo extends ApiObject { - id: number; - game?: Game | number; - name?: string; - video_id?: string; -} - -declare interface Genre extends ApiObject { - id: number; - created_at?: number; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface InvolvedCompany extends ApiObject { - id: number; - company?: Company | number; - created_at?: number; - developer?: boolean; - game?: Game | number; - porting?: boolean; - publisher?: boolean; - supporting?: boolean; - updated_at?: number; -} - -declare interface Keyword extends ApiObject { - id: number; - created_at?: number; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface List extends ApiObject { - id: number; - created_at?: number; - description?: string; - entries_count?: number; - list_entries?: Array | number[]; - list_tags?: Array; - listed_games?: Array | number[]; - name?: string; - numbering?: boolean; - private?: boolean; - similar_lists?: Array | number[]; - slug?: string; - updated_at?: number; - url?: string; - user?: User | number; -} - -declare interface ListEntry extends ApiObject { - id: number; - description?: string; - game?: Game | number; - list?: List | number; - platform?: Platform | number; - position?: number; - private?: boolean; - user?: User | number; -} - -declare interface MultiplayerMode extends ApiObject { - id: number; - campaigncoop?: boolean; - dropin?: boolean; - game?: Game | number; - lancoop?: boolean; - offlinecoop?: boolean; - offlinecoopmax?: number; - offlinemax?: number; - onlinecoop?: boolean; - onlinecoopmax?: number; - onlinemax?: number; - platform?: Platform | number; - splitscreen?: boolean; - splitscreenonline?: boolean; -} - -declare interface Page extends ApiObject { - id: number; - background?: PageBackground | number; - battlenet?: string; - category?: PageCategoryEnum; - color?: ColorColorEnum; - company?: Company | number; - country?: number; - created_at?: number; - description?: string; - feed?: Feed | number; - game?: Game | number; - name?: string; - origin?: string; - page_follows_count?: number; - page_logo?: PageLogo | number; - slug?: string; - sub_category?: PageSubCategoryEnum; - updated_at?: number; - uplay?: string; - url?: string; - user?: User | number; - websites?: Array | number[]; -} - -declare interface PageBackground extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface PageLogo extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface PageWebsite extends ApiObject { - id: number; - category?: WebsiteCategoryEnum; - trusted?: boolean; - url?: string; -} - -declare interface Person extends ApiObject { - id: number; - bio?: string; - characters?: Array | number[]; - country?: number; - created_at?: number; - credited_games?: Array | number[]; - description?: string; - dob?: number; - gender?: GenderGenderEnum; - loves_count?: number; - mug_shot?: PersonMugShot | number; - name?: string; - nicknames?: Array | number[]; - parent?: Person | number; - slug?: string; - updated_at?: number; - url?: string; - voice_acted?: Array | number[]; - websites?: Array | number[]; -} - -declare interface PersonMugShot extends ApiObject { - id: number; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface PersonWebsite extends ApiObject { - id: number; - category?: WebsiteCategoryEnum; - trusted?: boolean; - url?: string; -} - -declare interface Platform extends ApiObject { - id: number; - abbreviation?: string; - alternative_name?: string; - category?: PlatformCategoryEnum; - created_at?: number; - generation?: number; - name?: string; - platform_logo?: PlatformLogo | number; - product_family?: ProductFamily | number; - slug?: string; - summary?: string; - updated_at?: number; - url?: string; - versions?: Array | number[]; - websites?: Array | number[]; -} - -declare interface PlatformLogo extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface PlatformVersion extends ApiObject { - id: number; - companies?: Array | number[]; - connectivity?: string; - cpu?: string; - graphics?: string; - main_manufacturer?: PlatformVersionCompany | number; - media?: string; - memory?: string; - name?: string; - online?: string; - os?: string; - output?: string; - platform_logo?: PlatformLogo | number; - platform_version_release_dates?: Array | number[]; - resolutions?: string; - slug?: string; - sound?: string; - storage?: string; - summary?: string; - url?: string; -} - -declare interface PlatformVersionCompany extends ApiObject { - id: number; - comment?: string; - company?: Company | number; - developer?: boolean; - manufacturer?: boolean; -} - -declare interface PlatformVersionReleaseDate extends ApiObject { - id: number; - category?: DateFormatStartDateCategoryEnum; - created_at?: number; - date?: number; - human?: string; - m?: number; - platform_version?: PlatformVersion | number; - region?: RegionLanguageEnum; - updated_at?: number; - y?: number; -} - -declare interface PlatformWebsite extends ApiObject { - id: number; - category?: WebsiteCategoryEnum; - trusted?: boolean; - url?: string; -} - -declare interface PlayerPerspective extends ApiObject { - id: number; - created_at?: number; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface ProductFamily extends ApiObject { - id: number; - name?: string; - slug?: string; -} - -declare interface Pulse extends ApiObject { - id: number; - author?: string; - category?: number; - created_at?: number; - ignored?: boolean; - image?: string; - published_at?: number; - pulse_image?: PulseImage | number; - pulse_source?: PulseSource | number; - summary?: string; - tags?: Array; - title?: string; - uid?: string; - updated_at?: number; - videos?: Array | number[]; - website?: PulseUrl | number; -} - -declare interface PulseImage extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface PulseSource extends ApiObject { - id: number; - game?: Game | number; - name?: string; - page?: Page | number; -} - -declare interface PulseUrl extends ApiObject { - id: number; - trusted?: boolean; - url?: string; -} - -declare interface ReleaseDate extends ApiObject { - id: number; - category?: DateFormatStartDateCategoryEnum; - created_at?: number; - date?: number; - game?: Game | number; - human?: string; - m?: number; - platform?: Platform | number; - region?: RegionLanguageEnum; - updated_at?: number; - y?: number; -} - -declare interface Screenshot extends ApiObject { - id: number; - alpha_channel?: boolean; - animated?: boolean; - game?: Game | number; - height?: number; - image_id?: string; - url?: string; - width?: number; -} - -declare interface SocialMetric extends ApiObject { - id: number; - category?: SocialMetricCategoryEnum; - created_at?: number; - social_metric_source?: SocialMetricSource | number; - value?: number; -} - -declare interface SocialMetricSource extends ApiObject { - id: number; - category?: number; - channel?: string; - channel_title?: string; - created_at?: number; - duration?: number; - external_id?: string; - game?: Game | number; - internal_name?: string; - meta?: string; - metric_tags?: Array | number[]; - published_at?: number; - social_metrics?: Array | number[]; - social_network?: SocialMetricSourceSocialNetworkEnum; - title?: string; - updated_at?: number; - url?: string; -} - -declare interface Theme extends ApiObject { - id: number; - created_at?: number; - name?: string; - slug?: string; - updated_at?: number; - url?: string; -} - -declare interface TimeToBeat extends ApiObject { - id: number; - completely?: number; - game?: Game | number; - hastly?: number; - normally?: number; -} - -declare interface User extends ApiObject { - id: number; - battlenet?: string; - color?: ColorColorEnum; - created_at?: number; - discord?: string; - facebook?: string; - google_plus?: string; - instagram?: string; - linkedin?: string; - origin?: string; - pinterest?: string; - presentation?: string; - reddit?: string; - role?: UserRoleEnum; - slug?: string; - soundcloud?: string; - steam?: string; - twitch?: string; - twitter?: string; - updated_at?: number; - uplay?: string; - url?: string; - username?: string; - youtube?: string; -} - -declare interface Website extends ApiObject { - id: number; - category?: WebsiteCategoryEnum; - game?: Game | number; - trusted?: boolean; - url?: string; -} - -declare const enum RegionLanguageEnum { - REGION_LANGUAGE_NULL = 0, - EUROPE = 1, - NORTH_AMERICA = 2, - AUSTRALIA = 3, - NEW_ZELAND = 4, - JAPAN = 5, - CHINA = 6, - ASIA = 7, - WORLDWIDE = 8, - HONG_KONG = 9, - SOUTH_KOREA = 10 -} - -export enum AgeRatingRatingEnum { - AGERATING_RATING_NULL = 0, - THREE = 1, - SEVEN = 2, - TWELVE = 3, - SIXTEEN = 4, - EIGHTEEN = 5, - RP = 6, - EC = 7, - E = 8, - E10 = 9, - T = 10, - M = 11, - AO = 12 -} - -declare const enum AgeRatingCategoryEnum { - AGERATING_CATEGORY_NULL = 0, - ESRB = 1, - PEGI = 2 -} - -declare const enum GenderGenderEnum { - GENDER_GENDER_NULL = 0, - MALE = 1, - FEMALE = 2, - OTHER = 3 -} - -declare const enum CharacterSpeciesEnum { - CHARACTER_SPECIES_NULL = 0, - HUMAN = 1, - ALIEN = 2, - ANIMAL = 3, - ANDROID = 4, - UNKNOWN = 5 -} - -declare const enum DateFormatStartDateCategoryEnum { - YYYYMMMMDD = 0, - YYYYMMMM = 1, - YYYY = 2, - YYYYQ1 = 3, - YYYYQ2 = 4, - YYYYQ3 = 5, - YYYYQ4 = 6, - TBD = 7 -} - -declare const enum WebsiteCategoryEnum { - WEBSITE_CATEGORY_NULL = 0, - WEBSITE_OFFICIAL = 1, - WEBSITE_WIKIA = 2, - WEBSITE_WIKIPEDIA = 3, - WEBSITE_FACEBOOK = 4, - WEBSITE_TWITTER = 5, - WEBSITE_TWITCH = 6, - WEBSITE_INSTAGRAM = 8, - WEBSITE_YOUTUBE = 9, - WEBSITE_IPHONE = 10, - WEBSITE_IPAD = 11, - WEBSITE_ANDROID = 12, - WEBSITE_STEAM = 13, - WEBSITE_REDDIT = 14, - WEBSITE_ITCH = 15, - WEBSITE_EPICGAMES = 16, - WEBSITE_GOG = 17 -} - -declare const enum ExternalGameCategoryEnum { - EXTERNALGAME_CATEGORY_NULL = 0, - EXTERNALGAME_STEAM = 1, - EXTERNALGAME_GOG = 5, - EXTERNALGAME_YOUTUBE = 10, - EXTERNALGAME_MICROSOFT = 11, - EXTERNALGAME_APPLE = 13, - EXTERNALGAME_TWITCH = 14, - EXTERNALGAME_ANDROID = 15 -} - -declare const enum FeedCategoryEnum { - FEED_CATEGORY_NULL = 0, - PULSE_ARTICLE = 1, - COMING_SOON = 2, - NEW_TRAILER = 3, - USER_CONTRIBUTED_ITEM = 5, - USER_CONTRIBUTIONS_ITEM = 6, - PAGE_CONTRIBUTED_ITEM = 7 -} - -declare const enum GameCategoryEnum { - MAIN_GAME = 0, - DLC_ADDON = 1, - EXPANSION = 2, - BUNDLE = 3, - STANDALONE_EXPANSION = 4 -} - -declare const enum GameStatusEnum { - RELEASED = 0, - ALPHA = 2, - BETA = 3, - EARLY_ACCESS = 4, - OFFLINE = 5, - CANCELLED = 6 -} - -declare const enum GameVersionFeatureCategoryEnum { - BOOLEAN = 0, - DESCRIPTION = 1 -} - -declare const enum GameVersionFeatureValueIncludedFeatureEnum { - NOT_INCLUDED = 0, - INCLUDED = 1, - PRE_ORDER_ONLY = 2 -} - -declare const enum PageCategoryEnum { - PAGE_CATEGORY_NULL = 0, - PERSONALITY = 1, - MEDIA_ORGANIZATION = 2, - CONTENT_CREATOR = 3, - CLAN_TEAM = 4 -} - -declare const enum ColorColorEnum { - GREEN = 0, - BLUE = 1, - RED = 2, - ORANGE = 3, - PINK = 4, - YELLOW = 5 -} - -declare const enum PageSubCategoryEnum { - PAGE_SUB_CATEGORY_NULL = 0, - USER = 1, - GAME = 2, - COMPANY = 3, - CONSUMER = 4, - INDUSTRY = 5, - E_SPORTS = 6 -} - -declare const enum PlatformCategoryEnum { - PLATFORM_CATEGORY_NULL = 0, - CONSOLE = 1, - ARCADE = 2, - PLATFORM = 3, - OPERATING_SYSTEM = 4, - PORTABLE_CONSOLE = 5, - COMPUTER = 6 -} - -declare const enum SocialMetricCategoryEnum { - SOCIALMETRIC_CATEGORY_NULL = 0, - FOLLOWS = 1, - LIKES = 2, - HATES = 3, - SHARES = 4, - VIEW = 5, - COMMENTS = 6, - FAVORITES = 7 -} - -declare const enum SocialMetricSourceSocialNetworkEnum { - SOCIALMETRICSOURCE_SOCIAL_NETWORK_NULL = 0, - SOCIALMETRICSOURCE_OFFICIAL = 1, - SOCIALMETRICSOURCE_WIKIA = 2, - SOCIALMETRICSOURCE_WIKIPEDIA = 3, - SOCIALMETRICSOURCE_FACEBOOK = 4, - SOCIALMETRICSOURCE_TWITTER = 5, - SOCIALMETRICSOURCE_TWITCH = 6, - SOCIALMETRICSOURCE_INSTAGRAM = 8, - SOCIALMETRICSOURCE_YOUTUBE = 9, - SOCIALMETRICSOURCE_IPHONE = 10, - SOCIALMETRICSOURCE_IPAD = 11, - SOCIALMETRICSOURCE_ANDROID = 12, - SOCIALMETRICSOURCE_STEAM = 13, - SOCIALMETRICSOURCE_REDDIT = 14 -} - -declare const enum UserRoleEnum { - USER_ROLE_NULL = 0, - USER_USER = 1, - USER_ADVANCED_USER = 2, - USER_SUPER_ADVANCED_USER = 3, - USER_KEEPER = 4, - USER_ADMIN = 9, - USER_SUPER_ADMIN = 10 -} diff --git a/src/lib/types/definitions/Internals.ts b/src/lib/types/definitions/Internals.ts deleted file mode 100644 index 7ca2da29ce6..00000000000 --- a/src/lib/types/definitions/Internals.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { ScheduleEntity, Task } from '#lib/database'; -import type { IPieceError, Listener } from '@sapphire/framework'; -import type { Message } from 'discord.js'; - -export interface CommandHandler extends Listener { - run(message: Message): Promise; - runCommand(message: Message): Promise; -} - -export interface TaskErrorPayload extends IPieceError { - piece: Task; - entity: ScheduleEntity; -} diff --git a/src/lib/types/definitions/Kitsu.ts b/src/lib/types/definitions/Kitsu.ts deleted file mode 100644 index ec3ef6cf545..00000000000 --- a/src/lib/types/definitions/Kitsu.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { AlgoliaResult } from './AlgoliaSearch'; - -export namespace Kitsu { - export type KitsuResult = AlgoliaResult; - - export interface KitsuHit { - abbreviatedTitles: string[]; - ageRating: 'PG' | 'G' | string; - averageRating: number; - canonicalTitle: string; - description?: Description; - endDate: number; - episodeCount: number; - episodeLength: number; - favoritesCount: number; - id: number; - kind: 'anime' | string; - objectID: string; - season: 'spring' | 'summer' | 'autumn' | 'winter' | string; - seasonYear: number; - slug: string; - startDate: number; - subtype: 'TV' | 'movie' | 'special' | string; - synopsis?: string; - totalLength: number; - userCount: number; - year: number; - posterImage: KitsuPosterImage; - titles: Titles; - _tags: string[]; - } - - export interface KitsuPosterImageDimensions { - width: number | null; - height: number | null; - } - - export interface KitsuPosterImage { - tiny?: string; - small?: string; - medium?: string; - large?: string; - original?: string; - meta: { - dimensions: { - large: KitsuPosterImageDimensions; - medium: KitsuPosterImageDimensions; - small: KitsuPosterImageDimensions; - tiny: KitsuPosterImageDimensions; - }; - }; - } - - export interface Titles { - en?: string; - en_jp?: string; - en_us?: string; - ja_jp?: string; - } - - export interface Description { - en: string; - en_jp: string; - en_us: string; - ja_jp: string; - [key: string]: string; - } -} diff --git a/src/lib/types/definitions/Reddit.ts b/src/lib/types/definitions/Reddit.ts deleted file mode 100644 index a672d19429d..00000000000 --- a/src/lib/types/definitions/Reddit.ts +++ /dev/null @@ -1,177 +0,0 @@ -import type { NonNullObject } from '@sapphire/utilities'; - -export namespace Reddit { - export interface Response { - kind: string; - data: Data; - } - - export interface Data { - after: string; - before: null; - children: Child[]; - dist: number; - modhash: string; - } - - export interface Child { - kind: Kind; - data: PostDataElement; - } - - export interface PostDataElement { - all_awardings: any[]; - allow_live_comments: boolean; - approved_at_utc: null; - approved_by: null; - archived: boolean; - author: string; - author_flair_background_color: string | null; - author_flair_css_class: string | null; - author_flair_richtext: FlairRichtext[]; - author_flair_template_id: string | null; - author_flair_text: string | null; - author_flair_text_color: FlairTextColor | null; - author_flair_type: FlairType; - author_fullname: string; - author_patreon_flair: boolean; - author_premium: boolean; - awarders: unknown[]; - banned_at_utc: null; - banned_by: null; - can_gild: boolean; - can_mod_post: boolean; - category: null; - clicked: boolean; - content_categories: null; - contest_mode: boolean; - created: number; - created_utc: number; - discussion_type: null; - distinguished: null | string; - domain: string; - downs: number; - edited: boolean; - gilded: number; - gildings: NonNullObject; - hidden: boolean; - hide_score: boolean; - id: string; - is_crosspostable: boolean; - is_meta: boolean; - is_original_content: boolean; - is_reddit_media_domain: boolean; - is_robot_indexable: boolean; - is_self: boolean; - is_video: boolean; - likes: null; - link_flair_background_color: string; - link_flair_css_class: null; - link_flair_richtext: FlairRichtext[]; - link_flair_template_id: string; - link_flair_text: null; - link_flair_text_color: FlairTextColor; - link_flair_type: FlairType; - locked: boolean; - media: null; - media_embed: NonNullObject; - media_only: boolean; - mod_note: null; - mod_reason_by: null; - mod_reason_title: null; - mod_reports: unknown[]; - name: string; - no_follow: boolean; - num_comments: number; - num_crossposts: number; - num_reports: null; - over_18: boolean; - parent_whitelist_status: null | string; - permalink: string; - pinned: boolean; - post_hint: PostHint; - preview: Preview; - pwls: number | null; - quarantine: boolean; - removal_reason: null; - removed_by: null; - removed_by_category: string; - report_reasons: null; - saved: boolean; - score: number; - secure_media: null; - secure_media_embed: NonNullObject; - selftext: string; - selftext_html: null; - send_replies: boolean; - spoiler: boolean; - stickied: boolean; - subreddit: string; - subreddit_id: string; - subreddit_name_prefixed: string; - subreddit_subscribers: number; - subreddit_type: SubredditType; - suggested_sort: null; - thumbnail: string; - thumbnail_height: number; - thumbnail_width: number; - title: string; - top_awarded_type: null; - total_awards_received: number; - treatment_tags: unknown[]; - ups: number; - upvote_ratio: number; - url: string; - url_overridden_by_dest: string; - user_reports: unknown[]; - view_count: null; - visited: boolean; - whitelist_status: null | string; - wls: number | null; - } - - export interface FlairRichtext { - e: FlairType; - t: string; - } - - export enum FlairType { - Richtext = 'richtext', - Text = 'text' - } - - export enum FlairTextColor { - Dark = 'dark' - } - - export enum PostHint { - Link = 'link' - } - - export interface Preview { - images: Image[]; - enabled: boolean; - } - - export interface Image { - source: Source; - resolutions: Source[]; - variants: NonNullObject; - id: string; - } - - export interface Source { - url: string; - width: number; - height: number; - } - - export enum SubredditType { - Public = 'public', - Restricted = 'restricted' - } - - export enum Kind { - T3 = 't3' - } -} diff --git a/src/lib/types/definitions/StarWars.ts b/src/lib/types/definitions/StarWars.ts deleted file mode 100644 index f989a9eaf52..00000000000 --- a/src/lib/types/definitions/StarWars.ts +++ /dev/null @@ -1,92 +0,0 @@ -export const enum Resource { - Films = 'films', - People = 'people', - Planets = 'planets', - Species = 'species', - Starships = 'starships', - Vehicles = 'vehicles' -} - -export interface EmbedTitles { - [Resource.Films]: { - characters: string; - director: string; - episodeId: string; - planets: string; - producers: string; - releaseDate: string; - species: string; - starships: string; - vehicles: string; - }; - [Resource.People]: { - appearedInFilms: string; - eyeColours: string; - gender: string; - hairColours: string; - height: string; - homeworld: string; - mass: string; - ownedStarShips: string; - ownedVehicles: string; - skinColours: string; - species: string; - yearOfBirth: string; - }; - [Resource.Planets]: { - appearedInFilms: string; - averageSentientPopulation: string; - climates: string; - diameter: string; - gravity: string; - gravityBody: string; - orbitalPeriod: string; - residents: string; - rotationPeriod: string; - surfaceWaterPercentage: string; - terrains: string; - }; - [Resource.Species]: { - appearedInFilms: string; - averageHeight: string; - averageLifespan: string; - classification: string; - designation: string; - eyeColours: string; - hairColours: string; - homeworld: string; - knownPeopleOfSpecies: string; - language: string; - skinColours: string; - }; - [Resource.Starships]: { - amountOfPassengers: string; - appearedInFilms: string; - cargoCapacity: string; - consumables: string; - costInCredits: string; - crew: string; - hyperdriveRating: string; - length: string; - manufacturers: string; - maximumAtmospheringSpeed: string; - megalightsTravelSpeed: string; - model: string; - pilots: string; - starshipClass: string; - }; - [Resource.Vehicles]: { - amountOfPassengers: string; - appearedInFilms: string; - cargoCapacity: string; - consumables: string; - costInCredits: string; - crew: string; - length: string; - manufacturers: string; - maximumAtmospheringSpeed: string; - model: string; - pilots: string; - vehicleClass: string; - }; -} diff --git a/src/lib/types/definitions/Suggestion.ts b/src/lib/types/definitions/Suggestion.ts deleted file mode 100644 index 943a9d41194..00000000000 --- a/src/lib/types/definitions/Suggestion.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Message, User } from 'discord.js'; - -export interface SuggestionData { - author: User | null; - message: Message; - id: number; -} diff --git a/src/lib/types/definitions/Tmdb.ts b/src/lib/types/definitions/Tmdb.ts deleted file mode 100644 index 869df3d717b..00000000000 --- a/src/lib/types/definitions/Tmdb.ts +++ /dev/null @@ -1,91 +0,0 @@ -export namespace Tmdb { - export interface TmdbCommon { - id: number; - adult: boolean; - backdrop_path: string; - original_language: string; - original_title: string; - overview: string; - popularity: number; - poster_path: string; - release_date: string; - title: string; - video: boolean; - vote_average?: number; - vote_count?: number; - } - - export interface TmdbMovieList { - page: number; - total_pages: number; - total_results: number; - results: (TmdbCommon & { genre_ids: number[] })[]; - } - - export interface TmdbMovie extends TmdbCommon { - budget: number; - revenue: number; - tagline: string; - status: string; - homepage?: string; - runtime?: number; - imdb_id?: number; - genres: { id: number; name: string }[]; - spoken_language: { iso_639_1: number; name: string }[]; - production_countries?: { iso_3166_1: string; name: string }[]; - belongs_to_collection?: { id: number; name: string; poster_path: string }; - production_companies?: { id: number; logo_path: string | null; name: string; origin_country: string }[]; - } - - export interface TmdbSeriesList extends TmdbMovieList { - results: (TmdbCommon & { - genre_ids: number[]; - first_air_date: string; - origin_country: string[]; - })[]; - } - - export interface TmdbSerieEpisode { - id: number; - air_date: string; - episode_number: number; - name: string; - overview: string; - production_code: string; - season_number: number; - show_id: number; - still_path: string; - vote_average: number; - vote_count: number; - } - - export interface TmdbSerie extends TmdbCommon { - created_by: string[]; - episode_run_time: number[]; - first_air_date: string; - in_production: boolean; - languages: string[]; - status: string; - type: string; - name: string; - number_of_episodes: number; - number_of_seasons: number; - origin_country: string[]; - last_air_date: string; - last_episode_to_air: TmdbSerieEpisode; - next_episode_to_air: TmdbSerieEpisode | null; - homepage?: string; - seasons: { - id: number; - air_date: string; - episode_count: number; - name: string; - overview: string; - poster_path: string; - season_number: number; - }[]; - genres: { id: number; name: string }[]; - networks: { id: number; logo_path: string; name: string; origin_country: string }[]; - production_companies?: { id: number; logo_path: string | null; name: string; origin_country: string }[]; - } -} diff --git a/src/lib/types/definitions/Twitch.ts b/src/lib/types/definitions/Twitch.ts deleted file mode 100644 index 8c4901ba774..00000000000 --- a/src/lib/types/definitions/Twitch.ts +++ /dev/null @@ -1,197 +0,0 @@ -import type { NonNullObject } from '@sapphire/utilities'; - -export const enum TwitchHelixUserType { - Staff = 'staff', - Admin = 'admin', - GlobalMod = 'global_mod', - Normal = '' -} - -export const enum TwitchHelixBroadcasterType { - Partner = 'partner', - Affiliate = 'affiliate', - Normal = '' -} - -export interface TwitchHelixBearerToken { - EXPIRE: number | null; - - TOKEN: string | null; -} - -export interface TwitchHelixResponse { - data: T[]; -} - -export interface TwitchHelixOauth2Result { - access_token: string; - - expires_in: number; - - refresh_token: string; - - scope: string; -} - -export interface TwitchHelixUsersSearchResult { - broadcaster_type: TwitchHelixBroadcasterType; - - description: string; - - display_name: string; - - email?: string; - - id: string; - - login: string; - - offline_image_url: string; - - profile_image_url: string; - - type: TwitchHelixUserType; - - view_count: number; -} - -export interface TwitchHelixUserFollowsResult { - /** In the format of YYYY-MM-DD[T]HH:mm:ssZ, so can be parsed to a Date */ - followed_at: string; - - /** The ID of the user following a streamer */ - from_id: string; - - /** The name of the user following a streamer */ - from_name: string; - - /** The ID of the channel that the user follows */ - to_id: string; - - /** The name of the channel that the user follows */ - to_name: string; -} - -export interface TwitchHelixGameSearchResult { - /** Template URL for the game’s box art. */ - box_art_url: string; - - /** ID of the game. */ - id: string; - - /** Name of the game. */ - name: string; -} - -export interface TwitchHelixStreamsResult { - /** Template URL for the game’s box art. */ - game_box_art_url?: string; - - /** ID of the game being played on the stream. */ - game_id: string; - - /** Name of the game being played. */ - game_name: string; - - /** Stream ID. */ - id: string; - - /** Indicates if the broadcaster has specified their channel contains mature content that may be inappropriate for younger audiences. */ - is_mature: boolean; - - /** Stream language. A language value is either the {@linkplain https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes ISO 639-1} two-letter code for a {@linkplain https://help.twitch.tv/s/article/languages-on-twitch#streamlang supported stream language} or “other”. */ - language: string; - - /** UTC timestamp. */ - started_at: Date; - - /** Shows tag IDs that apply to the stream. */ - tag_ids: string[]; - - /** Thumbnail URL of the stream. All image URLs have variable width and height. You can replace `{width}` and `{height}` with any values to get that size image */ - thumbnail_url: string; - - /** Stream title. */ - title: string; - - /** Stream type: "live" or "" (in case of error). */ - type: string; - - /** ID of the user who is streaming. */ - user_id: string; - - /** Login of the user who is streaming. */ - user_login: string; - - /** Display name corresponding to {@link TwitchHelixStreamsResult.user_id}. */ - user_name: string; - - /** Number of viewers watching the stream at the time of the query. */ - viewer_count: number; -} - -export enum TwitchEventSubTypes { - StreamOnline = 'stream.online', - StreamOffline = 'stream.offline' -} - -export interface TwitchEventSubResult { - condition: { - broadcaster_user_id: string; - }; - - cost: number; - - created_at: string; - - id: string; - - status: string; - - transport: { - method: string; - callback: string; - }; - - type: TwitchEventSubTypes; - - version: string; -} - -export interface TwitchEventSubVerificationMessage { - challenge: string; - - event: TwitchEventSubEvent; - - subscription: TwitchEventSubResult; -} - -export type TwitchEventSubEvent = T & { - broadcaster_user_id: string; - broadcaster_user_login: string; - broadcaster_user_name: string; -}; - -export type TwitchEventSubOnlineEvent = TwitchEventSubEvent<{ - id: string; - type: 'live'; - started_at: string; -}>; - -export interface TwitchOnlineEmbedData { - embedImageUrl?: string; - - embedThumbnailUrl?: string; - - gameName?: string; - - language?: string; - - startedAt: Date; - - title: string; - - userName: string; - - viewerCount?: number; -} diff --git a/src/lib/types/definitions/index.ts b/src/lib/types/definitions/index.ts deleted file mode 100644 index 068c4a9a532..00000000000 --- a/src/lib/types/definitions/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './AniList'; -export * from './ArgumentTypes'; -export * from './Igdb'; -export * from './Internals'; -export * from './Kitsu'; -export * from './Reddit'; -export * from './StarWars'; -export * from './Suggestion'; -export * from './Tmdb'; -export * from './Twitch'; diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts deleted file mode 100644 index b6ff001d71d..00000000000 --- a/src/lib/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './definitions'; -export type { DMMessage, GuildMessage } from './Discord'; -export * from './Utils'; diff --git a/src/lib/util/APIs/AniList.ts b/src/lib/util/APIs/AniList.ts deleted file mode 100644 index d8921b01e44..00000000000 --- a/src/lib/util/APIs/AniList.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Page } from '#lib/types/definitions/AniList'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { UserError } from '@sapphire/framework'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { cutText } from '@sapphire/utilities'; -import { decode } from 'he'; -import { gql } from '../util'; - -const MediaFragment = gql` - fragment MediaFragment on Media { - id - title { - romaji - english - native - } - description - isAdult - countryOfOrigin - duration - siteUrl - externalLinks { - url - site - } - } -`; - -/** - * Regex to remove excessive new lines from the Anime or Manga description - */ -const excessiveNewLinesRegex = /\n{3,}/g; - -/** - * Regex to remove HTML entities from the Anime or Manga description - */ -const htmlEntityRegex = /<\/?(i|b|br)>/g; - -/** - * Replacements for HTML entities - */ -const htmlEntityReplacements = Object.freeze({ - i: '_', - em: '_', - var: '_', - b: '**', - br: '\n', - code: '```', - pre: '`', - mark: '`', - kbd: '`', - s: '~~', - wbr: '', - u: '__' -} as const); - -export const getAnime = gql` - ${MediaFragment} - - query ($search: String!) { - Page(page: 1, perPage: 10) { - pageInfo { - total - } - media(search: $search, type: ANIME) { - ...MediaFragment - episodes - } - } - } -`; - -export const getManga = gql` - ${MediaFragment} - - query ($search: String!) { - Page(page: 1, perPage: 10) { - pageInfo { - total - } - media(search: $search, type: MANGA) { - ...MediaFragment - chapters - volumes - } - } - } -`; - -export async function fetchAniList( - query: string, - variables: { - search: string; - } -): Promise { - try { - return fetch( - 'https://graphql.anilist.co/', - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson - }, - body: JSON.stringify({ - query, - variables - }) - }, - FetchResultTypes.JSON - ); - } catch { - throw new UserError({ identifier: LanguageKeys.System.QueryFail }); - } -} - -export function parseDescription(description: string) { - return cutText( - decode(description.replace(htmlEntityRegex, (_, type: keyof typeof htmlEntityReplacements) => htmlEntityReplacements[type])).replace( - excessiveNewLinesRegex, - '\n\n' - ), - 500 - ); -} - -interface AniListResponse { - data: { - Page: Page; - }; -} diff --git a/src/lib/util/APIs/Hastebin.ts b/src/lib/util/APIs/Hastebin.ts deleted file mode 100644 index 5a7c24d1205..00000000000 --- a/src/lib/util/APIs/Hastebin.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { envParseString } from '@skyra/env-utilities'; - -interface HastebinResponse { - key: string; -} - -const hastebinBaseUrlPost = envParseString('HASTEBIN_POST_URL'); -const hastebinBaseUrlGet = envParseString('HASTEBIN_GET_URL'); - -export async function getHaste(result: string, language = 'js') { - const { key } = await fetch( - `${hastebinBaseUrlPost}/documents`, - { - method: FetchMethods.Post, - body: result - }, - FetchResultTypes.JSON - ); - return `${hastebinBaseUrlGet}/${key}.${language}`; -} diff --git a/src/lib/util/APIs/Saelem.ts b/src/lib/util/APIs/Saelem.ts deleted file mode 100644 index 84aaf050d3b..00000000000 --- a/src/lib/util/APIs/Saelem.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { UserError } from '@sapphire/framework'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { envParseString } from '@skyra/env-utilities'; -import type { Query, QueryGetHoroscopeArgs } from '@skyra/saelem'; -import { gql } from '../util'; - -export const getHoroscope = gql` - query getHoroscope($sunsign: Sunsigns!, $day: Days!) { - getHoroscope(sunsign: $sunsign, day: $day) { - date - intensity - keywords - mood - prediction - rating - } - } -`; - -export async function fetchSaelem(query: string, variables: SaelemQueryVariables) { - try { - return await fetch>( - envParseString('SAELEM_URL'), - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson - }, - body: JSON.stringify({ - query, - variables - }) - }, - FetchResultTypes.JSON - ); - } catch { - // No need to throw anything specific here, it is caught off in the commands' fetchAPI method. - throw new UserError({ identifier: LanguageKeys.System.QueryFail }); - } -} - -export type SaelemQueryReturnTypes = keyof Pick; - -export interface SaelemResponse> { - data: Record>; -} - -type SaelemQueryVariables = R extends 'getHoroscope' ? QueryGetHoroscopeArgs : never; diff --git a/src/lib/util/APIs/StarWars.ts b/src/lib/util/APIs/StarWars.ts deleted file mode 100644 index 2480d58de57..00000000000 --- a/src/lib/util/APIs/StarWars.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { UserError } from '@sapphire/framework'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { envParseString } from '@skyra/env-utilities'; -import type { - Query, - QueryGetFuzzyFilmArgs, - QueryGetFuzzyPersonArgs, - QueryGetFuzzyPlanetArgs, - QueryGetFuzzySpeciesArgs, - QueryGetFuzzyStarshipArgs, - QueryGetFuzzyVehicleArgs -} from '@skyra/star-wars-api'; -import { gql } from '../util'; - -export const getFilms = gql` - query ($film: String!, $take: Int, $reverse: Boolean) { - getFuzzyFilm(film: $film, take: $take, reverse: $reverse) { - director - episodeId - releaseDate - openingCrawl - producers - title - characters { - name - } - planets { - name - } - species { - name - } - starships { - name - } - vehicles { - name - } - } - } -`; - -export const getPerson = gql` - query ($person: String!, $take: Int, $reverse: Boolean) { - getFuzzyPerson(person: $person, take: $take, reverse: $reverse) { - birthYear - eyeColors - films { - title - } - gender - hairColors - height - homeworld { - name - } - mass - name - skinColors - species { - name - } - starships { - name - } - vehicles { - name - } - } - } -`; - -export const getPlanet = gql` - query ($planet: String!, $take: Int, $reverse: Boolean) { - getFuzzyPlanet(planet: $planet, take: $take, reverse: $reverse) { - climates - diameter - films { - title - } - gravity - name - orbitalPeriod - population - residents { - name - } - rotationPeriod - surfaceWater - terrains - } - } -`; - -export const getSpecies = gql` - query ($species: String!, $take: Int, $reverse: Boolean) { - getFuzzySpecies(species: $species, take: $take, reverse: $reverse) { - averageHeight - averageLifespan - classification - designation - eyeColors - films { - title - } - hairColors - homeworld { - name - } - language - name - people { - name - } - skinColors - } - } -`; - -export const getStarship = gql` - query ($starship: String!, $take: Int, $reverse: Boolean) { - getFuzzyStarship(starship: $starship, take: $take, reverse: $reverse) { - cargoCapacity - consumables - costInCredits - crew - films { - title - } - hyperdriveRating - length - manufacturers - maxAtmospheringSpeed - MGLT - model - name - passengers - pilots { - name - } - starshipClass - } - } -`; - -export const getVehicles = gql` - query ($vehicle: String!, $take: Int, $reverse: Boolean) { - getFuzzyVehicle(vehicle: $vehicle, take: $take, reverse: $reverse) { - cargoCapacity - consumables - costInCredits - crew - films { - title - } - length - manufacturers - maxAtmospheringSpeed - model - name - passengers - pilots { - name - } - vehicleClass - } - } -`; - -export async function fetchStarWarsApi( - query: string, - variables: StarWarsQueryVariables -): Promise> { - try { - return fetch>( - envParseString('GRAPHQL_STARWARS_URL'), - { - method: FetchMethods.Post, - headers: { - 'Content-Type': MimeTypes.ApplicationJson - }, - body: JSON.stringify({ - query, - variables - }) - }, - FetchResultTypes.JSON - ); - } catch (error) { - throw new UserError({ identifier: LanguageKeys.System.QueryFail }); - } -} - -export interface StarWarsResponse> { - data: Record>; -} - -export type StarWarsQueryReturnTypes = keyof Pick< - Query, - 'getFuzzyFilm' | 'getFuzzyPerson' | 'getFuzzyPlanet' | 'getFuzzySpecies' | 'getFuzzyStarship' | 'getFuzzyVehicle' ->; - -type StarWarsQueryVariables = R extends 'getFuzzyFilm' - ? QueryGetFuzzyFilmArgs - : R extends 'getFuzzyPlanet' - ? QueryGetFuzzyPlanetArgs - : R extends 'getFuzzyPerson' - ? QueryGetFuzzyPersonArgs - : R extends 'getFuzzySpecies' - ? QueryGetFuzzySpeciesArgs - : R extends 'getFuzzyStarship' - ? QueryGetFuzzyStarshipArgs - : R extends 'getFuzzyVehicle' - ? QueryGetFuzzyVehicleArgs - : never; diff --git a/src/lib/util/Color.ts b/src/lib/util/Color.ts deleted file mode 100644 index 1ec559dc957..00000000000 --- a/src/lib/util/Color.ts +++ /dev/null @@ -1,63 +0,0 @@ -import * as Resolver from '#lib/structures/color'; - -const REGEXP = { - B10: /^(?:\d{1,8}|0o[0-7]{1,8}|0x[0-9a-fA-F]{1,6}|0b[01]{1,24})$/, - HEX: /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/i, - HEX_EXEC: /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/i, - HSL: /^hsl\(\d{1,3},\s?\d{1,3},\s?\d{1,3}\)$/i, - HSL_EXEC: /^hsl\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3})\)$/i, - RANDOM: /^(?:r|random)$/i, - RGB: /^rgba?\(\d{1,3},\s?\d{1,3},\s?\d{1,3}(?:,.+)?\)$/i, - RGB_EXEC: /^rgba?\((\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3})(?:,.+)?\)$/i -}; - -export function parse(input: string): Resolver.ColorHandler | null { - if (REGEXP.RANDOM.test(input)) return _generateRandom(); - const output = _HEX(input) || _B10(input) || _RGB(input) || _HSL(input); - - return output; -} - -function generateBetween(max: number, min: number): number { - return Math.floor(Math.random() * (max - min)) + 1 + min; -} - -export function luminance(r: number, g: number, b: number): number { - return 0.299 * r ** 2 + 0.587 * g ** 2 + 0.114 * b ** 2; -} - -export function hexConcat(r: number, g: number, b: number) { - return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`; -} - -function _generateRandom() { - return new Resolver.HSL(generateBetween(360, 0), generateBetween(100, 75), generateBetween(100, 65)); -} - -function _HEX(input: string) { - if (!REGEXP.HEX.test(input)) return null; - let raw = REGEXP.HEX_EXEC.exec(input)![1]; - if (raw.length === 3) - raw = raw - .split('') - .map((char) => char + char) - .join(''); - return new Resolver.HEX(raw.substring(0, 2), raw.substring(2, 4), raw.substring(4, 6)); -} - -function _RGB(input: string) { - if (!REGEXP.RGB.test(input)) return null; - const raw = REGEXP.RGB_EXEC.exec(input)!; - return new Resolver.RGB(parseInt(raw[1], 10), parseInt(raw[2], 10), parseInt(raw[3], 10)); -} - -function _HSL(input: string) { - if (!REGEXP.HSL.test(input)) return null; - const raw = REGEXP.HSL_EXEC.exec(input)!; - return new Resolver.HSL(parseInt(raw[1], 10), parseInt(raw[2], 10), parseInt(raw[3], 10)); -} - -function _B10(input: string) { - if (!REGEXP.B10.test(input)) return null; - return new Resolver.B10(input); -} diff --git a/src/lib/util/External/escapeMarkdown.ts b/src/lib/util/External/escapeMarkdown.ts deleted file mode 100644 index 9dadf6ecc7e..00000000000 --- a/src/lib/util/External/escapeMarkdown.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Copyright 2015 - 2020 Amish Shah - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * The escape markdown options. - */ -export interface EscapeMarkdownOptions { - /** - * Whether or not to escape codeblocks - * @default true - */ - codeBlock?: boolean; - - /** - * Whether or not to escape inline codes - * @default true - */ - inlineCode?: boolean; - - /** - * Whether or not to escape bold text - * @default true - */ - bold?: boolean; - - /** - * Whether or not to escape italic text - * @default true - */ - italic?: boolean; - - /** - * Whether or not to escape underline text - * @default true - */ - underline?: boolean; - - /** - * Whether or not to escape strikethrough text - * @default true - */ - strikethrough?: boolean; - - /** - * Whether or not to escape spoiler text - * @default true - */ - spoiler?: boolean; - - /** - * Whether or not to escape codeblock content - * @default true - */ - codeBlockContent?: boolean; - - /** - * Whether or not to escape inline code content - * @default true - */ - inlineCodeContent?: boolean; -} - -/** - * Escapes any Discord-flavour markdown in a string - * @param text Content to escape - * @param options What types of markdown to escape. Any undefined options are defaulted to `true` - */ -export function escapeMarkdown( - text: string, - { - codeBlock = true, - inlineCode = true, - bold = true, - italic = true, - underline = true, - strikethrough = true, - spoiler = true, - codeBlockContent = true, - inlineCodeContent = true - }: Partial = {} -): string { - if (!codeBlockContent) { - return text - .split('```') - .map((subString, index, array) => { - if (index % 2 && index !== array.length - 1) return subString; - return escapeMarkdown(subString, { - inlineCode, - bold, - italic, - underline, - strikethrough, - spoiler, - inlineCodeContent - }); - }) - .join(codeBlock ? '\\`\\`\\`' : '```'); - } - if (!inlineCodeContent) { - return text - .split(/(?<=^|[^`])`(?=[^`]|$)/g) - .map((subString, index, array) => { - if (index % 2 && index !== array.length - 1) return subString; - return escapeMarkdown(subString, { - codeBlock, - bold, - italic, - underline, - strikethrough, - spoiler - }); - }) - .join(inlineCode ? '\\`' : '`'); - } - if (inlineCode) text = escapeInlineCode(text); - if (codeBlock) text = escapeCodeBlock(text); - if (italic) text = escapeItalic(text); - if (bold) text = escapeBold(text); - if (underline) text = escapeUnderline(text); - if (strikethrough) text = escapeStrikethrough(text); - if (spoiler) text = escapeSpoiler(text); - return text; -} - -/** - * Escapes bold markdown in a string - * @param text Content to escape - */ -export function escapeBold(text: string): string { - let i = 0; - return text.replace(/\*\*(\*)?/g, (_, match) => { - if (match) return ++i % 2 ? `${match}\\*\\*` : `\\*\\*${match}`; - return '\\*\\*'; - }); -} - -/** - * Escapes italic markdown in a string - * @param text Content to escape - */ -export function escapeItalic(text: string): string { - let i = 0; - return (text = text.replace(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => { - if (match === '**' || match === '__') return ++i % 2 ? `\\*${match}` : `${match}\\*`; - return `\\*${match}`; - })); -} - -/** - * Escapes underline markdown in a string - * @param text Content to escape - */ -export function escapeUnderline(text: string): string { - let i = 0; - return text.replace(/__(_)?/g, (_, match) => { - if (match) return ++i % 2 ? `${match}\\_\\_` : `\\_\\_${match}`; - return '\\_\\_'; - }); -} - -/** - * Escapes inline code markdown in a string - * @param text Content to escape - */ -export function escapeInlineCode(text: string): string { - return text.replace(/(?<=^|[^`])`(?=[^`]|$)/g, '\\`'); -} - -/** - * Escapes spoiler markdown in a string - * @param text Content to escape - */ -export function escapeSpoiler(text: string): string { - return text.replace(/\|\|/g, '\\|\\|'); -} - -/** - * Escapes strikethrough markdown in a string - * @param text Content to escape - */ -export function escapeStrikethrough(text: string): string { - return text.replace(/~~/g, '\\~\\~'); -} - -/** - * Escapes code block markdown in a string - * @param text Content to escape - */ -export function escapeCodeBlock(text: string) { - return text.replace(/```/g, '\\`\\`\\`'); -} diff --git a/src/lib/util/Leaderboard.ts b/src/lib/util/Leaderboard.ts deleted file mode 100644 index 375631e2887..00000000000 --- a/src/lib/util/Leaderboard.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { Collection } from '@discordjs/collection'; -import { container } from '@sapphire/framework'; -import { minutes } from './common'; -import { PreciseTimeout } from './PreciseTimeout'; - -/** - * The Leaderboard singleton class in charge of storing local and global leaderboards - * @version 2.1.0 - */ -export class Leaderboard { - /** - * The cached global leaderboard - */ - public readonly global = new Collection(); - - /** - * The cached collection for local leaderboards - */ - public readonly local = new Collection>(); - - /** - * The timeouts object - */ - private readonly kTimeouts: LeaderboardTimeouts = { - guilds: new Collection(), - users: null - }; - - /** - * The temporal promises - */ - private readonly kTempPromises: LeaderboardPromises = { - guilds: new Collection(), - users: null - }; - - public async fetch(guild?: string) { - if (guild) { - if (this.kTempPromises.guilds.has(guild)) await this.kTempPromises.guilds.get(guild); - else if (!this.local.has(guild)) await this.syncMembers(guild); - return this.local.get(guild)!; - } - - if (this.kTempPromises.users) await this.kTempPromises.users; - else if (this.global.size === 0) await this.syncUsers(); - return this.global; - } - - /** - * Clear the entire cache and timeouts - */ - public dispose(): void { - this.clearGuilds(); - this.clearUsers(); - } - - /** - * Clear the guilds cache - */ - public clearGuilds(): void { - for (const timeout of this.kTimeouts.guilds.values()) { - timeout.stop(); - } - } - - /** - * Clear the user leaderboard cache - */ - public clearUsers(): void { - if (this.kTimeouts.users) { - this.kTimeouts.users.stop(); - } - } - - /** - * Sync the leaderboard for the selected guild - * @param guild A guild id - */ - private async syncMembers(guild: string): Promise { - // If it's still on timeout, reset it - if (this.kTimeouts.guilds.has(guild)) { - this.kTimeouts.guilds.get(guild)!.stop(); - } - // It's not deleting the entry as the previous run will resolve - - // Get the sorted data from the db - const promise = new Promise((resolve) => this.createMemberSyncHandle(guild).then(resolve)); - - this.kTempPromises.guilds.set(guild, promise); - await promise; - - // Set the timeout for the refresh - const timeout = new PreciseTimeout(minutes(10)); - this.kTimeouts.guilds.set(guild, timeout); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - timeout.run().then(() => { - this.kTimeouts.guilds.delete(guild); - this.local.get(guild)?.clear(); - this.local.delete(guild); - }); - } - - private async createMemberSyncHandle(guild: string) { - const { members } = container.db; - const data = await members - .createQueryBuilder() - .select(['user_id', 'points']) - .where('guild_id = :guild', { guild }) - .andWhere('points >= 25') - .orderBy('points', 'DESC') - .limit(5000) - .getRawMany<{ user_id: string; points: number }>(); - - // Clear the leaderboards for said guild - if (this.local.has(guild)) this.local.get(guild)!.clear(); - else this.local.set(guild, new Collection()); - - // Get the store and initialize the position number, then save all entries - const store = this.local.get(guild)!; - let i = 0; - for (const entry of data) { - store.set(entry.user_id, { points: entry.points, position: ++i }); - } - - this.kTempPromises.guilds.delete(guild); - } - - /** - * Sync the global leaderboard - */ - private async syncUsers(): Promise { - const promise = new Promise((resolve) => this.createUserSyncHandle().then(resolve)); - await (this.kTempPromises.users = promise); - - // If it's still on timeout, reset it - this.clearUsers(); - - // Set the timeout for the refresh - this.kTimeouts.users = new PreciseTimeout(minutes(15)); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.kTimeouts.users.run().then(() => { - this.kTimeouts.users = null; - this.global.clear(); - }); - } - - private async createUserSyncHandle() { - const { users } = container.db; - // Get the sorted data from the db - const data = await users - .createQueryBuilder() - .select(['id', 'points']) - .where('points >= 25') - .orderBy('points', 'DESC') - .limit(25000) - .getRawMany<{ id: string; points: number }>(); - - // Get the store and initialize the position number, then save all entries - this.global.clear(); - - let i = 0; - for (const entry of data) { - this.global.set(entry.id, { points: entry.points, position: ++i }); - } - - this.kTempPromises.users = null; - } -} - -export interface LeaderboardUser { - points: number; - position: number; -} - -interface LeaderboardTimeouts { - users: PreciseTimeout | null; - guilds: Collection; -} - -interface LeaderboardPromises { - /** - * The Promise that is syncing the user leaderboard cache with the database, if syncing - */ - users: Promise | null; - /** - * The collection of Promises that are running for each guild leaderboard, if syncing - */ - guilds: Collection>; -} diff --git a/src/lib/util/LongLivingReactionCollector.ts b/src/lib/util/LongLivingReactionCollector.ts deleted file mode 100644 index c760bf9fca6..00000000000 --- a/src/lib/util/LongLivingReactionCollector.ts +++ /dev/null @@ -1,98 +0,0 @@ -import type { GuildTextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { container } from '@sapphire/framework'; -import { noop } from '@sapphire/utilities'; -import type { Guild, User } from 'discord.js'; -import { minutes } from './common'; - -export type LongLivingReactionCollectorListener = (reaction: LLRCData) => void; - -export class LongLivingReactionCollector { - public listener: LongLivingReactionCollectorListener | null; - public endListener: (() => void) | null; - - private _timer: NodeJS.Timeout | null = null; - - public constructor(listener: LongLivingReactionCollectorListener | null = null, endListener: (() => void) | null = null) { - this.listener = listener; - this.endListener = endListener; - container.client.llrCollectors.add(this); - } - - public setListener(listener: LongLivingReactionCollectorListener | null) { - this.listener = listener; - return this; - } - - public setEndListener(listener: () => void) { - this.endListener = listener; - return this; - } - - public get ended(): boolean { - return !container.client.llrCollectors.has(this); - } - - public send(reaction: LLRCData): void { - if (this.listener) this.listener(reaction); - } - - public setTime(time: number) { - if (this._timer) clearTimeout(this._timer); - if (time === -1) this._timer = null; - else this._timer = setTimeout(() => this.end(), time); - return this; - } - - public end() { - if (!container.client.llrCollectors.delete(this)) return this; - - if (this._timer) { - clearTimeout(this._timer); - this._timer = null; - } - if (this.endListener) { - process.nextTick(this.endListener.bind(null)); - this.endListener = null; - } - return this; - } - - public static collectOne({ filter = () => true, time = minutes(5) }: LLRCCollectOneOptions = {}) { - return new Promise((resolve) => { - const llrc = new LongLivingReactionCollector( - (reaction) => { - if (filter(reaction)) { - resolve(reaction); - llrc.setEndListener(noop).end(); - } - }, - () => { - resolve(null); - } - ).setTime(time); - }); - } -} - -export interface LLRCCollectOneOptions { - filter?: (reaction: LLRCData) => boolean; - time?: number; -} - -export interface LLRCDataEmoji { - animated: boolean; - id: string | null; - managed: boolean | null; - name: string | null; - requireColons: boolean | null; - roles: string[] | null; - user: User | { id: string }; -} - -export interface LLRCData { - channel: GuildTextBasedChannelTypes; - emoji: LLRCDataEmoji; - guild: Guild; - messageId: string; - userId: string; -} diff --git a/src/lib/util/Notifications/Twitch.ts b/src/lib/util/Notifications/Twitch.ts deleted file mode 100644 index f503c3cc834..00000000000 --- a/src/lib/util/Notifications/Twitch.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { - TwitchEventSubResult, - TwitchEventSubTypes, - TwitchHelixBearerToken, - TwitchHelixGameSearchResult, - TwitchHelixOauth2Result, - TwitchHelixResponse, - TwitchHelixStreamsResult, - TwitchHelixUserFollowsResult, - TwitchHelixUsersSearchResult -} from '#lib/types/definitions/Twitch'; -import { Enumerable, EnumerableMethod } from '@sapphire/decorators'; -import { fetch, FetchMethods, FetchResultTypes } from '@sapphire/fetch'; -import { MimeTypes } from '@sapphire/plugin-api'; -import { RateLimitManager } from '@sapphire/ratelimits'; -import { Time } from '@sapphire/time-utilities'; -import { createHmac } from 'node:crypto'; -import { URL } from 'node:url'; - -export class Twitch { - public readonly ratelimitsStreams = new RateLimitManager(Time.Minute * 3000, 1); - public readonly BASE_URL_HELIX = 'https://api.twitch.tv/helix'; - public readonly BRANDING_COLOUR = 0x6441a4; - - @Enumerable(false) - private BEARER: TwitchHelixBearerToken = { - EXPIRE: null, - TOKEN: null - }; - - @Enumerable(false) - private readonly clientId = process.env.TWITCH_CLIENT_ID; - - @Enumerable(false) - private readonly clientSecret = process.env.TWITCH_TOKEN; - - @Enumerable(false) - private readonly eventSubSecret = process.env.TWITCH_EVENTSUB_SECRET; - - @Enumerable(false) - private readonly kTwitchRequestHeaders = { - 'Content-Type': MimeTypes.ApplicationJson, - Accept: MimeTypes.ApplicationJson, - 'Client-ID': this.clientId - }; - - public streamNotificationDrip(id: string) { - try { - this.ratelimitsStreams.acquire(id).consume(); - return false; - } catch { - return true; - } - } - - public async fetchUsers(ids: Iterable = [], logins: Iterable = []) { - const search: string[] = []; - for (const id of ids) search.push(`id=${encodeURIComponent(id)}`); - for (const login of logins) search.push(`login=${encodeURIComponent(login)}`); - return this._performApiGETRequest>(`users?${search.join('&')}`); - } - - public async fetchStream(broadcasterUserId: string): Promise { - const search = `user_id=${encodeURIComponent(broadcasterUserId)}`; - const streamResult = await this._performApiGETRequest>(`streams?${search}`); - const streamData = streamResult.data?.[0]; - - if (streamData) { - const gameSearch = `id=${encodeURIComponent(streamData.game_id)}`; - const gameResult = await this._performApiGETRequest>(`games?${gameSearch}`); - const gameData = gameResult.data?.[0]; - - if (gameData) { - return { - ...streamData, - game_box_art_url: gameData.box_art_url - }; - } - } - - return streamData ?? null; - } - - public async fetchUserFollowage(userId: string, channelId: string) { - return this._performApiGETRequest & { total: number }>( - `users/follows?from_id=${userId}&to_id=${channelId}` - ); - } - - public checkSignature(algorithm: string, signature: string, data: any) { - const hash = createHmac(algorithm, this.eventSubSecret).update(data).digest('hex'); - - return hash === signature; - } - - public fetchBearer() { - const { TOKEN, EXPIRE } = this.BEARER; - if (!EXPIRE || !TOKEN) return this._generateBearerToken(); - if (Date.now() > EXPIRE) return this._generateBearerToken(); - return TOKEN; - } - - /** - * Adds a new Twitch subscription - */ - public async subscriptionsStreamHandle( - streamerId: string, - subscriptionType: TwitchEventSubTypes = TwitchEventSubTypes.StreamOnline - ): Promise { - const subscription = await fetch>( - `${this.BASE_URL_HELIX}/eventsub/subscriptions`, - { - body: JSON.stringify({ - type: subscriptionType, - version: '1', - condition: { - broadcaster_user_id: streamerId - }, - transport: { - method: 'webhook', - callback: process.env.TWITCH_CALLBACK, - secret: this.eventSubSecret - } - }), - headers: { - ...this.kTwitchRequestHeaders, - Authorization: `Bearer ${await this.fetchBearer()}` - }, - method: FetchMethods.Post - }, - FetchResultTypes.JSON - ); - - return subscription.data[0].id; - } - - /** - * Removes a Twitch subscription based on its ID - * @param subscriptionId the ID to remove - */ - public async removeSubscription(subscriptionId: string): Promise { - const url = new URL(`${this.BASE_URL_HELIX}/eventsub/subscriptions`); - url.searchParams.append('id', subscriptionId); - - await fetch>( - url, - { - headers: { - ...this.kTwitchRequestHeaders, - Authorization: `Bearer ${await this.fetchBearer()}` - }, - method: FetchMethods.Delete - }, - FetchResultTypes.Result - ); - } - - @EnumerableMethod(false) - // @ts-expect-error This is a convenience function for eval-ling - private async getCurrentTwitchSubscriptions(): Promise> { - return this._performApiGETRequest>('eventsub/subscriptions'); - } - - private async _performApiGETRequest(path: string): Promise { - return fetch( - `${this.BASE_URL_HELIX}/${path}`, - { - headers: { - ...this.kTwitchRequestHeaders, - Authorization: `Bearer ${await this.fetchBearer()}` - } - }, - FetchResultTypes.JSON - ); - } - - private async _generateBearerToken() { - const url = new URL('https://id.twitch.tv/oauth2/token'); - url.searchParams.append('client_secret', this.clientSecret); - url.searchParams.append('client_id', this.clientId); - url.searchParams.append('grant_type', 'client_credentials'); - const response = await fetch(url.href, { method: FetchMethods.Post }, FetchResultTypes.JSON); - const expires = Date.now() + response.expires_in * 1000; - this.BEARER = { TOKEN: response.access_token, EXPIRE: expires }; - return response.access_token; - } -} diff --git a/src/lib/util/PreciseTimeout.ts b/src/lib/util/PreciseTimeout.ts deleted file mode 100644 index 51d690970ea..00000000000 --- a/src/lib/util/PreciseTimeout.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * The PreciseTimeout class in charge to perform high-precision promisified and cancellable timeouts - * @version 1.0.0 - */ -export class PreciseTimeout { - private readonly kEndsAt: number; - private stopped = false; - private resolve: (() => void) | null = null; - private timeout: NodeJS.Timeout | null = null; - - /** - * Create a new PreciseTimeout - * @param time The time in milliseconds to run - */ - public constructor(time: number) { - this.kEndsAt = Date.now() + time; - } - - /** - * Run the timeout - */ - public async run(): Promise { - if (this.stopped) return false; - - const cb = () => { - if (Date.now() + 10 >= this.kEndsAt) this.stopped = true; - this.resolve!(); - this.resolve = null; - }; - - while (!this.stopped) { - await new Promise((resolve) => { - this.resolve = resolve; - this.timeout = setTimeout(cb, Date.now() - this.kEndsAt + 10); - }); - } - - return true; - } - - /** - * Stop the timeout - */ - public stop(): boolean { - if (this.stopped) return false; - - this.stopped = true; - if (this.timeout) clearTimeout(this.timeout); - if (this.resolve) this.resolve(); - return true; - } -} diff --git a/src/lib/util/PromptList.ts b/src/lib/util/PromptList.ts deleted file mode 100644 index a11bbdf8fe0..00000000000 --- a/src/lib/util/PromptList.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { UserError } from '@sapphire/framework'; -import { get, send } from '@sapphire/plugin-editable-commands'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { codeBlock } from '@sapphire/utilities'; -import type { Message } from 'discord.js'; -import { deleteMessage } from './functions'; - -const kPromptOptions = { time: 30000, dispose: true, max: 1 }; -const kAttempts = 5; - -/** - * Run the prompt - * @param message The message that runs this prompt - * @param entries The entries to resolve - */ -export async function prompt(message: Message, entries: PromptListResolvable) { - const n = await ask(message, [...resolve(entries, 10)]); - const response = get(message); - if (response) await deleteMessage(response).catch(() => null); - return n; -} - -/** - * Retrieve the number via prompts - * @param message The message that runs this prompt - * @param list The list to show - * @private - */ -async function ask(message: Message, list: readonly string[]) { - const possibles = list.length; - const codeblock = codeBlock('asciidoc', list.join('\n')); - const t = await fetchT(message); - const responseMessage = await send( - message, - t(LanguageKeys.PromptList.MultipleChoice, { - list: codeblock, - count: possibles - }) - ); - 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; - let n = NaN; - let attempts = 0; - do { - if (attempts !== 0) { - await send(message, t(LanguageKeys.PromptList.AttemptFailed, { list: codeblock, attempt: attempts, maxAttempts: kAttempts })); - } - response = await message.channel - .awaitMessages({ filter: promptFilter, ...kPromptOptions }) - .then((responses) => (responses.size ? responses.first()! : null)); - - if (response) { - if (response.deletable) deleteMessage(response).catch(() => null); - if (abortOptions.includes(response.content.toLowerCase())) throw new UserError({ identifier: LanguageKeys.PromptList.Aborted }); - n = Number(response.content); - if (!Number.isNaN(n) && n >= 1 && n <= possibles) { - await responseMessage.delete(); - break; - } - } - } while (response && attempts++ < kAttempts); - - if (!response || attempts >= kAttempts) throw null; - return (n ?? 0) - 1; -} - -function* resolve(data: PromptListResolvable, maxLength: number): Iterable { - let i = 0; - for (const entry of data) { - if (typeof entry === 'string') yield `${(i + 1).toString().padStart(2, ' ')} :: ${entry}`; - else if (Array.isArray(entry)) yield `${(i + 1).toString().padStart(2, ' ')} :: ${entry.join(' : ')}`; - - if (++i >= maxLength) break; - } -} - -type PromptListResolvable = Iterable | Iterable<[string, string]>; diff --git a/src/lib/util/Timers.ts b/src/lib/util/Timers.ts deleted file mode 100644 index e1eb2142b33..00000000000 --- a/src/lib/util/Timers.ts +++ /dev/null @@ -1,34 +0,0 @@ -export function setAccurateTimeout(fn: (...args: T) => void, delay: number, ...args: T) { - const end = Date.now() + delay; - const context: AccurateTimeout = { - timeout: null!, - fn, - cb(...args: T) { - const remaining = end - Date.now(); - if (remaining < 1) { - fn(...args); - } else { - // eslint-disable-next-line @typescript-eslint/unbound-method - context.timeout = setTimeout(context.cb, delay, ...args).unref(); - } - }, - stop() { - clearAccurateTimeout(context); - } - }; - - // eslint-disable-next-line @typescript-eslint/unbound-method - context.timeout = setTimeout(context.cb, delay, ...args).unref(); - return context; -} - -export function clearAccurateTimeout(context: AccurateTimeout) { - clearTimeout(context.timeout); -} - -export interface AccurateTimeout { - timeout: NodeJS.Timeout; - fn(...args: T): void; - cb(...args: T): void; - stop(): void; -} diff --git a/src/lib/util/decorators.ts b/src/lib/util/decorators.ts deleted file mode 100644 index e1b6ced71a6..00000000000 --- a/src/lib/util/decorators.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { GuildMessage } from '#lib/types'; -import { PermissionLevels } from '#lib/types/Enums'; -import { createFunctionPrecondition } from '@sapphire/decorators'; -import { UserError } from '@sapphire/framework'; -import { isAdmin, isModerator, isOwner } from './functions'; - -/** - * Allows you to set permissions required for individual methods. - * @remark This decorator makes the decorated function asynchronous. - * @param permissionsResolvable Permissions that the method should have. - * @param thrownError The error to be thrown. This gets assigned as the `identifier` property for a {@link UserError} - * @param userErrorOptions Additional options to pass to the thrown {@link UserError} - */ -export const RequiresLevel = ( - level: PermissionLevels, - thrownError: string, - userErrorOptions?: Omit -): MethodDecorator => { - return createFunctionPrecondition( - (message: GuildMessage) => { - if (isOwner(message.member)) return true; - - switch (level) { - case PermissionLevels.BotOwner: - return false; - case PermissionLevels.ServerOwner: - return message.author.id === message.guild.ownerId; - case PermissionLevels.Administrator: - return isAdmin(message.member); - case PermissionLevels.Moderator: - return isModerator(message.member); - case PermissionLevels.Everyone: - return true; - } - }, - () => { - throw new UserError({ identifier: thrownError, ...userErrorOptions }); - } - ); -}; diff --git a/src/lib/util/functions/channels.ts b/src/lib/util/functions/channels.ts deleted file mode 100644 index 1b79b974cb6..00000000000 --- a/src/lib/util/functions/channels.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildTextBasedChannelTypes, TextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { UserError } from '@sapphire/framework'; -import type { Message, ThreadChannel } from 'discord.js'; - -/** - * Asserts a text-based channel is not a thread channel. - * @param channel The channel to assert. - * @returns The thread channel. - */ -export function assertNonThread(channel: T): Exclude { - if (channel.isThread()) { - throw new UserError({ identifier: LanguageKeys.Assertions.ExpectedNonThreadChannel, context: { channel: channel.toString() } }); - } - - return channel as Exclude; -} - -export interface SnipedMessage { - message: Message; - timeout: NodeJS.Timeout; -} - -const snipedMessages = new WeakMap(); -export function getSnipedMessage(channel: GuildTextBasedChannelTypes): Message | null { - const current = snipedMessages.get(channel); - return current?.message ?? null; -} - -export function setSnipedMessage(channel: GuildTextBasedChannelTypes, value: Message | null) { - const previous = snipedMessages.get(channel); - if (typeof previous !== 'undefined') clearTimeout(previous.timeout); - - if (value === null) { - snipedMessages.delete(channel); - } else { - const next: SnipedMessage = { - message: value, - timeout: setTimeout(() => snipedMessages.delete(channel), 15000).unref() - }; - snipedMessages.set(channel, next); - } -} diff --git a/src/lib/util/functions/members.ts b/src/lib/util/functions/members.ts deleted file mode 100644 index 84c0d5f8408..00000000000 --- a/src/lib/util/functions/members.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { container } from '@sapphire/framework'; -import type { GuildMember, GuildResolvable, User } from 'discord.js'; - -/** - * Retrieves the local rank a member has in a guild. - * @param member The member to retrieve the rank from. - * @returns The local rank the member has. - */ -export async function fetchLocalRank(member: GuildMember | User, guild: GuildResolvable): Promise { - const guildId = container.client.guilds.resolveId(guild)!; - const list = await container.client.leaderboard.fetch(guildId); - const rank = list.get(member.id); - return rank ? rank.position : list.size; -} diff --git a/src/lib/util/functions/messages.ts b/src/lib/util/functions/messages.ts deleted file mode 100644 index c6cf4262e9b..00000000000 --- a/src/lib/util/functions/messages.ts +++ /dev/null @@ -1,198 +0,0 @@ -import type { SkyraCommand } from '#lib/structures'; -import type { CustomFunctionGet, CustomGet } from '#lib/types'; -import { floatPromise, minutes, resolveOnErrorCodes } from '#utils/common'; -import { canReact, canRemoveAllReactions } from '@sapphire/discord.js-utilities'; -import { container } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import { resolveKey, StringMap, TOptions } from '@sapphire/plugin-i18next'; -import type { NonNullObject } from '@sapphire/utilities'; -import { RESTJSONErrorCodes } from 'discord-api-types/v9'; -import type { Message, MessageOptions, UserResolvable } from 'discord.js'; -import { setTimeout as sleep } from 'node:timers/promises'; - -const messageCommands = new WeakMap(); - -/** - * Sets or resets the tracking status of a message with a command. - * @param message The message to track. - * @param command The command that was run with the given message, if any. - */ -export function setCommand(message: Message, command: SkyraCommand | null) { - if (command === null) messageCommands.delete(message); - else messageCommands.set(message, command); -} - -/** - * Gets the tracked command from a message. - * @param message The message to get the command from. - * @returns The command that was run with the given message, if any. - */ -export function getCommand(message: Message): SkyraCommand | null { - return messageCommands.get(message) ?? null; -} - -async function deleteMessageImmediately(message: Message): Promise { - return (await resolveOnErrorCodes(message.delete(), RESTJSONErrorCodes.UnknownMessage)) ?? message; -} - -/** - * Deletes a message, skipping if it was already deleted, and aborting if a non-zero timer was set and the message was - * either deleted or edited. - * - * This also ignores the `UnknownMessage` error code. - * @param message The message to delete. - * @param time The amount of time, defaults to 0. - * @returns The deleted message. - */ -export async function deleteMessage(message: Message, time = 0): Promise { - if (message.deleted) return message; - if (time === 0) return deleteMessageImmediately(message); - - const lastEditedTimestamp = message.editedTimestamp; - await sleep(time); - - // If it was deleted or edited, cancel: - if (message.deleted || message.editedTimestamp !== lastEditedTimestamp) { - return message; - } - - return deleteMessageImmediately(message); -} - -/** - * Sends a temporary editable message and then floats a {@link deleteMessage} with the given `timer`. - * @param message The message to reply to. - * @param options The options to be sent to the channel. - * @param timer The timer in which the message should be deleted, using {@link deleteMessage}. - * @returns The response message. - */ -export async function sendTemporaryMessage(message: Message, options: string | MessageOptions, timer = minutes(1)): Promise { - if (typeof options === 'string') options = { content: options }; - - const response = (await send(message, options)) as Message; - floatPromise(deleteMessage(response, timer)); - return response; -} - -/** - * Send an editable localized message using `key`. - * @param message The message to reply to. - * @param key The key to be used when resolving. - * @example - * ```typescript - * await sendLocalizedMessage(message, LanguageKeys.Commands.General.Ping); - * // ➡ "Pinging..." - * ``` - */ -export function sendLocalizedMessage(message: Message, key: LocalizedSimpleKey): Promise; -/** - * Send an editable localized message using an object. - * @param message The message to reply to. - * @param options The options to be sent, requiring at least `key` to be passed. - * @example - * ```typescript - * await sendLocalizedMessage(message, { - * key: LanguageKeys.Commands.General.Ping - * }); - * // ➡ "Pinging..." - * ``` - * @example - * ```typescript - * const latency = 42; - * - * await sendLocalizedMessage(message, { - * key: LanguageKeys.Commands.General.PingPong, - * formatOptions: { latency } - * }); - * // ➡ "Pong! Current latency is 42ms." - * ``` - */ -export function sendLocalizedMessage(message: Message, options: LocalizedMessageOptions): Promise; -export async function sendLocalizedMessage(message: Message, options: LocalizedSimpleKey | LocalizedMessageOptions) { - if (typeof options === 'string') options = { key: options }; - - const content = await resolveKey(message, options.key, options.formatOptions); - return send(message, { ...options, content }); -} - -type LocalizedSimpleKey = CustomGet; -type LocalizedMessageOptions = Omit & - ( - | { - key: LocalizedSimpleKey; - formatOptions?: TOptions; - } - | { - key: CustomFunctionGet; - formatOptions: TOptions; - } - ); - -/** - * The prompt confirmation options. - */ -export interface PromptConfirmationMessageOptions extends MessageOptions { - /** - * The target. - * @default message.author - */ - target?: UserResolvable; - - /** - * The time for the confirmation to run. - * @default minutes(1) - */ - time?: number; -} - -const enum PromptConfirmationReactions { - Yes = '🇾', - No = '🇳' -} - -async function promptConfirmationReaction(message: Message, response: Message, options: PromptConfirmationMessageOptions) { - await response.react(PromptConfirmationReactions.Yes); - await response.react(PromptConfirmationReactions.No); - - const target = container.client.users.resolveId(options.target ?? message.author)!; - const reactions = await response.awaitReactions({ filter: (__, user) => user.id === target, time: minutes(1), max: 1 }); - - // Remove all reactions if the user has permissions to do so - if (canRemoveAllReactions(response.channel)) { - floatPromise(response.reactions.removeAll()); - } - - return reactions.size === 0 ? null : reactions.firstKey() === PromptConfirmationReactions.Yes; -} - -const promptConfirmationMessageRegExp = /^y|yes?|yeah?$/i; -async function promptConfirmationMessage(message: Message, response: Message, options: PromptConfirmationMessageOptions) { - const target = container.client.users.resolveId(options.target ?? message.author)!; - const messages = await response.channel.awaitMessages({ filter: (message) => message.author.id === target, time: minutes(1), max: 1 }); - - return messages.size === 0 ? null : promptConfirmationMessageRegExp.test(messages.first()!.content); -} - -/** - * Sends a boolean confirmation prompt asking the `target` for either of two choices. - * @param message The message to ask for a confirmation from. - * @param options The options for the message to be sent, alongside the prompt options. - * @returns `null` if no response was given within the requested time, `boolean` otherwise. - */ -export async function promptConfirmation(message: Message, options: string | PromptConfirmationMessageOptions) { - if (typeof options === 'string') options = { content: options }; - - // TODO: v13 | Switch to buttons only when available. - const response = await send(message, options); - return canReact(response.channel) - ? promptConfirmationReaction(message, response, options) - : promptConfirmationMessage(message, response, options); -} - -export async function promptForMessage(message: Message, sendOptions: string | MessageOptions, time = minutes(1)): Promise { - const response = await message.channel.send(sendOptions); - const responses = await message.channel.awaitMessages({ filter: (msg) => msg.author === message.author, time, max: 1 }); - floatPromise(deleteMessage(response)); - - return responses.size === 0 ? null : responses.first()!.content; -} diff --git a/src/lib/util/functions/users.ts b/src/lib/util/functions/users.ts deleted file mode 100644 index 46d68e3c070..00000000000 --- a/src/lib/util/functions/users.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { container } from '@sapphire/framework'; -import type { UserResolvable } from 'discord.js'; - -/** - * Retrieves the global rank a user has. - * @param resolvable The user to retrieve the rank from. - * @returns The global rank the user has. - */ -export async function fetchGlobalRank(resolvable: UserResolvable): Promise { - const id = container.client.users.resolveId(resolvable); - if (id === null) throw new TypeError(`Cannot resolve ${resolvable} to a User.`); - - const list = await container.client.leaderboard.fetch(); - const rank = list.get(id); - return rank ? rank.position : list.size; -} diff --git a/src/lib/util/util.ts b/src/lib/util/util.ts deleted file mode 100644 index fcdfba06b36..00000000000 --- a/src/lib/util/util.ts +++ /dev/null @@ -1,482 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildMessage } from '#lib/types'; -import { TwemojiRegex } from '@sapphire/discord.js-utilities'; -import { fetch, FetchResultTypes } from '@sapphire/fetch'; -import { send } from '@sapphire/plugin-editable-commands'; -import { DiscordSnowflake } from '@sapphire/snowflake'; -import { Time } from '@sapphire/time-utilities'; -import { isNullishOrEmpty, isNumber, Nullish, parseURL } from '@sapphire/utilities'; -import { getCode, isLetterOrDigit, isWhiteSpace } from '@skyra/char'; -import { loadImage, type Image } from 'canvas-constructor/napi-rs'; -import type { APIUser } from 'discord-api-types/v9'; -import { - AllowedImageSize, - Guild, - GuildChannel, - ImageURLOptions, - Message, - MessageEmbed, - MessageMentionTypes, - Permissions, - ThreadChannel, - User, - UserResolvable -} from 'discord.js'; -import type { TFunction } from 'i18next'; -import type { PathLike } from 'node:fs'; -import { FileHandle, readFile } from 'node:fs/promises'; -import { BrandingColors, ZeroWidthSpace } from './constants'; -import type { LeaderboardUser } from './Leaderboard'; - -const ONE_TO_TEN = new Map([ - [0, { emoji: '😪', color: 0x5b1100 }], - [1, { emoji: '😪', color: 0x5b1100 }], - [2, { emoji: '😫', color: 0xab1100 }], - [3, { emoji: '😔', color: 0xff2b00 }], - [4, { emoji: '😒', color: 0xff6100 }], - [5, { emoji: '😌', color: 0xff9c00 }], - [6, { emoji: '😕', color: 0xb4bf00 }], - [7, { emoji: '😬', color: 0x84fc00 }], - [8, { emoji: '🙂', color: 0x5bf700 }], - [9, { emoji: '😃', color: 0x24f700 }], - [10, { emoji: '😍', color: 0x51d4ef }] -]); - -/** - * Image extensions: - * - bmp - * - jpg - * - jpeg - * - png - * - gif - * - webp - */ -export const IMAGE_EXTENSION = /\.(bmp|jpe?g|png|gif|webp)$/i; - -/** - * Media extensions - * - ...Image extensions - * - ...Audio extensions - * - ...Video extensions - */ -export const MEDIA_EXTENSION = /\.(bmp|jpe?g|png|gifv?|web[pm]|wav|mp[34]|ogg)$/i; - -export function radians(degrees: number) { - return (degrees * Math.PI) / 180; -} - -export function showSeconds(duration: number): string { - if (!isNumber(duration)) return '00:00'; - const seconds = Math.floor(duration / Time.Second) % 60; - const minutes = Math.floor(duration / Time.Minute) % 60; - let output = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; - if (duration >= Time.Hour) { - const hours = Math.floor(duration / Time.Hour); - output = `${hours.toString().padStart(2, '0')}:${output}`; - } - - return output; -} - -export function snowflakeAge(snowflake: string | bigint) { - return Math.max(Date.now() - DiscordSnowflake.timestampFrom(snowflake), 0); -} - -export function oneToTen(level: number): UtilOneToTenEntry | undefined { - level |= 0; - if (level < 0) level = 0; - else if (level > 10) level = 10; - return ONE_TO_TEN.get(level); -} - -export interface Payload { - avatar: string | null; - username: string | null; - discriminator: string | null; - points: number; - position: number; -} - -export function fetchAllLeaderBoardEntries(guild: Guild, results: readonly [string, LeaderboardUser][]) { - const members = guild.members.cache; - const payload: Payload[] = []; - for (const [id, element] of results) { - const member = members.get(id); - if (member === undefined) { - payload.push({ - avatar: null, - username: null, - discriminator: null, - points: element.points, - position: element.position - }); - } else { - const { user } = member; - payload.push({ - avatar: user.avatar, - username: user.username, - discriminator: user.discriminator, - points: element.points, - position: element.position - }); - } - } - - return payload; -} - -export async function loadImageFromUrl(url: string | URL): Promise { - const buffer = await fetch(url, FetchResultTypes.Buffer); - return loadImage(buffer); -} - -export async function loadImageFromFS(path: PathLike | FileHandle): Promise { - const file = await readFile(path); - return loadImage(file); -} - -export function fetchAvatar(user: User, size: AllowedImageSize = 512): Promise { - const url = user.avatar ? user.avatarURL({ format: 'png', size })! : user.defaultAvatarURL; - return loadImageFromUrl(url); -} - -export function twemoji(emoji: string) { - const r: string[] = []; - let c = 0; - let p = 0; - let i = 0; - - while (i < emoji.length) { - c = emoji.charCodeAt(i++); - if (p) { - r.push((0x10000 + ((p - 0xd800) << 10) + (c - 0xdc00)).toString(16)); - p = 0; - } else if (c >= 0xd800 && c <= 0xdbff) { - p = c; - } else { - r.push(c.toString(16)); - } - } - return r.join('-'); -} - -/** - * Get the content from a message. - * @param message The Message instance to get the content from - */ -export function getContent(message: Message): string | null { - if (message.content) return message.content; - for (const embed of message.embeds) { - if (embed.description) return embed.description; - if (embed.fields.length) return embed.fields[0].value; - } - return null; -} - -/** - * Gets all the contents from a message. - * @param message The Message instance to get all contents from - */ -export function getAllContent(message: Message): string { - const output: string[] = []; - if (message.content) output.push(message.content); - for (const embed of message.embeds) { - if (embed.author?.name) output.push(embed.author.name); - if (embed.title) output.push(embed.title); - if (embed.description) output.push(embed.description); - for (const field of embed.fields) output.push(`${field.name}\n${field.value}`); - if (embed.footer?.text) output.push(embed.footer.text); - } - - return output.join('\n'); -} - -export interface ImageAttachment { - url: string; - proxyURL: string; - height: number; - width: number; -} - -/** - * Get a image attachment from a message. - * @param message The Message instance to get the image url from - */ -export function getAttachment(message: Message): ImageAttachment | null { - if (message.attachments.size) { - const attachment = message.attachments.find((att) => IMAGE_EXTENSION.test(att.url)); - if (attachment) { - return { - url: attachment.url, - proxyURL: attachment.proxyURL, - height: attachment.height!, - width: attachment.width! - }; - } - } - - for (const embed of message.embeds) { - if (embed.type === 'image') { - return { - url: embed.thumbnail!.url, - proxyURL: embed.thumbnail!.proxyURL!, - height: embed.thumbnail!.height!, - width: embed.thumbnail!.width! - }; - } - if (embed.image) { - return { - url: embed.image.url, - proxyURL: embed.image.proxyURL!, - height: embed.image.height!, - width: embed.image.width! - }; - } - } - - return null; -} - -/** - * Get the image url from a message. - * @param message The Message instance to get the image url from - */ -export function getImage(message: Message): string | null { - const attachment = getAttachment(message); - return attachment ? attachment.proxyURL || attachment.url : null; -} - -const ROOT = 'https://cdn.discordapp.com'; -export function getDisplayAvatar(id: string, user: User | APIUser, options: ImageURLOptions = {}) { - if (user.avatar === null) return `${ROOT}/embed/avatars/${Number(user.discriminator) % 5}.png`; - const format = typeof options.format === 'undefined' ? (user.avatar.startsWith('a_') ? 'gif' : 'png') : options.format; - const size = typeof options.size === 'undefined' ? '' : `?size=${options.size}`; - return `${ROOT}/avatars/${id}/${user.avatar}.${format}${size}`; -} - -/** - * Parse a range - * @param input The input to parse - * @example - * parseRange('23..25'); - * // -> [23, 24, 25] - * @example - * parseRange('1..3,23..25'); - * // -> [1, 2, 3, 23, 24, 25] - */ -export function parseRange(input: string): number[] { - const set = new Set(); - for (const subset of input.split(',')) { - const [, stringMin, stringMax] = /(\d+) *\.{2,} *(\d+)/.exec(subset) || [subset, subset, subset]; - let min = Number(stringMin); - let max = Number(stringMax); - if (min > max) [max, min] = [min, max]; - - for (let i = Math.max(1, min); i <= max; ++i) set.add(i); - } - - return [...set]; -} - -/** - * Parses an URL and checks if the extension is valid. - * @param url The url to check - */ -export function getImageUrl(url: string): string | undefined { - const parsed = parseURL(url); - return parsed && IMAGE_EXTENSION.test(parsed.pathname) ? parsed.href : undefined; -} - -/** - * Clean all mentions from a body of text - * @param guild The guild for context - * @param input The input to clean - * @returns The input cleaned of mentions - * @license Apache-2.0 - * @copyright 2019 Antonio Román - */ -export function cleanMentions(guild: Guild, input: string) { - return input.replace(/@(here|everyone)/g, `@${ZeroWidthSpace}$1`).replace(/<(@[!&]?|#)(\d{17,19})>/g, (match, type, id) => { - switch (type) { - case '@': - case '@!': { - const tag = guild.client.users.cache.get(id); - return tag ? `@${tag.username}` : `<${type}${ZeroWidthSpace}${id}>`; - } - case '@&': { - const role = guild.roles.cache.get(id); - return role ? `@${role.name}` : match; - } - case '#': { - const channel = guild.channels.cache.get(id); - return channel ? `#${channel.name}` : `<${type}${ZeroWidthSpace}${id}>`; - } - default: - return `<${type}${ZeroWidthSpace}${id}>`; - } - }); -} - -export const anyMentionRegExp = /<(@[!&]?|#)(\d{17,19})>/g; -export const hereOrEveryoneMentionRegExp = /@(?:here|everyone)/; - -/** - * Extracts mentions from a body of text. - * @remark Preserves the mentions in the content, if you want to remove them use `cleanMentions`. - * @param input The input to extract mentions from. - */ -export function extractDetailedMentions(input: string | Nullish): DetailedMentionExtractionResult { - const users = new Set(); - const roles = new Set(); - const channels = new Set(); - const parse = [] as MessageMentionTypes[]; - - if (isNullishOrEmpty(input)) { - return { users, roles, channels, parse }; - } - - let result: RegExpExecArray | null; - while ((result = anyMentionRegExp.exec(input)) !== null) { - switch (result[1]) { - case '@': - case '@!': { - users.add(result[2]); - continue; - } - case '@&': { - roles.add(result[2]); - continue; - } - case '#': { - channels.add(result[2]); - continue; - } - } - } - - if (hereOrEveryoneMentionRegExp.test(input)) parse.push('everyone'); - - return { users, roles, channels, parse }; -} - -export interface DetailedMentionExtractionResult { - users: ReadonlySet; - roles: ReadonlySet; - channels: ReadonlySet; - parse: MessageMentionTypes[]; -} - -/** - * Creates an array picker function - * @param array The array to create a pick function from - * @example - * const picker = createPick([1, 2, 3, 4]); - * picker(); // 2 - * picker(); // 1 - * picker(); // 4 - */ -export function createPick(array: T[]): () => T { - const { length } = array; - return () => array[Math.floor(Math.random() * length)]; -} - -/** - * Picks a random item from an array - * @param array The array to pick a random item from - * @example - * const randomEntry = pickRandom([1, 2, 3, 4]) // 1 - */ -export function pickRandom(array: readonly T[]): T { - const { length } = array; - return array[Math.floor(Math.random() * length)]; -} - -export function cast(value: unknown): T { - return value as T; -} - -/** - * Validates that a user has VIEW_CHANNEL permissions to a channel - * @param channel The TextChannel to check - * @param user The user for which to check permission - * @returns Whether the user has access to the channel - * @example validateChannelAccess(channel, message.author) - */ -export function validateChannelAccess(channel: GuildChannel | ThreadChannel, user: UserResolvable) { - return (channel.guild !== null && channel.permissionsFor(user)?.has(Permissions.FLAGS.VIEW_CHANNEL)) || false; -} - -/** - * Fake GraphQL tag that just returns everything passed in as a single combined string - * @remark used to trick the GraphQL parser into treating some code as GraphQL parsable data for syntax checking - * @param gqlData data to pass off as GraphQL code - */ -export function gql(...args: any[]): string { - return args[0].reduce((acc: string, str: string, idx: number) => { - acc += str; - if (Reflect.has(args, idx + 1)) acc += args[idx + 1]; - return acc; - }, ''); -} - -/** - * Shuffles an array, returning it - * @param array The array to shuffle - */ -export const shuffle = (array: T[]): T[] => { - let m = array.length; - while (m) { - const i = Math.floor(Math.random() * m--); - [array[m], array[i]] = [array[i], array[m]]; - } - return array; -}; - -export const random = (num: number) => Math.floor(Math.random() * num); - -export const sendLoadingMessage = (message: T, t: TFunction): Promise => { - const embed = new MessageEmbed().setDescription(pickRandom(t(LanguageKeys.System.Loading))).setColor(BrandingColors.Secondary); - return send(message, { embeds: [embed] }) as Promise; -}; - -/** - * Gets the base language from an i18n code. - * @param lang The ISO 639-1 language to process, e.g. `en-US` - * @returns The base language, for example, `en-US` becomes `en`. - */ -export function baseLanguage(lang: string): string { - const index = lang.indexOf('-'); - return index === -1 ? lang : lang.slice(0, index); -} - -/** - * Gets the country from an i18n code. - * @param lang The ISO 639-1 language to process, e.g. `en-US` - * @returns The country, for example, `en-US` becomes `US`. - */ -export function countryLanguage(lang: string): string { - const index = lang.lastIndexOf('-'); - return index === -1 ? lang : lang.slice(index + 1); -} - -export function sanitizeInput(input: string): string { - return [...input] - .map((c) => { - if (TwemojiRegex.test(c)) return c; - - const code = getCode(c); - - return isLetterOrDigit(code) || isWhiteSpace(code) ? c : ''; - }) - .join(''); -} - -export interface UtilOneToTenEntry { - emoji: string; - color: number; -} - -export interface MuteOptions { - reason?: string; - duration?: number | string | null; -} diff --git a/src/lib/weather/index.ts b/src/lib/weather/index.ts deleted file mode 100644 index 6d5a6ef495d..00000000000 --- a/src/lib/weather/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './types'; -export * from './utils'; diff --git a/src/lib/weather/types.ts b/src/lib/weather/types.ts deleted file mode 100644 index 75b3e813463..00000000000 --- a/src/lib/weather/types.ts +++ /dev/null @@ -1,228 +0,0 @@ -export type IntegerString = `${bigint}`; -export type FloatString = `${number}`; - -export interface Weather { - current_condition: CurrentCondition[]; - nearest_area: NearestArea[]; - request: Request[]; - weather: WeatherElement[]; -} - -export interface CurrentCondition { - FeelsLikeC: IntegerString; - FeelsLikeF: IntegerString; - cloudcover: IntegerString; - humidity: IntegerString; - localObsDateTime: Date; - observation_time: Hour; - precipInches: FloatString; - precipMM: FloatString; - pressure: IntegerString; - pressureInches: IntegerString; - temp_C: IntegerString; - temp_F: IntegerString; - uvIndex: IntegerString; - visibility: IntegerString; - visibilityMiles: IntegerString; - weatherCode: WeatherCode; - weatherDesc: WeatherDescription[]; - weatherIconUrl: Url[]; - winddir16Point: WindDirection; - winddirDegree: IntegerString; - windspeedKmph: IntegerString; - windspeedMiles: IntegerString; -} - -export const enum WeatherCode { - ClearOrSunny = '113', - PartlyCloudy = '116', - Cloudy = '119', - Overcast = '122', - Mist = '143', - PatchyRainNearby = '176', - PatchySnowNearby = '179', - PatchySleetNearby = '182', - PatchyFreezingDrizzleNearby = '185', - ThunderyOutbreaksInNearby = '200', - BlowingSnow = '227', - Blizzard = '230', - Fog = '248', - FreezingFog = '260', - PatchyLightDrizzle = '263', - LightDrizzle = '266', - FreezingDrizzle = '281', - HeavyFreezingDrizzle = '284', - PatchyLightRain = '293', - LightRain = '296', - ModerateRainAtTimes = '299', - ModerateRain = '302', - HeavyRainAtTimes = '305', - HeavyRain = '308', - LightFreezingRain = '311', - ModerateOrHeavyFreezingRain = '314', - LightSleet = '317', - ModerateOrHeavySleet = '320', - PatchyLightSnow = '323', - LightSnow = '326', - PatchyModerateSnow = '329', - ModerateSnow = '332', - PatchyHeavySnow = '335', - HeavySnow = '338', - IcePellets = '350', - LightRainShower = '353', - ModerateOrHeavyRainShower = '356', - TorrentialRainShower = '359', - LightSleetShowers = '362', - ModerateOrHeavySleetShowers = '365', - LightSnowShowers = '368', - ModerateOrHeavySnowShowers = '371', - LightShowersOfIcePellets = '374', - ModerateOrHeavyShowersOfIcePellets = '377', - PatchyLightRainInAreaWithThunder = '386', - ModerateOrHeavyRainInAreaWithThunder = '389', - PatchyLightSnowInAreaWithThunder = '392', - ModerateOrHeavySnowInAreaWithThunder = '395' -} - -export interface WeatherDescription { - value: WeatherName; -} - -export type WeatherName = - | 'Cloudy' - | 'Fog' - | 'HeavyRain' - | 'HeavyShowers' - | 'HeavySnow' - | 'HeavySnowShowers' - | 'LightRain' - | 'LightShowers' - | 'LightSleet' - | 'LightSleetShowers' - | 'LightSnow' - | 'LightSnowShowers' - | 'PartlyCloudy' - | 'Sunny' - | 'ThunderyHeavyRain' - | 'ThunderyShowers' - | 'ThunderySnowShowers' - | 'VeryCloudy'; - -export interface NearestArea { - areaName: ValueWrapper[]; - country: ValueWrapper[]; - latitude: FloatString; - longitude: FloatString; - population: IntegerString; - region: ValueWrapper[]; - weatherUrl: Url[]; -} - -export interface ValueWrapper { - value: string; -} - -export interface Url { - value: string; -} - -export interface Request { - query: string; - type: 'LatLon'; -} - -export interface WeatherElement { - astronomy: Astronomy[]; - avgtempC: IntegerString; - avgtempF: IntegerString; - date: Date; - hourly: Hourly[]; - maxtempC: IntegerString; - maxtempF: IntegerString; - mintempC: IntegerString; - mintempF: IntegerString; - sunHour: FloatString; - totalSnow_cm: FloatString; - uvIndex: IntegerString; -} - -export interface Astronomy { - moon_illumination: IntegerString; - moon_phase: MoonPhase; - moonrise: Hour; - moonset: Hour; - sunrise: Hour; - sunset: Hour; -} - -export type MoonPhase = - | 'New Moon' - | 'Waxing Crescent' - | 'First Quarter' - | 'Waxing Gibbous' - | 'Full Moon' - | 'Waning Gibbous' - | 'Last Quarter' - | 'Waning Crescent'; - -export type Hour = `${bigint}:${bigint} ${'AM' | 'PM'}`; - -export interface Hourly { - DewPointC: IntegerString; - DewPointF: IntegerString; - FeelsLikeC: IntegerString; - FeelsLikeF: IntegerString; - HeatIndexC: IntegerString; - HeatIndexF: IntegerString; - WindChillC: IntegerString; - WindChillF: IntegerString; - WindGustKmph: IntegerString; - WindGustMiles: IntegerString; - chanceoffog: IntegerString; - chanceoffrost: IntegerString; - chanceofhightemp: IntegerString; - chanceofovercast: IntegerString; - chanceofrain: IntegerString; - chanceofremdry: IntegerString; - chanceofsnow: IntegerString; - chanceofsunshine: IntegerString; - chanceofthunder: IntegerString; - chanceofwindy: IntegerString; - cloudcover: IntegerString; - humidity: IntegerString; - precipInches: FloatString; - precipMM: FloatString; - pressure: IntegerString; - pressureInches: FloatString; - tempC: IntegerString; - tempF: IntegerString; - time: IntegerString; - uvIndex: IntegerString; - visibility: IntegerString; - visibilityMiles: IntegerString; - weatherCode: WeatherCode; - weatherDesc: WeatherDescription[]; - weatherIconUrl: Url[]; - winddir16Point: WindDirection; - winddirDegree: IntegerString; - windspeedKmph: IntegerString; - windspeedMiles: IntegerString; -} - -export type WindDirectionNorth = 'N' | 'NNE'; -export type WindDirectionNorthEast = 'NE' | 'ENE'; -export type WindDirectionEast = 'E' | 'ESE'; -export type WindDirectionSouthEast = 'SE' | 'SSE'; -export type WindDirectionSouth = 'S' | 'SSW'; -export type WindDirectionSouthWest = 'SW' | 'WSW'; -export type WindDirectionWest = 'W' | 'WNW'; -export type WindDirectionNorthWest = 'NW' | 'NNW'; -export type WindDirection = - | WindDirectionNorth - | WindDirectionNorthEast - | WindDirectionEast - | WindDirectionSouthEast - | WindDirectionSouth - | WindDirectionSouthWest - | WindDirectionWest - | WindDirectionNorthWest; diff --git a/src/lib/weather/utils.ts b/src/lib/weather/utils.ts deleted file mode 100644 index 1faa9c6d5f1..00000000000 --- a/src/lib/weather/utils.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { assetsFolder } from '#utils/constants'; -import { loadImageFromFS } from '#utils/util'; -import { fetch, FetchResultTypes, QueryError } from '@sapphire/fetch'; -import { container, fromAsync, UserError } from '@sapphire/framework'; -import { tryParse } from '@sapphire/utilities'; -import type { Image } from 'canvas-constructor/napi-rs'; -import { cyan, gray, red } from 'colorette'; -import type { TFunction } from 'i18next'; -import { join } from 'node:path'; -import { URL } from 'node:url'; -import { CurrentCondition, Weather, WeatherCode, WeatherName } from './types'; - -export function getColors(name: WeatherName): WeatherTheme { - switch (name) { - case 'LightShowers': - case 'LightSleetShowers': - case 'LightSnowShowers': - case 'LightRain': - case 'LightSleet': - case 'LightSnow': - case 'HeavySnow': - case 'HeavySnowShowers': - case 'Cloudy': - case 'Fog': - return { background: '#2E2E2E', text: '#FAFAFA', theme: 'light' }; - case 'HeavyRain': - case 'HeavyShowers': - case 'VeryCloudy': - return { background: '#EAEAEA', text: '#1F1F1F', theme: 'dark' }; - case 'PartlyCloudy': - case 'Sunny': - return { background: '#0096D6', text: '#FAFAFA', theme: 'light' }; - case 'ThunderyHeavyRain': - case 'ThunderyShowers': - case 'ThunderySnowShowers': - return { background: '#99446B', text: '#FAFAFA', theme: 'light' }; - default: - throw new Error(`Could not find weather name '${name}'.`); - } -} - -const getWeatherNameMap = new Map([ - [WeatherCode.ClearOrSunny, 'Sunny'], - [WeatherCode.PartlyCloudy, 'PartlyCloudy'], - [WeatherCode.Cloudy, 'Cloudy'], - [WeatherCode.Overcast, 'VeryCloudy'], - [WeatherCode.Mist, 'Fog'], - [WeatherCode.PatchyRainNearby, 'LightShowers'], - [WeatherCode.PatchySnowNearby, 'LightSleetShowers'], - [WeatherCode.PatchySleetNearby, 'LightSleet'], - [WeatherCode.PatchyFreezingDrizzleNearby, 'LightSleet'], - [WeatherCode.ThunderyOutbreaksInNearby, 'ThunderyShowers'], - [WeatherCode.BlowingSnow, 'LightSnow'], - [WeatherCode.Blizzard, 'HeavySnow'], - [WeatherCode.Fog, 'Fog'], - [WeatherCode.FreezingFog, 'Fog'], - [WeatherCode.PatchyLightDrizzle, 'LightShowers'], - [WeatherCode.LightDrizzle, 'LightRain'], - [WeatherCode.FreezingDrizzle, 'LightSleet'], - [WeatherCode.HeavyFreezingDrizzle, 'LightSleet'], - [WeatherCode.PatchyLightRain, 'LightRain'], - [WeatherCode.LightRain, 'LightRain'], - [WeatherCode.ModerateRainAtTimes, 'HeavyShowers'], - [WeatherCode.ModerateRain, 'HeavyRain'], - [WeatherCode.HeavyRainAtTimes, 'HeavyShowers'], - [WeatherCode.HeavyRain, 'HeavyRain'], - [WeatherCode.LightFreezingRain, 'LightSleet'], - [WeatherCode.ModerateOrHeavyFreezingRain, 'LightSleet'], - [WeatherCode.LightSleet, 'LightSleet'], - [WeatherCode.ModerateOrHeavySleet, 'LightSnow'], - [WeatherCode.PatchyLightSnow, 'LightSnowShowers'], - [WeatherCode.LightSnow, 'LightSnowShowers'], - [WeatherCode.PatchyModerateSnow, 'HeavySnow'], - [WeatherCode.ModerateSnow, 'HeavySnow'], - [WeatherCode.PatchyHeavySnow, 'HeavySnowShowers'], - [WeatherCode.HeavySnow, 'HeavySnow'], - [WeatherCode.IcePellets, 'LightSleet'], - [WeatherCode.LightRainShower, 'LightShowers'], - [WeatherCode.ModerateOrHeavyRainShower, 'HeavyShowers'], - [WeatherCode.TorrentialRainShower, 'HeavyShowers'], - [WeatherCode.LightSleetShowers, 'LightSleetShowers'], - [WeatherCode.ModerateOrHeavySleetShowers, 'LightSleetShowers'], - [WeatherCode.LightSnowShowers, 'LightSnowShowers'], - [WeatherCode.ModerateOrHeavySnowShowers, 'LightSnowShowers'], - [WeatherCode.LightShowersOfIcePellets, 'LightSleetShowers'], - [WeatherCode.ModerateOrHeavyShowersOfIcePellets, 'LightSleet'], - [WeatherCode.PatchyLightRainInAreaWithThunder, 'ThunderyShowers'], - [WeatherCode.ModerateOrHeavyRainInAreaWithThunder, 'ThunderyHeavyRain'], - [WeatherCode.PatchyLightSnowInAreaWithThunder, 'ThunderySnowShowers'], - [WeatherCode.ModerateOrHeavySnowInAreaWithThunder, 'ThunderySnowShowers'] -]); -export function getWeatherName(code: WeatherCode): WeatherName { - const name = getWeatherNameMap.get(code); - if (name === undefined) throw new Error(`The code '${code}' is not available.`); - return name; -} - -const weatherFolder = join(assetsFolder, 'images', 'weather'); -const getFileCache = new Map(); -export async function getFile(name: WeatherName): Promise { - const existing = getFileCache.get(name); - if (existing !== undefined) return existing; - - const image = await loadImageFromFS(join(weatherFolder, `${name}.png`)); - getFileCache.set(name, image); - return image; -} - -const getIconsCache = new Map(); -export async function getIcons(theme: Theme): Promise { - const existing = getIconsCache.get(theme); - if (existing !== undefined) return existing; - - const [pointer, precipitation, temperature, visibility] = await Promise.all([ - loadImageFromFS(join(weatherFolder, theme, 'pointer.png')), - loadImageFromFS(join(weatherFolder, theme, 'precipitation.png')), - loadImageFromFS(join(weatherFolder, theme, 'temperature.png')), - loadImageFromFS(join(weatherFolder, theme, 'visibility.png')) - ]); - - const icons: Icons = { pointer, precipitation, temperature, visibility }; - getIconsCache.set(theme, icons); - return icons; -} - -const getDataBaseURL = 'https://wttr.in/'; -export async function getData(query: string, lang: string): Promise { - const url = new URL(`${getDataBaseURL}~${encodeURIComponent(query)}`); - url.searchParams.append('format', 'j1'); - url.searchParams.append('lang', lang); - - const result = await fromAsync(fetch(url, FetchResultTypes.Text)); - if (result.success) { - const { value } = result; - // JSON object: - if (value.startsWith('{')) { - const parsed = tryParse(value); - if (parsed === null) throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherInvalidJsonBody, context: { query } }); - return parsed as Weather; - } - - // Yes, wttr.in returns 200 OK on errors (ref: https://github.com/chubin/wttr.in/issues/591). - // "Unknown location; ..." message: - if (value.startsWith('Unknown location')) { - throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherUnknownLocation, context: { query } }); - } - - // Log the error and return unknown error: - container.logger.error(`[${cyan('WEATHER')}]: Unknown Error Body Received: ${gray(value)}`); - throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherUnknownError, context: { query } }); - } - - const { error } = result; - if (error.code === 403) throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherBlockedLocation, context: { query } }); - if (error.code === 429) throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherRateLimited, context: { query } }); - if (error.code === 500) throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherRemoteServerError, context: { query } }); - if (error.code === 503) throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherServiceUnavailable, context: { query } }); - - // Log the error and return unknown error: - container.logger.error(`[${cyan('WEATHER')}]: Unknown Error Code Received: ${red(error.code.toString())} - ${gray(error.body)}`); - throw new UserError({ identifier: LanguageKeys.Commands.Google.WeatherUnknownError, context: { query } }); -} - -export function resolveCurrentConditionsImperial(conditions: CurrentCondition, t: TFunction): ResolvedConditions { - return { - precipitation: t(LanguageKeys.Commands.Google.WeatherInches, { value: Number(conditions.precipInches) }), - pressure: t(LanguageKeys.Commands.Google.WeatherInches, { value: Number(conditions.pressureInches) }), - temperature: t(LanguageKeys.Commands.Google.WeatherTemperatureFahrenheit, { - value: Number(conditions.temp_F), - feelsLike: Number(conditions.FeelsLikeF) - }), - visibility: t(LanguageKeys.Commands.Google.WeatherMiles, { value: Number(conditions.visibilityMiles) }), - windSpeed: t(LanguageKeys.Commands.Google.WeatherMilesPerHour, { value: Number(conditions.windspeedMiles) }) - }; -} - -export function resolveCurrentConditionsSI(conditions: CurrentCondition, t: TFunction, options: ConditionsOptions = {}): ResolvedConditions { - const kelvin = options.kelvin ?? false; - const temperature = Number(conditions.temp_C); - return { - precipitation: t(LanguageKeys.Commands.Google.WeatherMillimeters, { value: Number(conditions.precipMM) }), - pressure: t(LanguageKeys.Commands.Google.WeatherPascal, { value: Number(conditions.pressure) }), - temperature: kelvin - ? t(LanguageKeys.Commands.Google.WeatherTemperatureKelvin, { value: celsiusToKelvin(temperature) }) - : t(LanguageKeys.Commands.Google.WeatherTemperatureCelsius, { value: temperature, feelsLike: Number(conditions.FeelsLikeC) }), - visibility: t(LanguageKeys.Commands.Google.WeatherKilometers, { value: Number(conditions.visibility) }), - windSpeed: t(LanguageKeys.Commands.Google.WeatherKilometersPerHour, { value: Number(conditions.windspeedKmph) }) - }; -} - -export interface ConditionsOptions { - kelvin?: boolean; -} - -function celsiusToKelvin(celsius: number): number { - return celsius + 273.15; -} - -export type Theme = 'light' | 'dark'; - -export interface WeatherTheme { - background: `#${string}`; - text: `#${string}`; - theme: Theme; -} - -export interface ResolvedConditions { - precipitation: string; - pressure: string; - temperature: string; - visibility: string; - windSpeed: string; -} - -export interface Icons { - pointer: Image; - precipitation: Image; - temperature: Image; - visibility: Image; -} diff --git a/src/listeners/analytics/analyticsSync.ts b/src/listeners/analytics/analyticsSync.ts deleted file mode 100644 index 5b85c81100e..00000000000 --- a/src/listeners/analytics/analyticsSync.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { DbSet } from '#lib/database'; -import { AnalyticsListener } from '#lib/structures'; -import { Actions, EconomyType, EconomyValueType, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ event: Events.AnalyticsSync }) -export class UserAnalyticsEvent extends AnalyticsListener { - public async run(guilds: number, users: number) { - const dbSet = this.container.db; - const [economyHealth, twitchSubscriptionCount] = await Promise.all([this.fetchEconomyHealth(dbSet), dbSet.twitchSubscriptions.count()]); - - this.writePoints([ - this.syncGuilds(guilds), - this.syncUsers(users), - this.syncEconomy(economyHealth.total_money, EconomyType.Money), - this.syncEconomy(economyHealth.total_vault, EconomyType.Vault), - this.syncTwitchSubscriptions(twitchSubscriptionCount), - this.syncMessageCount() - ]); - - return this.container.client.analytics!.writeApi.flush(); - } - - private syncGuilds(value: number) { - return ( - new Point(Points.Guilds) - .tag(Tags.Action, Actions.Sync) - // TODO: Adjust for traditional sharding - .intField('value', value) - ); - } - - private syncUsers(value: number) { - return ( - new Point(Points.Users) - .tag(Tags.Action, Actions.Sync) - // TODO: Adjust for traditional sharding - .intField('value', value) - ); - } - - private syncEconomy(value: string, type: EconomyType) { - return new Point(Points.Economy) // - .tag(Tags.Action, Actions.Sync) - .tag(Tags.ValueType, EconomyValueType.Size) - .intField(type, Number(value)); - } - - private syncTwitchSubscriptions(value: number) { - return new Point(Points.TwitchSubscriptions) // - .tag(Tags.Action, Actions.Sync) - .intField('count', value); - } - - private syncMessageCount() { - const { client } = this.container; - const value = client.analytics!.messageCount; - client.analytics!.messageCount = 0; - - return new Point(Points.MessageCount) // - .tag(Tags.Action, Actions.Sync) - .intField('value', value); - } - - private async fetchEconomyHealth(dbSet: DbSet): Promise<{ total_money: string; total_vault: string }> { - const [data] = await dbSet.users.query(/* sql */ ` - WITH - u AS (SELECT SUM(money) as total_money FROM public.user), - v AS (SELECT SUM(vault) as total_vault FROM public.user_profile) - SELECT * FROM u, v; - `); - return data; - } -} diff --git a/src/listeners/analytics/commandUsageAnalytics.ts b/src/listeners/analytics/commandUsageAnalytics.ts deleted file mode 100644 index 3996ae06f4e..00000000000 --- a/src/listeners/analytics/commandUsageAnalytics.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Actions, CommandCategoryTypes, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ event: Events.CommandUsageAnalytics }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run(commandName: string, category: string) { - const command = new Point(Points.Commands) - .tag(Tags.Action, Actions.Addition) - .tag(CommandCategoryTypes.Category, category) - .intField(commandName.replace(/^time$/, 'case-time'), 1); - - return this.writePoint(command); - } -} diff --git a/src/listeners/analytics/guilds/guildCreateAnalytics.ts b/src/listeners/analytics/guilds/guildCreateAnalytics.ts deleted file mode 100644 index 50631e598c7..00000000000 --- a/src/listeners/analytics/guilds/guildCreateAnalytics.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Actions, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { Guild } from 'discord.js'; - -@ApplyOptions({ event: Events.GuildCreate }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run(guild: Guild) { - const guilds = new Point(Points.Guilds) - .tag(Tags.Shard, guild.shardId.toString()) - .tag(Tags.Action, Actions.Addition) - // TODO: Adjust for traditional sharding - .intField('value', guild.client.guilds.cache.size); - const users = new Point(Points.Users) - .tag(Tags.Shard, guild.shardId.toString()) - .tag(Tags.Action, Actions.Addition) - // TODO: Adjust for traditional sharding - .intField( - 'value', - guild.client.guilds.cache.reduce((acc, val) => acc + (val.memberCount ?? 0), 0) - ); - - return this.writePoints([guilds, users]); - } -} diff --git a/src/listeners/analytics/guilds/guildDeleteAnalytics.ts b/src/listeners/analytics/guilds/guildDeleteAnalytics.ts deleted file mode 100644 index b3fafd67520..00000000000 --- a/src/listeners/analytics/guilds/guildDeleteAnalytics.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Actions, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { Guild } from 'discord.js'; - -@ApplyOptions({ event: Events.GuildDelete }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run(guild: Guild) { - const guilds = new Point(Points.Guilds) - .tag(Tags.Shard, guild.shardId.toString()) - .tag(Tags.Action, Actions.Subtraction) - // TODO: Adjust for traditional sharding - .intField('value', guild.client.guilds.cache.size); - - const users = new Point(Points.Users) - .tag(Tags.Shard, guild.shardId.toString()) - .tag(Tags.Action, Actions.Subtraction) - // TODO: Adjust for traditional sharding - .intField( - 'value', - guild.client.guilds.cache.reduce((acc, val) => acc + (val.memberCount ?? 0), 0) - ); - return this.writePoints([guilds, users]); - } -} diff --git a/src/listeners/analytics/messages/messageAnalytics.ts b/src/listeners/analytics/messages/messageAnalytics.ts deleted file mode 100644 index 978b20ef847..00000000000 --- a/src/listeners/analytics/messages/messageAnalytics.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Events } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ event: Events.MessageCreate }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run(): void { - this.container.client.analytics!.messageCount++; - } -} diff --git a/src/listeners/analytics/resourceAnalyticsSync.ts b/src/listeners/analytics/resourceAnalyticsSync.ts deleted file mode 100644 index 339a3bddd11..00000000000 --- a/src/listeners/analytics/resourceAnalyticsSync.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Actions, Points, Tags } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; -import { cpus } from 'node:os'; - -@ApplyOptions({ event: Events.ResourceAnalyticsSync }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run() { - this.writePoints([this.syncPerCoreLoad(), this.syncMem()]); - - return this.container.client.analytics!.writeApi.flush(); - } - - private syncPerCoreLoad() { - const point = new Point(Points.PerCoreCPULoad).tag(Tags.Action, Actions.Sync); - - let index = 0; - for (const { times } of cpus()) point.floatField(`cpu_${index++}`, (times.user + times.nice + times.sys + times.irq) / times.idle); - - return point; - } - - private syncMem() { - // TODO: Adjust for traditional sharding - const usage = process.memoryUsage(); - return new Point(Points.Memory) // - .tag(Tags.Action, Actions.Sync) - .floatField('total', usage.heapTotal) - .floatField('used', usage.heapUsed); - } -} diff --git a/src/listeners/analytics/twitchStreamHookedAnalytics.ts b/src/listeners/analytics/twitchStreamHookedAnalytics.ts deleted file mode 100644 index 3461d2cb31b..00000000000 --- a/src/listeners/analytics/twitchStreamHookedAnalytics.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AnalyticsListener } from '#lib/structures'; -import { Actions, Points, Tags, TwitchStreamStatus } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { Point } from '@influxdata/influxdb-client'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ event: Events.TwitchStreamHookedAnalytics }) -export class UserAnalyticsEvent extends AnalyticsListener { - public run(status: TwitchStreamStatus) { - return this.writePoint( - new Point(Points.TwitchSubscriptionHook) - .tag(Tags.Action, status === TwitchStreamStatus.Online ? Actions.Addition : Actions.Subtraction) - .tag(Tags.TwitchStreamStatus, status) - .intField('filler', 1) - ); - } -} diff --git a/src/listeners/mentionPrefixOnly.ts b/src/listeners/mentionPrefixOnly.ts deleted file mode 100644 index 23be54f9e67..00000000000 --- a/src/listeners/mentionPrefixOnly.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GuildSettings, readSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { DMMessage, GuildMessage } from '#lib/types'; -import { isModerator, sendLocalizedMessage } from '#utils/functions'; -import { Events, Listener } from '@sapphire/framework'; -import { send } from '@sapphire/plugin-editable-commands'; -import type { Message } from 'discord.js'; - -export default class extends Listener { - public run(message: Message) { - return message.guild ? this.guild(message as GuildMessage) : this.dm(message as DMMessage); - } - - private async dm(message: DMMessage) { - const prefix = (await this.container.client.fetchPrefix(message)) as string; - return sendLocalizedMessage(message, { key: LanguageKeys.Misc.PrefixReminder, formatOptions: { prefix } }); - } - - private async guild(message: GuildMessage) { - const [prefix, disabled, t] = await readSettings(message.guild, (settings) => [ - settings[GuildSettings.Prefix], - settings[GuildSettings.DisabledChannels], - settings.getLanguage() - ]); - - if (disabled.includes(message.channel.id) && !(await isModerator(message.member))) return; - return send(message, t(LanguageKeys.Misc.PrefixReminder, { prefix })); - } -} diff --git a/src/listeners/mentionSpamExceeded.ts b/src/listeners/mentionSpamExceeded.ts deleted file mode 100644 index a3a18f55c4a..00000000000 --- a/src/listeners/mentionSpamExceeded.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { GuildSettings, readSettings } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { GuildMessage } from '#lib/types'; -import { Events } from '#lib/types/Enums'; -import { getModeration } from '#utils/functions'; -import { TypeCodes } from '#utils/moderationConstants'; -import { Listener } from '@sapphire/framework'; - -export class UserListener extends Listener { - public async run(message: GuildMessage) { - const [threshold, nms, t] = await readSettings(message.guild, (settings) => [ - settings[GuildSettings.Selfmod.NoMentionSpam.MentionsAllowed], - settings.nms, - settings.getLanguage() - ]); - - const moderation = getModeration(message.guild); - const lock = moderation.createLock(); - try { - await message.guild.members - .ban(message.author.id, { days: 0, reason: t(LanguageKeys.Events.NoMentionSpam.Footer) }) - .catch((error) => this.container.client.emit(Events.Error, error)); - await message.channel - .send(t(LanguageKeys.Events.NoMentionSpam.Message, { user: message.author })) - .catch((error) => this.container.client.emit(Events.Error, error)); - nms.delete(message.author.id); - - const reason = t(LanguageKeys.Events.NoMentionSpam.ModerationLog, { threshold }); - await moderation - .create({ - userId: message.author.id, - moderatorId: process.env.CLIENT_ID, - type: TypeCodes.Ban, - reason - }) - .create(); - } finally { - lock(); - } - } -} diff --git a/src/listeners/mentionSpamWarning.ts b/src/listeners/mentionSpamWarning.ts deleted file mode 100644 index 0ea26dec41f..00000000000 --- a/src/listeners/mentionSpamWarning.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { sendTemporaryMessage } from '#utils/functions'; -import { Listener } from '@sapphire/framework'; -import { resolveKey } from '@sapphire/plugin-i18next'; -import type { Message } from 'discord.js'; - -export class UserListener extends Listener { - public async run(message: Message) { - await sendTemporaryMessage(message, await resolveKey(message, LanguageKeys.Events.NoMentionSpam.Alert)); - } -} diff --git a/src/listeners/ready.ts b/src/listeners/ready.ts deleted file mode 100644 index a3cbcc0abbf..00000000000 --- a/src/listeners/ready.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Slotmachine } from '#lib/games/Slotmachine'; -import { WheelOfFortune } from '#lib/games/WheelOfFortune'; -import { Events, Schedules } from '#lib/types/Enums'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Listener, ListenerOptions, Piece, Store } from '@sapphire/framework'; -import type { TFunction } from '@sapphire/plugin-i18next'; -import { envParseBoolean } from '@skyra/env-utilities'; -import { blue, gray, green, magenta, magentaBright, red, white, yellow } from 'colorette'; - -@ApplyOptions({ once: true }) -export class UserListener extends Listener { - private readonly style = this.container.client.dev ? yellow : blue; - - public async run() { - try { - await Promise.all([ - // Initialize Slotmachine data - Slotmachine.init().catch((error) => this.container.logger.fatal(error)), - // Initialize WheelOfFortune data - WheelOfFortune.init().catch((error) => this.container.logger.fatal(error)), - this.initAnalytics() - ]); - - // Setup the stat updating task - await this.initPostStatsTask().catch((error) => this.container.logger.fatal(error)); - // Setup the Twitch subscriptions refresh task - } catch (error) { - this.container.logger.fatal(error); - } - - this.printBanner(); - this.printStoreDebugInformation(); - } - - private async initPostStatsTask() { - const { queue } = this.container.schedule; - if (!queue.some((task) => task.taskId === Schedules.Poststats)) { - await this.container.schedule.add(Schedules.Poststats, '*/10 * * * *', {}); - } - } - - private async initSyncResourceAnalyticsTask() { - const { queue } = this.container.schedule; - if (!queue.some((task) => task.taskId === Schedules.SyncResourceAnalytics)) { - await this.container.schedule.add(Schedules.SyncResourceAnalytics, '*/1 * * * *'); - } - } - - private async initAnalytics() { - if (envParseBoolean('INFLUX_ENABLED')) { - const { client } = this.container; - client.emit( - Events.AnalyticsSync, - client.guilds.cache.size, - client.guilds.cache.reduce((acc, val) => acc + (val.memberCount ?? 0), 0) - ); - - await this.initSyncResourceAnalyticsTask().catch((error) => this.container.logger.fatal(error)); - } - } - - private printBanner() { - const { client } = this.container; - const success = green('+'); - const failed = red('-'); - const llc = client.dev ? magentaBright : white; - const blc = client.dev ? magenta : blue; - - const line01 = llc(String.raw` / `); - const line02 = llc(String.raw` ${blc('/╬')}▓ `); - const line03 = llc(String.raw` ${blc('/▓▓')}╢ `); - const line04 = llc(String.raw` [${blc('▓▓')}▓╣/ `); - const line05 = llc(String.raw` [╢╢╣▓ `); - const line06 = llc(String.raw` %,╚╣╣@\ `); - const line07 = llc(String.raw` #,╙▓▓▓\╙N `); - const line08 = llc(String.raw` '╙ \▓▓▓╖╙╦ `); - const line09 = llc(String.raw` \@╣▓╗╢% `); - const line10 = llc(String.raw` ▓╣╢╢] `); - const line11 = llc(String.raw` /╣▓${blc('▓▓')}] `); - const line12 = llc(String.raw` ╢${blc('▓▓/')} `); - const line13 = llc(String.raw` ▓${blc('╬/')} `); - const line14 = llc(String.raw` / `); - - // Offset Pad - const pad = ' '.repeat(7); - - console.log( - String.raw` -${line01} ________ __ ___ ___ ___ _______ __ -${line02} /" )|/"| / ")|" \/" |/" \ /""\ -${line03} (: \___/ (: |/ / \ \ /|: | / \ -${line04} \___ \ | __/ \\ \/ |_____/ ) /' /\ \ -${line05} __/ \\ (// _ \ / / // / // __' \ -${line06} /" \ :) |: | \ \ / / |: __ \ / / \\ \ -${line07} (_______/ (__| \__)|___/ |__| \___)(___/ \___) -${line08} ${blc(process.env.CLIENT_VERSION.padStart(55, ' '))} -${line09} ${pad}[${success}] Gateway -${line10} ${pad}[${client.analytics ? success : failed}] Analytics -${line11} ${pad}[${success}] Moderation -${line12} ${pad}[${success}] Social & Leaderboards -${line13} -${line14}${client.dev ? ` ${pad}${blc('<')}${llc('/')}${blc('>')} ${llc('DEVELOPMENT MODE')}` : ''} - `.trim() - ); - } - - private printStoreDebugInformation() { - const { client, logger, i18n } = this.container; - const stores = [...client.stores.values()]; - - for (const store of stores) { - logger.info(this.styleStore(store)); - } - - logger.info(this.styleLanguages(i18n.languages)); - } - - private styleStore(store: Store) { - return gray(`├─ Loaded ${this.style(store.size.toString().padEnd(3, ' '))} ${store.name}.`); - } - - private styleLanguages(languages: Map) { - return gray(`└─ Loaded ${this.style(languages.size.toString().padEnd(3, ' '))} languages.`); - } -} diff --git a/src/listeners/shard/shardDisconnect.ts b/src/listeners/shard/shardDisconnect.ts deleted file mode 100644 index 802a467e9e9..00000000000 --- a/src/listeners/shard/shardDisconnect.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ShardListener } from '#lib/structures'; -import { red } from 'colorette'; -import type { CloseEvent } from 'discord.js'; - -export class UserShardListener extends ShardListener { - protected readonly title = red('Disconnected'); - - public run(event: CloseEvent, id: number) { - this.container.logger.error(`${this.header(id)}:\n\tCode: ${event.code}\n\tReason: ${event.reason}`); - } -} diff --git a/src/listeners/shard/shardError.ts b/src/listeners/shard/shardError.ts deleted file mode 100644 index 2e6ad5152f8..00000000000 --- a/src/listeners/shard/shardError.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ShardListener } from '#lib/structures'; -import { red } from 'colorette'; - -export class UserShardListener extends ShardListener { - protected readonly title = red('Error'); - - public run(error: Error, id: number) { - this.container.logger.error(`${this.header(id)}: ${error.stack ?? error.message}`); - } -} diff --git a/src/listeners/shard/shardReady.ts b/src/listeners/shard/shardReady.ts deleted file mode 100644 index 5f387483e87..00000000000 --- a/src/listeners/shard/shardReady.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ShardListener } from '#lib/structures'; -import { green } from 'colorette'; - -export class UserShardListener extends ShardListener { - protected readonly title = green('Ready'); - - public run(id: number, unavailableGuilds: Set | null) { - this.container.logger.info(`${this.header(id)}: ${unavailableGuilds?.size ?? 'Unknown or no unavailable'} guilds`); - } -} diff --git a/src/listeners/shard/shardReconnecting.ts b/src/listeners/shard/shardReconnecting.ts deleted file mode 100644 index a5d977b84c5..00000000000 --- a/src/listeners/shard/shardReconnecting.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ShardListener } from '#lib/structures'; -import { yellow } from 'colorette'; - -export class UserShardListener extends ShardListener { - protected readonly title = yellow('Reconnecting'); - - public run(id: number) { - this.container.logger.error(`${this.header(id)}: ${this.title}`); - } -} diff --git a/src/listeners/shard/shardResume.ts b/src/listeners/shard/shardResume.ts deleted file mode 100644 index 973f3031328..00000000000 --- a/src/listeners/shard/shardResume.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ShardListener } from '#lib/structures'; -import { yellow } from 'colorette'; - -export class UserShardListener extends ShardListener { - protected readonly title = yellow('Resumed'); - - public run(id: number, replayedEvents: number) { - this.container.logger.error(`${this.header(id)}: ${replayedEvents} events replayed.`); - } -} diff --git a/src/listeners/twitch/twitchStreamOffline.ts b/src/listeners/twitch/twitchStreamOffline.ts deleted file mode 100644 index 9cea58e2423..00000000000 --- a/src/listeners/twitch/twitchStreamOffline.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { TwitchEventSubEvent, TwitchEventSubTypes } from '#lib/types'; -import { Events } from '#lib/types/Enums'; -import { floatPromise } from '#utils/common'; -import { extractDetailedMentions } from '#utils/util'; -import { time, TimestampStyles } from '@discordjs/builders'; -import { ApplyOptions } from '@sapphire/decorators'; -import { canSendMessages, TextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { Listener, ListenerOptions } from '@sapphire/framework'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { isNullish, isNullishOrEmpty } from '@sapphire/utilities'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - event: Events.TwitchStreamOffline -}) -export class UserListener extends Listener { - public async run(data: TwitchEventSubEvent) { - const { twitchSubscriptions } = this.container.db; - const date = new Date(); - - const twitchSubscription = await twitchSubscriptions.findOne({ - relations: ['guildSubscription'], - where: { - streamerId: data.broadcaster_user_id, - subscriptionType: TwitchEventSubTypes.StreamOffline - } - }); - - if (twitchSubscription) { - // Iterate over all the guilds that are subscribed to this streamer and subscription type - for (const guildSubscription of twitchSubscription.guildSubscription) { - if ( - this.container.client.twitch.streamNotificationDrip( - `${twitchSubscription.streamerId}-${guildSubscription.channelId}-${TwitchEventSubTypes.StreamOffline}` - ) - ) { - continue; - } - - // Retrieve the guild, if not found, skip to the next loop cycle. - const guild = this.container.client.guilds.cache.get(guildSubscription.guildId); - if (typeof guild === 'undefined') continue; - - // Retrieve the language for this guild - const t = await fetchT(guild); - - // Retrieve the channel to send the message to - const channel = guild.channels.cache.get(guildSubscription.channelId) as TextBasedChannelTypes; - if (isNullish(channel) || !canSendMessages(channel)) { - continue; - } - - // Construct a message embed and send it. - // If the message could not be retrieved then skip this notification. - if (!isNullishOrEmpty(guildSubscription.message)) { - const detailedMentions = extractDetailedMentions(guildSubscription.message); - floatPromise( - channel.send({ - content: this.buildMessage(guildSubscription.message, date, t), - allowedMentions: { parse: detailedMentions.parse, users: [...detailedMentions.users], roles: [...detailedMentions.roles] } - }) - ); - } - } - } - } - - private buildMessage(message: string, date: Date, t: TFunction): string { - return `${message} | ${time(date, TimestampStyles.ShortDateTime)} | ${t(LanguageKeys.Events.Twitch.OfflinePostfix)}`; - } -} diff --git a/src/listeners/twitch/twitchStreamOnline.ts b/src/listeners/twitch/twitchStreamOnline.ts deleted file mode 100644 index f4981f4d31d..00000000000 --- a/src/listeners/twitch/twitchStreamOnline.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { TwitchEventSubTypes } from '#lib/types'; -import type { TwitchEventSubOnlineEvent, TwitchHelixStreamsResult, TwitchOnlineEmbedData } from '#lib/types/definitions/Twitch'; -import { Events } from '#lib/types/Enums'; -import { floatPromise } from '#utils/common'; -import { escapeMarkdown } from '#utils/External/escapeMarkdown'; -import { extractDetailedMentions } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { canSendMessages, TextBasedChannelTypes } from '@sapphire/discord.js-utilities'; -import { Listener, ListenerOptions } from '@sapphire/framework'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { isNullish } from '@sapphire/utilities'; -import { MessageEmbed } from 'discord.js'; -import type { TFunction } from 'i18next'; - -@ApplyOptions({ - event: Events.TwitchStreamOnline -}) -export class UserListener extends Listener { - private readonly kTwitchImageReplacerRegex = /({width}|{height})/gi; - - public async run(data: TwitchEventSubOnlineEvent) { - const { twitchSubscriptions } = this.container.db; - - const twitchSubscription = await twitchSubscriptions.findOne({ - relations: ['guildSubscription'], - where: { - streamerId: data.broadcaster_user_id, - subscriptionType: TwitchEventSubTypes.StreamOnline - } - }); - - if (twitchSubscription) { - try { - // Get the data for this stream from the Twitch API - const streamData = await this.container.client.twitch.fetchStream(data.broadcaster_user_id); - - // Iterate over all the guilds that are subscribed to this streamer and subscription type - for (const guildSubscription of twitchSubscription.guildSubscription) { - if ( - this.container.client.twitch.streamNotificationDrip( - `${twitchSubscription.streamerId}-${guildSubscription.channelId}-${TwitchEventSubTypes.StreamOnline}` - ) - ) { - continue; - } - - // Retrieve the guild, if not found, skip to the next loop cycle. - const guild = this.container.client.guilds.cache.get(guildSubscription.guildId); - if (typeof guild === 'undefined') continue; - - // Retrieve the language for this guild - const t = await fetchT(guild); - - // Retrieve the channel to send the message to - const channel = guild.channels.cache.get(guildSubscription.channelId) as TextBasedChannelTypes; - if (isNullish(channel) || !canSendMessages(channel)) { - continue; - } - - // Construct a message embed and send it. - const detailedMentions = extractDetailedMentions(guildSubscription.message); - floatPromise( - channel.send({ - content: guildSubscription.message || null, - embeds: [this.buildEmbed(this.transformTextToObject(data, streamData), t)], - allowedMentions: { parse: detailedMentions.parse, users: [...detailedMentions.users], roles: [...detailedMentions.roles] } - }) - ); - } - } catch { - // noop, this try/catch is only here so we don't get a runtime error. - } - } - } - - private transformTextToObject(notification: TwitchEventSubOnlineEvent, streamData: TwitchHelixStreamsResult | null): TwitchOnlineEmbedData { - return { - embedThumbnailUrl: streamData?.game_box_art_url?.replace(this.kTwitchImageReplacerRegex, '128'), - gameName: streamData?.game_name, - language: streamData?.language, - startedAt: new Date(notification.started_at), - title: this.escapeText(streamData?.title), - userName: notification.broadcaster_user_name, - viewerCount: streamData?.viewer_count, - embedImageUrl: streamData?.thumbnail_url.replace(this.kTwitchImageReplacerRegex, '128') - }; - } - - private buildEmbed(data: TwitchOnlineEmbedData, t: TFunction) { - const embed = new MessageEmbed() - .setTitle(data.title) - .setURL(`https://twitch.tv/${data.userName}`) - .setFooter({ text: t(LanguageKeys.Events.Twitch.OfflinePostfix) }) - .setColor(this.container.client.twitch.BRANDING_COLOUR) - .setTimestamp(data.startedAt); - - if (data.gameName) { - embed.setDescription(t(LanguageKeys.Events.Twitch.EmbedDescriptionWithGame, { userName: data.userName, gameName: data.gameName })); - } else { - embed.setDescription(t(LanguageKeys.Events.Twitch.EmbedDescription, { userName: data.userName })); - } - - if (data.embedImageUrl) { - embed.setImage(data.embedImageUrl); - } - - if (data.embedThumbnailUrl) { - embed.setThumbnail(data.embedThumbnailUrl ?? ''); - } - - return embed; - } - - private escapeText(text?: string) { - if (isNullish(text)) { - return ''; - } - - return escapeMarkdown(text.replace(/\\/g, '\\\\').replace(/"/g, '\\"')); - } -} diff --git a/src/preconditions/Administrator.ts b/src/preconditions/Administrator.ts deleted file mode 100644 index 06bf360f78c..00000000000 --- a/src/preconditions/Administrator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PermissionsPrecondition } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { isAdmin } from '#utils/functions'; - -export class UserPermissionsPrecondition extends PermissionsPrecondition { - public async handle(message: GuildMessage): PermissionsPrecondition.AsyncResult { - return (await isAdmin(message.member)) ? this.ok() : this.error({ identifier: LanguageKeys.Preconditions.Administrator }); - } -} diff --git a/src/preconditions/BotOwner.ts b/src/preconditions/BotOwner.ts deleted file mode 100644 index 1d4996d8a24..00000000000 --- a/src/preconditions/BotOwner.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { OWNERS } from '#root/config'; -import { AsyncPreconditionResult, Precondition } from '@sapphire/framework'; -import type { Message } from 'discord.js'; - -export class UserPrecondition extends Precondition { - public async run(message: Message): AsyncPreconditionResult { - return OWNERS.includes(message.author.id) ? this.ok() : this.error({ context: { silent: true } }); - } -} diff --git a/src/preconditions/Enabled.ts b/src/preconditions/Enabled.ts deleted file mode 100644 index 3242fc795ae..00000000000 --- a/src/preconditions/Enabled.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { CommandMatcher, GuildEntity, GuildSettings, readSettings } from '#lib/database'; -import type { SkyraCommand } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { isModerator } from '#utils/functions'; -import { ApplyOptions } from '@sapphire/decorators'; -import { Command, Identifiers, Precondition } from '@sapphire/framework'; -import type { Message } from 'discord.js'; - -@ApplyOptions({ position: 10 }) -export class UserPrecondition extends Precondition { - public run(message: Message, command: Command, context: Precondition.Context): Precondition.Result { - return message.guild ? this.runGuild(message as GuildMessage, command, context) : this.runDM(command, context); - } - - private runDM(command: Command, context: Precondition.Context): Precondition.Result { - return command.enabled ? this.ok() : this.error({ identifier: Identifiers.CommandDisabled, context }); - } - - private async runGuild(message: GuildMessage, command: Command, context: Precondition.Context): Precondition.AsyncResult { - const disabled = await readSettings(message.guild, (settings) => this.checkGuildDisabled(settings, message, command as SkyraCommand)); - if (disabled) { - const canOverride = await isModerator(message.member); - if (!canOverride) return this.error({ context: { ...context, silent: true } }); - } - - return this.runDM(command, context); - } - - private checkGuildDisabled(settings: GuildEntity, message: GuildMessage, command: SkyraCommand) { - if (settings[GuildSettings.DisabledChannels].includes(message.channel.id)) return true; - if (CommandMatcher.matchAny(settings[GuildSettings.DisabledCommands], command)) return true; - - const entry = settings[GuildSettings.DisabledCommandChannels].find((d) => d.channel === message.channel.id); - if (entry === undefined) return false; - - return CommandMatcher.matchAny(entry.commands, command); - } -} diff --git a/src/preconditions/Everyone.ts b/src/preconditions/Everyone.ts deleted file mode 100644 index 332eeb341db..00000000000 --- a/src/preconditions/Everyone.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PermissionsPrecondition } from '#lib/structures'; -import { ApplyOptions } from '@sapphire/decorators'; - -@ApplyOptions({ guildOnly: false }) -export class UserPermissionsPrecondition extends PermissionsPrecondition { - public handle(): PermissionsPrecondition.Result { - return this.ok(); - } -} diff --git a/src/preconditions/Moderator.ts b/src/preconditions/Moderator.ts deleted file mode 100644 index af2ee76e85b..00000000000 --- a/src/preconditions/Moderator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PermissionsPrecondition } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; -import { isModerator } from '#utils/functions'; - -export class UserPermissionsPrecondition extends PermissionsPrecondition { - public async handle(message: GuildMessage): PermissionsPrecondition.AsyncResult { - return (await isModerator(message.member)) ? this.ok() : this.error({ identifier: LanguageKeys.Preconditions.Moderator }); - } -} diff --git a/src/preconditions/ServerOwner.ts b/src/preconditions/ServerOwner.ts deleted file mode 100644 index f4e4a806bdb..00000000000 --- a/src/preconditions/ServerOwner.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { PermissionsPrecondition } from '#lib/structures'; -import type { GuildMessage } from '#lib/types'; - -export class UserPermissionsPrecondition extends PermissionsPrecondition { - public handle(message: GuildMessage): PermissionsPrecondition.Result { - return message.author.id === message.guild.ownerId ? this.ok() : this.error({ identifier: LanguageKeys.Preconditions.ServerOwner }); - } -} diff --git a/src/routes/banners.ts b/src/routes/banners.ts deleted file mode 100644 index ea4af0e6f73..00000000000 --- a/src/routes/banners.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ratelimit } from '#lib/api/utils'; -import { seconds } from '#utils/common'; -import { ApplyOptions } from '@sapphire/decorators'; -import { ApiRequest, ApiResponse, methods, Route, RouteOptions } from '@sapphire/plugin-api'; - -@ApplyOptions({ route: 'banners' }) -export class UserRoute extends Route { - @ratelimit(seconds(5), 2) - public async [methods.GET](_: ApiRequest, response: ApiResponse) { - const { banners } = this.container.db; - const entries = await banners.find(); - return response.json(entries); - } -} diff --git a/src/routes/guilds/guild/leaderboard.ts b/src/routes/guilds/guild/leaderboard.ts deleted file mode 100644 index ce34182b375..00000000000 --- a/src/routes/guilds/guild/leaderboard.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ratelimit } from '#lib/api/utils'; -import { iteratorRange, seconds } from '#utils/common'; -import { fetchAllLeaderBoardEntries } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { ApiRequest, ApiResponse, HttpCodes, methods, Route, RouteOptions } from '@sapphire/plugin-api'; - -@ApplyOptions({ name: 'guildLeaderboard', route: 'guilds/:guild/leaderboard' }) -export class UserRoute extends Route { - @ratelimit(seconds(5), 2) - public async [methods.GET](request: ApiRequest, response: ApiResponse) { - const guildId = request.params.guild; - - const { client } = this.container; - const guild = client.guilds.cache.get(guildId); - if (!guild) return response.error(HttpCodes.BadRequest); - - const limit = Reflect.has(request.query, 'limit') ? Number(request.query.limit) : 10; - if (!Number.isInteger(limit) || limit <= 0 || limit > 100) return response.error(HttpCodes.BadRequest); - - const after = Reflect.has(request.query, 'after') ? Number(request.query.after) : 1; - if (!Number.isInteger(after) || after <= 0 || after > 2500 - limit) return response.error(HttpCodes.BadRequest); - - const leaderboard = await client.leaderboard.fetch(guildId); - const results = iteratorRange(leaderboard.entries(), after - 1, limit); - - return response.json(fetchAllLeaderBoardEntries(guild, results)); - } -} diff --git a/src/routes/twitch/twitchEventSubVerify.ts b/src/routes/twitch/twitchEventSubVerify.ts deleted file mode 100644 index 4f8ccd1820b..00000000000 --- a/src/routes/twitch/twitchEventSubVerify.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { TwitchEventSubTypes, TwitchEventSubVerificationMessage } from '#lib/types'; -import { TwitchStreamStatus } from '#lib/types/AnalyticsSchema'; -import { Events } from '#lib/types/Enums'; -import { cast } from '#utils/util'; -import { ApplyOptions } from '@sapphire/decorators'; -import { ApiRequest, ApiResponse, methods, Route, RouteOptions } from '@sapphire/plugin-api'; -import { isObject } from '@sapphire/utilities'; - -@ApplyOptions({ route: 'twitch/event_sub_verify' }) -export class UserRoute extends Route { - private lastNotificationId: string | null = null; - - // Stream Changed - public [methods.POST](request: ApiRequest, response: ApiResponse) { - // Grab the headers that we need to use for verification - const twitchEventSubMessageSignature = cast(request.headers['twitch-eventsub-message-signature']); - const twitchEventSubMessageId = cast(request.headers['twitch-eventsub-message-id']); - const twitchEventSubMessageTimestamp = cast(request.headers['twitch-eventsub-message-timestamp']); - - // If this notification is the same as before, then send ok back - if (this.lastNotificationId && this.lastNotificationId === twitchEventSubMessageId) return response.ok(); - - // If there is no body then tell Twitch they are sending malformed data - if (!isObject(request.body)) return response.badRequest('Malformed data received'); - - // If any of the headers is missing tell Twitch they are sending invalid data - if (!twitchEventSubMessageSignature || !twitchEventSubMessageId || !twitchEventSubMessageTimestamp) { - return response.badRequest('Missing required Twitch Eventsub headers'); - } - - // Construct the verification signature - const twitchEventSubMessage = twitchEventSubMessageId + twitchEventSubMessageTimestamp + JSON.stringify(request.body); - - // Split the algorithm from the signature - const [algorithm, signature] = twitchEventSubMessageSignature.toString().split('=', 2); - - const { client } = this.container; - - // Verify the signature - if (!client.twitch.checkSignature(algorithm, signature, twitchEventSubMessage)) { - return response.forbidden('Invalid Hub signature'); - } - - // Destructure the properties that we need from the body - const { - challenge, - subscription: { type }, - event - } = request.body as TwitchEventSubVerificationMessage; - - // Tell the Twitch API this response was OK, then continue processing the request - response.text(challenge); - - // If there is an event then this is an online or offline notification - // If there is no event this is an endpoint verification request - if (event) { - if (type === TwitchEventSubTypes.StreamOnline) { - client.emit(Events.TwitchStreamHookedAnalytics, TwitchStreamStatus.Online); - client.emit(Events.TwitchStreamOnline, event); - } else { - client.emit(Events.TwitchStreamHookedAnalytics, TwitchStreamStatus.Offline); - client.emit(Events.TwitchStreamOffline, event); - } - } - - // Store the last notification id - this.lastNotificationId = twitchEventSubMessageId; - } -} diff --git a/src/serializers/autorole.ts b/src/serializers/autorole.ts deleted file mode 100644 index 7e312812f7e..00000000000 --- a/src/serializers/autorole.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { RolesAuto, Serializer, SerializerUpdateContext } from '#lib/database'; -import { formatNumber } from '#utils/functions'; -import { Awaitable, isObject } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const role = await args.pickResult('role'); - if (!role.success) { - return this.errorFromArgument(args, role.error); - } - - const points = await args.pickResult('integer'); - if (!points.success) { - return this.errorFromArgument(args, points.error); - } - - return this.ok({ id: role.value.id, points: points.value }); - } - - public isValid(value: RolesAuto): Awaitable { - return isObject(value) && Object.keys(value).length === 2 && typeof value.id === 'string' && typeof value.points === 'number'; - } - - public stringify(value: RolesAuto, { t }: SerializerUpdateContext): string { - return `[${value.id} -> ${formatNumber(t, value.points)}]`; - } - - public equals(left: RolesAuto, right: RolesAuto): boolean { - return left.id === right.id && left.points === right.points; - } -} diff --git a/src/serializers/boolean.ts b/src/serializers/boolean.ts deleted file mode 100644 index c0837786002..00000000000 --- a/src/serializers/boolean.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { Awaitable } from '@sapphire/utilities'; - -@ApplyOptions({ - aliases: ['bool'] -}) -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - return this.result(args, await args.pickResult('boolean')); - } - - public isValid(value: boolean): Awaitable { - return typeof value === 'boolean'; - } - - public stringify(value: boolean, { t }: SerializerUpdateContext): string { - return t(value ? LanguageKeys.Arguments.BooleanEnabled : LanguageKeys.Arguments.BooleanDisabled); - } -} diff --git a/src/serializers/categoryortextchannel.ts b/src/serializers/categoryortextchannel.ts deleted file mode 100644 index 506d12eb5e3..00000000000 --- a/src/serializers/categoryortextchannel.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { isCategoryChannel, isTextChannel } from '@sapphire/discord.js-utilities'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { t, entry }: SerializerUpdateContext) { - const result = await args.pickResult('guildChannel'); - if (!result.success) { - return this.errorFromArgument(args, result.error); - } - - if (isTextChannel(result.value) || isCategoryChannel(result.value)) { - return this.ok(result.value.id); - } - - return this.error(t(LanguageKeys.Serializers.InvalidChannel, { name: entry.name })); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - return context.guild.channels.cache.has(value); - } - - public stringify(value: string, context: SerializerUpdateContext): string { - return context.guild.channels.cache.get(value)?.name ?? value; - } -} diff --git a/src/serializers/channel.ts b/src/serializers/channel.ts deleted file mode 100644 index f26bf4048ba..00000000000 --- a/src/serializers/channel.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { ApplyOptions } from '@sapphire/decorators'; -import { isCategoryChannel, isGuildBasedChannelByGuildKey, isNewsChannel, isTextChannel, isVoiceChannel } from '@sapphire/discord.js-utilities'; -import { Awaitable, isNullish } from '@sapphire/utilities'; -import type { Channel } from 'discord.js'; - -@ApplyOptions({ - aliases: ['guildTextChannel', 'guildVoiceChannel', 'guildCategoryChannel'] -}) -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { entry }: SerializerUpdateContext) { - const result = await args.pickResult(entry.type as 'guildTextChannel' | 'guildVoiceChannel' | 'guildCategoryChannel'); - return result.success ? this.ok(result.value.id) : this.errorFromArgument(args, result.error); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - const channel = context.guild.channels.cache.get(value); - return !isNullish(channel) && this.isValidChannel(channel, context.entry.type); - } - - /** - * The stringify method to be overwritten in actual Serializers - * @param value The data to stringify - * @param guild The guild given for context in this call - */ - public stringify(value: string, context: SerializerUpdateContext): string { - return context.guild.channels.cache.get(value)?.name ?? value; - } - - private isValidChannel(channel: Channel, type: string): boolean { - if (!isGuildBasedChannelByGuildKey(channel)) return false; - - switch (type) { - case 'textChannel': - return isTextChannel(channel) || isNewsChannel(channel); - case 'voiceChannel': - return isVoiceChannel(channel); - case 'categoryChannel': - return isCategoryChannel(channel); - } - - return false; - } -} diff --git a/src/serializers/command.ts b/src/serializers/command.ts deleted file mode 100644 index 3ed5ec6107b..00000000000 --- a/src/serializers/command.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('commandName'); - return result.success ? this.ok(result.value.name) : this.errorFromArgument(args, result.error); - } - - public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaitable { - const command = this.container.stores.get('commands').has(value); - if (!command) throw t(LanguageKeys.Serializers.InvalidCommand, { name: entry.name }); - return true; - } - - public stringify(value: string) { - return (this.container.stores.get('commands').get(value) || { name: value }).name; - } -} diff --git a/src/serializers/commandautodelete.ts b/src/serializers/commandautodelete.ts deleted file mode 100644 index 1dfa6131b32..00000000000 --- a/src/serializers/commandautodelete.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { CommandAutoDelete, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { seconds } from '#utils/common'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const command = await args.pickResult('command'); - if (!command.success) return this.errorFromArgument(args, command.error); - - const duration = await args.pickResult('timespan', { minimum: seconds(1) }); - if (!duration.success) return this.errorFromArgument(args, duration.error); - - return this.ok([command.value.name, duration.value] as const); - } - - public isValid(value: CommandAutoDelete): Awaitable { - return ( - Array.isArray(value) && - value.length === 2 && - typeof value[0] === 'string' && - typeof value[1] === 'number' && - this.container.stores.get('commands').has(value[0]) - ); - } - - public stringify(value: CommandAutoDelete, { t }: SerializerUpdateContext): string { - return `[${value[0]} -> ${t(LanguageKeys.Globals.DurationValue, { value: value[1] })}]`; - } - - public equals(left: CommandAutoDelete, right: CommandAutoDelete): boolean { - return left[0] === right[0]; - } -} diff --git a/src/serializers/commandmatch.ts b/src/serializers/commandmatch.ts deleted file mode 100644 index c89dd1c2ecf..00000000000 --- a/src/serializers/commandmatch.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CommandMatcher, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('commandMatch'); - return result.success ? this.ok(result.value) : this.errorFromArgument(args, result.error); - } - - public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaitable { - const command = CommandMatcher.resolve(value); - if (!command) throw t(LanguageKeys.Serializers.InvalidCommand, { name: entry.name }); - return true; - } - - public stringify(value: string) { - return (this.container.stores.get('commands').get(value) || { name: value }).name; - } -} diff --git a/src/serializers/customcommand.ts b/src/serializers/customcommand.ts deleted file mode 100644 index 7a044268ce4..00000000000 --- a/src/serializers/customcommand.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { parseAndValidate } from '#lib/customCommands'; -import { CustomCommand, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ZeroWidthSpace } from '#utils/constants'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public parse(_: Serializer.Args, { t }: SerializerUpdateContext) { - return this.error(t(LanguageKeys.Serializers.Unsupported)); - } - - public isValid(value: CustomCommand, { t }: SerializerUpdateContext): Awaitable { - if (typeof value.id !== 'string') { - throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidId)); - } - - if (value.id.length > 50) { - throw t(LanguageKeys.Commands.Tags.TagNameTooLong); - } - - if (value.id.includes('`') || value.id.includes(ZeroWidthSpace)) { - throw t(LanguageKeys.Commands.Tags.TagNameNotAllowed); - } - - if (!Array.isArray(value.aliases) || value.aliases.some((alias) => typeof alias !== 'string')) { - throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidAliases)); - } - - if (typeof value.embed !== 'boolean') { - throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidEmbed)); - } - - if (typeof value.color !== 'number') { - throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidColor)); - } - - if (typeof value.content !== 'string') { - throw new Error(t(LanguageKeys.Serializers.CustomCommands.InvalidContent)); - } - - // We will need to mutate this because the dashboard can't send Sentence instances: - value.content = parseAndValidate(value.content); - - return true; - } - - public stringify(value: CustomCommand): string { - return value.id; - } - - public equals(left: CustomCommand, right: CustomCommand): boolean { - return left.id === right.id; - } -} diff --git a/src/serializers/disabledcommandchannel.ts b/src/serializers/disabledcommandchannel.ts deleted file mode 100644 index e4988ee486d..00000000000 --- a/src/serializers/disabledcommandchannel.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { DisabledCommandChannel, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { isTextChannel } from '@sapphire/discord.js-utilities'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const channel = await args.pickResult('guildTextChannel'); - if (!channel.success) return this.errorFromArgument(args, channel.error); - - const commands = await args.repeatResult('command'); - if (!commands.success) return this.errorFromArgument(args, commands.error); - - return this.ok({ channel: channel.value.id, commands: commands.value.map((command) => command.name) }); - } - - public isValid(value: DisabledCommandChannel, { t, entry, guild }: SerializerUpdateContext): Awaitable { - const channel = guild.channels.cache.get(value.channel); - if (!channel) { - throw new Error(t(LanguageKeys.Serializers.DisabledCommandChannels.ChannelDoesNotExist)); - } - - if (!isTextChannel(channel)) { - throw t(LanguageKeys.Serializers.InvalidChannel, { name: entry.name }); - } - - for (const command of value.commands) { - if (!this.container.stores.get('commands').has(command)) { - throw new Error(t(LanguageKeys.Serializers.DisabledCommandChannels.CommandDoesNotExist, { name: command })); - } - } - - return true; - } - - public stringify(value: DisabledCommandChannel, { t, guild }: SerializerUpdateContext): string { - const name = guild.channels.cache.get(value.channel)?.name ?? t(LanguageKeys.Serializers.UnknownChannel); - return `[${name} -> ${value.commands.join(' | ')}]`; - } - - public equals(left: DisabledCommandChannel, right: DisabledCommandChannel): boolean { - return left.channel === right.channel; - } -} diff --git a/src/serializers/emoji.ts b/src/serializers/emoji.ts deleted file mode 100644 index 6edb49ae628..00000000000 --- a/src/serializers/emoji.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { getEmojiString, getEmojiTextFormat, isValidSerializedEmoji, SerializedEmoji } from '#utils/functions'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('emoji'); - if (!result.success) return this.errorFromArgument(args, result.error); - return this.ok(getEmojiString(result.value)); - } - - public isValid(value: SerializedEmoji, { t, entry }: SerializerUpdateContext): Awaitable { - if (isValidSerializedEmoji(value)) return true; - throw new Error(t(LanguageKeys.Serializers.InvalidEmoji, { name: entry.name })); - } - - public stringify(data: SerializedEmoji) { - return getEmojiTextFormat(data); - } -} diff --git a/src/serializers/guild.ts b/src/serializers/guild.ts deleted file mode 100644 index 09d2680ba89..00000000000 --- a/src/serializers/guild.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - return this.result(args, await args.pickResult('snowflake')); - } - - public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaitable { - const guild = this.container.client.guilds.cache.get(value); - if (!guild) { - throw t(LanguageKeys.Serializers.InvalidGuild, { name: entry.name }); - } - - return true; - } - - public stringify(value: string) { - return (this.container.client.guilds.cache.get(value) || { name: value }).name; - } -} diff --git a/src/serializers/invite.ts b/src/serializers/invite.ts deleted file mode 100644 index ae73cf2f614..00000000000 --- a/src/serializers/invite.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const invite = await args.pickResult('invite'); - return invite.success ? this.ok(invite.value.code) : this.errorFromArgument(args, invite.error); - } - - public async isValid(value: string, { t, entry }: SerializerUpdateContext): Promise { - const invite = await this.container.client.invites.fetch(value); - if (invite === null || !Reflect.has(invite, 'guildId')) { - throw t(LanguageKeys.Serializers.InvalidInvite, { name: entry.name }); - } - - return true; - } -} diff --git a/src/serializers/language.ts b/src/serializers/language.ts deleted file mode 100644 index 5bd1f1a1e5f..00000000000 --- a/src/serializers/language.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Serializer } from '#lib/database'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - return this.result(args, await args.pickResult('language')); - } - - public isValid(value: string): Awaitable { - return this.container.i18n.languages.has(value); - } -} diff --git a/src/serializers/number.ts b/src/serializers/number.ts deleted file mode 100644 index 3b1c7d6046e..00000000000 --- a/src/serializers/number.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ApplyOptions } from '@sapphire/decorators'; -import type { Awaitable } from '@sapphire/utilities'; - -@ApplyOptions({ - aliases: ['integer', 'float'] -}) -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { entry }: SerializerUpdateContext) { - return this.result(args, await args.pickResult(entry.type as 'integer' | 'number' | 'float')); - } - - public isValid(value: number, context: SerializerUpdateContext): Awaitable { - switch (context.entry.type) { - case 'integer': { - if (typeof value === 'number' && Number.isInteger(value) && this.minOrMax(value, value, context)) return true; - throw context.t(LanguageKeys.Serializers.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.t(LanguageKeys.Serializers.InvalidFloat, { name: context.entry.name }); - } - } - - throw new Error('Unreachable'); - } -} diff --git a/src/serializers/permissionnode.ts b/src/serializers/permissionnode.ts deleted file mode 100644 index ccc189c42fb..00000000000 --- a/src/serializers/permissionnode.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { CommandMatcher, PermissionsNode, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { SkyraCommand } from '#lib/structures'; -import { PermissionLevels } from '#lib/types/Enums'; -import type { CommandStore } from '@sapphire/framework'; -import { isObject } from '@sapphire/utilities'; -import type { GuildMember, Role } from 'discord.js'; - -export class UserSerializer extends Serializer { - public parse(_: Serializer.Args, { t }: SerializerUpdateContext) { - return this.error(t(LanguageKeys.Serializers.Unsupported)); - } - - public async isValid(value: PermissionsNode, { t, entry, guild }: SerializerUpdateContext): Promise { - // Safe-guard checks against arbitrary data - 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; - if (entry.name === 'permissionsRoles') { - const role = guild.roles.cache.get(value.id); - if (!role) throw t(LanguageKeys.Serializers.PermissionNodeInvalidTarget); - target = role; - } else { - target = await guild.members.fetch(value.id).catch(() => { - throw t(LanguageKeys.Serializers.PermissionNodeInvalidTarget); - }); - } - - // The @everyone role should not have allows - if (target.id === guild.id && value.allow.length !== 0) { - throw t(LanguageKeys.Serializers.PermissionNodeSecurityEveryoneAllows); - } - - // The owner cannot have allows nor denies - if (target.id === guild.ownerId) { - throw t(LanguageKeys.Serializers.PermissionNodeSecurityOwner); - } - - // Check all commands - const commands = this.container.stores.get('commands'); - const checked = new Set(); - for (const allowed of value.allow) { - if (checked.has(allowed)) throw t(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: allowed }); - - const match = CommandMatcher.resolve(allowed); - if (match === null || !this.validCommand(commands, match)) { - throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: allowed }); - } - checked.add(match); - } - - for (const denied of value.deny) { - if (checked.has(denied)) throw t(LanguageKeys.Serializers.PermissionNodeDuplicatedCommand, { command: denied }); - - const match = CommandMatcher.resolve(denied); - if (match === null || !this.validCommand(commands, match)) { - throw t(LanguageKeys.Serializers.PermissionNodeInvalidCommand, { command: denied }); - } - checked.add(match); - } - - return true; - } - - public stringify(value: PermissionsNode) { - return `${value.id}(${value.allow.join(', ')} | ${value.deny.join(', ')})`; - } - - private validCommand(commands: CommandStore, name: string) { - const command = commands.get(name) as SkyraCommand | undefined; - - // No command means it matched a group, which is fine: - if (command === undefined) return true; - - // If it matched a command, it must not be a bot-owner one: - return command.permissionLevel < PermissionLevels.BotOwner; - } -} diff --git a/src/serializers/reactionrole.ts b/src/serializers/reactionrole.ts deleted file mode 100644 index ca953a61023..00000000000 --- a/src/serializers/reactionrole.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ReactionRole, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { getEmojiTextFormat, isValidSerializedEmoji } from '#utils/functions'; -import { Awaitable, isObject } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public parse(_: Serializer.Args, { t }: SerializerUpdateContext) { - return this.error(t(LanguageKeys.Serializers.Unsupported)); - } - - public isValid(value: ReactionRole, { t }: SerializerUpdateContext): Awaitable { - if ( - isObject(value) && - Object.keys(value).length === 4 && - typeof value.emoji === 'string' && - isValidSerializedEmoji(value.emoji) && - (typeof value.message === 'string' || value.message === null) && - typeof value.channel === 'string' && - typeof value.role === 'string' - ) - return true; - - throw t(LanguageKeys.Serializers.ReactionRoleInvalid); - } - - public stringify(value: ReactionRole, { t, guild }: SerializerUpdateContext) { - const emoji = getEmojiTextFormat(value.emoji); - const role = guild.roles.cache.get(value.role)?.name ?? t(LanguageKeys.Serializers.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 deleted file mode 100644 index d1260267b3b..00000000000 --- a/src/serializers/role.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const role = await args.pickResult('role'); - return role.success ? this.ok(role.value.id) : this.errorFromArgument(args, role.error); - } - - public isValid(value: string, { t, entry, guild }: SerializerUpdateContext): Awaitable { - if (guild.roles.cache.has(value)) return true; - throw t(LanguageKeys.Serializers.InvalidRole, { name: entry.name }); - } - - 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 deleted file mode 100644 index 4b9b1e465b1..00000000000 --- a/src/serializers/snowflake.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { DiscordSnowflake } from '@sapphire/snowflake'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - /** - * The validator, requiring all numbers and 17 to 19 digits (future-proof). - */ - private readonly kRegExp = /^\d{17,19}$/; - - /** - * Stanislav's join day, known as the oldest user in Discord, and practically - * the lowest snowflake we can get (as they're bound by the creation date). - */ - private readonly kMinimum = new Date(2015, 1, 28).getTime(); - - public async parse(args: Serializer.Args) { - return this.result(args, await args.pickResult('snowflake')); - } - - public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaitable { - 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 t(LanguageKeys.Serializers.InvalidSnowflake, { name: entry.name }); - } -} diff --git a/src/serializers/stickyrole.ts b/src/serializers/stickyrole.ts deleted file mode 100644 index 1d204ca0e7a..00000000000 --- a/src/serializers/stickyrole.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Serializer, SerializerUpdateContext, StickyRole } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Awaitable, isObject } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public parse(_: Serializer.Args, { t }: SerializerUpdateContext) { - return this.error(t(LanguageKeys.Serializers.Unsupported)); - } - - public isValid(value: StickyRole, { t, guild }: SerializerUpdateContext): Awaitable { - if ( - isObject(value) && - Object.keys(value).length === 2 && - typeof value.user === 'string' && - Array.isArray(value.roles) && - value.roles.every((role) => typeof role === 'string' && guild.roles.cache.has(role)) - ) - return true; - - throw t(LanguageKeys.Serializers.StickyRoleInvalid); - } - - public stringify(value: StickyRole, { t, guild }: SerializerUpdateContext) { - const username = guild.client.users.cache.get(value.user)?.username ?? t(LanguageKeys.Serializers.UnknownUser); - const roles = value.roles.map((role) => guild.roles.cache.get(role)?.name ?? t(LanguageKeys.Serializers.UnknownRole)); - return `[${username} -> ${roles}]`; - } -} diff --git a/src/serializers/string.ts b/src/serializers/string.ts deleted file mode 100644 index 53671ed46b0..00000000000 --- a/src/serializers/string.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { entry }: SerializerUpdateContext) { - return this.result(args, await args.restResult('string', { minimum: entry.minimum, maximum: entry.maximum })); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - return this.minOrMax(value, value.length, context).success; - } -} diff --git a/src/serializers/textchannel.ts b/src/serializers/textchannel.ts deleted file mode 100644 index 301e7dd0bf4..00000000000 --- a/src/serializers/textchannel.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('textOrNewsChannelName'); - return result.success ? this.ok(result.value.id) : this.errorFromArgument(args, result.error); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - return context.guild.channels.cache.has(value); - } - - public stringify(value: string, context: SerializerUpdateContext): string { - return context.guild.channels.cache.get(value)?.name ?? value; - } -} diff --git a/src/serializers/timespan.ts b/src/serializers/timespan.ts deleted file mode 100644 index a6cf278da6f..00000000000 --- a/src/serializers/timespan.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { entry }: SerializerUpdateContext) { - return this.result(args, await args.pickResult(entry.type as 'timespan', { minimum: entry.minimum, maximum: entry.maximum })); - } - - public isValid(value: number, context: SerializerUpdateContext): Awaitable { - if (typeof value === 'number' && Number.isInteger(value) && this.minOrMax(value, value, context)) return true; - throw context.t(LanguageKeys.Serializers.InvalidInt, { name: context.entry.name }); - } - - public stringify(data: number, { t }: SerializerUpdateContext): string { - return t(LanguageKeys.Globals.DurationValue, { value: data }); - } -} diff --git a/src/serializers/uniqueroleset.ts b/src/serializers/uniqueroleset.ts deleted file mode 100644 index 9e8c88e52e5..00000000000 --- a/src/serializers/uniqueroleset.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Serializer, SerializerUpdateContext, UniqueRoleSet } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { Awaitable, isObject } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const name = await args.pickResult('string'); - if (!name.success) return this.errorFromArgument(args, name.error); - - const roles = await args.repeatResult('role'); - if (!roles.success) return this.errorFromArgument(args, roles.error); - - return this.ok({ name: name.value, roles: roles.value.map((role) => role.id) }); - } - - public isValid(value: UniqueRoleSet, { t, guild }: SerializerUpdateContext): Awaitable { - if ( - isObject(value) && - Object.keys(value).length === 2 && - typeof value.name === 'string' && - Array.isArray(value.roles) && - value.roles.every((role) => typeof role === 'string' && guild.roles.cache.has(role)) - ) - return true; - - throw t(LanguageKeys.Serializers.UniqueRoleSetInvalid); - } - - public stringify(value: UniqueRoleSet, { t, entity: { guild } }: SerializerUpdateContext) { - return `[${value.name} -> \`${value.roles - .map((role) => guild.roles.cache.get(role)?.name ?? t(LanguageKeys.Serializers.UnknownRole)) - .join('` | `')}\`]`; - } -} diff --git a/src/serializers/url.ts b/src/serializers/url.ts deleted file mode 100644 index 189ffdcd6c4..00000000000 --- a/src/serializers/url.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - private readonly kProtocol = /^https?:\/\//; - - public parse(args: Serializer.Args, { t, entry }: SerializerUpdateContext) { - const value = args.next(); - try { - const { hostname } = new URL(this.kProtocol.test(value) ? value : `https://${value}`); - if (hostname.length <= 128) return this.ok(hostname); - return this.error(t(LanguageKeys.Serializers.MinMaxMaxInclusive, { name: entry.name, max: 128 })); - } catch { - return this.error(t(LanguageKeys.Serializers.MinMaxMaxInclusive, { name: entry.name, max: 128 })); - } - } - - public isValid(value: string, { t, entry }: SerializerUpdateContext): Awaitable { - try { - const { hostname } = new URL(this.kProtocol.test(value) ? value : `https://${value}`); - return hostname.length <= 128; - } catch { - throw new Error(t(LanguageKeys.Serializers.InvalidUrl, { name: entry.name })); - } - } - - public validate(data: string, { entry, t }: SerializerUpdateContext) { - try { - const { hostname } = new URL(this.kProtocol.test(data) ? data : `https://${data}`); - if (hostname.length > 128) throw t(LanguageKeys.Serializers.MinMaxMaxInclusive, { name: entry.name, max: 128 }); - return hostname; - } catch { - throw t(LanguageKeys.Serializers.InvalidUrl, { name: entry.name }); - } - } - - public stringify(data: string) { - return `https://${data}`; - } -} diff --git a/src/serializers/user.ts b/src/serializers/user.ts deleted file mode 100644 index d4e5d1eba73..00000000000 --- a/src/serializers/user.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SnowflakeRegex } from '@sapphire/discord.js-utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('user'); - return result.success ? this.ok(result.value.id) : this.errorFromArgument(args, result.error); - } - - public async isValid(value: string, { t, entry }: SerializerUpdateContext): Promise { - try { - // If it's not a valid snowflake, throw - if (!SnowflakeRegex.test(value)) throw undefined; - - // Fetch the value, if it exists, it'll resolve and return true - await this.container.client.users.fetch(value); - return true; - } catch { - throw t(LanguageKeys.Serializers.InvalidUser, { name: entry.name }); - } - } - - public stringify(value: string) { - return this.container.client.users.cache.get(value)?.tag ?? value; - } -} diff --git a/src/serializers/voicechannel.ts b/src/serializers/voicechannel.ts deleted file mode 100644 index e2d9ff3efcb..00000000000 --- a/src/serializers/voicechannel.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Serializer, SerializerUpdateContext } from '#lib/database'; -import type { Awaitable } from '@sapphire/utilities'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args) { - const result = await args.pickResult('guildVoiceChannel'); - return result.success ? this.ok(result.value.id) : this.errorFromArgument(args, result.error); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - return context.guild.channels.cache.has(value); - } - - public stringify(value: string, context: SerializerUpdateContext): string { - return context.guild.channels.cache.get(value)?.name ?? value; - } -} diff --git a/src/serializers/word.ts b/src/serializers/word.ts deleted file mode 100644 index 1f5507b730b..00000000000 --- a/src/serializers/word.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { GuildEntity, GuildSettings, Serializer, SerializerUpdateContext } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { IncomingType, OutgoingType } from '#lib/moderation/workers'; -import type { Awaitable } from '@sapphire/utilities'; -import { remove as removeConfusables } from 'confusables'; - -export class UserSerializer extends Serializer { - public async parse(args: Serializer.Args, { t, entry, entity }: SerializerUpdateContext) { - const result = await args.restResult('string', { minimum: entry.minimum, maximum: entry.maximum }); - if (!result.success) return this.result(args, result); - - const word = removeConfusables(result.value.toLowerCase()); - if (await this.hasWord(entity, word)) return this.error(t(LanguageKeys.Serializers.WordIncluded, { name: entry.name, value: word })); - return this.ok(word); - } - - public isValid(value: string, context: SerializerUpdateContext): Awaitable { - const word = removeConfusables(value.toLowerCase()); - return value === word && this.minOrMax(value, value.length, context).success; - } - - private async hasWord(settings: GuildEntity, content: string) { - const words = settings[GuildSettings.Selfmod.Filter.Raw]; - if (words.includes(content)) return true; - - const regExp = settings.wordFilterRegExp; - if (regExp === null) return false; - - try { - const result = await this.container.workers.send({ type: IncomingType.RunRegExp, content, regExp }); - return result.type === OutgoingType.RegExpMatch; - } catch { - return false; - } - } -} diff --git a/src/tasks/moderation/moderationEndRestrictionAttachment.ts b/src/tasks/moderation/moderationEndRestrictionAttachment.ts deleted file mode 100644 index 760da43c99e..00000000000 --- a/src/tasks/moderation/moderationEndRestrictionAttachment.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationData, ModerationTask } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { Guild, Permissions } from 'discord.js'; - -export class UserModerationTask extends ModerationTask { - protected async handle(guild: Guild, data: ModerationData) { - const me = guild.me === null ? await guild.members.fetch(process.env.CLIENT_ID) : guild.me; - if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; - - const t = await fetchT(guild); - await getSecurity(guild).actions.unRestrictAttachment( - { - moderatorId: process.env.CLIENT_ID, - userId: data.userID, - reason: `[MODERATION] Attachment Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` - }, - await this.getTargetDM(guild, await this.container.client.users.fetch(data.userID)) - ); - return null; - } -} diff --git a/src/tasks/moderation/moderationEndRestrictionEmbed.ts b/src/tasks/moderation/moderationEndRestrictionEmbed.ts deleted file mode 100644 index 0075b81b510..00000000000 --- a/src/tasks/moderation/moderationEndRestrictionEmbed.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationData, ModerationTask } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { Guild, Permissions } from 'discord.js'; - -export class UserModerationTask extends ModerationTask { - protected async handle(guild: Guild, data: ModerationData) { - const me = guild.me === null ? await guild.members.fetch(process.env.CLIENT_ID) : guild.me; - if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; - - const t = await fetchT(guild); - await getSecurity(guild).actions.unRestrictEmbed( - { - moderatorId: process.env.CLIENT_ID, - userId: data.userID, - reason: `[MODERATION] Embed Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` - }, - await this.getTargetDM(guild, await this.container.client.users.fetch(data.userID)) - ); - return null; - } -} diff --git a/src/tasks/moderation/moderationEndRestrictionReaction.ts b/src/tasks/moderation/moderationEndRestrictionReaction.ts deleted file mode 100644 index 38f0a4bdfbf..00000000000 --- a/src/tasks/moderation/moderationEndRestrictionReaction.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationData, ModerationTask } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { Guild, Permissions } from 'discord.js'; - -export class UserModerationTask extends ModerationTask { - protected async handle(guild: Guild, data: ModerationData) { - const me = guild.me === null ? await guild.members.fetch(process.env.CLIENT_ID) : guild.me; - if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; - - const t = await fetchT(guild); - await getSecurity(guild).actions.unRestrictReaction( - { - moderatorId: process.env.CLIENT_ID, - userId: data.userID, - reason: `[MODERATION] Reaction Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` - }, - await this.getTargetDM(guild, await this.container.client.users.fetch(data.userID)) - ); - return null; - } -} diff --git a/src/tasks/moderation/moderationEndRestrictionVoice.ts b/src/tasks/moderation/moderationEndRestrictionVoice.ts deleted file mode 100644 index e9d63085e4d..00000000000 --- a/src/tasks/moderation/moderationEndRestrictionVoice.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { ModerationData, ModerationTask } from '#lib/moderation'; -import { getSecurity } from '#utils/functions'; -import { fetchT } from '@sapphire/plugin-i18next'; -import { Guild, Permissions } from 'discord.js'; - -export class UserModerationTask extends ModerationTask { - protected async handle(guild: Guild, data: ModerationData) { - const me = guild.me === null ? await guild.members.fetch(process.env.CLIENT_ID) : guild.me; - if (!me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) return null; - - const t = await fetchT(guild); - await getSecurity(guild).actions.unRestrictVoice( - { - moderatorId: process.env.CLIENT_ID, - userId: data.userID, - reason: `[MODERATION] Voice Restricted released after ${t(LanguageKeys.Globals.DurationValue, { value: data.duration })}` - }, - await this.getTargetDM(guild, await this.container.client.users.fetch(data.userID)) - ); - return null; - } -} diff --git a/src/tasks/syncResourceAnalytics.ts b/src/tasks/syncResourceAnalytics.ts deleted file mode 100644 index 79db989e86b..00000000000 --- a/src/tasks/syncResourceAnalytics.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Task } from '#lib/database'; -import { Events } from '#lib/types/Enums'; - -export class UserTask extends Task { - public run() { - this.container.client.emit(Events.ResourceAnalyticsSync); - return null; - } -} diff --git a/tests/lib/database/settings/structures/PermissionNodeManager.test.ts b/tests/lib/database/settings/structures/PermissionNodeManager.test.ts deleted file mode 100644 index e1c5ef57eb2..00000000000 --- a/tests/lib/database/settings/structures/PermissionNodeManager.test.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { GuildEntity, PermissionNodeAction, PermissionsNode } from '#lib/database'; -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { createGuild, createGuildMember, createRole, createUser, roleData } from '#mocks/MockInstances'; -import { UserError } from '@sapphire/framework'; -import type { Guild } from 'discord.js'; - -describe('PermissionNodeManager', () => { - let guild: Guild; - let entity: GuildEntity; - - beforeEach(() => { - guild = createGuild(); - entity = new GuildEntity(); - entity.id = guild.id; - }); - - function getSorted() { - // eslint-disable-next-line @typescript-eslint/dot-notation - return entity.permissionNodes['sorted']; - } - - describe('run', () => { - // TODO: Test with no nodes - // TODO: Test with non-applicable nodes - // TODO: Test with user nodes - // TODO: Test with role nodes - }); - - describe('has', () => { - test('GIVEN a guild with no roles THEN returns false', () => { - expect(entity.permissionNodes.has('1')).toBe(false); - }); - - // TODO: Test with entry but no refresh - // TODO: Test with entry and refresh - }); - - describe('add', () => { - describe('user', () => { - const user = createUser(); - - test('GIVEN an User with no node THEN creates new one', () => { - entity.permissionNodes.add(user, 'ping', PermissionNodeAction.Allow); - - expect(entity.permissionsRoles).toEqual([]); - expect(entity.permissionsUsers).toEqual([{ id: user.id, allow: ['ping'], deny: [] }]); - }); - - test('GIVEN an User with a node THEN modifies existing one', () => { - entity.permissionNodes.add(user, 'ping', PermissionNodeAction.Allow); - entity.permissionNodes.add(user, 'balance', PermissionNodeAction.Allow); - - expect(entity.permissionsRoles).toEqual([]); - expect(entity.permissionsUsers).toEqual([{ id: user.id, allow: ['ping', 'balance'], deny: [] }]); - }); - - // TODO: Test with existing command in same action type - // TODO: Test with existing command in opposite action type - }); - - describe('member', () => { - test('GIVEN a GuildMember with no node THEN creates new one', () => { - const member = createGuildMember({}, guild); - - entity.permissionNodes.add(member, 'ping', PermissionNodeAction.Deny); - - expect(entity.permissionsRoles).toEqual([]); - expect(entity.permissionsUsers).toEqual([{ id: member.id, allow: [], deny: ['ping'] }]); - }); - - test('GIVEN a GuildMember with a node THEN modifies existing one', () => { - const member = createGuildMember({}, guild); - - entity.permissionNodes.add(member, 'ping', PermissionNodeAction.Deny); - entity.permissionNodes.add(member, 'balance', PermissionNodeAction.Deny); - - expect(entity.permissionsRoles).toEqual([]); - expect(entity.permissionsUsers).toEqual([{ id: member.id, allow: [], deny: ['ping', 'balance'] }]); - }); - - // TODO: Test with existing command in same action type - // TODO: Test with existing command in opposite action type - }); - - describe('role', () => { - test('GIVEN a Role with no node THEN creates new one', () => { - const role = guild.roles.cache.get(roleData.id)!; - entity.permissionNodes.add(role, 'ping', PermissionNodeAction.Allow); - - expect(entity.permissionsRoles).toEqual([{ id: role.id, allow: ['ping'], deny: [] }]); - expect(entity.permissionsUsers).toEqual([]); - }); - - test('GIVEN a Role with a node THEN modifies existing one', () => { - const role = guild.roles.cache.get(roleData.id)!; - entity.permissionNodes.add(role, 'ping', PermissionNodeAction.Allow); - entity.permissionNodes.add(role, 'balance', PermissionNodeAction.Deny); - - expect(entity.permissionsRoles).toEqual([{ id: role.id, allow: ['ping'], deny: ['balance'] }]); - expect(entity.permissionsUsers).toEqual([]); - }); - - // TODO: Test with existing command in same action type - // TODO: Test with existing command in opposite action type - }); - }); - - describe('remove', () => { - describe('user', () => { - // TODO: Test with no node - // TODO: Test with only one command (auto-reset) - // TODO: Test with two or more commands - }); - - describe('member', () => { - // TODO: Test with no node - // TODO: Test with only one command (auto-reset) - // TODO: Test with two or more commands - }); - - describe('role', () => { - // TODO: Test with no node - // TODO: Test with only one command (auto-reset) - // TODO: Test with two or more commands - }); - }); - - describe('reset', () => { - describe('user', () => { - const user = createUser(); - - test('GIVEN an empty node THEN throws error', () => { - try { - entity.permissionNodes.reset(user); - fail(); - } catch (error: unknown) { - const casted = error as UserError; - - expect(casted).toBeInstanceOf(UserError); - expect(casted.identifier).toBe(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); - expect((casted.context as { target: typeof user }).target).toBe(user); - } - }); - - // TODO: Test with existing node - }); - - describe('member', () => { - test('GIVEN an empty node THEN throws error', () => { - const member = createGuildMember({}, guild); - - try { - entity.permissionNodes.reset(member); - fail(); - } catch (error: unknown) { - const casted = error as UserError; - - expect(casted).toBeInstanceOf(UserError); - expect(casted.identifier).toBe(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); - expect((casted.context as { target: typeof member }).target).toBe(member); - } - }); - - // TODO: Test with existing node - }); - - describe('role', () => { - test('GIVEN an empty node THEN throws error', () => { - const role = createGuildMember({}, guild); - try { - entity.permissionNodes.reset(role); - fail(); - } catch (error: unknown) { - const casted = error as UserError; - - expect(casted).toBeInstanceOf(UserError); - expect(casted.identifier).toBe(LanguageKeys.Commands.Management.PermissionNodesNodeNotExists); - expect((casted.context as { target: typeof role }).target).toBe(role); - } - }); - - // TODO: Test with existing node - }); - }); - - describe('refresh', () => { - test('GIVEN no roles THEN returns early', () => { - entity.permissionNodes.refresh(); - - expect(getSorted().size).toBe(0); - }); - - test('GIVEN valid roles THEN the sorted permission nodes are in correct order', () => { - const roleDeveloper = createRole({ id: '541739191776575502', name: 'Developer', position: 27 }, guild); - const roleModerator = createRole({ id: '637592502756704256', name: 'Moderator', position: 26 }, guild); - const roleContributor = createRole({ id: '635547552229490708', name: 'Contributor', position: 18 }, guild); - const roleAlumni = createRole({ id: '541743369081192451', name: 'Alumni', position: 11 }, guild); - - entity.permissionsRoles.push({ id: roleModerator.id, allow: ['balance'], deny: [] }); - entity.permissionsRoles.push({ id: roleAlumni.id, allow: [], deny: ['balance'] }); - entity.permissionsRoles.push({ id: roleDeveloper.id, allow: ['ping'], deny: [] }); - entity.permissionsRoles.push({ id: roleContributor.id, allow: [], deny: ['ping'] }); - - entity.permissionNodes.refresh(); - - const sorted = [...getSorted().entries()]; - expect(sorted.length).toBe(4); - expect(sorted[0]).toEqual([roleDeveloper.id, { allow: new Set(['ping']), deny: new Set() }]); - expect(sorted[1]).toEqual([roleModerator.id, { allow: new Set(['balance']), deny: new Set() }]); - expect(sorted[2]).toEqual([roleContributor.id, { allow: new Set(), deny: new Set(['ping']) }]); - expect(sorted[3]).toEqual([roleAlumni.id, { allow: new Set(), deny: new Set(['balance']) }]); - }); - - // TODO: Test with auto-removal - }); -}); diff --git a/tests/lib/i18n/LanguageHelp.test.ts b/tests/lib/i18n/LanguageHelp.test.ts deleted file mode 100644 index aafdf31f5b1..00000000000 --- a/tests/lib/i18n/LanguageHelp.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { LanguageHelp } from '#lib/i18n/LanguageHelp'; - -describe('LanguageHelp builder', () => { - const builder = new LanguageHelp() - .setAliases('🖇️ | **Aliases**') - .setUsages('📝 | **Command Usage**') - .setExtendedHelp('🔍 | **Extended Help**') - .setExplainedUsage('⚙ | **Explained usage**') - .setPossibleFormats('🔢 | **Possible formats**') - .setExamples('🔗 | **Examples**') - .setReminder('⏰ | **Reminder**'); - - test('GIVEN basic command display THEN parses correctly', () => { - const commandHelp = builder.display( - 'coinflip', - null, - { - usages: ['heads/tails', 'heads cashless', 'tails Wager'], - 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'.", - explainedUsage: [ - ['heads/tails', 'Whether you think the coin will lands heads or tails up.'], - [ - 'cashless, Wager', - 'If cashless (default) then you do not input shinies for the coinflip (useful for RPG games or making decision). You can also put a wager of shinies here to gamble them.' - ] - ], - examples: ['tails', 'heads 50', 'tails 200', 'tails cashless'] - }, - 's!' - ); - - const expectedOutput = `📝 | **Command Usage** -→ s!coinflip *heads/tails* -→ s!coinflip *heads cashless* -→ s!coinflip *tails Wager* - -🔍 | **Extended Help** -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'. - -⚙ | **Explained usage** -→ **heads/tails**: Whether you think the coin will lands heads or tails up. -→ **cashless, Wager**: If cashless (default) then you do not input shinies for the coinflip (useful for RPG games or making decision). You can also put a wager of shinies here to gamble them. - -🔗 | **Examples** -→ s!coinflip *tails* -→ s!coinflip *heads 50* -→ s!coinflip *tails 200* -→ s!coinflip *tails cashless* -`; - - expect(commandHelp).toBe(expectedOutput); - }); - - test('GIVEN extended help w/o extendedHelp THEN parses correctly', () => { - const commandHelp = builder.display( - 'sample', - null, - { - reminder: ['This goes to 9000', 'Actually 9001'].join('\n') - }, - 's!' - ); - - const expectedOutput = `🔗 | **Examples** -→ s!sample - -⏰ | **Reminder** -This goes to 9000 -Actually 9001`; - - expect(commandHelp).toBe(expectedOutput); - }); -}); diff --git a/tests/lib/i18n/translate.test.ts b/tests/lib/i18n/translate.test.ts deleted file mode 100644 index eac2e9e2422..00000000000 --- a/tests/lib/i18n/translate.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { translate } from '#lib/i18n/translate'; -import { Identifiers } from '@sapphire/framework'; - -describe('translate', () => { - test('GIVEN argument identifier THEN returns arguments:{identifier}', () => { - expect(translate(Identifiers.ArgumentBooleanError)).toBe(`arguments:${Identifiers.ArgumentBooleanError}`); - expect(translate(Identifiers.ArgumentChannelError)).toBe(`arguments:${Identifiers.ArgumentChannelError}`); - expect(translate(Identifiers.ArgumentDateError)).toBe(`arguments:${Identifiers.ArgumentDateError}`); - expect(translate(Identifiers.ArgumentDateTooEarly)).toBe(`arguments:${Identifiers.ArgumentDateTooEarly}`); - expect(translate(Identifiers.ArgumentDateTooFar)).toBe(`arguments:${Identifiers.ArgumentDateTooFar}`); - expect(translate(Identifiers.ArgumentDMChannelError)).toBe(`arguments:${Identifiers.ArgumentDMChannelError}`); - expect(translate(Identifiers.ArgumentFloatError)).toBe(`arguments:${Identifiers.ArgumentFloatError}`); - expect(translate(Identifiers.ArgumentFloatTooLarge)).toBe(`arguments:${Identifiers.ArgumentFloatTooLarge}`); - expect(translate(Identifiers.ArgumentFloatTooSmall)).toBe(`arguments:${Identifiers.ArgumentFloatTooSmall}`); - expect(translate(Identifiers.ArgumentGuildCategoryChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildCategoryChannelError}`); - expect(translate(Identifiers.ArgumentGuildChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildChannelError}`); - expect(translate(Identifiers.ArgumentGuildChannelMissingGuildError)).toBe(`arguments:${Identifiers.ArgumentGuildChannelMissingGuildError}`); - expect(translate(Identifiers.ArgumentGuildNewsChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildNewsChannelError}`); - expect(translate(Identifiers.ArgumentGuildNewsThreadChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildNewsThreadChannelError}`); - expect(translate(Identifiers.ArgumentGuildPrivateThreadChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildPrivateThreadChannelError}`); - expect(translate(Identifiers.ArgumentGuildPublicThreadChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildPublicThreadChannelError}`); - expect(translate(Identifiers.ArgumentGuildStageVoiceChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildStageVoiceChannelError}`); - expect(translate(Identifiers.ArgumentGuildTextChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildTextChannelError}`); - expect(translate(Identifiers.ArgumentGuildThreadChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildThreadChannelError}`); - expect(translate(Identifiers.ArgumentGuildVoiceChannelError)).toBe(`arguments:${Identifiers.ArgumentGuildVoiceChannelError}`); - expect(translate(Identifiers.ArgumentHyperlinkError)).toBe(`arguments:${Identifiers.ArgumentHyperlinkError}`); - expect(translate(Identifiers.ArgumentIntegerError)).toBe(`arguments:${Identifiers.ArgumentIntegerError}`); - expect(translate(Identifiers.ArgumentIntegerTooLarge)).toBe(`arguments:${Identifiers.ArgumentIntegerTooLarge}`); - expect(translate(Identifiers.ArgumentIntegerTooSmall)).toBe(`arguments:${Identifiers.ArgumentIntegerTooSmall}`); - expect(translate(Identifiers.ArgumentMemberError)).toBe(`arguments:${Identifiers.ArgumentMemberError}`); - expect(translate(Identifiers.ArgumentMemberMissingGuild)).toBe(`arguments:${Identifiers.ArgumentMemberMissingGuild}`); - expect(translate(Identifiers.ArgumentMessageError)).toBe(`arguments:${Identifiers.ArgumentMessageError}`); - expect(translate(Identifiers.ArgumentNumberError)).toBe(`arguments:${Identifiers.ArgumentNumberError}`); - expect(translate(Identifiers.ArgumentNumberTooLarge)).toBe(`arguments:${Identifiers.ArgumentNumberTooLarge}`); - expect(translate(Identifiers.ArgumentNumberTooSmall)).toBe(`arguments:${Identifiers.ArgumentNumberTooSmall}`); - expect(translate(Identifiers.ArgumentRoleError)).toBe(`arguments:${Identifiers.ArgumentRoleError}`); - expect(translate(Identifiers.ArgumentRoleMissingGuild)).toBe(`arguments:${Identifiers.ArgumentRoleMissingGuild}`); - expect(translate(Identifiers.ArgumentStringTooLong)).toBe(`arguments:${Identifiers.ArgumentStringTooLong}`); - expect(translate(Identifiers.ArgumentStringTooShort)).toBe(`arguments:${Identifiers.ArgumentStringTooShort}`); - expect(translate(Identifiers.ArgumentUserError)).toBe(`arguments:${Identifiers.ArgumentUserError}`); - }); - - test('GIVEN ArgsUnavailable THEN returns LanguageKeys.Arguments.Unavailable', () => { - expect(translate(Identifiers.ArgsUnavailable)).toBe(LanguageKeys.Arguments.Unavailable); - }); - - test('GIVEN ArgsMissing THEN returns LanguageKeys.Arguments.Missing', () => { - expect(translate(Identifiers.ArgsMissing)).toBe(LanguageKeys.Arguments.Missing); - }); - - test('GIVEN CommandDisabled THEN returns LanguageKeys.Preconditions.DisabledGlobal', () => { - expect(translate(Identifiers.CommandDisabled)).toBe(LanguageKeys.Preconditions.DisabledGlobal); - }); - - test('GIVEN PreconditionCooldown THEN returns LanguageKeys.Preconditions.Cooldown', () => { - expect(translate(Identifiers.PreconditionCooldown)).toBe(LanguageKeys.Preconditions.Cooldown); - }); - - test('GIVEN PreconditionDMOnly THEN returns LanguageKeys.Preconditions.DmOnly', () => { - expect(translate(Identifiers.PreconditionDMOnly)).toBe(LanguageKeys.Preconditions.DmOnly); - }); - - test('GIVEN PreconditionGuildNewsOnly THEN returns LanguageKeys.Preconditions.GuildNewsOnly', () => { - expect(translate(Identifiers.PreconditionGuildNewsOnly)).toBe(LanguageKeys.Preconditions.GuildNewsOnly); - }); - - test('GIVEN PreconditionGuildNewsThreadOnly THEN returns LanguageKeys.Preconditions.GuildNewsThreadOnly', () => { - expect(translate(Identifiers.PreconditionGuildNewsThreadOnly)).toBe(LanguageKeys.Preconditions.GuildNewsThreadOnly); - }); - - test('GIVEN PreconditionGuildOnly THEN returns LanguageKeys.Preconditions.GuildOnly', () => { - expect(translate(Identifiers.PreconditionGuildOnly)).toBe(LanguageKeys.Preconditions.GuildOnly); - }); - - test('GIVEN PreconditionGuildPrivateThreadOnly THEN returns LanguageKeys.Preconditions.GuildPrivateThreadOnly', () => { - expect(translate(Identifiers.PreconditionGuildPrivateThreadOnly)).toBe(LanguageKeys.Preconditions.GuildPrivateThreadOnly); - }); - - test('GIVEN PreconditionGuildPublicThreadOnly THEN returns LanguageKeys.Preconditions.GuildPublicThreadOnly', () => { - expect(translate(Identifiers.PreconditionGuildPublicThreadOnly)).toBe(LanguageKeys.Preconditions.GuildPublicThreadOnly); - }); - - test('GIVEN PreconditionGuildTextOnly THEN returns LanguageKeys.Preconditions.GuildTextOnly', () => { - expect(translate(Identifiers.PreconditionGuildTextOnly)).toBe(LanguageKeys.Preconditions.GuildTextOnly); - }); - - test('GIVEN PreconditionNSFW THEN returns LanguageKeys.Preconditions.Nsfw', () => { - expect(translate(Identifiers.PreconditionNSFW)).toBe(LanguageKeys.Preconditions.Nsfw); - }); - - test('GIVEN PreconditionClientPermissions THEN returns LanguageKeys.Preconditions.ClientPermissions', () => { - expect(translate(Identifiers.PreconditionClientPermissions)).toBe(LanguageKeys.Preconditions.ClientPermissions); - }); - - test('GIVEN PreconditionUserPermissions THEN returns LanguageKeys.Preconditions.UserPermissions', () => { - expect(translate(Identifiers.PreconditionUserPermissions)).toBe(LanguageKeys.Preconditions.UserPermissions); - }); - - test('GIVEN PreconditionThreadOnly THEN returns LanguageKeys.Preconditions.ThreadOnly', () => { - expect(translate(Identifiers.PreconditionThreadOnly)).toBe(LanguageKeys.Preconditions.ThreadOnly); - }); - - test('GIVEN unknown identifier THEN returns identifier', () => { - expect(translate('does_not_exist')).toBe('does_not_exist'); - }); -}); diff --git a/tests/lib/util/common/comparators.test.ts b/tests/lib/util/common/comparators.test.ts deleted file mode 100644 index f146189632b..00000000000 --- a/tests/lib/util/common/comparators.test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { andMix, orMix } from '#utils/common'; - -describe('util common comparators', () => { - describe('andMix', () => { - test('GIVEN two callbacks AND passing value THEN passes test', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = andMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(0.5)).toBe(true); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(true); - - expect(b.mock.calls.length).toBe(1); - expect(b.mock.results[0].value).toBe(true); - }); - - test('GIVEN two callbacks AND a value failing the second THEN fails test', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = andMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(1.5)).toBe(false); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(true); - - expect(b.mock.calls.length).toBe(1); - expect(b.mock.results[0].value).toBe(false); - }); - - test('GIVEN two callbacks AND a value failing the first THEN fails test and short-circuits the second', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = andMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(-1)).toBe(false); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(false); - - expect(b.mock.calls.length).toBe(0); - }); - }); - - describe('orMix', () => { - test('GIVEN two callbacks AND passing value THEN passes test', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = orMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(0.5)).toBe(true); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(true); - - expect(b.mock.calls.length).toBe(0); - }); - - test('GIVEN two callbacks AND a value passing the first THEN passes test and short-circuits the second', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = orMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(1.5)).toBe(true); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(true); - - expect(b.mock.calls.length).toBe(0); - }); - - test('GIVEN two callbacks AND a value passing the second THEN passes test', () => { - const a = jest.fn((v: number) => v > 0); - const b = jest.fn((v: number) => v < 1); - - const mix = orMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(-1)).toBe(true); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(false); - - expect(b.mock.calls.length).toBe(1); - expect(b.mock.results[0].value).toBe(true); - }); - - test('GIVEN two callbacks AND a value failing both THEN fails test and short-circuits the second', () => { - const a = jest.fn((v: number) => v < 0); - const b = jest.fn((v: number) => v > 1); - - const mix = orMix(a, b); - expect(a.mock.calls.length).toBe(0); - expect(b.mock.calls.length).toBe(0); - - expect(mix(0.5)).toBe(false); - expect(a.mock.calls.length).toBe(1); - expect(a.mock.results[0].value).toBe(false); - - expect(b.mock.calls.length).toBe(1); - expect(b.mock.results[0].value).toBe(false); - }); - }); -}); diff --git a/tests/mocks/MockInstances.ts b/tests/mocks/MockInstances.ts deleted file mode 100644 index 83e6a77abf8..00000000000 --- a/tests/mocks/MockInstances.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { LanguageKeys } from '#lib/i18n/languageKeys'; -import { SkyraCommand } from '#lib/structures'; -import { CLIENT_OPTIONS } from '#root/config'; -import { SapphireClient } from '@sapphire/framework'; -import { APIChannel, APIGuild, APIGuildMember, APIRole, APIUser, ChannelType, GuildFeature, GuildNSFWLevel } from 'discord-api-types/v9'; -import { Guild, GuildMember, Role, TextChannel, User } from 'discord.js'; -import { resolve } from 'node:path'; - -export const client = new SapphireClient(CLIENT_OPTIONS); - -export const userData: APIUser = { - id: '266624760782258186', - username: 'Skyra', - discriminator: '7023', - avatar: '09b52e547fa797c47c7877cd10eb6ba8' -}; - -export function createUser(data: Partial = {}) { - return new User(client, { ...userData, ...data }); -} - -export const guildMemberData: APIGuildMember = { - user: userData, - deaf: false, - mute: false, - nick: null, - roles: [], - premium_since: null, - joined_at: '2019-02-03T21:57:10.354Z' -}; - -export function createGuildMember(data: Partial = {}, g: Guild = guild) { - return new GuildMember(client, { ...guildMemberData, ...data, user: { ...guildMemberData.user, ...data.user! } }, g); -} - -export const roleData: APIRole = { - id: '254360814063058944', - name: '@​everyone', - color: 0, - hoist: false, - position: 0, - permissions: '104189505', - managed: false, - mentionable: false -}; - -export function createRole(data: Partial = {}, g: Guild = guild) { - const role = new Role(client, { ...roleData, ...data }, g); - g.roles.cache.set(role.id, role); - return role; -} - -export const guildData: APIGuild = { - id: '254360814063058944', - name: 'Skyra Lounge', - icon: 'a_933397e7006838cf97fe70e47605b274', - description: null, - discovery_splash: null, - afk_channel_id: null, - afk_timeout: 60, - application_id: null, - banner: null, - default_message_notifications: 1, - emojis: [], - explicit_content_filter: 2, - features: [ - GuildFeature.News, - GuildFeature.AnimatedIcon, - GuildFeature.Commerce, - GuildFeature.WelcomeScreenEnabled, - GuildFeature.InviteSplash, - GuildFeature.Community - ], - max_members: 100000, - max_presences: null, - max_video_channel_users: 25, - mfa_level: 1, - nsfw_level: GuildNSFWLevel.Default, - owner_id: '242043489611808769', - preferred_locale: 'en-US', - premium_subscription_count: 3, - premium_tier: 1, - public_updates_channel_id: '700806874294911067', - region: 'eu-central', - roles: [roleData], - rules_channel_id: '409663610780909569', - splash: null, - stickers: [], - system_channel_flags: 0, - system_channel_id: '254360814063058944', - vanity_url_code: null, - verification_level: 2, - widget_channel_id: '409663610780909569', - widget_enabled: true -}; - -export function createGuild(data: Partial = {}) { - const g = new Guild(client, { ...guildData, ...data }); - client.guilds.cache.set(g.id, g); - return g; -} -export const guild = createGuild(); - -export const textChannelData: APIChannel = { - type: ChannelType.GuildText, - id: '331027040306331648', - name: 'staff-testing', - position: 19, - parent_id: '355963113696133130', - permission_overwrites: [], - topic: null, - last_message_id: '825133477896388670', - rate_limit_per_user: 0, - last_pin_timestamp: '2021-01-17T08:17:36.935Z', - guild_id: '254360814063058944', - nsfw: false -}; - -export function createTextChannel(data: Partial = {}, g: Guild = guild) { - const c = new TextChannel(guild, { ...textChannelData, ...data }); - g.channels.cache.set(c.id, c); - g.client.channels.cache.set(c.id, c); - return c; -} -export const textChannel = createTextChannel(); - -export const commands = client.stores.get('commands'); - -function addCommand(command: SkyraCommand) { - commands.set(command.name, command); - for (const alias of command.aliases) commands.aliases.set(alias, command); -} - -class Command extends SkyraCommand {} -addCommand( - new Command( - { - name: 'ping', - path: resolve('/home/skyra/commands/General/Chat Bot Info/ping.js'), - store: commands, - root: '/home/skyra/commands' - }, - { - description: LanguageKeys.Commands.General.PingDescription, - extendedHelp: LanguageKeys.Commands.General.PingExtended, - aliases: ['pong'], - fullCategory: ['General'] - } - ) -); - -addCommand( - new Command( - { - name: 'balance', - path: resolve('/home/skyra/commands/Social/balance.js'), - store: commands, - root: '/home/skyra/commands' - }, - { - description: LanguageKeys.Commands.Social.BalanceDescription, - extendedHelp: LanguageKeys.Commands.Social.BalanceExtended, - aliases: ['bal'], - fullCategory: ['Currency'] - } - ) -); - -addCommand( - new Command( - { - name: 'define', - path: resolve('/home/skyra/commands/Tools/Dictionary/define.js'), - store: commands, - root: '/home/skyra/commands' - }, - { - description: LanguageKeys.Commands.Tools.DefineDescription, - extendedHelp: LanguageKeys.Commands.Tools.DefineExtended, - aliases: ['def', 'definition', 'defination', 'dictionary'], - fullCategory: ['Tools', 'Dictionary'] - } - ) -); diff --git a/tests/mocks/constants.ts b/tests/mocks/constants.ts deleted file mode 100644 index 51605278e33..00000000000 --- a/tests/mocks/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { SerializedEmoji } from '#utils/functions'; - -export const animatedSkyraGlasses = 'a:SkyraGlasses:735070572416991235'; -export const serializedAnimatedSkyraGlasses = 'a735070572416991235' as SerializedEmoji; -export const staticSkyra = ':Skyra:819227046453444620'; -export const serializedStaticSkyra = 's819227046453444620' as SerializedEmoji; -export const bunnyTwemoji = '🐰'; -export const encodedBunnyTwemoji = encodeURIComponent(bunnyTwemoji) as SerializedEmoji; diff --git a/tests/mocks/image.png b/tests/mocks/image.png deleted file mode 100644 index 57da00546d2..00000000000 Binary files a/tests/mocks/image.png and /dev/null differ diff --git a/tsconfig.base.json b/tsconfig.base.json index 0d38bbc8244..ab37235dbfc 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,7 +1,9 @@ { - "extends": "@sapphire/ts-config", + "extends": "@sapphire/ts-config/extra-strict", "compilerOptions": { + "lib": ["ESNext", "DOM"], + "emitDecoratorMetadata": false, "target": "ESNext", - "removeComments": true + "module": "ESNext" } } diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index dc864cade07..cb94dda450f 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,8 +1,4 @@ { "extends": "./tsconfig.base.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true - }, - "include": ["src", "tests", "scripts", "ormconfig.js", "babel.config.js", "jest.config.mjs"] + "include": ["projects", "scripts", "vitest.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000000..3142887c1b1 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,16 @@ +import { resolve } from 'node:path'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + resolve: { + alias: [{ find: '#lib', replacement: resolve('src/lib') }] + }, + test: { + globals: true, + coverage: { + enabled: true, + reporter: ['text', 'lcov', 'clover'], + include: ['./src/lib/**/*.ts'] + } + } +}); diff --git a/yarn.lock b/yarn.lock index 5b55467380c..95ffea0ec46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,55 +5,7 @@ __metadata: version: 6 cacheKey: 8 -"0x@npm:^5.4.0": - version: 5.4.0 - resolution: "0x@npm:5.4.0" - dependencies: - ajv: ^8.8.2 - browserify: ^17.0.0 - concat-stream: ^2.0.0 - d3-fg: ^6.14.0 - debounce: ^1.2.0 - debug: ^4.1.1 - end-of-stream: ^1.1.0 - env-string: ^1.0.0 - escape-string-regexp: ^4.0.0 - execspawn: ^1.0.1 - fs-extra: ^10.1.0 - has-unicode: ^2.0.1 - hsl-to-rgb-for-reals: ^1.1.0 - jsonstream2: ^3.0.0 - make-dir: ^3.1.0 - minimist: ^1.2.0 - morphdom: ^2.3.3 - nanohtml: ^1.4.0 - on-net-listen: ^1.1.0 - opn: ^5.4.0 - pump: ^3.0.0 - pumpify: ^2.0.1 - semver: ^7.3.5 - single-line-log: ^1.0.1 - split2: ^4.0.0 - tachyons: ^4.9.1 - through2: ^4.0.0 - which: ^2.0.2 - bin: - 0x: cmd.js - checksum: 231be8f66c4e61ea4f914c94cea6b1a24081d383535838be5ef1ed0924c84ceaf65361c6b3bd893a96b5e3bb77d8d4be786d787f4e019d5df26e783246f31b56 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.1.0": - version: 2.2.0 - resolution: "@ampproject/remapping@npm:2.2.0" - dependencies: - "@jridgewell/gen-mapping": ^0.1.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": +"@babel/code-frame@npm:^7.0.0": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" dependencies: @@ -62,7255 +14,3563 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/compat-data@npm:7.18.8" - checksum: 3096aafad74936477ebdd039bcf342fba84eb3100e608f3360850fb63e1efa1c66037c4824f814d62f439ab47d25164439343a6e92e9b4357024fdf571505eb9 +"@babel/helper-validator-identifier@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-validator-identifier@npm:7.18.6" + checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/core@npm:7.18.9" - dependencies: - "@ampproject/remapping": ^2.1.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.9 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helpers": ^7.18.9 - "@babel/parser": ^7.18.9 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.1 - semver: ^6.3.0 - checksum: 64b9088b03fdf659b334864ef93bed85d60c17b27fcbd72970f8eb9e0d3266ffa5a1926960f648f2db36b0bafec615f947ea5117d200599a0661b9f0a9cdf323 +"@babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 languageName: node linkType: hard -"@babel/generator@npm:^7.18.9, @babel/generator@npm:^7.7.2": +"@babel/runtime@npm:^7.17.2": version: 7.18.9 - resolution: "@babel/generator@npm:7.18.9" + resolution: "@babel/runtime@npm:7.18.9" dependencies: - "@babel/types": ^7.18.9 - "@jridgewell/gen-mapping": ^0.3.2 - jsesc: ^2.5.1 - checksum: 1c271e0c6f33e59f7845d88a1b0b9b0dce88164e80dec9274a716efa54c260e405e9462b160843e73f45382bf5b24d8e160e0121207e480c29b30e2ed0eb16d4 + regenerator-runtime: ^0.13.4 + checksum: 36dd736baba7164e82b3cc9d43e081f0cb2d05ff867ad39cac515d99546cee75b7f782018b02a3dcf5f2ef3d27f319faa68965fdfec49d4912c60c6002353a2e languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" +"@commitlint/cli@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/cli@npm:17.0.3" dependencies: - "@babel/types": ^7.18.6 - checksum: 88ccd15ced475ef2243fdd3b2916a29ea54c5db3cd0cfabf9d1d29ff6e63b7f7cd1c27264137d7a40ac2e978b9b9a542c332e78f40eb72abe737a7400788fc1b + "@commitlint/format": ^17.0.0 + "@commitlint/lint": ^17.0.3 + "@commitlint/load": ^17.0.3 + "@commitlint/read": ^17.0.0 + "@commitlint/types": ^17.0.0 + execa: ^5.0.0 + lodash: ^4.17.19 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: ^17.0.0 + bin: + commitlint: cli.js + checksum: d8319889e0b5290d15c53b1f1f7588cb364d9c062cdf52f56b83e474dfe371a9430a1e3682a7b9668c5173a006d4c4eed0c9747580b44225864ea388014d58dd languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.18.9" +"@commitlint/config-conventional@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/config-conventional@npm:17.0.3" dependencies: - "@babel/helper-explode-assignable-expression": ^7.18.6 - "@babel/types": ^7.18.9 - checksum: b4bc214cb56329daff6cc18a7f7a26aeafb55a1242e5362f3d47fe3808421f8c7cd91fff95d6b9b7ccb67e14e5a67d944e49dbe026942bfcbfda19b1c72a8e72 + conventional-changelog-conventionalcommits: ^5.0.0 + checksum: 1cd30d827cf43bc7b08604398d4104bc031a69c8b45777886572aff12de25f40761dfbe5ffc6cd1f0d5b05de850e6d3e22dee6d799288e9cdd80bf575d036d46 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-compilation-targets@npm:7.18.9" +"@commitlint/config-validator@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/config-validator@npm:17.0.3" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.20.2 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 2a9d71e124e098a9f45de4527ddd1982349d231827d341e00da9dfb967e260ecc7662c8b62abee4a010fb34d5f07a8d2155c974e0bc1928144cee5644910621d + "@commitlint/types": ^17.0.0 + ajv: ^8.11.0 + checksum: bc543193bbe132e1fc351bd912434a7214055e8b865ea661b016c6e05c84714d75d8dc54ac6dcc1d53e872ef3665e4a0cf0e3817cff88a01201bf0b37d23744f languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.18.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-member-expression-to-functions": ^7.18.9 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.9 - "@babel/helper-split-export-declaration": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 020dba79b92ee9a98520dad81dddb47d75b34b7b4392672cbefc59db6f5e89a96c5eb95bb1cc46b2fddf913ef63dfe6d17168f56b059af5c6965bb37b6ce1d82 +"@commitlint/ensure@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/ensure@npm:17.0.0" + dependencies: + "@commitlint/types": ^17.0.0 + lodash: ^4.17.19 + checksum: 5ce3c624417dc64ed0d406954b7684ed287142535b0f55df6984093d0f82eadf0da5ab3e472e3020139304cd007c682a4bdfb95cf53fb99e7c7ae6d4711ada6b languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.18.6" - dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - regexpu-core: ^5.1.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 2d76e660cbfd0bfcb01ca9f177f0e9091c871a6b99f68ece6bcf4ab4a9df073485bdc2d87ecdfbde44b7f3723b26d13085d0f92082adb3ae80d31b246099f10a +"@commitlint/execute-rule@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/execute-rule@npm:17.0.0" + checksum: cb37e5c6e0e16bf04e8f344094146ed2de8155456191da88fb9a1b943a9b5a98e0f6ef49c55b239104eb68634df681fd3be05311bf2da0cb6b171fdd24371669 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.3.1, @babel/helper-define-polyfill-provider@npm:^0.3.2": - version: 0.3.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.3.2" +"@commitlint/format@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/format@npm:17.0.0" dependencies: - "@babel/helper-compilation-targets": ^7.17.7 - "@babel/helper-plugin-utils": ^7.16.7 - debug: ^4.1.1 - lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - semver: ^6.1.2 - peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: 8f693ab8e9d73873c2e547c7764c7d32d73c14f8dcefdd67fd3a038eb75527e2222aa53412ea673b9bfc01c32a8779a60e77a7381bbdd83452f05c9b7ef69c2c + "@commitlint/types": ^17.0.0 + chalk: ^4.1.0 + checksum: e54705bdc91741632bac6ae330ba5d08110ec7575900585f4947487e7189a3d586396a3da3f1622fd3b6a49be9af1f71519a1ffeaa562d4cc7349bde3846eb8a languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.6, @babel/helper-environment-visitor@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-environment-visitor@npm:7.18.9" - checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 +"@commitlint/is-ignored@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/is-ignored@npm:17.0.3" + dependencies: + "@commitlint/types": ^17.0.0 + semver: 7.3.7 + checksum: 5a0b1921ea03cf8b5fd735b1c0903e6a28b4ff0a730977b8c2afe827feed8162c95264127d60cfe8f03e46be194436a44d4c3049ab07396c9bce2daa730a212c languageName: node linkType: hard -"@babel/helper-explode-assignable-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" +"@commitlint/lint@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/lint@npm:17.0.3" dependencies: - "@babel/types": ^7.18.6 - checksum: 225cfcc3376a8799023d15dc95000609e9d4e7547b29528c7f7111a0e05493ffb12c15d70d379a0bb32d42752f340233c4115bded6d299bc0c3ab7a12be3d30f + "@commitlint/is-ignored": ^17.0.3 + "@commitlint/parse": ^17.0.0 + "@commitlint/rules": ^17.0.0 + "@commitlint/types": ^17.0.0 + checksum: 5bbb8bc1f3b37fd680700c00a6135a72d6737dac85c79bcaa85a211828e2dff08d742e721255edca859d75996352b20b888ee47bdef5b47fc2718f9fd08d5b53 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-function-name@npm:7.18.9" +"@commitlint/load@npm:>6.1.1, @commitlint/load@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/load@npm:17.0.3" dependencies: - "@babel/template": ^7.18.6 - "@babel/types": ^7.18.9 - checksum: d04c44e0272f887c0c868651be7fc3c5690531bea10936f00d4cca3f6d5db65e76dfb49e8d553c42ae1fe1eba61ccce9f3d93ba2df50a66408c8d4c3cc61cf0c + "@commitlint/config-validator": ^17.0.3 + "@commitlint/execute-rule": ^17.0.0 + "@commitlint/resolve-extends": ^17.0.3 + "@commitlint/types": ^17.0.0 + "@types/node": ">=12" + chalk: ^4.1.0 + cosmiconfig: ^7.0.0 + cosmiconfig-typescript-loader: ^2.0.0 + lodash: ^4.17.19 + resolve-from: ^5.0.0 + typescript: ^4.6.4 + checksum: 786b7064470b4c38577a10910ad725b4371e9f649fbcd4b6018ec4dec2b7f30bc60c6f02807b154ca59f5d5fd347f3d4a46523c9f44e324c05902a2fd29dfb17 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-hoist-variables@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f +"@commitlint/message@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/message@npm:17.0.0" + checksum: ec80ea7f98082e48116fda1203277ac139bf2f442a8f58f87f8b823c6e526ec3771a9de7821b249254d580bff59a3fe205d044d1e9df29c34c3014a41e851c5d languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.18.9" +"@commitlint/parse@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/parse@npm:17.0.0" dependencies: - "@babel/types": ^7.18.9 - checksum: fcf8184e3b55051c4286b2cbedf0eccc781d0f3c9b5cbaba582eca19bf0e8d87806cdb7efc8554fcb969ceaf2b187d5ea748d40022d06ec7739fbb18c1b19a7a + "@commitlint/types": ^17.0.0 + conventional-changelog-angular: ^5.0.11 + conventional-commits-parser: ^3.2.2 + checksum: 86610df080665b8ba83037c598f4e6d0538a5ec40fdb0c2ad1925bfdf0f494934deafa020d2e21663f64dbc20fec4e889d21675573d3860c379c2d305db7a141 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" +"@commitlint/read@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/read@npm:17.0.0" dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + "@commitlint/top-level": ^17.0.0 + "@commitlint/types": ^17.0.0 + fs-extra: ^10.0.0 + git-raw-commits: ^2.0.0 + checksum: 5307d9ba06279343280cae4ab64bc6a153a44a24bc8948bbd80f07f5fac1f5b64586d34386ce5f6fd0fd221de4787c21fd82607f44a7969ab499c84bab1f0fa6 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-module-transforms@npm:7.18.9" +"@commitlint/resolve-extends@npm:^17.0.3": + version: 17.0.3 + resolution: "@commitlint/resolve-extends@npm:17.0.3" dependencies: - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/helper-validator-identifier": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: af08c60ea239ff3d40eda542fceaab69de17e713f131e80ead08c975ba7a47dd55d439cb48cfb14ae7ec96704a10c989ff5a5240e52a39101cb44a49467ce058 + "@commitlint/config-validator": ^17.0.3 + "@commitlint/types": ^17.0.0 + import-fresh: ^3.0.0 + lodash: ^4.17.19 + resolve-from: ^5.0.0 + resolve-global: ^1.0.0 + checksum: 384fc59a5a8f3da2b4551b92b2734f8d22c39ba389ca31df2f7a8ea1e68e8c15b137faf4ae20529a7b826ca6a7f5e5cd30ab2c903f9d65f74d0b43dcac5f8e0c languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" +"@commitlint/rules@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/rules@npm:17.0.0" dependencies: - "@babel/types": ^7.18.6 - checksum: e518fe8418571405e21644cfb39cf694f30b6c47b10b006609a92469ae8b8775cbff56f0b19732343e2ea910641091c5a2dc73b56ceba04e116a33b0f8bd2fbd + "@commitlint/ensure": ^17.0.0 + "@commitlint/message": ^17.0.0 + "@commitlint/to-lines": ^17.0.0 + "@commitlint/types": ^17.0.0 + execa: ^5.0.0 + checksum: cd0944069932bee738a0ed70cb972fa0d14c0e35642310ca856d5e368ddc48513d05ece00f2e309ebcf4ecb119f8b44b322ff086edaa5208edb3cec0968dac06 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.18.9 - resolution: "@babel/helper-plugin-utils@npm:7.18.9" - checksum: ebae876cd60f1fe238c7210986093845fa5c4cad5feeda843ea4d780bf068256717650376d3af2a5e760f2ed6a35c065ae144f99c47da3e54aa6cba99d8804e0 +"@commitlint/to-lines@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/to-lines@npm:17.0.0" + checksum: ccad787a3baf567c6c589e96e110aa2582103b50eaa9b70493116c08a0e5c6c50669c05e67b0a77cd803d66c031b1dcb9805b752d604178dbc4c744fc7f9bb04 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.6": - version: 7.18.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.18.9" +"@commitlint/top-level@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/top-level@npm:17.0.0" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-wrap-function": ^7.18.9 - "@babel/types": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 4be6076192308671b046245899b703ba090dbe7ad03e0bea897bb2944ae5b88e5e85853c9d1f83f643474b54c578d8ac0800b80341a86e8538264a725fbbefec + find-up: ^5.0.0 + checksum: 2e43d021a63faee67aa0e63b86a3ab9347ccda1b81f1f0722841223bd6bf127de954933c2ca3172fac0a1ce07a8b3bed62ac8f4afa04d50281dc5f80b43b61fb languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-replace-supers@npm:7.18.9" +"@commitlint/types@npm:^17.0.0": + version: 17.0.0 + resolution: "@commitlint/types@npm:17.0.0" dependencies: - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-member-expression-to-functions": ^7.18.9 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 2de8b29cc4bfa4e241da2de16abd5571709f6eb394206dc16e3a7816976d1691635dd4bc930881e9d798f44b48a5f1849dc7f51a62946f3e8270452be1ec5352 + chalk: ^4.1.0 + checksum: 210636d3923f93f7cfc409eac04376b0fe50356a0e08f25a37b43d5cd9ca4363f7b03ca2e7736cbf95b62d67733fe8e1028269d35b4fddd1b3f2a653c90ca85c languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-simple-access@npm:7.18.6" +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" dependencies: - "@babel/types": ^7.18.6 - checksum: 37cd36eef199e0517845763c1e6ff6ea5e7876d6d707a6f59c9267c547a50aa0e84260ba9285d49acfaf2cfa0a74a772d92967f32ac1024c961517d40b6c16a5 + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.18.9" +"@discordjs/builders@npm:^1.1.0": + version: 1.1.0 + resolution: "@discordjs/builders@npm:1.1.0" dependencies: - "@babel/types": ^7.18.9 - checksum: 6e93ccd10248293082606a4b3e30eed32c6f796d378f6b662796c88f462f348aa368aadeb48eb410cfcc8250db93b2d6627c2e55662530f08fc25397e588d68a + "@sapphire/shapeshift": ^3.5.1 + discord-api-types: ^0.36.3 + fast-deep-equal: ^3.1.3 + ts-mixer: ^6.0.1 + tslib: ^2.4.0 + checksum: 95a30b151447bfb625f3f325dc06476a58a050930b07cd0e9d6f66f62cee49e3d68cea137b436bf64559d47add7900574b732ba15e707cdda68a320020988c49 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-split-export-declaration@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b +"@discordjs/collection@npm:^1.0.0, @discordjs/collection@npm:^1.0.1": + version: 1.0.1 + resolution: "@discordjs/collection@npm:1.0.1" + checksum: 6477ae9870f3c069b190f673a6b34467930b409a6d763f1b0d4f6169051b8499d03de7b0e7e4c3697222845aea6d94283573ad6a488b50516764df675915ff44 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-identifier@npm:7.18.6" - checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 +"@discordjs/rest@npm:^1.0.1": + version: 1.0.1 + resolution: "@discordjs/rest@npm:1.0.1" + dependencies: + "@discordjs/collection": ^1.0.1 + "@sapphire/async-queue": ^1.3.2 + "@sapphire/snowflake": ^3.2.2 + discord-api-types: ^0.36.3 + file-type: ^17.1.4 + tslib: ^2.4.0 + undici: ^5.8.0 + checksum: d83b57de5b71eae15ecabc5da0767d70be9cd4667c872b2fdfd933670a6f162f9815208fe5a6dd018d38d8d25dea6dde62a7285e08b03b66c1896308605c2850 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-option@npm:7.18.6" - checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf +"@discordjs/ws@npm:^0.2.0": + version: 0.2.0 + resolution: "@discordjs/ws@npm:0.2.0" + dependencies: + "@discordjs/collection": ^1.0.1 + "@discordjs/rest": ^1.0.1 + "@sapphire/async-queue": ^1.3.2 + "@types/ws": ^8.5.3 + "@vladfrangu/async_event_emitter": ^2.0.1 + discord-api-types: ^0.36.3 + tslib: ^2.4.0 + ws: ^8.8.1 + checksum: e25895cf3480b8575d947559009e4e467b9b6d58285a9e55d7ba9d0c45eae59b5dff63fa0f5b41a2337dd1421b4dd2390cf8801e74682533a78b775cfe2e70a4 languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-wrap-function@npm:7.18.9" +"@eslint/eslintrc@npm:^1.3.0": + version: 1.3.0 + resolution: "@eslint/eslintrc@npm:1.3.0" dependencies: - "@babel/helper-function-name": ^7.18.9 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: da818e519b48bbaa748a4fa87b0ba681bc627c9eb9557008d5307d42d3f536fe435b775163088dd9639b0120c8ea1ae1021777f48806f9f83397f4df622b88d3 + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.3.2 + globals: ^13.15.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: a1e734ad31a8b5328dce9f479f185fd4fc83dd7f06c538e1fa457fd8226b89602a55cc6458cd52b29573b01cdfaf42331be8cfc1fec732570086b591f4ed6515 languageName: node linkType: hard -"@babel/helpers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helpers@npm:7.18.9" +"@fastify/ajv-compiler@npm:^3.1.1": + version: 3.1.2 + resolution: "@fastify/ajv-compiler@npm:3.1.2" dependencies: - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: d0bd8255d36bfc65dc52ce75f7fea778c70287da2d64981db4c84fbdf9581409ecbd6433deff1c81da3a5acf26d7e4c364b3a4445efacf88f4f48e77c5b34d8d + ajv: ^8.10.0 + ajv-formats: ^2.1.1 + fast-uri: ^2.0.0 + checksum: 8876754279eef74d91b2a5dd42c2a5ca43c80de92a15d1b6cb980e0b27f572710a67a7675dd100b172e92941efaf2ecda57653d254542e5d94ca3ff785e0ce31 languageName: node linkType: hard -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" - dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 +"@fastify/deepmerge@npm:^1.0.0": + version: 1.1.0 + resolution: "@fastify/deepmerge@npm:1.1.0" + checksum: 3e6839ef2ab5ab524d90290c11e6997abda53cdfa9037639a794f4f1e1d9047c1c23e51d44d8a74b303285ef08f753d4bcff631f36d581ad24ee9fee6a0d2cf1 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.6, @babel/parser@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/parser@npm:7.18.9" - bin: - parser: ./bin/babel-parser.js - checksum: 81a966b334e3ef397e883c64026265a5ae0ad435a86f52a84f60a5ee1efc0738c1f42c55e0dc5f191cc6a83ba0c61350433eee417bf1dff160ca5f3cfde244c6 +"@fastify/error@npm:^3.0.0": + version: 3.0.0 + resolution: "@fastify/error@npm:3.0.0" + checksum: d9ea16db2d17e4d54f34ad2daf7bbd223fd3fd5682e55406f61dae66616a2fd79fa7585736e6e3b46e9dc60da6e96018f92ebb2f87fd100b4e8ad27308aa9c74 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" +"@fastify/fast-json-stringify-compiler@npm:^4.0.0": + version: 4.0.0 + resolution: "@fastify/fast-json-stringify-compiler@npm:4.0.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 845bd280c55a6a91d232cfa54eaf9708ec71e594676fe705794f494bb8b711d833b752b59d1a5c154695225880c23dbc9cab0e53af16fd57807976cd3ff41b8d + fast-json-stringify: ^5.0.0 + checksum: 5cfeebcd9fb7ae5d912836503a7934ed4b9db83c30cae15e393341b52c059cd83531b375226406f8056b09f472c11560c730999c7ae4647c2fb9771d372db60a languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 93abb5cb179a13db171bfc2cdf79489598f43c50cc174f97a2b7bb1d44d24ade7109665a20cf4e317ad6c1c730f036f06478f7c7e789b4240be1abdb60d6452f +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.18.6" +"@humanwhocodes/config-array@npm:^0.10.4": + version: 0.10.4 + resolution: "@humanwhocodes/config-array@npm:0.10.4" dependencies: - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 - "@babel/plugin-syntax-async-generators": ^7.8.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3f708808ba6f8a9bd18805b1b22ab90ec0b362d949111a776e0bade5391f143f55479dcc444b2cec25fc89ac21035ee92e9a5ec37c02c610639197a0c2f7dcb0 + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: d480e5d57e6d787565b6cff78e27c3d1b380692d4ffb0ada7d7f5957a56c9032f034da05a3e443065dbd0671ebf4d859036ced34e96b325bbc1badbae3c05300 languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" +"@humanwhocodes/config-array@npm:^0.9.2": + version: 0.9.5 + resolution: "@humanwhocodes/config-array@npm:0.9.5" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: 8ba6281bc0590f6c6eadeefc14244b5a3e3f5903445aadd1a32099ed80e753037674026ce1b3c945ab93561bea5eb29e3c5bff67060e230c295595ba517a3492 languageName: node linkType: hard -"@babel/plugin-proposal-class-static-block@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: b8d7ae99ed5ad784f39e7820e3ac03841f91d6ed60ab4a98c61d6112253da36013e12807bae4ffed0ef3cb318e47debac112ed614e03b403fb8b075b09a828ee +"@humanwhocodes/gitignore-to-minimatch@npm:^1.0.2": + version: 1.0.2 + resolution: "@humanwhocodes/gitignore-to-minimatch@npm:1.0.2" + checksum: aba5c40c9e3770ed73a558b0bfb53323842abfc2ce58c91d7e8b1073995598e6374456d38767be24ab6176915f0a8d8b23eaae5c85e2b488c0dccca6d795e2ad languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-decorators@npm:7.18.9" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-replace-supers": ^7.18.9 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/plugin-syntax-decorators": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c2f6562c133ce5ee0662dae162d32cb653dabb33fb2fb1caf930ee255a3fb5158f7ef680b37a3866482d68ed5ff6aea0734e64f67142ee4e9c33589339d2cc42 +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 languageName: node linkType: hard -"@babel/plugin-proposal-dynamic-import@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-dynamic-import@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 96b1c8a8ad8171d39e9ab106be33bde37ae09b22fb2c449afee9a5edf3c537933d79d963dcdc2694d10677cb96da739cdf1b53454e6a5deab9801f28a818bb2f +"@ioredis/commands@npm:^1.1.1": + version: 1.2.0 + resolution: "@ioredis/commands@npm:1.2.0" + checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 languageName: node linkType: hard -"@babel/plugin-proposal-export-namespace-from@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 84ff22bacc5d30918a849bfb7e0e90ae4c5b8d8b65f2ac881803d1cf9068dffbe53bd657b0e4bc4c20b4db301b1c85f1e74183cf29a0dd31e964bd4e97c363ef +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 languageName: node linkType: hard -"@babel/plugin-proposal-json-strings@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-json-strings@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-json-strings": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 25ba0e6b9d6115174f51f7c6787e96214c90dd4026e266976b248a2ed417fe50fddae72843ffb3cbe324014a18632ce5648dfac77f089da858022b49fd608cb3 +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.18.9" +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: dd87fa4a48c6408c5e85dbd6405a65cc8fe909e3090030df46df90df64cdf3e74007381a58ed87608778ee597eff7395d215274009bb3f5d8964b2db5557754f + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 949c9ddcdecdaec766ee610ef98f965f928ccc0361dd87cf9f88cf4896a6ccd62fce063d4494778e50da99dea63d270a1be574a62d6ab81cbe9d85884bf55a7d + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f370ea584c55bf4040e1f78c80b4eeb1ce2e6aaa74f87d1a48266493c33931d0b6222d8cee3a082383d6bb648ab8d6b7147a06f974d3296ef3bc39c7851683ec +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.18.9" +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.18.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 66b9bae741d46edf1c96776d26dfe5d335981e57164ec2450583e3d20dfaa08a5137ffebb897e443913207789f9816bfec4ae845f38762c0196a60949eaffdba + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 languageName: node linkType: hard -"@babel/plugin-proposal-optional-catch-binding@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.18.6" +"@npmcli/fs@npm:^2.1.0": + version: 2.1.1 + resolution: "@npmcli/fs@npm:2.1.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7b5b39fb5d8d6d14faad6cb68ece5eeb2fd550fb66b5af7d7582402f974f5bc3684641f7c192a5a57e0f59acfae4aada6786be1eba030881ddc590666eff4d1e + "@gar/promisify": ^1.1.3 + semver: ^7.3.5 + checksum: 4944a0545d38d3e6e29780eeb3cd4be6059c1e9627509d2c9ced635c53b852d28b37cdc615a2adf815b51ab8673adb6507e370401a20a7e90c8a6dc4fac02389 languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.18.9" +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/move-file@npm:2.0.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f2db40e26172f07c50b635cb61e1f36165de3ba868fcf608d967642f0d044b7c6beb0e7ecf17cbd421144b99e1eae7ad6031ded92925343bb0ed1d08707b514f + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" +"@prisma/client@npm:^4.1.1": + version: 4.1.1 + resolution: "@prisma/client@npm:4.1.1" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@prisma/engines-version": 4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 22d8502ee96bca99ad2c8393e8493e2b8d4507576dd054490fd8201a36824373440106f5b098b6d821b026c7e72b0424ff4aeca69ed5f42e48f029d3a156d5ad + prisma: "*" + peerDependenciesMeta: + prisma: + optional: true + checksum: 0251ebba98c5212e5d2fabfadac945c5977b6e48c1baeaa5d962cd2d486524304e14f320870df879c7cc83de2783d0dd3fee9c63bcdd300bd88d2b5f8f461ed0 languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.18.6" - dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c8e56a972930730345f39f2384916fd8e711b3f4b4eae2ca9740e99958980118120d5cc9b6ac150f0965a5a35f825910e2c3013d90be3e9993ab6111df444569 +"@prisma/engines-version@npm:4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8": + version: 4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8 + resolution: "@prisma/engines-version@npm:4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8" + checksum: 6c2e937663439589412f5b5765abbae6aeed0df10640a9fdd5a8d39b77981e95b5b5871ed865e50ef8e4c150511f455d7b3acbf44cd3cae4a67732489dc58fec languageName: node linkType: hard -"@babel/plugin-proposal-unicode-property-regex@npm:^7.18.6, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a8575ecb7ff24bf6c6e94808d5c84bb5a0c6dd7892b54f09f4646711ba0ee1e1668032b3c43e3e1dfec2c5716c302e851ac756c1645e15882d73df6ad21ae951 +"@prisma/engines@npm:4.1.1": + version: 4.1.1 + resolution: "@prisma/engines@npm:4.1.1" + checksum: 23877091007c288065b002cedc70273bc1a5eb601e3bae767549521aeffbd58775f079ba61fd9516546befe0a6c50db2fb2469f33b1e2ee847f5b1056ac4a07a languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 +"@sapphire/async-queue@npm:^1.3.2": + version: 1.3.2 + resolution: "@sapphire/async-queue@npm:1.3.2" + checksum: 348f35a278bff68cb6d5e2c2219b03ce66243162522003bb14426e5fdad251300bea8ef3883043eb034c181dddd52296a519e9f377075a5b31074807fe163e76 languageName: node linkType: hard -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" +"@sapphire/eslint-config@npm:^4.3.7": + version: 4.3.7 + resolution: "@sapphire/eslint-config@npm:4.3.7" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + "@typescript-eslint/eslint-plugin": ^5.28.0 + "@typescript-eslint/parser": ^5.28.0 + eslint: ^8.17.0 + eslint-config-prettier: ^8.5.0 + eslint-plugin-prettier: ^4.0.0 + prettier: ^2.6.2 + typescript: ^4.7.3 + checksum: 58326b4ee235b97cc68a92bdcb230ff823119600e81a27ae28a0d646ad718d742984694045805d27ebfa4a9f2a571c2d0602bd291df0085824cb16adc2e5794e languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" +"@sapphire/pieces@npm:^3.3.5": + version: 3.3.5 + resolution: "@sapphire/pieces@npm:3.3.5" dependencies: - "@babel/helper-plugin-utils": ^7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + "@discordjs/collection": ^1.0.0 + "@sapphire/utilities": ^3.7.0 + tslib: ^2.4.0 + checksum: fb86ab91a002dc85033cf160d0f4429930e4cc580323888c2e2032aedb7ca599ec69743071fd08baef228e9497930b8afff7d9c4d43427b47da1ba3a537666ab languageName: node linkType: hard -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" +"@sapphire/prettier-config@npm:^1.4.3": + version: 1.4.3 + resolution: "@sapphire/prettier-config@npm:1.4.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 + prettier: ^2.6.2 + checksum: 95ed7d3b67f9a2373936282b47f13f81141ce3a61f26c630feca32f8a711c1b49198673579072310f290dd86c5ddbd39a3ca382ca3800b211318cd19ae226395 languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-decorators@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fb84e064b2db09fbc94380f4666281433cd2d485365e3b82de976cb8e1f28a433775e6af4b36556fff8ce8197864674ee334e67b6ab7b73d808d9e1b4c936287 +"@sapphire/result@npm:^2.1.1": + version: 2.1.1 + resolution: "@sapphire/result@npm:2.1.1" + checksum: e1c77ba6fcdb63b17152e06a1b30ca8e9a8da00c343019cf1181aeb6d14cc3d7546c2535c9f3f592252c3578889081dcdbad0649bd33d6279b93a79710a7f8e1 languageName: node linkType: hard -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" +"@sapphire/shapeshift@npm:^3.5.1": + version: 3.5.1 + resolution: "@sapphire/shapeshift@npm:3.5.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd + fast-deep-equal: ^3.1.3 + lodash.uniqwith: ^4.5.0 + checksum: caecfef844c9e43e921a5051da888fae7da8980bfd9f9bb4f7fee85931d40929ffb9b6dfae464c0dccee61e56f7698f998e4d9a54d25f35fad39a51ba1a4f391 languageName: node linkType: hard -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a +"@sapphire/snowflake@npm:^3.2.2": + version: 3.2.2 + resolution: "@sapphire/snowflake@npm:3.2.2" + checksum: 315fecef4738092c2a2f3509b132b811fcbfa6c98d5d45d951adaf3ca21608be69043bcc137cc6933a7c3e55cbdc066daa5bb484603e6575422b335445b59315 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.18.6" +"@sapphire/ts-config@npm:^3.3.4": + version: 3.3.4 + resolution: "@sapphire/ts-config@npm:3.3.4" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 54918a05375325ba0c60bc81abfb261e6f118bed2de94e4c17dca9a2006fc25e13b1a8b5504b9a881238ea394fd2f098f60b2eb3a392585d6348874565445e7b + tslib: ^2.3.1 + typescript: ^4.6.3 + checksum: c26dee331e17dd1762caa499ca6f1d1ee22fe781a5486575ead625c399678fbf3b33cf963a4f48aad04df5d515a4b3d2f80a03272d2413894d96f799d5f5ca87 languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b +"@sapphire/utilities@npm:^3.7.0": + version: 3.7.0 + resolution: "@sapphire/utilities@npm:3.7.0" + checksum: 3b574586242f015859e913123a5311774ad2d6cb79241c2a3d447a585282bdb04cddcd8e086f757a8ae5d2c49f4a25b4f848d63cebe605c7641364b51c3cfa11 languageName: node linkType: hard -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a +"@sapphire/utilities@npm:^3.8.0": + version: 3.8.0 + resolution: "@sapphire/utilities@npm:3.8.0" + checksum: 5b7520bcce6abf743bdf393783bed7b003e2fe6e6473a8325c00ee1df8c7eb6325ec0a307435345627b609146ca0555e5169545af41c7b3a71dcf6f7b87339f3 languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" +"@sentry/core@npm:7.8.1": + version: 7.8.1 + resolution: "@sentry/core@npm:7.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + "@sentry/hub": 7.8.1 + "@sentry/types": 7.8.1 + "@sentry/utils": 7.8.1 + tslib: ^1.9.3 + checksum: 6fa019f49f4476a0d04b3efbe1d2f5b9ff5be14a5b2bff848ae97f7215113a6e768ac73d670f4d992af3e8defa495dfa31e5a9d3a6a38740f9b780ea088db172 languageName: node linkType: hard -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" +"@sentry/hub@npm:7.8.1": + version: 7.8.1 + resolution: "@sentry/hub@npm:7.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + "@sentry/types": 7.8.1 + "@sentry/utils": 7.8.1 + tslib: ^1.9.3 + checksum: a764749e311dd9e71cfe1fe2c6e781009ab4874e506e34615f723e11174a60ac97671b6f89de66cc3a208e64b4616d35901b5b231efe0785f54d60dc783b5014 languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" +"@sentry/integrations@npm:^7.8.0": + version: 7.8.1 + resolution: "@sentry/integrations@npm:7.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + "@sentry/types": 7.8.1 + "@sentry/utils": 7.8.1 + localforage: ^1.8.1 + tslib: ^1.9.3 + checksum: c95816f6ccbb77a2f54d8da2032d890fd59c5bd1b9d0f28478db9b6c23416eaac2d2c35f03ec92d39b2fbf7c2f59cd587838f0b8c78a6f80358ad5a0569de90b languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" +"@sentry/node@npm:^7.8.0": + version: 7.8.1 + resolution: "@sentry/node@npm:7.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + "@sentry/core": 7.8.1 + "@sentry/hub": 7.8.1 + "@sentry/types": 7.8.1 + "@sentry/utils": 7.8.1 + cookie: ^0.4.1 + https-proxy-agent: ^5.0.0 + lru_map: ^0.3.3 + tslib: ^1.9.3 + checksum: 9f45360a94592de0f24cdec7630929e227aef313d0d9ac4e9af3e6530967f113cf2cef93e728a1e33fa637cfeb6d55149c60c65cb2c13ab6f0f6879d9febc0e7 languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 +"@sentry/types@npm:7.8.1": + version: 7.8.1 + resolution: "@sentry/types@npm:7.8.1" + checksum: b06961923034b46d75a4cc2aef6658d14899f45483ff2c159dee281ab32c1180a5c972bfc5b443deece75ea815f9c7d05f1a77b52b559204dea6cbf8173660a7 languageName: node linkType: hard -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" +"@sentry/utils@npm:7.8.1": + version: 7.8.1 + resolution: "@sentry/utils@npm:7.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + "@sentry/types": 7.8.1 + tslib: ^1.9.3 + checksum: 7777e86885513fb5ef7baa22e71f0e4e8cbf8d00db6a00775444c2b3fe8d2935f39756374e058adb99673fb8618e0fb105d2f24f537ed60ce84977e68a2178f2 languageName: node linkType: hard -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" +"@skyra/env-utilities@npm:^1.0.2": + version: 1.0.2 + resolution: "@skyra/env-utilities@npm:1.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda + dotenv-cra: ^3.0.2 + checksum: 21afca53bfdf3dc5845b95d0c56f20bafe5e9738b29dbdf7f67bee34d86a2f3c1d75b1eb6bed2bc8c32ddd07c5a345f3d67fb3c22c57e821c667ae3da283f60e languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" +"@skyra/http-framework-i18n@npm:^0.2.0": + version: 0.2.0 + resolution: "@skyra/http-framework-i18n@npm:0.2.0" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + "@discordjs/collection": ^1.0.1 + "@sapphire/utilities": ^3.8.0 + "@skyra/i18next-backend": ^1.0.2 + discord-api-types: ^0.36.3 + i18next: ^21.8.16 + tslib: ^2.4.0 + checksum: 855ebbee2319c39535f6c89174a335d2bab2156edde7a5553b6d5f01e212a5fa681b3773e89bf329fb28e66c56f3ea806e665bbb763e1c0198bdb7a1fad48ae3 languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.18.6, @babel/plugin-syntax-typescript@npm:^7.3.3, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.18.6 - resolution: "@babel/plugin-syntax-typescript@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2cde73725ec51118ebf410bf02d78781c03fa4d3185993fcc9d253b97443381b621c44810084c5dd68b92eb8bdfae0e5b163e91b32bebbb33852383d1815c05d +"@skyra/http-framework@npm:^0.7.0": + version: 0.7.0 + resolution: "@skyra/http-framework@npm:0.7.0" + dependencies: + "@discordjs/builders": ^1.1.0 + "@discordjs/collection": ^1.0.1 + "@discordjs/rest": ^1.0.1 + "@sapphire/pieces": ^3.3.5 + "@sapphire/utilities": ^3.8.0 + discord-api-types: ^0.36.3 + fastify: ^4.3.0 + form-data: ^4.0.0 + tweetnacl: ^1.0.3 + checksum: f9fc7f043ada86a6d2047feee3ee0f08c04f9743ab7ccd2b7acb8ff7cbf37dd81aff03e3c98c955f88968e94f02d50836905e1d5ca5e33c50c8358a55b74b2e8 languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.18.6" +"@skyra/i18next-backend@npm:^1.0.2": + version: 1.0.2 + resolution: "@skyra/i18next-backend@npm:1.0.2" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 900f5c695755062b91eec74da6f9092f40b8fada099058b92576f1e23c55e9813ec437051893a9b3c05cefe39e8ac06303d4a91b384e1c03dd8dc1581ea11602 + tslib: ^2.4.0 + checksum: 2f94a15203c4b1815a085daaee30ec06b6326648766dfded1164e257969ea269be466f0ad2cd578f2f7c7a7c613a74d35bd60d406c47f50aa23f82f9e079dee4 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.18.6" +"@skyra/shared-http-pieces@npm:^0.0.40": + version: 0.0.40 + resolution: "@skyra/shared-http-pieces@npm:0.0.40" dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c2cca47468cf1aeefdc7ec35d670e195c86cee4de28a1970648c46a88ce6bd1806ef0bab27251b9e7fb791bb28a64dcd543770efd899f28ee5f7854e64e873d3 + "@discordjs/builders": ^1.1.0 + "@discordjs/collection": ^1.0.1 + "@skyra/http-framework": ^0.7.0 + "@skyra/http-framework-i18n": ^0.2.0 + discord-api-types: ^0.36.3 + tslib: ^2.4.0 + checksum: 5d0638f1b253aaa1ded292b3db9f20897b03ae8ce6a48f3f61e6f636e189cc52e7a3e1cb42c4e47f003783d681fa6b9ebea2f02ca9874185e3ef7e8167522bc5 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0a0df61f94601e3666bf39f2cc26f5f7b22a94450fb93081edbed967bd752ce3f81d1227fefd3799f5ee2722171b5e28db61379234d1bb85b6ec689589f99d7e +"@skyra/start-banner@npm:^1.0.2": + version: 1.0.2 + resolution: "@skyra/start-banner@npm:1.0.2" + checksum: d2937cc093e200fb7e0fdc0612667be574bd6f9d20f9d64d3c96914efa637ebbafa34d07d9e03c2fe422f40443aea7b3c2ccf4a4389732832623b580decf616a languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f8064ea431eb7aa349dc5b6be87a650f912b48cd65afde917e8644f6f840d7f9d2ce4795f2aa3955aa5b23a73d4ad38abd03386ae109b4b8702b746c6d35bda3 +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-classes@npm:7.18.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-replace-supers": ^7.18.9 - "@babel/helper-split-export-declaration": ^7.18.6 - globals: ^11.1.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d7e953c0cf32af64e75db1277d2556c04635f32691ef462436897840be6f8021d4f85ee96134cb796a12dda549cf53346fedf96b671885f881bc4037c9d120ad +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a6bfbea207827d77592628973c0e8cc3319db636506bdc6e81e21582de2e767890e6975b382d0511e9ec3773b9f43691185df90832883bbf9251f688d27fbc1d +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1a9b85dff67fd248fa8a2488ef59df3eb4dd4ca6007ff7db9f780c7873630a13bc16cfb2ad8f4c4ca966e42978410d1e4b306545941fe62769f2683f34973acd +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.18.6, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: cbe5d7063eb8f8cca24cd4827bc97f5641166509e58781a5f8aa47fb3d2d786ce4506a30fca2e01f61f18792783a5cb5d96bf5434c3dd1ad0de8c9cc625a53da +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 220bf4a9fec5c4d4a7b1de38810350260e8ea08481bf78332a464a21256a95f0df8cd56025f346238f09b04f8e86d4158fafc9f4af57abaef31637e3b58bd4fe +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.18.6" +"@types/chai-subset@npm:^1.3.3": + version: 1.3.3 + resolution: "@types/chai-subset@npm:1.3.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7f70222f6829c82a36005508d34ddbe6fd0974ae190683a8670dd6ff08669aaf51fef2209d7403f9bd543cb2d12b18458016c99a6ed0332ccedb3ea127b01229 + "@types/chai": "*" + checksum: 4481da7345022995f5a105e6683744f7203d2c3d19cfe88d8e17274d045722948abf55e0adfd97709e0f043dade37a4d4e98cd4c660e2e8a14f23e6ecf79418f languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-for-of@npm:7.18.8" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ca64c623cf0c7a80ab6f07ebd3e6e4ade95e2ae806696f70b43eafe6394fa8ce21f2b1ffdd15df2067f7363d2ecfe26472a97c6c774403d2163fa05f50c98f17 +"@types/chai@npm:*, @types/chai@npm:^4.3.1": + version: 4.3.1 + resolution: "@types/chai@npm:4.3.1" + checksum: 2ee246b76c469cd620a7a1876a73bc597074361b67d547b4bd96a0c1adb43597ede2d8589ab626192e14349d83cbb646cc11e2c179eeeb43ff11596de94d82c4 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-function-name@npm:7.18.9" +"@types/gradient-string@npm:^1.1.2": + version: 1.1.2 + resolution: "@types/gradient-string@npm:1.1.2" dependencies: - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 62dd9c6cdc9714704efe15545e782ee52d74dc73916bf954b4d3bee088fb0ec9e3c8f52e751252433656c09f744b27b757fc06ed99bcde28e8a21600a1d8e597 + "@types/tinycolor2": "*" + checksum: 8bc665bcf277b4da9d30eb1dc5d83990678145700df991a24441948cb86b8e9c453cb701a370d3363dddafdd365748ef3190140601c82916ea70ee577de98dc3 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-literals@npm:7.18.9" - dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3458dd2f1a47ac51d9d607aa18f3d321cbfa8560a985199185bed5a906bb0c61ba85575d386460bac9aed43fdd98940041fae5a67dff286f6f967707cff489f8 +"@types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 35a3d04f6693bc6b298c05453d85ee6e41cc806538acb6928427e0e97ae06059f97d2f07d21495fcf5f70d3c13a242e2ecbd09d5c1fcb1b1a73ff528dcb0b695 +"@types/minimatch@npm:^3.0.3": + version: 3.0.5 + resolution: "@types/minimatch@npm:3.0.5" + checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-amd@npm:7.18.6" - dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f60c4c4e0eaec41e42c003cbab44305da7a8e05b2c9bdfc2b3fe0f9e1d7441c959ff5248aa03e350abe530e354028cbf3aa20bf07067b11510997dad8dd39be0 +"@types/minimist@npm:^1.2.0": + version: 1.2.2 + resolution: "@types/minimist@npm:1.2.2" + checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.6" - dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7e356e3df8a6a8542cced7491ec5b1cc1093a88d216a59e63a5d2b9fe9d193cbea864f680a41429e41a4f9ecec930aa5b0b8f57e2b17b3b4d27923bb12ba5d14 +"@types/node@npm:*, @types/node@npm:>=12": + version: 18.6.2 + resolution: "@types/node@npm:18.6.2" + checksum: 644c460baedb1fbbd55369ab621167cb39ddaa727fd4fcf4bc7080183cf936d7ff8c2c886ba93ff42768d6f7a579a540e6d1e63d3adba4e5758fb13671ae68ce languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.18.9" - dependencies: - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-module-transforms": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-validator-identifier": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6122d9901ed5dc56d9db843efc9249fe20d769a11989bbbf5a806ed4f086def949185198aa767888481babf70fc52b6b3e297a991e2b02b4f34ffb03d998d1e3 +"@types/node@npm:^13.7.4": + version: 13.13.52 + resolution: "@types/node@npm:13.13.52" + checksum: 8f1afff497ebeba209e2dc340d823284e087a47632afe99a7daa30eaff80893e520f222ad400cd1f2d3b8288e93cf3eaded52a8e64eaefb8aacfe6c35de98f42 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-umd@npm:7.18.6" - dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c3b6796c6f4579f1ba5ab0cdcc73910c1e9c8e1e773c507c8bb4da33072b3ae5df73c6d68f9126dab6e99c24ea8571e1563f8710d7c421fac1cde1e434c20153 +"@types/node@npm:^18.6.3": + version: 18.6.3 + resolution: "@types/node@npm:18.6.3" + checksum: 38495b8fd27200d2b7ab9ccd8c1e2475d2411fba15330f2cba869a85ef79dd42382a2658c8dd298ace8c21ed3bfafcdea408faecd74928b144377d07d00e7c8c languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 6ef64aa3dad68df139eeaa7b6e9bb626be8f738ed5ed4db765d516944b1456d513b6bad3bb60fff22babe73de26436fd814a4228705b2d3d2fdb272c31da35e2 +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.1 + resolution: "@types/normalize-package-data@npm:2.4.1" + checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-new-target@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bd780e14f46af55d0ae8503b3cb81ca86dcc73ed782f177e74f498fff934754f9e9911df1f8f3bd123777eed7c1c1af4d66abab87c8daae5403e7719a6b845d1 +"@types/parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/parse-json@npm:4.0.0" + checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-object-super@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0fcb04e15deea96ae047c21cb403607d49f06b23b4589055993365ebd7a7d7541334f06bf9642e90075e66efce6ebaf1eb0ef066fbbab802d21d714f1aac3aef +"@types/tinycolor2@npm:*, @types/tinycolor2@npm:^1.4.0": + version: 1.4.3 + resolution: "@types/tinycolor2@npm:1.4.3" + checksum: 61984b2825d4ee902016ef24777787bb2fb9e4999ccd4f7e5a709442c00cf90ba4afa510b9c78f18dcc83c03305d597d5fe3825a6aad38354f95c68af70ebc1b languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-parameters@npm:7.18.8" +"@types/ws@npm:^8.5.3": + version: 8.5.3 + resolution: "@types/ws@npm:8.5.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2b5863300da60face8a250d91da16294333bd5626e9721b13a3ba2078bd2a5a190e32c6e7a1323d5f547f579aeb2804ff49a62a55fcad2b1d099e55a55b788ea + "@types/node": "*" + checksum: 0ce46f850d41383fcdc2149bcacc86d7232fa7a233f903d2246dff86e31701a02f8566f40af5f8b56d1834779255c04ec6ec78660fe0f9b2a69cf3d71937e4ae languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-property-literals@npm:7.18.6" +"@typescript-eslint/eslint-plugin@npm:^5.28.0": + version: 5.31.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.31.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@typescript-eslint/scope-manager": 5.31.0 + "@typescript-eslint/type-utils": 5.31.0 + "@typescript-eslint/utils": 5.31.0 + debug: ^4.3.4 + functional-red-black-tree: ^1.0.1 + ignore: ^5.2.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1c16e64de554703f4b547541de2edda6c01346dd3031d4d29e881aa7733785cd26d53611a4ccf5353f4d3e69097bb0111c0a93ace9e683edd94fea28c4484144 + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: a6d007e6cc6c7204b9ce09dd6670a5a29f8b75417a84c8238d1dd7fc3bfa4a7294beb961a0ba76e610b695a0c80edd4186803429e3605a21562c23e47b8efa37 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-regenerator@npm:7.18.6" +"@typescript-eslint/eslint-plugin@npm:^5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.32.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - regenerator-transform: ^0.15.0 + "@typescript-eslint/scope-manager": 5.32.0 + "@typescript-eslint/type-utils": 5.32.0 + "@typescript-eslint/utils": 5.32.0 + debug: ^4.3.4 + functional-red-black-tree: ^1.0.1 + ignore: ^5.2.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 60bd482cb0343c714f85c3e19a13b3b5fa05ee336c079974091c0b35e263307f4e661f4555dff90707a87d5efe19b1d51835db44455405444ac1813e268ad750 + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 9785c34d9742b51130237bfe244924ca6dfd529bdcc5932a5cf81558f0235099c963a11125df393037db51ce451f7ab9442aba3c3a8bb2e0607569a0e31480c8 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-reserved-words@npm:7.18.6" +"@typescript-eslint/parser@npm:^5.28.0": + version: 5.31.0 + resolution: "@typescript-eslint/parser@npm:5.31.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@typescript-eslint/scope-manager": 5.31.0 + "@typescript-eslint/types": 5.31.0 + "@typescript-eslint/typescript-estree": 5.31.0 + debug: ^4.3.4 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0738cdc30abdae07c8ec4b233b30c31f68b3ff0eaa40eddb45ae607c066127f5fa99ddad3c0177d8e2832e3a7d3ad115775c62b431ebd6189c40a951b867a80c + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: ae842105ff0e5811d54c9c020ee0568170c13f401de293eb4caa2106f3060558773b496b5647f2b80b2969a2890135c054f50e2443a13c3705d5965aa12896c0 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.18.6" +"@typescript-eslint/parser@npm:^5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/parser@npm:5.32.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@typescript-eslint/scope-manager": 5.32.0 + "@typescript-eslint/types": 5.32.0 + "@typescript-eslint/typescript-estree": 5.32.0 + debug: ^4.3.4 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b8e4e8acc2700d1e0d7d5dbfd4fdfb935651913de6be36e6afb7e739d8f9ca539a5150075a0f9b79c88be25ddf45abb912fe7abf525f0b80f5b9d9860de685d7 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3fcfa183cad125c3198fd63701c6e13dad1cc984d309e8cd40ec9a2eb857902abfd7e9ee3f030b18eb1c18c795a61ea289ef147a7f9dfac38df905e7514316af languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-spread@npm:7.18.9" +"@typescript-eslint/scope-manager@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/scope-manager@npm:5.31.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 59489dd6212bd21debdf77746d9fa02dfe36f7062dc08742b8841d04312a26ea37bc0d71c71a6e37c3ab81dce744faa7f23fa94b0915593458f6adc35c087766 + "@typescript-eslint/types": 5.31.0 + "@typescript-eslint/visitor-keys": 5.31.0 + checksum: f771adf54a7cf6387bb201a0d4bef598425818c38832cabbf33c369b3fb650932cbb81a28f198727f3ffae5e21445dde710c41c624bd10b3b7283249333b625b languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.18.6" +"@typescript-eslint/scope-manager@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/scope-manager@npm:5.32.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 68ea18884ae9723443ffa975eb736c8c0d751265859cd3955691253f7fee37d7a0f7efea96c8a062876af49a257a18ea0ed5fea0d95a7b3611ce40f7ee23aee3 + "@typescript-eslint/types": 5.32.0 + "@typescript-eslint/visitor-keys": 5.32.0 + checksum: 69bdeb029f39d1112299dc0cb0ddef30e51bdb782fdb79cc4e72fa448e00d71e39938d3bff3fa4ee43b3416c2e3b4564de2c37252914772b07eeedafb14412d6 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-template-literals@npm:7.18.9" +"@typescript-eslint/type-utils@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/type-utils@npm:5.31.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@typescript-eslint/utils": 5.31.0 + debug: ^4.3.4 + tsutils: ^3.21.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3d2fcd79b7c345917f69b92a85bdc3ddd68ce2c87dc70c7d61a8373546ccd1f5cb8adc8540b49dfba08e1b82bb7b3bbe23a19efdb2b9c994db2db42906ca9fb2 + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 1e98a6952207cf7d19cdac375a69bcfed953a29746fa1f2b3c7a8c9376c6984c0bb52506539b76d6a9bebc33966c825f032a27859e545447890562dd3c05ef31 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.18.9" +"@typescript-eslint/type-utils@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/type-utils@npm:5.32.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@typescript-eslint/utils": 5.32.0 + debug: ^4.3.4 + tsutils: ^3.21.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: e754e0d8b8a028c52e10c148088606e3f7a9942c57bd648fc0438e5b4868db73c386a5ed47ab6d6f0594aae29ee5ffc2ffc0f7ebee7fae560a066d6dea811cd4 + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 4063808ca054789bebc6adb376d15c13e38f8ea14fa2842c38ae616d77fb77681b67a04b77887cf9ceb6f801ab3fc5eddfb6325779ab821404c62f36c56310bb languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.18.6": - version: 7.18.8 - resolution: "@babel/plugin-transform-typescript@npm:7.18.8" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-typescript": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 627211f1658870274fcabf38a71bb08ae219e3ac672423083574fabe2c857f28d39243cb7279adada8468c912a7beebc0622770ed66885a1e33b84ccc8bfd7df +"@typescript-eslint/types@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/types@npm:5.31.0" + checksum: 1c4223a7dcbeb2fb52dc723ac366e2cc75549b21d71f5de8515e86e48d13324e4e136e75804e0f71aff56c9936ef494fa4d1e3eb2f189ed60cf8e2c7401ce372 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 297a03706723164a777263f76a8d89bccfb1d3fbc5e1075079dfd84372a5416d579da7d44c650abf935a1150a995bfce0e61966447b657f958e51c4ea45b72dc +"@typescript-eslint/types@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/types@npm:5.32.0" + checksum: 6758f54d8d7763893cd7c1753f525ef1777eee8b558bf3d54fd2a2ce691ca0cf813c68a26e4db83a1deae4e4a62b247f1195e15a1f3577f1293849f9e55a232c languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.18.6" +"@typescript-eslint/typescript-estree@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.31.0" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d9e18d57536a2d317fb0b7c04f8f55347f3cfacb75e636b4c6fa2080ab13a3542771b5120e726b598b815891fc606d1472ac02b749c69fd527b03847f22dc25e + "@typescript-eslint/types": 5.31.0 + "@typescript-eslint/visitor-keys": 5.31.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 921c502ac4c93df9342d29636b384e154c3ac714e2be0308a4c9d3337d24d8b4721b76cbe700f70c7ceef06b50dfc404e4d4d734e446fe319bac030cb653d7b4 languageName: node linkType: hard -"@babel/preset-env@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/preset-env@npm:7.18.9" - dependencies: - "@babel/compat-data": ^7.18.8 - "@babel/helper-compilation-targets": ^7.18.9 - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-async-generator-functions": ^7.18.6 - "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-class-static-block": ^7.18.6 - "@babel/plugin-proposal-dynamic-import": ^7.18.6 - "@babel/plugin-proposal-export-namespace-from": ^7.18.9 - "@babel/plugin-proposal-json-strings": ^7.18.6 - "@babel/plugin-proposal-logical-assignment-operators": ^7.18.9 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 - "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.18.9 - "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-private-methods": ^7.18.6 - "@babel/plugin-proposal-private-property-in-object": ^7.18.6 - "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-class-properties": ^7.12.13 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.18.6 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.18.6 - "@babel/plugin-transform-async-to-generator": ^7.18.6 - "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.18.9 - "@babel/plugin-transform-classes": ^7.18.9 - "@babel/plugin-transform-computed-properties": ^7.18.9 - "@babel/plugin-transform-destructuring": ^7.18.9 - "@babel/plugin-transform-dotall-regex": ^7.18.6 - "@babel/plugin-transform-duplicate-keys": ^7.18.9 - "@babel/plugin-transform-exponentiation-operator": ^7.18.6 - "@babel/plugin-transform-for-of": ^7.18.8 - "@babel/plugin-transform-function-name": ^7.18.9 - "@babel/plugin-transform-literals": ^7.18.9 - "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.18.6 - "@babel/plugin-transform-modules-commonjs": ^7.18.6 - "@babel/plugin-transform-modules-systemjs": ^7.18.9 - "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.18.6 - "@babel/plugin-transform-new-target": ^7.18.6 - "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.18.8 - "@babel/plugin-transform-property-literals": ^7.18.6 - "@babel/plugin-transform-regenerator": ^7.18.6 - "@babel/plugin-transform-reserved-words": ^7.18.6 - "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.18.9 - "@babel/plugin-transform-sticky-regex": ^7.18.6 - "@babel/plugin-transform-template-literals": ^7.18.9 - "@babel/plugin-transform-typeof-symbol": ^7.18.9 - "@babel/plugin-transform-unicode-escapes": ^7.18.6 - "@babel/plugin-transform-unicode-regex": ^7.18.6 - "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.18.9 - babel-plugin-polyfill-corejs2: ^0.3.1 - babel-plugin-polyfill-corejs3: ^0.5.2 - babel-plugin-polyfill-regenerator: ^0.3.1 - core-js-compat: ^3.22.1 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 311002b9255d1aa261afe712ab73a93687652437804e2f44e6cc55438f8b199463f53bb2b8e0912b0034f208a42eee664a9e126a6061ca504a792ede97dd027e +"@typescript-eslint/typescript-estree@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.32.0" + dependencies: + "@typescript-eslint/types": 5.32.0 + "@typescript-eslint/visitor-keys": 5.32.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 6aee08be5d36603d038fb8340f324f5cb38519150c9b37c012f0c1ff2a4d8cf22fbc6835de31d069949c2b3d8ed3e729076a724ef29db4289d9fe73b97c9d310 languageName: node linkType: hard -"@babel/preset-modules@npm:^0.1.5": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" +"@typescript-eslint/utils@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/utils@npm:5.31.0" dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 - "@babel/plugin-transform-dotall-regex": ^7.4.4 - "@babel/types": ^7.4.4 - esutils: ^2.0.2 + "@types/json-schema": ^7.0.9 + "@typescript-eslint/scope-manager": 5.31.0 + "@typescript-eslint/types": 5.31.0 + "@typescript-eslint/typescript-estree": 5.31.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8430e0e9e9d520b53e22e8c4c6a5a080a12b63af6eabe559c2310b187bd62ae113f3da82ba33e9d1d0f3230930ca702843aae9dd226dec51f7d7114dc1f51c10 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 2a4200fd8812f7d7dfbe381d856e97da3606f0c59de78829edd297cc76b4851316bf8362b65e66c7db399e9ea31ec71943626ec12022a552bcb7bb591259ec49 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/preset-typescript@npm:7.18.6" +"@typescript-eslint/utils@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/utils@npm:5.32.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-transform-typescript": ^7.18.6 + "@types/json-schema": ^7.0.9 + "@typescript-eslint/scope-manager": 5.32.0 + "@typescript-eslint/types": 5.32.0 + "@typescript-eslint/typescript-estree": 5.32.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7fe0da5103eb72d3cf39cf3e138a794c8cdd19c0b38e3e101507eef519c46a87a0d6d0e8bc9e28a13ea2364001ebe7430b9d75758aab4c3c3a8db9a487b9dc7c + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: cfd88d93508c8fb0db17d2726691e1383db390357fa0637bd8111558fbe72da5130d995294001d71b1d929d620fbce3f20a70b277a77ca21a4241b3b470dc758 languageName: node linkType: hard -"@babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.8.4": - version: 7.18.9 - resolution: "@babel/runtime@npm:7.18.9" +"@typescript-eslint/visitor-keys@npm:5.31.0": + version: 5.31.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.31.0" dependencies: - regenerator-runtime: ^0.13.4 - checksum: 36dd736baba7164e82b3cc9d43e081f0cb2d05ff867ad39cac515d99546cee75b7f782018b02a3dcf5f2ef3d27f319faa68965fdfec49d4912c60c6002353a2e + "@typescript-eslint/types": 5.31.0 + eslint-visitor-keys: ^3.3.0 + checksum: 24ff3b9037b8fafe4f240b1c8a91981d658cd12a019f7961c9fe2f1d4dc84cf64e4071d865073191181b46652f4bd8f8cfc8e053ed8737ba1b9aede3e3252b3d languageName: node linkType: hard -"@babel/template@npm:^7.18.6, @babel/template@npm:^7.3.3": - version: 7.18.6 - resolution: "@babel/template@npm:7.18.6" +"@typescript-eslint/visitor-keys@npm:5.32.0": + version: 5.32.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.32.0" dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/parser": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: cb02ed804b7b1938dbecef4e01562013b80681843dd391933315b3dd9880820def3b5b1bff6320d6e4c6a1d63d1d5799630d658ec6b0369c5505e7e4029c38fb + "@typescript-eslint/types": 5.32.0 + eslint-visitor-keys: ^3.3.0 + checksum: 1f9b756d648c2346a6e8538ffde729d3d9ce6621fded3d9f15c96aa0ebf8f511daf8232470423fb36359c2113538a4daaf3336181be78a0cfbfd297af91ce9ba languageName: node linkType: hard -"@babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.7.2": - version: 7.18.9 - resolution: "@babel/traverse@npm:7.18.9" - dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.9 - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.18.9 - "@babel/types": ^7.18.9 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 0445a51952ea1664a5719d9b1f8bf04be6f1933bcf54915fecc544c844a5dad2ac56f3b555723bbf741ef680d7fd64f6a5d69cfd08d518a4089c79a734270162 +"@vladfrangu/async_event_emitter@npm:^2.0.1": + version: 2.0.1 + resolution: "@vladfrangu/async_event_emitter@npm:2.0.1" + checksum: 96aec2c774676c3af47651167cb8ce1eba386c512aeac44731b09080f3a6faed7286993c37086da6cf600027f3281572d7beb8bc650f2fb257749ac99e6e2f6a languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.18.9 - resolution: "@babel/types@npm:7.18.9" +"JSONStream@npm:^1.0.4": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - to-fast-properties: ^2.0.0 - checksum: f0e0147267895fd8a5b82133e711ce7ce99941f3ce63647e0e3b00656a7afe48a8aa48edbae27543b701794d2b29a562a08f51f88f41df401abce7c3acc5e13a + jsonparse: ^1.2.0 + through: ">=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 +"abbrev@npm:1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 languageName: node linkType: hard -"@commitlint/cli@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/cli@npm:17.0.3" +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" dependencies: - "@commitlint/format": ^17.0.0 - "@commitlint/lint": ^17.0.3 - "@commitlint/load": ^17.0.3 - "@commitlint/read": ^17.0.0 - "@commitlint/types": ^17.0.0 - execa: ^5.0.0 - lodash: ^4.17.19 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: ^17.0.0 - bin: - commitlint: cli.js - checksum: d8319889e0b5290d15c53b1f1f7588cb364d9c062cdf52f56b83e474dfe371a9430a1e3682a7b9668c5173a006d4c4eed0c9747580b44225864ea388014d58dd + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 languageName: node linkType: hard -"@commitlint/config-conventional@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/config-conventional@npm:17.0.3" - dependencies: - conventional-changelog-conventionalcommits: ^5.0.0 - checksum: 1cd30d827cf43bc7b08604398d4104bc031a69c8b45777886572aff12de25f40761dfbe5ffc6cd1f0d5b05de850e6d3e22dee6d799288e9cdd80bf575d036d46 +"abstract-logging@npm:^2.0.1": + version: 2.0.1 + resolution: "abstract-logging@npm:2.0.1" + checksum: 6967d15e5abbafd17f56eaf30ba8278c99333586fa4f7935fd80e93cfdc006c37fcc819c5d63ee373a12e6cb2d0417f7c3c6b9e42b957a25af9937d26749415e languageName: node linkType: hard -"@commitlint/config-validator@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/config-validator@npm:17.0.3" - dependencies: - "@commitlint/types": ^17.0.0 - ajv: ^8.11.0 - checksum: bc543193bbe132e1fc351bd912434a7214055e8b865ea661b016c6e05c84714d75d8dc54ac6dcc1d53e872ef3665e4a0cf0e3817cff88a01201bf0b37d23744f +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 languageName: node linkType: hard -"@commitlint/ensure@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/ensure@npm:17.0.0" - dependencies: - "@commitlint/types": ^17.0.0 - lodash: ^4.17.19 - checksum: 5ce3c624417dc64ed0d406954b7684ed287142535b0f55df6984093d0f82eadf0da5ab3e472e3020139304cd007c682a4bdfb95cf53fb99e7c7ae6d4711ada6b +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/execute-rule@npm:17.0.0" - checksum: cb37e5c6e0e16bf04e8f344094146ed2de8155456191da88fb9a1b943a9b5a98e0f6ef49c55b239104eb68634df681fd3be05311bf2da0cb6b171fdd24371669 +"acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0": + version: 8.8.0 + resolution: "acorn@npm:8.8.0" + bin: + acorn: bin/acorn + checksum: 7270ca82b242eafe5687a11fea6e088c960af712683756abf0791b68855ea9cace3057bd5e998ffcef50c944810c1e0ca1da526d02b32110e13c722aa959afdc languageName: node linkType: hard -"@commitlint/format@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/format@npm:17.0.0" +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" dependencies: - "@commitlint/types": ^17.0.0 - chalk: ^4.1.0 - checksum: e54705bdc91741632bac6ae330ba5d08110ec7575900585f4947487e7189a3d586396a3da3f1622fd3b6a49be9af1f71519a1ffeaa562d4cc7349bde3846eb8a + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d languageName: node linkType: hard -"@commitlint/is-ignored@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/is-ignored@npm:17.0.3" +"agentkeepalive@npm:^4.2.1": + version: 4.2.1 + resolution: "agentkeepalive@npm:4.2.1" dependencies: - "@commitlint/types": ^17.0.0 - semver: 7.3.7 - checksum: 5a0b1921ea03cf8b5fd735b1c0903e6a28b4ff0a730977b8c2afe827feed8162c95264127d60cfe8f03e46be194436a44d4c3049ab07396c9bce2daa730a212c + debug: ^4.1.0 + depd: ^1.1.2 + humanize-ms: ^1.2.1 + checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 languageName: node linkType: hard -"@commitlint/lint@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/lint@npm:17.0.3" +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" dependencies: - "@commitlint/is-ignored": ^17.0.3 - "@commitlint/parse": ^17.0.0 - "@commitlint/rules": ^17.0.0 - "@commitlint/types": ^17.0.0 - checksum: 5bbb8bc1f3b37fd680700c00a6135a72d6737dac85c79bcaa85a211828e2dff08d742e721255edca859d75996352b20b888ee47bdef5b47fc2718f9fd08d5b53 + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 languageName: node linkType: hard -"@commitlint/load@npm:>6.1.1, @commitlint/load@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/load@npm:17.0.3" +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" dependencies: - "@commitlint/config-validator": ^17.0.3 - "@commitlint/execute-rule": ^17.0.0 - "@commitlint/resolve-extends": ^17.0.3 - "@commitlint/types": ^17.0.0 - "@types/node": ">=12" - chalk: ^4.1.0 - cosmiconfig: ^7.0.0 - cosmiconfig-typescript-loader: ^2.0.0 - lodash: ^4.17.19 - resolve-from: ^5.0.0 - typescript: ^4.6.4 - checksum: 786b7064470b4c38577a10910ad725b4371e9f649fbcd4b6018ec4dec2b7f30bc60c6f02807b154ca59f5d5fd347f3d4a46523c9f44e324c05902a2fd29dfb17 + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 languageName: node linkType: hard -"@commitlint/message@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/message@npm:17.0.0" - checksum: ec80ea7f98082e48116fda1203277ac139bf2f442a8f58f87f8b823c6e526ec3771a9de7821b249254d580bff59a3fe205d044d1e9df29c34c3014a41e851c5d +"ajv@npm:^6.10.0, ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 languageName: node linkType: hard -"@commitlint/parse@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/parse@npm:17.0.0" +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.11.0": + version: 8.11.0 + resolution: "ajv@npm:8.11.0" dependencies: - "@commitlint/types": ^17.0.0 - conventional-changelog-angular: ^5.0.11 - conventional-commits-parser: ^3.2.2 - checksum: 86610df080665b8ba83037c598f4e6d0538a5ec40fdb0c2ad1925bfdf0f494934deafa020d2e21663f64dbc20fec4e889d21675573d3860c379c2d305db7a141 + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef languageName: node linkType: hard -"@commitlint/read@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/read@npm:17.0.0" +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" dependencies: - "@commitlint/top-level": ^17.0.0 - "@commitlint/types": ^17.0.0 - fs-extra: ^10.0.0 - git-raw-commits: ^2.0.0 - checksum: 5307d9ba06279343280cae4ab64bc6a153a44a24bc8948bbd80f07f5fac1f5b64586d34386ce5f6fd0fd221de4787c21fd82607f44a7969ab499c84bab1f0fa6 + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^17.0.3": - version: 17.0.3 - resolution: "@commitlint/resolve-extends@npm:17.0.3" - dependencies: - "@commitlint/config-validator": ^17.0.3 - "@commitlint/types": ^17.0.0 - import-fresh: ^3.0.0 - lodash: ^4.17.19 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: 384fc59a5a8f3da2b4551b92b2734f8d22c39ba389ca31df2f7a8ea1e68e8c15b137faf4ae20529a7b826ca6a7f5e5cd30ab2c903f9d65f74d0b43dcac5f8e0c +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b languageName: node linkType: hard -"@commitlint/rules@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/rules@npm:17.0.0" +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" dependencies: - "@commitlint/ensure": ^17.0.0 - "@commitlint/message": ^17.0.0 - "@commitlint/to-lines": ^17.0.0 - "@commitlint/types": ^17.0.0 - execa: ^5.0.0 - checksum: cd0944069932bee738a0ed70cb972fa0d14c0e35642310ca856d5e368ddc48513d05ece00f2e309ebcf4ecb119f8b44b322ff086edaa5208edb3cec0968dac06 + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 languageName: node linkType: hard -"@commitlint/to-lines@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/to-lines@npm:17.0.0" - checksum: ccad787a3baf567c6c589e96e110aa2582103b50eaa9b70493116c08a0e5c6c50669c05e67b0a77cd803d66c031b1dcb9805b752d604178dbc4c744fc7f9bb04 +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 languageName: node linkType: hard -"@commitlint/top-level@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/top-level@npm:17.0.0" - dependencies: - find-up: ^5.0.0 - checksum: 2e43d021a63faee67aa0e63b86a3ab9347ccda1b81f1f0722841223bd6bf127de954933c2ca3172fac0a1ce07a8b3bed62ac8f4afa04d50281dc5f80b43b61fb +"ansi-styles@npm:^6.0.0": + version: 6.1.0 + resolution: "ansi-styles@npm:6.1.0" + checksum: 7a7f8528c07a9d20c3a92bccd2b6bc3bb4d26e5cb775c02826921477377bd495d615d61f710d56216344b6238d1d11ef2b0348e146c5b128715578bfb3217229 languageName: node linkType: hard -"@commitlint/types@npm:^17.0.0": - version: 17.0.0 - resolution: "@commitlint/types@npm:17.0.0" - dependencies: - chalk: ^4.1.0 - checksum: 210636d3923f93f7cfc409eac04376b0fe50356a0e08f25a37b43d5cd9ca4363f7b03ca2e7736cbf95b62d67733fe8e1028269d35b4fddd1b3f2a653c90ca85c +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 languageName: node linkType: hard -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa +"archy@npm:^1.0.0": + version: 1.0.0 + resolution: "archy@npm:1.0.0" + checksum: 504ae7af655130bab9f471343cfdb054feaec7d8e300e13348bc9fe9e660f83d422e473069584f73233c701ae37d1c8452ff2522f2a20c38849e0f406f1732ac languageName: node linkType: hard -"@discordjs/builders@npm:^0.15.0": - version: 0.15.0 - resolution: "@discordjs/builders@npm:0.15.0" +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" dependencies: - "@sapphire/shapeshift": ^3.1.0 - "@sindresorhus/is": ^4.6.0 - discord-api-types: ^0.33.3 - fast-deep-equal: ^3.1.3 - ts-mixer: ^6.0.1 - tslib: ^2.4.0 - checksum: 1a8a4ffe048243ebb9fbbc76a113e4994c68904a5b3d256a6b10c0123f1d0fb58b45809d134ba993293fb2190c9f3506663ddfb5068a86ec6b9c53b5db61f6a6 + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 languageName: node linkType: hard -"@discordjs/builders@npm:^0.16.0": - version: 0.16.0 - resolution: "@discordjs/builders@npm:0.16.0" - dependencies: - "@sapphire/shapeshift": ^3.5.1 - discord-api-types: ^0.36.2 - fast-deep-equal: ^3.1.3 - ts-mixer: ^6.0.1 - tslib: ^2.4.0 - checksum: bf7ab00924bf84678c139b32c3b6bda16d62f190a1674ebaa4ec8767c7105890b1375716296037306661e138fe1c09c535b3141a047b7fceafaa92937a76cb8b +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 languageName: node linkType: hard -"@discordjs/builders@npm:^1.0.0": - version: 1.0.0 - resolution: "@discordjs/builders@npm:1.0.0" - dependencies: - "@sapphire/shapeshift": ^3.5.1 - discord-api-types: ^0.36.2 - fast-deep-equal: ^3.1.3 - ts-mixer: ^6.0.1 - tslib: ^2.4.0 - checksum: eeb627c772a2bd1fea1bddd58d46d391c30d0e2411cc3976386b7efc2048724e6bfd204ba848724ebd6d04791b358637c3a9eee878f924ef525c4920bfbfa2de +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced languageName: node linkType: hard -"@discordjs/collection@npm:^0.7.0": - version: 0.7.0 - resolution: "@discordjs/collection@npm:0.7.0" - checksum: 141aa35a5433bacba3617b533557b4948388c7b59cdaecee51ccd721c1b9242e50d95bdef53ee2491535a017095f5072ace3c3e9e594193f67a1c5a8a4b7db93 +"array-differ@npm:^3.0.0": + version: 3.0.0 + resolution: "array-differ@npm:3.0.0" + checksum: 117edd9df5c1530bd116c6e8eea891d4bd02850fd89b1b36e532b6540e47ca620a373b81feca1c62d1395d9ae601516ba538abe5e8172d41091da2c546b05fb7 languageName: node linkType: hard -"@discordjs/collection@npm:^1.0.0": +"array-ify@npm:^1.0.0": version: 1.0.0 - resolution: "@discordjs/collection@npm:1.0.0" - checksum: d8eafd35e782a6a2ee83a22c31679958bc827fce8cd5ffc7e5942cf681c96fd9543334b48c743ecda45179fcefa8d7be7a13f771d7f14effaec8a8ca25077031 + resolution: "array-ify@npm:1.0.0" + checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 languageName: node linkType: hard -"@discordjs/node-pre-gyp@npm:^0.4.2": - version: 0.4.4 - resolution: "@discordjs/node-pre-gyp@npm:0.4.4" - dependencies: - detect-libc: ^2.0.0 - https-proxy-agent: ^5.0.0 - make-dir: ^3.1.0 - node-fetch: ^2.6.7 - nopt: ^5.0.0 - npmlog: ^5.0.1 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.11 - bin: - node-pre-gyp: bin/node-pre-gyp - checksum: 432d9463388200733f6e659cf9bd885a4285a9c3bcddc791f892bac4ecca115f6051d09bd1a521ecdcdf5e90cf49c3e601f08da63f0d854b5c4749230be0425f +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.0": - version: 1.3.0 - resolution: "@eslint/eslintrc@npm:1.3.0" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.3.2 - globals: ^13.15.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: a1e734ad31a8b5328dce9f479f185fd4fc83dd7f06c538e1fa457fd8226b89602a55cc6458cd52b29573b01cdfaf42331be8cfc1fec732570086b591f4ed6515 +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 +"arrify@npm:^2.0.1": + version: 2.0.1 + resolution: "arrify@npm:2.0.1" + checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.9.2": - version: 0.9.5 - resolution: "@humanwhocodes/config-array@npm:0.9.5" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.4 - checksum: 8ba6281bc0590f6c6eadeefc14244b5a3e3f5903445aadd1a32099ed80e753037674026ce1b3c945ab93561bea5eb29e3c5bff67060e230c295595ba517a3492 +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 languageName: node linkType: hard -"@influxdata/influxdb-client-apis@npm:^1.27.0": - version: 1.27.0 - resolution: "@influxdata/influxdb-client-apis@npm:1.27.0" - peerDependencies: - "@influxdata/influxdb-client": "*" - checksum: fa9a71a7ca60ecf79b11a45c90d32e7950cfad8753003f001e00601b4bcd1f3d286acbc8848b28ef2490c56a11684b58cc2d6b4f733e53419b122259b2d45957 +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be languageName: node linkType: hard -"@influxdata/influxdb-client@npm:^1.27.0": - version: 1.27.0 - resolution: "@influxdata/influxdb-client@npm:1.27.0" - checksum: 6990c6daa698c9c3183ea831030b2584f2ccdfd56cd4c8b2ae9a6191d07abe091bd501ed2d428cb5c30cc9854fa5cc542c151d1366967c5d3695feb925a4901a +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e languageName: node linkType: hard -"@ioredis/commands@npm:^1.1.1": - version: 1.2.0 - resolution: "@ioredis/commands@npm:1.2.0" - checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 languageName: node linkType: hard -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" +"avvio@npm:^8.1.3": + version: 8.2.0 + resolution: "avvio@npm:8.2.0" dependencies: - camelcase: ^5.3.1 - find-up: ^4.1.0 - get-package-type: ^0.1.0 - js-yaml: ^3.13.1 - resolve-from: ^5.0.0 - checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + archy: ^1.0.0 + debug: ^4.0.0 + fastq: ^1.6.1 + checksum: bbd06eeb1f9ef428dbc32a32e06c350a7b320f60348698fd234145a4100f3688ce5d0999b966eb6ca70f9511d0c35fed5ef4651d276715e7e3e94a2d465cb56d languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 languageName: node linkType: hard -"@jest/console@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/console@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - slash: ^3.0.0 - checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 languageName: node linkType: hard -"@jest/core@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/core@npm:28.1.3" +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" dependencies: - "@jest/console": ^28.1.3 - "@jest/reporters": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - ci-info: ^3.2.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-changed-files: ^28.1.3 - jest-config: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-resolve-dependencies: ^28.1.3 - jest-runner: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - jest-watcher: ^28.1.3 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - rimraf: ^3.0.0 - slash: ^3.0.0 - strip-ansi: ^6.0.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: cb79f34bafc4637e7130df12257f5b29075892a2be2c7f45c6d4c0420853e80b5dae11016e652530eb234f4c44c00910cdca3c2cd86275721860725073f7d9b4 + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 languageName: node linkType: hard -"@jest/environment@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/environment@npm:28.1.3" +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" dependencies: - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - jest-mock: ^28.1.3 - checksum: 14c496b84aef951df33128cea68988e9de43b2e9d62be9f9c4308d4ac307fa345642813679f80d0a4cedeb900cf6f0b6bb2b92ce089528e8721f72295fdc727f + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 languageName: node linkType: hard -"@jest/expect-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect-utils@npm:28.1.3" +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" dependencies: - jest-get-type: ^28.0.2 - checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 languageName: node linkType: hard -"@jest/expect@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect@npm:28.1.3" +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" dependencies: - expect: ^28.1.3 - jest-snapshot: ^28.1.3 - checksum: 4197f6fdddc33dc45ba4e838f992fc61839c421d7aed0dfe665ef9c2f172bb1df8a8cac9cecee272b40e744a326da521d5e182709fe82a0b936055bfffa3b473 + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 languageName: node linkType: hard -"@jest/fake-timers@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/fake-timers@npm:28.1.3" +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" dependencies: - "@jest/types": ^28.1.3 - "@sinonjs/fake-timers": ^9.1.2 - "@types/node": "*" - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: cec14d5b14913a54dce64a62912c5456235f5d90b509ceae19c727565073114dae1aaf960ac6be96b3eb94789a3a758b96b72c8fca7e49a6ccac415fbc0321e1 + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 languageName: node linkType: hard -"@jest/globals@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/globals@npm:28.1.3" +"cacache@npm:^16.1.0": + version: 16.1.1 + resolution: "cacache@npm:16.1.1" dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/types": ^28.1.3 - checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + infer-owner: ^1.0.4 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + rimraf: ^3.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 + unique-filename: ^1.1.1 + checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a languageName: node linkType: hard -"@jest/reporters@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/reporters@npm:28.1.3" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 - "@types/node": "*" - chalk: ^4.0.0 - collect-v8-coverage: ^1.0.0 - exit: ^0.1.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 - istanbul-lib-report: ^3.0.0 - istanbul-lib-source-maps: ^4.0.0 - istanbul-reports: ^3.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 - slash: ^3.0.0 - string-length: ^4.0.1 - strip-ansi: ^6.0.0 - terminal-link: ^2.0.0 - v8-to-istanbul: ^9.0.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: a7440887ce837922cbeaa64c3232eb48aae02aa9123f29fc4280ad3e1afe4b35dcba171ba1d5fd219037c396c5152d9c2d102cff1798dd5ae3bd33ac4759ae0a +"cachedir@npm:2.3.0": + version: 2.3.0 + resolution: "cachedir@npm:2.3.0" + checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb languageName: node linkType: hard -"@jest/schemas@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/schemas@npm:28.1.3" - dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 languageName: node linkType: hard -"@jest/source-map@npm:^28.1.2": - version: 28.1.2 - resolution: "@jest/source-map@npm:28.1.2" +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" dependencies: - "@jridgewell/trace-mapping": ^0.3.13 - callsites: ^3.0.0 - graceful-fs: ^4.2.9 - checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a + camelcase: ^5.3.1 + map-obj: ^4.0.0 + quick-lru: ^4.0.1 + checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a languageName: node linkType: hard -"@jest/test-result@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-result@npm:28.1.3" - dependencies: - "@jest/console": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b languageName: node linkType: hard -"@jest/test-sequencer@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-sequencer@npm:28.1.3" +"chai@npm:^4.3.6": + version: 4.3.6 + resolution: "chai@npm:4.3.6" dependencies: - "@jest/test-result": ^28.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - slash: ^3.0.0 - checksum: 13f8905e6d1ec8286694146f7be3cf90eff801bbdea5e5c403e6881444bb390ed15494c7b9948aa94bd7e9c9a851e0d3002ed6e7371d048b478596e5b23df953 + assertion-error: ^1.1.0 + check-error: ^1.0.2 + deep-eql: ^3.0.1 + get-func-name: ^2.0.0 + loupe: ^2.3.1 + pathval: ^1.1.1 + type-detect: ^4.0.5 + checksum: acff93fd537f96d4a4d62dd83810285dffcfccb5089e1bf2a1205b28ec82d93dff551368722893cf85004282df10ee68802737c33c90c5493957ed449ed7ce71 languageName: node linkType: hard -"@jest/transform@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/transform@npm:28.1.3" +"chalk@npm:^2.0.0, chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" dependencies: - "@babel/core": ^7.11.6 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^1.4.0 - fast-json-stable-stringify: ^2.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - write-file-atomic: ^4.0.1 - checksum: dadf618936e0aa84342f07f532801d5bed43cdf95d1417b929e4f8782c872cff1adc84096d5a287a796d0039a2691c06d8450cce5a713a8b52fbb9f872a1e760 + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 languageName: node linkType: hard -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" dependencies: - "@jest/schemas": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.1.0": - version: 0.1.1 - resolution: "@jridgewell/gen-mapping@npm:0.1.1" +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" dependencies: - "@jridgewell/set-array": ^1.0.0 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.2 - resolution: "@jridgewell/gen-mapping@npm:0.3.2" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"check-error@npm:^1.0.2": + version: 1.0.2 + resolution: "check-error@npm:1.0.2" + checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + restore-cursor: ^3.1.0 + checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.14 - resolution: "@jridgewell/trace-mapping@npm:0.3.14" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: b9537b9630ffb631aef9651a085fe361881cde1772cd482c257fe3c78c8fd5388d681f504a9c9fe1081b1c05e8f75edf55ee10fdb58d92bbaa8dbf6a7bd6b18c +"cli-spinners@npm:^2.5.0": + version: 2.7.0 + resolution: "cli-spinners@npm:2.7.0" + checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f languageName: node linkType: hard -"@napi-rs/canvas-android-arm64@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-android-arm64@npm:0.1.25" - conditions: os=android & cpu=arm64 +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: ^3.0.0 + string-width: ^4.2.0 + checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d languageName: node linkType: hard -"@napi-rs/canvas-darwin-arm64@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-darwin-arm64@npm:0.1.25" - conditions: os=darwin & cpu=arm64 +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: ^5.0.0 + string-width: ^5.0.0 + checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a languageName: node linkType: hard -"@napi-rs/canvas-darwin-x64@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-darwin-x64@npm:0.1.25" - conditions: os=darwin & cpu=x64 +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 languageName: node linkType: hard -"@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-linux-arm-gnueabihf@npm:0.1.25" - conditions: os=linux & cpu=arm +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f languageName: node linkType: hard -"@napi-rs/canvas-linux-arm64-gnu@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-linux-arm64-gnu@npm:0.1.25" - conditions: os=linux & cpu=arm64 & libc=glibc +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd languageName: node linkType: hard -"@napi-rs/canvas-linux-arm64-musl@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-linux-arm64-musl@npm:0.1.25" - conditions: os=linux & cpu=arm64 & libc=musl +"cluster-key-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "cluster-key-slot@npm:1.1.0" + checksum: fc953c75209b1ef9088081bab4e40a0b2586491c974ab93460569c014515ca5a2e31c043f185285e177007162fc353d07836d98f570c171dbe055775430e495b languageName: node linkType: hard -"@napi-rs/canvas-linux-x64-gnu@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-linux-x64-gnu@npm:0.1.25" - conditions: os=linux & cpu=x64 & libc=glibc +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 languageName: node linkType: hard -"@napi-rs/canvas-linux-x64-musl@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-linux-x64-musl@npm:0.1.25" - conditions: os=linux & cpu=x64 & libc=musl +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 languageName: node linkType: hard -"@napi-rs/canvas-win32-x64-msvc@npm:0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas-win32-x64-msvc@npm:0.1.25" - conditions: os=win32 & cpu=x64 +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d languageName: node linkType: hard -"@napi-rs/canvas@npm:^0.1.25": - version: 0.1.25 - resolution: "@napi-rs/canvas@npm:0.1.25" - dependencies: - "@napi-rs/canvas-android-arm64": 0.1.25 - "@napi-rs/canvas-darwin-arm64": 0.1.25 - "@napi-rs/canvas-darwin-x64": 0.1.25 - "@napi-rs/canvas-linux-arm-gnueabihf": 0.1.25 - "@napi-rs/canvas-linux-arm64-gnu": 0.1.25 - "@napi-rs/canvas-linux-arm64-musl": 0.1.25 - "@napi-rs/canvas-linux-x64-gnu": 0.1.25 - "@napi-rs/canvas-linux-x64-musl": 0.1.25 - "@napi-rs/canvas-win32-x64-msvc": 0.1.25 - dependenciesMeta: - "@napi-rs/canvas-android-arm64": - optional: true - "@napi-rs/canvas-darwin-arm64": - optional: true - "@napi-rs/canvas-darwin-x64": - optional: true - "@napi-rs/canvas-linux-arm-gnueabihf": - optional: true - "@napi-rs/canvas-linux-arm64-gnu": - optional: true - "@napi-rs/canvas-linux-arm64-musl": - optional: true - "@napi-rs/canvas-linux-x64-gnu": - optional: true - "@napi-rs/canvas-linux-x64-musl": - optional: true - "@napi-rs/canvas-win32-x64-msvc": - optional: true - checksum: 76be83e3a5fe7badb59acb1a63fbb2bcad8a9ef879f5d157f81d28d0761f9bf0e839e2606077c9b8166525e86574810b518f7963debc83f34c2a6e3fb013425f +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 +"colorette@npm:^2.0.16, colorette@npm:^2.0.17, colorette@npm:^2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.1 - resolution: "@npmcli/fs@npm:2.1.1" - dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 4944a0545d38d3e6e29780eeb3cd4be6059c1e9627509d2c9ced635c53b852d28b37cdc615a2adf815b51ab8673adb6507e370401a20a7e90c8a6dc4fac02389 +"commander@npm:^9.3.0": + version: 9.4.0 + resolution: "commander@npm:9.4.0" + checksum: a322de584a6ccd1ea83c24f6a660e52d16ffbe2613fcfbb8d2cc68bc9dec637492456d754fe8bb5b039ad843ed8e04fb0b107e581a75f62cde9e1a0ab1546e09 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.0 - resolution: "@npmcli/move-file@npm:2.0.0" +"commitizen@npm:^4.0.3": + version: 4.2.5 + resolution: "commitizen@npm:4.2.5" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 - languageName: node - linkType: hard - -"@sapphire/async-queue@npm:^1.3.2": - version: 1.3.2 - resolution: "@sapphire/async-queue@npm:1.3.2" - checksum: 348f35a278bff68cb6d5e2c2219b03ce66243162522003bb14426e5fdad251300bea8ef3883043eb034c181dddd52296a519e9f377075a5b31074807fe163e76 + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: ^2.1.2 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.4 + is-utf8: ^0.2.1 + lodash: 4.17.21 + minimist: 1.2.6 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + bin: + commitizen: bin/commitizen + cz: bin/git-cz + git-cz: bin/git-cz + checksum: 28f5d10cf332663f1710edb2ca22473664bc4457146ce6922896ed2ed6ee2a23add607b04d5b8d1bb7ee09bb78bc0d38d09057e0ab39b38e44b172765e3835c9 languageName: node linkType: hard -"@sapphire/decorators@npm:^4.3.8": - version: 4.3.8 - resolution: "@sapphire/decorators@npm:4.3.8" +"compare-func@npm:^2.0.0": + version: 2.0.0 + resolution: "compare-func@npm:2.0.0" dependencies: - tslib: ^2.4.0 - checksum: 1642d102959fe81313c30a180d4bbbdc8ace51c6fb41710e03c5ec971b889aa0e845660c4bdaae4a2f16611bfefd09966c30e6d46fe39c59a0deaaa493f3a54d + array-ify: ^1.0.0 + dot-prop: ^5.1.0 + checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d languageName: node linkType: hard -"@sapphire/discord-utilities@npm:^2.11.2": - version: 2.11.5 - resolution: "@sapphire/discord-utilities@npm:2.11.5" - checksum: 5a507d845372f51012486d5bb6ec82fa4ac7e305b49d336517539d05267f82603ce4c0add3d7903afd19f0046efc6986f1837c041d0ec1edecd77cad48d27061 +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af languageName: node linkType: hard -"@sapphire/discord.js-utilities@npm:^4.11.2, @sapphire/discord.js-utilities@npm:^4.11.3": - version: 4.11.3 - resolution: "@sapphire/discord.js-utilities@npm:4.11.3" - dependencies: - "@sapphire/discord-utilities": ^2.11.2 - "@sapphire/time-utilities": ^1.7.4 - "@sapphire/utilities": ^3.6.2 - tslib: ^2.4.0 - checksum: 92a1040ecba4c1b7abfcc33edb7d97406f67f0d030cc7f741284946fa9c0f96517bfdcb8294828eb9590558810bacdeaf49eb8905399757f0b1211afb787bf2b +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed languageName: node linkType: hard -"@sapphire/eslint-config@npm:^4.3.7": - version: 4.3.7 - resolution: "@sapphire/eslint-config@npm:4.3.7" +"conventional-changelog-angular@npm:^5.0.11": + version: 5.0.13 + resolution: "conventional-changelog-angular@npm:5.0.13" dependencies: - "@typescript-eslint/eslint-plugin": ^5.28.0 - "@typescript-eslint/parser": ^5.28.0 - eslint: ^8.17.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-prettier: ^4.0.0 - prettier: ^2.6.2 - typescript: ^4.7.3 - checksum: 58326b4ee235b97cc68a92bdcb230ff823119600e81a27ae28a0d646ad718d742984694045805d27ebfa4a9f2a571c2d0602bd291df0085824cb16adc2e5794e + compare-func: ^2.0.0 + q: ^1.5.1 + checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 languageName: node linkType: hard -"@sapphire/fetch@npm:^2.4.1": - version: 2.4.1 - resolution: "@sapphire/fetch@npm:2.4.1" +"conventional-changelog-conventionalcommits@npm:^5.0.0": + version: 5.0.0 + resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" dependencies: - cross-fetch: ^3.1.5 - checksum: f8ab0baa59dfcb931729a46957073e4e26377b6b5e3bdbbed921ae793c0848a240545ed157efd5db13342d68eed84dc73c6fe83038a5e62af9daa3715326c4a9 + compare-func: ^2.0.0 + lodash: ^4.17.15 + q: ^1.5.1 + checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f languageName: node linkType: hard -"@sapphire/framework@npm:^2.5.1": - version: 2.5.1 - resolution: "@sapphire/framework@npm:2.5.1" - dependencies: - "@discordjs/builders": ^0.15.0 - "@sapphire/discord-utilities": ^2.11.2 - "@sapphire/discord.js-utilities": ^4.11.2 - "@sapphire/pieces": ^3.3.4 - "@sapphire/ratelimits": ^2.4.4 - "@sapphire/utilities": ^3.6.2 - lexure: ^0.17.0 - tslib: ^2.4.0 - checksum: 3ee022433eaae8922093feee782d788ce9751836011b685881635090cf72770a9fc0b5b32e9750e1b1901bb987a54ee96c3e71734d91833c2bfcfcaa57416470 +"conventional-commit-types@npm:^3.0.0": + version: 3.0.0 + resolution: "conventional-commit-types@npm:3.0.0" + checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d languageName: node linkType: hard -"@sapphire/pieces@npm:^3.3.4": - version: 3.3.5 - resolution: "@sapphire/pieces@npm:3.3.5" +"conventional-commits-parser@npm:^3.2.2": + version: 3.2.4 + resolution: "conventional-commits-parser@npm:3.2.4" dependencies: - "@discordjs/collection": ^1.0.0 - "@sapphire/utilities": ^3.7.0 - tslib: ^2.4.0 - checksum: fb86ab91a002dc85033cf160d0f4429930e4cc580323888c2e2032aedb7ca599ec69743071fd08baef228e9497930b8afff7d9c4d43427b47da1ba3a537666ab + JSONStream: ^1.0.4 + is-text-path: ^1.0.1 + lodash: ^4.17.15 + meow: ^8.0.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + conventional-commits-parser: cli.js + checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd languageName: node linkType: hard -"@sapphire/plugin-api@npm:^3.2.4": - version: 3.2.4 - resolution: "@sapphire/plugin-api@npm:3.2.4" - dependencies: - "@types/node-fetch": 2.6.2 - "@types/psl": ^1.1.0 - "@types/ws": ^8.5.3 - node-fetch: 2.6.7 - psl: ^1.9.0 - tslib: ^2.4.0 - checksum: ef1589396fc82909cd356ac29cbb6e9b52db152bf22dc72c66d2a21a0b74d9b92cfcb27d42ad1c2487c00cd21af94a82a13f9b13bb51bd24cb651637168cf0cd +"cookie@npm:^0.4.1": + version: 0.4.2 + resolution: "cookie@npm:0.4.2" + checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b languageName: node linkType: hard -"@sapphire/plugin-editable-commands@npm:^1.2.2": - version: 1.2.2 - resolution: "@sapphire/plugin-editable-commands@npm:1.2.2" - dependencies: - "@skyra/editable-commands": ^2.1.3 - tslib: ^2.4.0 - checksum: b294d6587a9d04233233b8f4350e0ea21acc8cbe558ef792beffad26d7605a2a90bd2c1d4c422bbcafe7d1dcb4786bc701d92e24f7ccd1184cf0f1a566e2e35b +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 languageName: node linkType: hard -"@sapphire/plugin-i18next@npm:^2.5.4": - version: 2.5.4 - resolution: "@sapphire/plugin-i18next@npm:2.5.4" +"cosmiconfig-typescript-loader@npm:^2.0.0": + version: 2.0.2 + resolution: "cosmiconfig-typescript-loader@npm:2.0.2" dependencies: - "@sapphire/utilities": ^3.7.0 - "@skyra/i18next-backend": ^1.0.1 - chokidar: ^3.5.3 - i18next: ^21.8.13 - tslib: ^2.4.0 - checksum: 79f470ba126f88e19eaac9db8604bcd9b9f0b895d101dedcd2911c88e40c075a27bbad2eff7cd78ada3f2e3fae44dcde06bddd36fd55b8dd7040fd181d66640a + cosmiconfig: ^7 + ts-node: ^10.8.1 + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + typescript: ">=3" + checksum: 0c9a777e2e3ff7594d753e5781e8c3817ce5ba493a4e69cfde698a8e231b438695248dcc62a16c661f93ada7f762ac6e24457889439c94f58c094a24aecbd982 languageName: node linkType: hard -"@sapphire/plugin-logger@npm:^2.2.3": - version: 2.2.3 - resolution: "@sapphire/plugin-logger@npm:2.2.3" +"cosmiconfig@npm:^7, cosmiconfig@npm:^7.0.0": + version: 7.0.1 + resolution: "cosmiconfig@npm:7.0.1" dependencies: - "@sapphire/time-utilities": ^1.7.4 - colorette: ^2.0.19 - tslib: ^2.4.0 - checksum: 90d4fdffccae8ab777601a322d0e32aba7ae415837298f176122620600f2b48a8235f746dfd292fdf9f2af1229f576e736870b394e368a3ed7e91791fddaacca + "@types/parse-json": ^4.0.0 + import-fresh: ^3.2.1 + parse-json: ^5.0.0 + path-type: ^4.0.0 + yaml: ^1.10.0 + checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b languageName: node linkType: hard -"@sapphire/plugin-subcommands@npm:^2.2.2": - version: 2.2.2 - resolution: "@sapphire/plugin-subcommands@npm:2.2.2" - dependencies: - tslib: ^2.4.0 - checksum: 358709f53d16ab52dbdb3f9d069c30a08bc78662e7726502baeaafbc76ecf57ad56d67a75e245563ed28be7ee8b18896a0e10a2d6100e6f959addb2cca2e7c91 +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff languageName: node linkType: hard -"@sapphire/prettier-config@npm:^1.4.3": - version: 1.4.3 - resolution: "@sapphire/prettier-config@npm:1.4.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" dependencies: - prettier: ^2.6.2 - checksum: 95ed7d3b67f9a2373936282b47f13f81141ce3a61f26c630feca32f8a711c1b49198673579072310f290dd86c5ddbd39a3ca382ca3800b211318cd19ae226395 + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 languageName: node linkType: hard -"@sapphire/ratelimits@npm:^2.4.4": - version: 2.4.4 - resolution: "@sapphire/ratelimits@npm:2.4.4" +"cz-conventional-changelog@npm:3.3.0, cz-conventional-changelog@npm:^3.3.0": + version: 3.3.0 + resolution: "cz-conventional-changelog@npm:3.3.0" dependencies: - "@sapphire/time-utilities": ^1.7.4 - checksum: 8bb31173f2fd61ca64b4f34ff3a927de00e339ee8d4dad7b8d80fa10e9020889033fc1f3ec0560256f54b8aedf3d2973378fe24d87f6aa1ca98be936eea35fcb + "@commitlint/load": ">6.1.1" + chalk: ^2.4.1 + commitizen: ^4.0.3 + conventional-commit-types: ^3.0.0 + lodash.map: ^4.5.1 + longest: ^2.0.1 + word-wrap: ^1.0.3 + dependenciesMeta: + "@commitlint/load": + optional: true + checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca languageName: node linkType: hard -"@sapphire/shapeshift@npm:^3.1.0, @sapphire/shapeshift@npm:^3.5.1": - version: 3.5.1 - resolution: "@sapphire/shapeshift@npm:3.5.1" - dependencies: - fast-deep-equal: ^3.1.3 - lodash.uniqwith: ^4.5.0 - checksum: caecfef844c9e43e921a5051da888fae7da8980bfd9f9bb4f7fee85931d40929ffb9b6dfae464c0dccee61e56f7698f998e4d9a54d25f35fad39a51ba1a4f391 +"dargs@npm:^7.0.0": + version: 7.0.0 + resolution: "dargs@npm:7.0.0" + checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 languageName: node linkType: hard -"@sapphire/snowflake@npm:^3.2.2": - version: 3.2.2 - resolution: "@sapphire/snowflake@npm:3.2.2" - checksum: 315fecef4738092c2a2f3509b132b811fcbfa6c98d5d45d951adaf3ca21608be69043bcc137cc6933a7c3e55cbdc066daa5bb484603e6575422b335445b59315 +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 languageName: node linkType: hard -"@sapphire/stopwatch@npm:^1.4.1": - version: 1.4.1 - resolution: "@sapphire/stopwatch@npm:1.4.1" +"decamelize-keys@npm:^1.1.0": + version: 1.1.0 + resolution: "decamelize-keys@npm:1.1.0" dependencies: - tslib: ^2.3.1 - checksum: 084462d9ca7ace45fd06d61e346a7a3326362d6d598c8721c908acf35772634b68f0224db998f0c59448a17b32b0d163248c6bc76c7f6f2d1db8a4f2ffc9fa68 + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: 8bc5d32e035a072f5dffc1f1f3d26ca7ab1fb44a9cade34c97ab6cd1e62c81a87e718101e96de07d78cecda20a3fdb955df958e46671ccad01bb8dcf0de2e298 languageName: node linkType: hard -"@sapphire/time-utilities@npm:^1.7.4, @sapphire/time-utilities@npm:^1.7.5": - version: 1.7.5 - resolution: "@sapphire/time-utilities@npm:1.7.5" - dependencies: - "@sapphire/utilities": ^3.7.0 - checksum: a83f505ff0e5eac7b8b316c7fa207f52ae2c07dd223f651d7dcb3f9a3e61b86b6168dac746455d1d1a2a4732d4865ab7526332f3f463db31048d8b1e5ba9d6cb +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa languageName: node linkType: hard -"@sapphire/ts-config@npm:^3.3.4": - version: 3.3.4 - resolution: "@sapphire/ts-config@npm:3.3.4" - dependencies: - tslib: ^2.3.1 - typescript: ^4.6.3 - checksum: c26dee331e17dd1762caa499ca6f1d1ee22fe781a5486575ead625c399678fbf3b33cf963a4f48aad04df5d515a4b3d2f80a03272d2413894d96f799d5f5ca87 +"dedent@npm:0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 languageName: node linkType: hard -"@sapphire/type@npm:^2.2.4": - version: 2.2.4 - resolution: "@sapphire/type@npm:2.2.4" +"deep-eql@npm:^3.0.1": + version: 3.0.1 + resolution: "deep-eql@npm:3.0.1" dependencies: - "@discordjs/node-pre-gyp": ^0.4.2 - nan: ^2.15.0 - tslib: ^2.4.0 - checksum: c1de369f48b0f15ac8bb365f0a618f2b75ef84687d871182982bbbc3f6d2560ba78fdac0c0e62c0f1c466f149f3b2a6dcd6459c3e1540cb92592c96b16033592 + type-detect: ^4.0.0 + checksum: 4f4c9fb79eb994fb6e81d4aa8b063adc40c00f831588aa65e20857d5d52f15fb23034a6576ecf886f7ff6222d5ae42e71e9b7d57113e0715b1df7ea1e812b125 languageName: node linkType: hard -"@sapphire/utilities@npm:^3.6.2, @sapphire/utilities@npm:^3.7.0": - version: 3.7.0 - resolution: "@sapphire/utilities@npm:3.7.0" - checksum: 3b574586242f015859e913123a5311774ad2d6cb79241c2a3d447a585282bdb04cddcd8e086f757a8ae5d2c49f4a25b4f848d63cebe605c7641364b51c3cfa11 +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 languageName: node linkType: hard -"@sentry/core@npm:7.7.0": - version: 7.7.0 - resolution: "@sentry/core@npm:7.7.0" +"defaults@npm:^1.0.3": + version: 1.0.3 + resolution: "defaults@npm:1.0.3" dependencies: - "@sentry/hub": 7.7.0 - "@sentry/types": 7.7.0 - "@sentry/utils": 7.7.0 - tslib: ^1.9.3 - checksum: d3b9b5a92a9182bae7f39eef01502dd542d5be7365632ea9e26aa5247c90fd72e620856b20a393f4d3eeadb27f3b744bf25be93b1fdc4f7457a894e290c41fb0 + clone: ^1.0.2 + checksum: 96e2112da6553d376afd5265ea7cbdb2a3b45535965d71ab8bb1da10c8126d168fdd5268799625324b368356d21ba2a7b3d4ec50961f11a47b7feb9de3d4413e languageName: node linkType: hard -"@sentry/hub@npm:7.7.0": - version: 7.7.0 - resolution: "@sentry/hub@npm:7.7.0" - dependencies: - "@sentry/types": 7.7.0 - "@sentry/utils": 7.7.0 - tslib: ^1.9.3 - checksum: 0683ae6da7d961e6bbb90ad1fded3b33cd9fc76dc54a080902a83bd7769991294ce8017277f5e0d145fcf9f2ad53ae89d3b0c7619fa0586c8513f4b585f14f6d +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 languageName: node linkType: hard -"@sentry/integrations@npm:^7.7.0": - version: 7.7.0 - resolution: "@sentry/integrations@npm:7.7.0" - dependencies: - "@sentry/types": 7.7.0 - "@sentry/utils": 7.7.0 - localforage: ^1.8.1 - tslib: ^1.9.3 - checksum: cd24f34301c55069e8487adc6d9b3c61e9f4f7284a01d4e9954324695f15b74806303cf53bd2e88db325289c057d2b33546986ed240b022f6d170cada94a0cab +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd languageName: node linkType: hard -"@sentry/node@npm:^7.7.0": - version: 7.7.0 - resolution: "@sentry/node@npm:7.7.0" - dependencies: - "@sentry/core": 7.7.0 - "@sentry/hub": 7.7.0 - "@sentry/types": 7.7.0 - "@sentry/utils": 7.7.0 - cookie: ^0.4.1 - https-proxy-agent: ^5.0.0 - lru_map: ^0.3.3 - tslib: ^1.9.3 - checksum: 554f4165f7cee16c70eca1e4e42d354330bcfcbf157bfbcdf4a17e89393f0c39f042cfaa07ba51ebb8391bbf2091d8dc6108a81650a60d39632d3b6a1edafe6f +"denque@npm:^2.0.1": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 languageName: node linkType: hard -"@sentry/types@npm:7.7.0": - version: 7.7.0 - resolution: "@sentry/types@npm:7.7.0" - checksum: 1f26c23617e9370cf32269ea5d5aa0f75fe86c34aede4fc07ae3bdae08803a788d628d0bba6f2e22c03d0430dcf63cc19453468ae086406448da07e13f36da70 +"depd@npm:^1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 languageName: node linkType: hard -"@sentry/utils@npm:7.7.0": - version: 7.7.0 - resolution: "@sentry/utils@npm:7.7.0" - dependencies: - "@sentry/types": 7.7.0 - tslib: ^1.9.3 - checksum: 990224e0542015952a4f1fa83dd69c82a3a85894576457f10bc3c0c60620c675969424bdbfde9872a19a5db2b682dd1d51c67ec99f0c57acfc993e6f7c970aaf +"detect-file@npm:^1.0.0": + version: 1.0.0 + resolution: "detect-file@npm:1.0.0" + checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a languageName: node linkType: hard -"@sinclair/typebox@npm:^0.24.1": - version: 0.24.20 - resolution: "@sinclair/typebox@npm:0.24.20" - checksum: bb2e95ab60236ebbcaf3c0735b01a8ce6bea068bb1214a8016f8fea7bc2027d69b08437998425d93a3ac38ded3dbe8c64e218e635c09282cb3dd5d5a64269076 +"detect-indent@npm:6.1.0": + version: 6.1.0 + resolution: "detect-indent@npm:6.1.0" + checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d languageName: node linkType: hard -"@sindresorhus/is@npm:^4.6.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d languageName: node linkType: hard -"@sinonjs/commons@npm:^1.7.0": - version: 1.8.3 - resolution: "@sinonjs/commons@npm:1.8.3" +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" dependencies: - type-detect: 4.0.8 - checksum: 6159726db5ce6bf9f2297f8427f7ca5b3dff45b31e5cee23496f1fa6ef0bb4eab878b23fb2c5e6446381f6a66aba4968ef2fc255c1180d753d4b8c271636a2e5 + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^9.1.2": - version: 9.1.2 - resolution: "@sinonjs/fake-timers@npm:9.1.2" +"discord-api-types@npm:^0.36.3": + version: 0.36.3 + resolution: "discord-api-types@npm:0.36.3" + checksum: 3089c0fb37425dc5df03c76d82988d43fcc272699b06a02fc830d0a3bef550009aaebdf6d646529e8a7ccea76ae3f43b099d736ea5ef37a0be143142ab49871d + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" dependencies: - "@sinonjs/commons": ^1.7.0 - checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce languageName: node linkType: hard -"@skyra/ai@npm:^1.2.0": - version: 1.2.0 - resolution: "@skyra/ai@npm:1.2.0" +"dot-prop@npm:^5.1.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" dependencies: - bindings: ^1.5.0 - node-addon-api: "*" - node-gyp: latest - tslib: ^2.2.0 - checksum: f950b31d4e669e44caa32d10d48542488e8512cce2f17d4fd878eaa33c1abb1a835305e65f0202f7dc2f70568ae7f46d3d6dca016beca19f449abb61853a0907 + is-obj: ^2.0.0 + checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea languageName: node linkType: hard -"@skyra/char@npm:^1.0.2": - version: 1.0.2 - resolution: "@skyra/char@npm:1.0.2" - checksum: 07a283d70d9f32b9d9017c48c5a0f4e5889223b6ac93e04e72fb85fc27a870ffda6c141dbc0d71c9c68799b842552d143f4d6236a1f939962e696b764754dae7 +"dotenv-cra@npm:^3.0.2": + version: 3.0.2 + resolution: "dotenv-cra@npm:3.0.2" + dependencies: + dotenv: ^10.0.0 + dotenv-expand: ^5.1.0 + checksum: dc33ca4c8751a16390f646513bbdfdf64e0cc6ebf3439e1d3e9fb418005f13d53106792e545824d9c08084a9c4e1bec425d30628f9791dab1f9a97f1e3684a64 languageName: node linkType: hard -"@skyra/editable-commands@npm:^2.1.3": - version: 2.1.3 - resolution: "@skyra/editable-commands@npm:2.1.3" - checksum: 3250f2167d8c3a2c2dfcb93f53323786cb2a94c50d3f511bdabf030b50d4df851eddba9d2f1fbde18478ab90c9a0ba43b2d71d99a9f7989b1c370820b9226b05 +"dotenv-expand@npm:^5.1.0": + version: 5.1.0 + resolution: "dotenv-expand@npm:5.1.0" + checksum: 8017675b7f254384915d55f9eb6388e577cf0a1231a28d54b0ca03b782be9501b0ac90ac57338636d395fa59051e6209e9b44b8ddf169ce6076dffb5dea227d3 languageName: node linkType: hard -"@skyra/env-utilities@npm:^1.0.2": - version: 1.0.2 - resolution: "@skyra/env-utilities@npm:1.0.2" - dependencies: - dotenv-cra: ^3.0.2 - checksum: 21afca53bfdf3dc5845b95d0c56f20bafe5e9738b29dbdf7f67bee34d86a2f3c1d75b1eb6bed2bc8c32ddd07c5a345f3d67fb3c22c57e821c667ae3da283f60e +"dotenv@npm:^10.0.0": + version: 10.0.0 + resolution: "dotenv@npm:10.0.0" + checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 languageName: node linkType: hard -"@skyra/gifenc@npm:^1.0.0": - version: 1.0.0 - resolution: "@skyra/gifenc@npm:1.0.0" - dependencies: - tslib: ^2.3.0 - checksum: 1f9743bd39211cda58f3a11431cca56fd6e87e0306b1a4d2e1c7e70b7852b5a3cac3ad1a1f33dbb7232b00099abf86537389e93fbc983bd601109a55c42af278 +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed languageName: node linkType: hard -"@skyra/i18next-backend@npm:^1.0.1": - version: 1.0.2 - resolution: "@skyra/i18next-backend@npm:1.0.2" - dependencies: - tslib: ^2.4.0 - checksum: 2f94a15203c4b1815a085daaee30ec06b6326648766dfded1164e257969ea269be466f0ad2cd578f2f7c7a7c613a74d35bd60d406c47f50aa23f82f9e079dee4 +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 languageName: node linkType: hard -"@skyra/jaro-winkler@npm:^1.1.0": - version: 1.1.0 - resolution: "@skyra/jaro-winkler@npm:1.1.0" - checksum: f46641f73363f19d2bc7f27534385d885d3c9dc4f7df81866860fcd549ec4f90de6249f078a49da33e4cc6a0ba5e4f2d687f63df9ccd14de70bd745e6927b29a +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 languageName: node linkType: hard -"@skyra/saelem@npm:^3.0.34": - version: 3.0.34 - resolution: "@skyra/saelem@npm:3.0.34" +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" dependencies: - graphql: ^15.8.0 - checksum: f1b81bbb65c208a06e6a701db6fd8db436bee2bc85d0485481a76e36dad911161dcad5b3e959f239503246cf216bc57f309b8453804369db84d882ec386da35b + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f languageName: node linkType: hard -"@skyra/star-wars-api@npm:^2.0.30": - version: 2.0.31 - resolution: "@skyra/star-wars-api@npm:2.0.31" +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" dependencies: - graphql: ^15.8.0 - checksum: e2544118f764988406616dd2ce8e754aa182fc347a31219d32971adff5045abc7ae9afe11fa9db862201562d5ff185c8c0c3ec96972998027740432fc3453ae6 + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b languageName: node linkType: hard -"@skyra/tags@npm:^1.1.3": - version: 1.1.3 - resolution: "@skyra/tags@npm:1.1.3" - dependencies: - tslib: ^2.3.0 - checksum: d94bad1fa4cc687d12a322fdd566710a0a641d0db944e1736ec19773959dd0fa353c4169a35cff369d019084c37e1c4a39190db7e52a3baff2fe2fbc88a158b0 +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e languageName: node linkType: hard -"@sqltools/formatter@npm:1.2.2": - version: 1.2.2 - resolution: "@sqltools/formatter@npm:1.2.2" - checksum: 9c355f0961f93deea6540960b9ef031bd37cd5a92e3e236da05ea860cd408bf5ba039505150143202a59ca9ebf471ee607d1be4c24378320911a98bb0394fd46 +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df +"esbuild-android-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-android-64@npm:0.14.51" + conditions: os=android & cpu=x64 languageName: node linkType: hard -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a +"esbuild-android-arm64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-android-arm64@npm:0.14.51" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d +"esbuild-darwin-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-darwin-64@npm:0.14.51" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f +"esbuild-darwin-arm64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-darwin-arm64@npm:0.14.51" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14": - version: 7.1.19 - resolution: "@types/babel__core@npm:7.1.19" - dependencies: - "@babel/parser": ^7.1.0 - "@babel/types": ^7.0.0 - "@types/babel__generator": "*" - "@types/babel__template": "*" - "@types/babel__traverse": "*" - checksum: 8c9fa87a1c2224cbec251683a58bebb0d74c497118034166aaa0491a4e2627998a6621fc71f8a60ffd27d9c0c52097defedf7637adc6618d0331c15adb302338 +"esbuild-freebsd-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-freebsd-64@npm:0.14.51" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@types/babel__generator@npm:*": - version: 7.6.4 - resolution: "@types/babel__generator@npm:7.6.4" - dependencies: - "@babel/types": ^7.0.0 - checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 +"esbuild-freebsd-arm64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-freebsd-arm64@npm:0.14.51" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@types/babel__template@npm:*": - version: 7.4.1 - resolution: "@types/babel__template@npm:7.4.1" - dependencies: - "@babel/parser": ^7.1.0 - "@babel/types": ^7.0.0 - checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee +"esbuild-linux-32@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-32@npm:0.14.51" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.17.1 - resolution: "@types/babel__traverse@npm:7.17.1" - dependencies: - "@babel/types": ^7.3.0 - checksum: 8992d8c1eaaf1c793e9184b930767883446939d2744c40ea4e9591086e79b631189dc519931ed8864f1e016742a189703c217db59b800aca84870b865009d8b4 +"esbuild-linux-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-64@npm:0.14.51" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@types/backoff@npm:^2.5.2": - version: 2.5.2 - resolution: "@types/backoff@npm:2.5.2" - dependencies: - "@types/node": "*" - checksum: a22b727b3540d28535fb9fefb0ece82ae2c325a16f7ab2736650a93294e74fec77d33562f2b363f8fcb3c6c1d8f8654d7d7a57f319e5b173e3c7d16819d8d235 +"esbuild-linux-arm64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-arm64@npm:0.14.51" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@types/diff@npm:^5.0.2": - version: 5.0.2 - resolution: "@types/diff@npm:5.0.2" - checksum: 8fbc419b5aca33f494026bf5f70e026f76367689677ef114f9c078ac738d7dbe96e6dda3fd8290e4a7c35281e2b60b034e3d7e3c968b850cf06a21279e7ddcbe +"esbuild-linux-arm@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-arm@npm:0.14.51" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.5 - resolution: "@types/graceful-fs@npm:4.1.5" - dependencies: - "@types/node": "*" - checksum: d076bb61f45d0fc42dee496ef8b1c2f8742e15d5e47e90e20d0243386e426c04d4efd408a48875ab432f7960b4ce3414db20ed0fbbfc7bcc89d84e574f6e045a +"esbuild-linux-mips64le@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-mips64le@npm:0.14.51" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@types/he@npm:^1.1.2": - version: 1.1.2 - resolution: "@types/he@npm:1.1.2" - checksum: 71e9786c35330a2003a7692d5dc4f70946e4c45486f84d7a5792360c6c234cd34bf53421856de40a2c4bead9c21a805c309d72d012467f46bb2cce0571a9ba08 +"esbuild-linux-ppc64le@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-ppc64le@npm:0.14.51" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 +"esbuild-linux-riscv64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-riscv64@npm:0.14.51" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@types/istanbul-lib-report@npm:*": - version: 3.0.0 - resolution: "@types/istanbul-lib-report@npm:3.0.0" - dependencies: - "@types/istanbul-lib-coverage": "*" - checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 +"esbuild-linux-s390x@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-linux-s390x@npm:0.14.51" + conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/istanbul-reports@npm:3.0.1" - dependencies: - "@types/istanbul-lib-report": "*" - checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 +"esbuild-netbsd-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-netbsd-64@npm:0.14.51" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@types/jest@npm:^28.1.6": - version: 28.1.6 - resolution: "@types/jest@npm:28.1.6" - dependencies: - jest-matcher-utils: ^28.0.0 - pretty-format: ^28.0.0 - checksum: f2ba5fbefc8f44d1c16ee19d8d2811bca75754a2846e222287f2788d96062801c568215e6b81eb532a48e8cb2a7282729da1d4f6fb496831da8269c5abaad4c5 +"esbuild-openbsd-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-openbsd-64@npm:0.14.51" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d +"esbuild-sunos-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-sunos-64@npm:0.14.51" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@types/minimatch@npm:^3.0.3": - version: 3.0.5 - resolution: "@types/minimatch@npm:3.0.5" - checksum: c41d136f67231c3131cf1d4ca0b06687f4a322918a3a5adddc87ce90ed9dbd175a3610adee36b106ae68c0b92c637c35e02b58c8a56c424f71d30993ea220b92 +"esbuild-windows-32@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-windows-32@npm:0.14.51" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@types/minimist@npm:^1.2.0": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d +"esbuild-windows-64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-windows-64@npm:0.14.51" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@types/node-fetch@npm:2.6.2, @types/node-fetch@npm:^2.6.2": - version: 2.6.2 - resolution: "@types/node-fetch@npm:2.6.2" - dependencies: - "@types/node": "*" - form-data: ^3.0.0 - checksum: 6f73b1470000d303d25a6fb92875ea837a216656cb7474f66cdd67bb014aa81a5a11e7ac9c21fe19bee9ecb2ef87c1962bceeaec31386119d1ac86e4c30ad7a6 +"esbuild-windows-arm64@npm:0.14.51": + version: 0.14.51 + resolution: "esbuild-windows-arm64@npm:0.14.51" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"esbuild@npm:^0.14.47": + version: 0.14.51 + resolution: "esbuild@npm:0.14.51" + dependencies: + esbuild-android-64: 0.14.51 + esbuild-android-arm64: 0.14.51 + esbuild-darwin-64: 0.14.51 + esbuild-darwin-arm64: 0.14.51 + esbuild-freebsd-64: 0.14.51 + esbuild-freebsd-arm64: 0.14.51 + esbuild-linux-32: 0.14.51 + esbuild-linux-64: 0.14.51 + esbuild-linux-arm: 0.14.51 + esbuild-linux-arm64: 0.14.51 + esbuild-linux-mips64le: 0.14.51 + esbuild-linux-ppc64le: 0.14.51 + esbuild-linux-riscv64: 0.14.51 + esbuild-linux-s390x: 0.14.51 + esbuild-netbsd-64: 0.14.51 + esbuild-openbsd-64: 0.14.51 + esbuild-sunos-64: 0.14.51 + esbuild-windows-32: 0.14.51 + esbuild-windows-64: 0.14.51 + esbuild-windows-arm64: 0.14.51 + dependenciesMeta: + esbuild-android-64: + optional: true + esbuild-android-arm64: + optional: true + esbuild-darwin-64: + optional: true + esbuild-darwin-arm64: + optional: true + esbuild-freebsd-64: + optional: true + esbuild-freebsd-arm64: + optional: true + esbuild-linux-32: + optional: true + esbuild-linux-64: + optional: true + esbuild-linux-arm: + optional: true + esbuild-linux-arm64: + optional: true + esbuild-linux-mips64le: + optional: true + esbuild-linux-ppc64le: + optional: true + esbuild-linux-riscv64: + optional: true + esbuild-linux-s390x: + optional: true + esbuild-netbsd-64: + optional: true + esbuild-openbsd-64: + optional: true + esbuild-sunos-64: + optional: true + esbuild-windows-32: + optional: true + esbuild-windows-64: + optional: true + esbuild-windows-arm64: + optional: true + bin: + esbuild: bin/esbuild + checksum: 0fa8a52dd1dc7b231f7b02448aae5ee71ff2fe26ee67f6c97945a6dd128806be6eb2c73be7b49c7b25f831d646edd3da245faf31ede136f4aa0934abd7206e4b languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:^18.0.6": - version: 18.0.6 - resolution: "@types/node@npm:18.0.6" - checksum: 780f8885a6b6eb12f4c0246617747fdc37a451931b3c01ce8148d356c0903b705dcb16cc6a914de63d48b0dc1b002c7a3dfae681f580e1761aa551d3cd996813 +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard -"@types/parse-json@npm:^4.0.0": +"escape-string-regexp@npm:^4.0.0": version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 languageName: node linkType: hard -"@types/pg@npm:^8.6.5": - version: 8.6.5 - resolution: "@types/pg@npm:8.6.5" - dependencies: - "@types/node": "*" - pg-protocol: "*" - pg-types: ^2.2.0 - checksum: 49ef858d95e84a6c1be193d367996581c991cf383d8628449507cc4ce67ef43b75acb18a0f9f49f870594cdec3501ddf4d2ac3fbe0dcdaab35c295c038d47199 +"eslint-config-prettier@npm:^8.5.0": + version: 8.5.0 + resolution: "eslint-config-prettier@npm:8.5.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 languageName: node linkType: hard -"@types/prettier@npm:^2.1.5": - version: 2.6.3 - resolution: "@types/prettier@npm:2.6.3" - checksum: e1836699ca189fff6d2a73dc22e028b6a6f693ed1180d5998ac29fa197caf8f85aa92cb38db642e4a370e616b451cb5722ad2395dab11c78e025a1455f37d1f0 +"eslint-plugin-prettier@npm:^4.0.0, eslint-plugin-prettier@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 languageName: node linkType: hard -"@types/psl@npm:^1.1.0": - version: 1.1.0 - resolution: "@types/psl@npm:1.1.0" - checksum: 648a4a40827fb101a05616b9c448b04d40c467db9f09e08099274759fd5e032e7d276013296679765c7d7359f43f0479094c1d8b6a56a8f9445b84b5a9af1263 +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 +"eslint-scope@npm:^7.1.1": + version: 7.1.1 + resolution: "eslint-scope@npm:7.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e languageName: node linkType: hard -"@types/ws@npm:^8.5.3": - version: 8.5.3 - resolution: "@types/ws@npm:8.5.3" +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" dependencies: - "@types/node": "*" - checksum: 0ce46f850d41383fcdc2149bcacc86d7232fa7a233f903d2246dff86e31701a02f8566f40af5f8b56d1834779255c04ec6ec78660fe0f9b2a69cf3d71937e4ae + eslint-visitor-keys: ^2.0.0 + peerDependencies: + eslint: ">=5" + checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 languageName: node linkType: hard -"@types/yargs-parser@npm:*": - version: 21.0.0 - resolution: "@types/yargs-parser@npm:21.0.0" - checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.10 - resolution: "@types/yargs@npm:17.0.10" - dependencies: - "@types/yargs-parser": "*" - checksum: f0673cbfc08e17239dc58952a88350d6c4db04a027a28a06fbad27d87b670e909f9cd9e66f9c64cebdd5071d1096261e33454a55868395f125297e5c50992ca8 +"eslint-visitor-keys@npm:^3.3.0": + version: 3.3.0 + resolution: "eslint-visitor-keys@npm:3.3.0" + checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.28.0, @typescript-eslint/eslint-plugin@npm:^5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/eslint-plugin@npm:5.30.7" +"eslint@npm:^8.17.0": + version: 8.20.0 + resolution: "eslint@npm:8.20.0" dependencies: - "@typescript-eslint/scope-manager": 5.30.7 - "@typescript-eslint/type-utils": 5.30.7 - "@typescript-eslint/utils": 5.30.7 - debug: ^4.3.4 + "@eslint/eslintrc": ^1.3.0 + "@humanwhocodes/config-array": ^0.9.2 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.3.2 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 functional-red-black-tree: ^1.0.1 + glob-parent: ^6.0.1 + globals: ^13.15.0 ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 regexpp: ^3.2.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d42af514f5817732646b5601030699687b4ef619ba7983754a4173bf908f6c6030324038e3733b88342ec6ace07af61aa946d677da6a6266931275bd2afc9fc2 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.28.0, @typescript-eslint/parser@npm:^5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/parser@npm:5.30.7" - dependencies: - "@typescript-eslint/scope-manager": 5.30.7 - "@typescript-eslint/types": 5.30.7 - "@typescript-eslint/typescript-estree": 5.30.7 - debug: ^4.3.4 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: f0b2da3cfd047d241f0bd3065a36afe008214aa9e8cd05e9f92d8b0e4b9ec19d3651d0e4a3995b8cb34b553cccb4b0d02d18c0cfbe11f53acd85923dd68366d5 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/scope-manager@npm:5.30.7" - dependencies: - "@typescript-eslint/types": 5.30.7 - "@typescript-eslint/visitor-keys": 5.30.7 - checksum: 434ce7a13a8f3bffae2af2b7fe19bab6e490c78114584212519f50cd1b91fbdcddc8ad93bdb3cacdc8cecca5a8c5d2eb606557e66bd3fcd9d3040846846c22ff - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/type-utils@npm:5.30.7" - dependencies: - "@typescript-eslint/utils": 5.30.7 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: e7a8d4ec973355c0fe5bad4c317a55940e41d24b1c33b0bf40e8bb268d784f6584a8048fc84ebdb7287849a2c70e2b36365067cba7815de849cd41a1d7653167 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/types@npm:5.30.7" - checksum: 2f6345bf0e2e9f392c1f62a5f96c630d4565574230a000508d923444229e51c1a05e07cef042935ca30f4f35755dbf3871b8b9da808911f578d63e6a4b897b79 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: a31adf390d71d916925586bc8467b48f620e93dd0416bc1e897d99265af88b48d4eba3985b5ff4653ae5cc46311a360d373574002277e159bb38a4363abf9228 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/typescript-estree@npm:5.30.7" +"eslint@npm:^8.21.0": + version: 8.21.0 + resolution: "eslint@npm:8.21.0" dependencies: - "@typescript-eslint/types": 5.30.7 - "@typescript-eslint/visitor-keys": 5.30.7 - debug: ^4.3.4 + "@eslint/eslintrc": ^1.3.0 + "@humanwhocodes/config-array": ^0.10.4 + "@humanwhocodes/gitignore-to-minimatch": ^1.0.2 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.3.3 + esquery: ^1.4.0 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + functional-red-black-tree: ^1.0.1 + glob-parent: ^6.0.1 + globals: ^13.15.0 globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 7cff83a9b9c91a89bcbb677d539b7122b2a423a66f575364858b4635d7e53a25b9329cd20a5adfb732758a41d1c6801d4bfa3eb798a192f351aafb11eedc58b6 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + regexpp: ^3.2.0 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: 1d39ddb08772ea230cb7d74f7f81f85b9d46965d3600725c7eb39a27bcdaf28cb2a780dacf6cfa1cfbf2da606b57a5e7e3ab373ab474cbcf0ba042076821f501 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/utils@npm:5.30.7" +"espree@npm:^9.3.2": + version: 9.3.2 + resolution: "espree@npm:9.3.2" dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.30.7 - "@typescript-eslint/types": 5.30.7 - "@typescript-eslint/typescript-estree": 5.30.7 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 77b0baf069f70290214294d74fdf7c46a7ddeab322ef53f65766b0c8e59f0e6f8074beb19233be34faca5beb390ac1b932dd1c983337355674c4437b4b1e2b44 + acorn: ^8.7.1 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.3.0 + checksum: 9a790d6779847051e87f70d720a0f6981899a722419e80c92ab6dee01e1ab83b8ce52d11b4dc96c2c490182efb5a4c138b8b0d569205bfe1cd4629e658e58c30 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.30.7": - version: 5.30.7 - resolution: "@typescript-eslint/visitor-keys@npm:5.30.7" +"espree@npm:^9.3.3": + version: 9.3.3 + resolution: "espree@npm:9.3.3" dependencies: - "@typescript-eslint/types": 5.30.7 + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.3.0 - checksum: f322972aeda3143d4c24826436357937131f7fbad102d48cfa6dfca70ac245f93b20cf7beb5f1809bda4fe8f454676a6cabf8f73e39af6724076f2b2c213ee80 + checksum: 33e8a36fc15d082e68672e322e22a53856b564d60aad8f291a667bfc21b2c900c42412d37dd3c7a0f18b9d0d8f8858dabe8776dbd4b4c2f72c5cf4d6afeabf65 languageName: node linkType: hard -"JSONStream@npm:^1.0.3, JSONStream@npm:^1.0.4": - version: 1.3.5 - resolution: "JSONStream@npm:1.3.5" +"esquery@npm:^1.4.0": + version: 1.4.0 + resolution: "esquery@npm:1.4.0" dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" - bin: - JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 + estraverse: ^5.1.0 + checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 languageName: node linkType: hard -"abbrev@npm:1": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 languageName: node linkType: hard -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 languageName: node linkType: hard -"acorn-node@npm:^1.2.0, acorn-node@npm:^1.3.0, acorn-node@npm:^1.5.2, acorn-node@npm:^1.8.2": - version: 1.8.2 - resolution: "acorn-node@npm:1.8.2" - dependencies: - acorn: ^7.0.0 - acorn-walk: ^7.0.0 - xtend: ^4.0.2 - checksum: 02e1564a1ccf8bd1fcefcd01235398af4a9effaf032c5397994ddd275590a72894cb3e26e4b82579ccdda1e48ade7486aef61e771ddae3563ca452b927f443d8 +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b languageName: node linkType: hard -"acorn-walk@npm:^7.0.0": - version: 7.2.0 - resolution: "acorn-walk@npm:7.2.0" - checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 languageName: node linkType: hard -"acorn@npm:^7.0.0": - version: 7.4.1 - resolution: "acorn@npm:7.4.1" - bin: - acorn: bin/acorn - checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 +"execa@npm:^4.0.0": + version: 4.1.0 + resolution: "execa@npm:4.1.0" + dependencies: + cross-spawn: ^7.0.0 + get-stream: ^5.0.0 + human-signals: ^1.1.1 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.0 + onetime: ^5.1.0 + signal-exit: ^3.0.2 + strip-final-newline: ^2.0.0 + checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.7.1": - version: 8.8.0 - resolution: "acorn@npm:8.8.0" - bin: - acorn: bin/acorn - checksum: 7270ca82b242eafe5687a11fea6e088c960af712683756abf0791b68855ea9cace3057bd5e998ffcef50c944810c1e0ca1da526d02b32110e13c722aa959afdc +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" +"execa@npm:^6.1.0": + version: 6.1.0 + resolution: "execa@npm:6.1.0" dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^3.0.1 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e languageName: node linkType: hard -"agentkeepalive@npm:^4.2.1": - version: 4.2.1 - resolution: "agentkeepalive@npm:4.2.1" +"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": + version: 2.0.2 + resolution: "expand-tilde@npm:2.0.2" dependencies: - debug: ^4.1.0 - depd: ^1.1.2 - humanize-ms: ^1.2.1 - checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 + homedir-polyfill: ^1.0.1 + checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": +"external-editor@npm:^3.0.3": version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" + resolution: "external-editor@npm:3.1.0" dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.10.0, ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ajv@npm:^8.11.0, ajv@npm:^8.8.2": - version: 8.11.0 - resolution: "ajv@npm:8.11.0" - dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.0.0": - version: 6.1.0 - resolution: "ansi-styles@npm:6.1.0" - checksum: 7a7f8528c07a9d20c3a92bccd2b6bc3bb4d26e5cb775c02826921477377bd495d615d61f710d56216344b6238d1d11ef2b0348e146c5b128715578bfb3217229 - languageName: node - linkType: hard - -"any-promise@npm:^1.0.0": - version: 1.3.0 - resolution: "any-promise@npm:1.3.0" - checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de - languageName: node - linkType: hard - -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": - version: 3.1.2 - resolution: "anymatch@npm:3.1.2" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 - languageName: node - linkType: hard - -"app-root-path@npm:^3.0.0": - version: 3.0.0 - resolution: "app-root-path@npm:3.0.0" - checksum: ff91a24db2b55070f6b3e22e72ce8fe8ea847e19eb8a3cbb267f9e9ac2a8372db65114dd6798a4ed7897a6f475b90a49330b3e53bf199d47e6abb5c5279aa1d7 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 6c80b4fd04ecee6ba6e737e0b72a4b41bdc64b7d279edfc998678567ff583c8df27e27523bc789f2c99be603ffa9eaa612803da1d886962d2086e7ff6fa90c7c - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.0 - resolution: "are-we-there-yet@npm:3.0.0" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-differ@npm:^3.0.0": - version: 3.0.0 - resolution: "array-differ@npm:3.0.0" - checksum: 117edd9df5c1530bd116c6e8eea891d4bd02850fd89b1b36e532b6540e47ca620a373b81feca1c62d1395d9ae601516ba538abe5e8172d41091da2c546b05fb7 - languageName: node - linkType: hard - -"array-ify@npm:^1.0.0": - version: 1.0.0 - resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"arrify@npm:^1.0.1": - version: 1.0.1 - resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 - languageName: node - linkType: hard - -"arrify@npm:^2.0.1": - version: 2.0.1 - resolution: "arrify@npm:2.0.1" - checksum: 067c4c1afd182806a82e4c1cb8acee16ab8b5284fbca1ce29408e6e91281c36bb5b612f6ddfbd40a0f7a7e0c75bf2696eb94c027f6e328d6e9c52465c98e4209 - languageName: node - linkType: hard - -"asn1.js@npm:^5.2.0": - version: 5.4.1 - resolution: "asn1.js@npm:5.4.1" - dependencies: - bn.js: ^4.0.0 - inherits: ^2.0.1 - minimalistic-assert: ^1.0.0 - safer-buffer: ^2.1.0 - checksum: 3786a101ac6f304bd4e9a7df79549a7561950a13d4bcaec0c7790d44c80d147c1a94ba3d4e663673406064642a40b23fcd6c82a9952468e386c1a1376d747f9a - languageName: node - linkType: hard - -"assert@npm:^1.4.0": - version: 1.5.0 - resolution: "assert@npm:1.5.0" - dependencies: - object-assign: ^4.1.1 - util: 0.10.3 - checksum: 9be48435f726029ae7020c5888a3566bf4d617687aab280827f2e4029644b6515a9519ea10d018b342147c02faf73d9e9419e780e8937b3786ee4945a0ca71e5 - languageName: node - linkType: hard - -"astral-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "astral-regex@npm:2.0.0" - checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 - languageName: node - linkType: hard - -"async-rwlock@npm:^1.1.1": - version: 1.1.1 - resolution: "async-rwlock@npm:1.1.1" - checksum: 8df4f4f6b41de4747ded1d5b7136c5fe583f89f54f7f27bbcb2e93022aefed79c0b31ff3357548da08655c14c405177a80be0401b53a89c9d4e829be0b704225 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be - languageName: node - linkType: hard - -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a - languageName: node - linkType: hard - -"babel-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-jest@npm:28.1.3" - dependencies: - "@jest/transform": ^28.1.3 - "@types/babel__core": ^7.1.14 - babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^28.1.3 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - slash: ^3.0.0 - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 57ccd2296e1839687b5df2fd138c3d00717e0369e385254b012ccd4ee70e75f5d5c8e6cfcdf92d155015b468cfebb847b38e69bb5805d8aaf730e20575127cc6 - languageName: node - linkType: hard - -"babel-plugin-const-enum@npm:^1.2.0": - version: 1.2.0 - resolution: "babel-plugin-const-enum@npm:1.2.0" - dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-syntax-typescript": ^7.3.3 - "@babel/traverse": ^7.16.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fc840a71f6717a01b63853b8bc67f75c591ebacfd0d8739c68de02da5d6e48ea38086040427d553726c0e103d2e0ee8b4207827ef26b281247f671f868f78aae - languageName: node - linkType: hard - -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: ^4.1.0 - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@istanbuljs/load-nyc-config": ^1.0.0 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-instrument: ^5.0.4 - test-exclude: ^6.0.0 - checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-plugin-jest-hoist@npm:28.1.3" - dependencies: - "@babel/template": ^7.3.3 - "@babel/types": ^7.3.3 - "@types/babel__core": ^7.1.14 - "@types/babel__traverse": ^7.0.6 - checksum: 648d89f9d80f6450ce7e50d0c32eb91b7f26269b47c3e37aaf2e0f2f66a980978345bd6b8c9b8c3aa6a8252ad2bc2c9fb50630e9895622c9a0972af5f70ed20e - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs2@npm:^0.3.1": - version: 0.3.2 - resolution: "babel-plugin-polyfill-corejs2@npm:0.3.2" - dependencies: - "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.3.2 - semver: ^6.1.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a76e7bb1a5cc0a4507baa523c23f9efd75764069a25845beba92290386e5e48ed85b894005ece3b527e13c3d2d9c6589cc0a23befb72ea6fc7aa8711f231bb4d - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.5.2": - version: 0.5.3 - resolution: "babel-plugin-polyfill-corejs3@npm:0.5.3" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.2 - core-js-compat: ^3.21.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9c6644a1b0afbe59e402827fdafc6f44994ff92c5b2f258659cbbfd228f7075dea49e95114af10e66d70f36cbde12ff1d81263eb67be749b3ef0e2c18cf3c16d - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.3.1": - version: 0.3.1 - resolution: "babel-plugin-polyfill-regenerator@npm:0.3.1" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f1473df7b700d6795ca41301b1e65a0aff15ce6c1463fc0ce2cf0c821114b0330920f59d4cebf52976363ee817ba29ad2758544a4661a724b08191080b9fe1da - languageName: node - linkType: hard - -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" - dependencies: - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-bigint": ^7.8.3 - "@babel/plugin-syntax-class-properties": ^7.8.3 - "@babel/plugin-syntax-import-meta": ^7.8.3 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.8.3 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-top-level-await": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 - languageName: node - linkType: hard - -"babel-preset-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-preset-jest@npm:28.1.3" - dependencies: - babel-plugin-jest-hoist: ^28.1.3 - babel-preset-current-node-syntax: ^1.0.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - -"bindings@npm:^1.5.0": - version: 1.5.0 - resolution: "bindings@npm:1.5.0" - dependencies: - file-uri-to-path: 1.0.0 - checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 - languageName: node - linkType: hard - -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 - languageName: node - linkType: hard - -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 - languageName: node - linkType: hard - -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browser-pack@npm:^6.0.1": - version: 6.1.0 - resolution: "browser-pack@npm:6.1.0" - dependencies: - JSONStream: ^1.0.3 - combine-source-map: ~0.8.0 - defined: ^1.0.0 - safe-buffer: ^5.1.1 - through2: ^2.0.0 - umd: ^3.0.0 - bin: - browser-pack: bin/cmd.js - checksum: 9e5993d3eefb7c56a68cfc8810e59a2920481f93bdcb0a53e07b322f273f697cfeb3a2302aa7fc0f725d29be0e8cc629561f463f2c8b06e2958497869d42cc53 - languageName: node - linkType: hard - -"browser-process-hrtime@npm:^0.1.2": - version: 0.1.3 - resolution: "browser-process-hrtime@npm:0.1.3" - checksum: e052e0593339ba238eb2e2146b99d79555c195242a280c75a0627a39d938349859df21ea400a2d456b0d7614df8bf61ba34d110f7046e2a9ec69e70e64698e2f - languageName: node - linkType: hard - -"browser-resolve@npm:^2.0.0": - version: 2.0.0 - resolution: "browser-resolve@npm:2.0.0" - dependencies: - resolve: ^1.17.0 - checksum: 69225e73b555bd6d2a08fb93c7342cfcf3b5058b975099c52649cd5c3cec84c2066c5385084d190faedfb849684d9dabe10129f0cd401d1883572f2e6650f440 - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: ^1.0.3 - cipher-base: ^1.0.0 - create-hash: ^1.1.0 - evp_bytestokey: ^1.0.3 - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.0": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: ^1.0.4 - browserify-des: ^1.0.0 - evp_bytestokey: ^1.0.0 - checksum: 2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13 - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: ^1.0.1 - des.js: ^1.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: b15a3e358a1d78a3b62ddc06c845d02afde6fc826dab23f1b9c016e643e7b1fda41de628d2110b712f6a44fb10cbc1800bc6872a03ddd363fb50768e010395b7 - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": - version: 4.1.0 - resolution: "browserify-rsa@npm:4.1.0" - dependencies: - bn.js: ^5.0.0 - randombytes: ^2.0.1 - checksum: 155f0c135873efc85620571a33d884aa8810e40176125ad424ec9d85016ff105a07f6231650914a760cca66f29af0494087947b7be34880dd4599a0cd3c38e54 - languageName: node - linkType: hard - -"browserify-sign@npm:^4.0.0": - version: 4.2.1 - resolution: "browserify-sign@npm:4.2.1" - dependencies: - bn.js: ^5.1.1 - browserify-rsa: ^4.0.1 - create-hash: ^1.2.0 - create-hmac: ^1.1.7 - elliptic: ^6.5.3 - inherits: ^2.0.4 - parse-asn1: ^5.1.5 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 0221f190e3f5b2d40183fa51621be7e838d9caa329fe1ba773406b7637855f37b30f5d83e52ff8f244ed12ffe6278dd9983638609ed88c841ce547e603855707 - languageName: node - linkType: hard - -"browserify-zlib@npm:~0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: ~1.0.5 - checksum: 5cd9d6a665190fedb4a97dfbad8dabc8698d8a507298a03f42c734e96d58ca35d3c7d4085e283440bbca1cd1938cff85031728079bedb3345310c58ab1ec92d6 - languageName: node - linkType: hard - -"browserify@npm:^17.0.0": - version: 17.0.0 - resolution: "browserify@npm:17.0.0" - dependencies: - JSONStream: ^1.0.3 - assert: ^1.4.0 - browser-pack: ^6.0.1 - browser-resolve: ^2.0.0 - browserify-zlib: ~0.2.0 - buffer: ~5.2.1 - cached-path-relative: ^1.0.0 - concat-stream: ^1.6.0 - console-browserify: ^1.1.0 - constants-browserify: ~1.0.0 - crypto-browserify: ^3.0.0 - defined: ^1.0.0 - deps-sort: ^2.0.1 - domain-browser: ^1.2.0 - duplexer2: ~0.1.2 - events: ^3.0.0 - glob: ^7.1.0 - has: ^1.0.0 - htmlescape: ^1.1.0 - https-browserify: ^1.0.0 - inherits: ~2.0.1 - insert-module-globals: ^7.2.1 - labeled-stream-splicer: ^2.0.0 - mkdirp-classic: ^0.5.2 - module-deps: ^6.2.3 - os-browserify: ~0.3.0 - parents: ^1.0.1 - path-browserify: ^1.0.0 - process: ~0.11.0 - punycode: ^1.3.2 - querystring-es3: ~0.2.0 - read-only-stream: ^2.0.0 - readable-stream: ^2.0.2 - resolve: ^1.1.4 - shasum-object: ^1.0.0 - shell-quote: ^1.6.1 - stream-browserify: ^3.0.0 - stream-http: ^3.0.0 - string_decoder: ^1.1.1 - subarg: ^1.0.0 - syntax-error: ^1.1.1 - through2: ^2.0.0 - timers-browserify: ^1.0.1 - tty-browserify: 0.0.1 - url: ~0.11.0 - util: ~0.12.0 - vm-browserify: ^1.0.0 - xtend: ^4.0.0 - bin: - browserify: bin/cmd.js - checksum: 6b1dda742eb0eaef8bddffc00328fe4a874e4db251fcea85402663aa74c41d39bee424bedab6094ea9e965b9207cb0ac836f44c024e47045fde5ccb2bb845cb8 - languageName: node - linkType: hard - -"browserslist@npm:^4.20.2, browserslist@npm:^4.21.2": - version: 4.21.2 - resolution: "browserslist@npm:4.21.2" - dependencies: - caniuse-lite: ^1.0.30001366 - electron-to-chromium: ^1.4.188 - node-releases: ^2.0.6 - update-browserslist-db: ^1.0.4 - bin: - browserslist: cli.js - checksum: 30fe59f8b065f99665ea63819d29c797660f7975857c290f61f570403abed4d7039ca15b6fd21e39a57b87e1a9262f94676114040766fc0da6ccc11faf9fc377 - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: ^0.4.0 - checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer-writer@npm:2.0.0": - version: 2.0.0 - resolution: "buffer-writer@npm:2.0.0" - checksum: 11736b48bb75106c52ca8ec9f025e7c1b3b25ce31875f469d7210eabd5c576c329e34f6b805d4a8d605ff3f0db1e16342328802c4c963e9c826b0e43a4e631c2 - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"buffer@npm:~5.2.1": - version: 5.2.1 - resolution: "buffer@npm:5.2.1" - dependencies: - base64-js: ^1.0.2 - ieee754: ^1.1.4 - checksum: aa3f25bb88d313b8317b436677b46e9e32db64ae397dd5a9d1f867da132985b857c71deaa36cc37666fdb955d8d0f66abeae9460aa7d9b2dca36a9da2f50d05e - languageName: node - linkType: hard - -"bufferutil@npm:^4.0.6": - version: 4.0.6 - resolution: "bufferutil@npm:4.0.6" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: dd107560947445280af7820c3d0534127b911577d85d537e1d7e0aa30fd634853cef8a994d6e8aed3d81388ab1a20257de776164afe6a6af8e78f5f17968ebd6 - languageName: node - linkType: hard - -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773 - languageName: node - linkType: hard - -"cacache@npm:^16.1.0": - version: 16.1.1 - resolution: "cacache@npm:16.1.1" - dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^1.1.1 - checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a - languageName: node - linkType: hard - -"cached-path-relative@npm:^1.0.0, cached-path-relative@npm:^1.0.2": - version: 1.1.0 - resolution: "cached-path-relative@npm:1.1.0" - checksum: 2f1d63c2301feda575039b945811e54b2dc851b49e94aa366d2916fece745fe4f4490a28a68bd0afe79c2fe336bebf62cbdfa2ad75b178d33b074089114d402d - languageName: node - linkType: hard - -"cachedir@npm:2.3.0": - version: 2.3.0 - resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camel-case@npm:^3.0.0": - version: 3.0.0 - resolution: "camel-case@npm:3.0.0" - dependencies: - no-case: ^2.2.0 - upper-case: ^1.1.1 - checksum: 4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a - languageName: node - linkType: hard - -"camelcase-keys@npm:^6.2.2": - version: 6.2.2 - resolution: "camelcase-keys@npm:6.2.2" - dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001366": - version: 1.0.30001369 - resolution: "caniuse-lite@npm:1.0.30001369" - checksum: f3f0eadc0685b399c0cad1116991d4c73d9fa10517ab72c3fb1c5e78fd5a019002f94a6d03b57a530009c69106400bdfa7dc0bddb01569428df67b9c5e411542 - languageName: node - linkType: hard - -"canvas-constructor@npm:^6.0.2": - version: 6.0.2 - resolution: "canvas-constructor@npm:6.0.2" - dependencies: - tslib: ^2.4.0 - checksum: 8c609a623b5ac2483c1a815ba8fa172c9e9441aba6a04647c41534fbccec33ef057c3580439853fd5f8d91d05dc272b080d52fc9e55e246e6e71dc3a86829aa0 - languageName: node - linkType: hard - -"chalk@npm:^1.1.1, chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: ^2.2.1 - escape-string-regexp: ^1.0.2 - has-ansi: ^2.0.0 - strip-ansi: ^3.0.0 - supports-color: ^2.0.0 - checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd - languageName: node - linkType: hard - -"chalk@npm:^2.0.0, chalk@npm:^2.4.1": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0": - version: 3.3.2 - resolution: "ci-info@npm:3.3.2" - checksum: fd81f1edd2d3b0f6cb077b2e84365136d87b9db8c055928c1ad69da8a76c2c2f19cba8ea51b90238302157ca927f91f92b653e933f2398dde4867500f08d6e62 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.2 - resolution: "cjs-module-lexer@npm:1.2.2" - checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 - languageName: node - linkType: hard - -"cli-highlight@npm:^2.1.4": - version: 2.1.11 - resolution: "cli-highlight@npm:2.1.11" - dependencies: - chalk: ^4.0.0 - highlight.js: ^10.7.1 - mz: ^2.4.0 - parse5: ^5.1.1 - parse5-htmlparser2-tree-adapter: ^6.0.0 - yargs: ^16.0.0 - bin: - highlight: bin/highlight - checksum: 0a60e60545e39efea78c1732a25b91692017ec40fb6e9497208dc0eeeae69991d3923a8d6e4edd0543db3c395ed14529a33dd4d0353f1679c5b6dded792a8496 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.6.1 - resolution: "cli-spinners@npm:2.6.1" - checksum: 423409baaa7a58e5104b46ca1745fbfc5888bbd0b0c5a626e052ae1387060839c8efd512fb127e25769b3dc9562db1dc1b5add6e0b93b7ef64f477feb6416a45 - languageName: node - linkType: hard - -"cli-truncate@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-truncate@npm:2.1.0" - dependencies: - slice-ansi: ^3.0.0 - string-width: ^4.2.0 - checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d - languageName: node - linkType: hard - -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" - dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a - languageName: node - linkType: hard - -"cli-width@npm:^3.0.0": - version: 3.0.0 - resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd - languageName: node - linkType: hard - -"cluster-key-slot@npm:^1.1.0": - version: 1.1.0 - resolution: "cluster-key-slot@npm:1.1.0" - checksum: fc953c75209b1ef9088081bab4e40a0b2586491c974ab93460569c014515ca5a2e31c043f185285e177007162fc353d07836d98f570c171dbe055775430e495b - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - -"code-point-at@npm:^1.0.0": - version: 1.1.0 - resolution: "code-point-at@npm:1.1.0" - checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.1 - resolution: "collect-v8-coverage@npm:1.0.1" - checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.2, color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"colorette@npm:^2.0.16, colorette@npm:^2.0.17, colorette@npm:^2.0.19": - version: 2.0.19 - resolution: "colorette@npm:2.0.19" - checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 - languageName: node - linkType: hard - -"combine-source-map@npm:^0.8.0, combine-source-map@npm:~0.8.0": - version: 0.8.0 - resolution: "combine-source-map@npm:0.8.0" - dependencies: - convert-source-map: ~1.1.0 - inline-source-map: ~0.6.0 - lodash.memoize: ~3.0.3 - source-map: ~0.5.3 - checksum: 26b3064a4e58400e04089acbf5c8741c47db079706bb2fcd79a7768f99d68de9baf1eb48081cdfbc568e308633105af2aeaf52c73e388619ba1f56463fb73a2e - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: ~1.0.0 - checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c - languageName: node - linkType: hard - -"commander@npm:^9.3.0": - version: 9.4.0 - resolution: "commander@npm:9.4.0" - checksum: a322de584a6ccd1ea83c24f6a660e52d16ffbe2613fcfbb8d2cc68bc9dec637492456d754fe8bb5b039ad843ed8e04fb0b107e581a75f62cde9e1a0ab1546e09 - languageName: node - linkType: hard - -"commitizen@npm:^4.0.3": - version: 4.2.5 - resolution: "commitizen@npm:4.2.5" - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: ^2.1.2 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.4 - is-utf8: ^0.2.1 - lodash: 4.17.21 - minimist: 1.2.6 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - bin: - commitizen: bin/commitizen - cz: bin/git-cz - git-cz: bin/git-cz - checksum: 28f5d10cf332663f1710edb2ca22473664bc4457146ce6922896ed2ed6ee2a23add607b04d5b8d1bb7ee09bb78bc0d38d09057e0ab39b38e44b172765e3835c9 - languageName: node - linkType: hard - -"compare-func@npm:^2.0.0": - version: 2.0.0 - resolution: "compare-func@npm:2.0.0" - dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.1, concat-stream@npm:~1.6.0": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^2.2.2 - typedarray: ^0.0.6 - checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 - languageName: node - linkType: hard - -"concat-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "concat-stream@npm:2.0.0" - dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.0.2 - typedarray: ^0.0.6 - checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7 - languageName: node - linkType: hard - -"confusables@npm:^1.1.1": - version: 1.1.1 - resolution: "confusables@npm:1.1.1" - checksum: 4114964e0996d8b6d6d3698de9cf7bfc910f8d4dd471f75f1e6c75b08cc1b169aee371f1e9d379eba530dd4676920f55bd60a9e4817564b505745f9ca53b3b24 - languageName: node - linkType: hard - -"console-browserify@npm:^1.1.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 226591eeff8ed68e451dffb924c1fb750c654d54b9059b3b261d360f369d1f8f70650adecf2c7136656236a4bfeb55c39281b5d8a55d792ebbb99efd3d848d52 - languageName: node - linkType: hard - -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"constants-browserify@npm:~1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: f7ac8c6d0b6e4e0c77340a1d47a3574e25abd580bfd99ad707b26ff7618596cf1a5e5ce9caf44715e9e01d4a5d12cb3b4edaf1176f34c19adb2874815a56e64f - languageName: node - linkType: hard - -"conventional-changelog-angular@npm:^5.0.11": - version: 5.0.13 - resolution: "conventional-changelog-angular@npm:5.0.13" - dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^5.0.0": - version: 5.0.0 - resolution: "conventional-changelog-conventionalcommits@npm:5.0.0" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: b67d12e4e0fdde5baa32c3d77af472de38646a18657b26f5543eecce041a318103092fbfcef247e2319a16957c9ac78c6ea78acc11a5db6acf74be79a28c561f - languageName: node - linkType: hard - -"conventional-commit-types@npm:^3.0.0": - version: 3.0.0 - resolution: "conventional-commit-types@npm:3.0.0" - checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d - languageName: node - linkType: hard - -"conventional-commits-parser@npm:^3.2.2": - version: 3.2.4 - resolution: "conventional-commits-parser@npm:3.2.4" - dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd - languageName: node - linkType: hard - -"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.5.1, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": - version: 1.8.0 - resolution: "convert-source-map@npm:1.8.0" - dependencies: - safe-buffer: ~5.1.1 - checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed - languageName: node - linkType: hard - -"convert-source-map@npm:~1.1.0": - version: 1.1.3 - resolution: "convert-source-map@npm:1.1.3" - checksum: 0ed6bdecd330fd05941b417b63ebc9001b438f6d6681cd9a068617c3d4b649794dc35c95ba239d0a01f0b9499912b9e0d0d1b7c612e3669c57c65ce4bbc8fdd8 - languageName: node - linkType: hard - -"cookie@npm:^0.4.1": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - -"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1": - version: 3.23.5 - resolution: "core-js-compat@npm:3.23.5" - dependencies: - browserslist: ^4.21.2 - semver: 7.0.0 - checksum: c2398a39239a782ba1b9531a80b25f8d9fb8d98de8bf980f32140e9be3d2852afb797517afdf3a15f9319bcd25d594b3d3d2a500dce7c338532532565c9e83cb - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 - languageName: node - linkType: hard - -"cosmiconfig-typescript-loader@npm:^2.0.0": - version: 2.0.2 - resolution: "cosmiconfig-typescript-loader@npm:2.0.2" - dependencies: - cosmiconfig: ^7 - ts-node: ^10.8.1 - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - typescript: ">=3" - checksum: 0c9a777e2e3ff7594d753e5781e8c3817ce5ba493a4e69cfde698a8e231b438695248dcc62a16c661f93ada7f762ac6e24457889439c94f58c094a24aecbd982 - languageName: node - linkType: hard - -"cosmiconfig@npm:^7, cosmiconfig@npm:^7.0.0": - version: 7.0.1 - resolution: "cosmiconfig@npm:7.0.1" - dependencies: - "@types/parse-json": ^4.0.0 - import-fresh: ^3.2.1 - parse-json: ^5.0.0 - path-type: ^4.0.0 - yaml: ^1.10.0 - checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.0": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: ^4.1.0 - elliptic: ^6.5.3 - checksum: 0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: ^1.0.1 - inherits: ^2.0.1 - md5.js: ^1.3.4 - ripemd160: ^2.0.1 - sha.js: ^2.4.0 - checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: ^1.0.3 - create-hash: ^1.1.0 - inherits: ^2.0.1 - ripemd160: ^2.0.0 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-fetch@npm:^3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" - dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypto-browserify@npm:^3.0.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" - dependencies: - browserify-cipher: ^1.0.0 - browserify-sign: ^4.0.0 - create-ecdh: ^4.0.0 - create-hash: ^1.1.0 - create-hmac: ^1.1.0 - diffie-hellman: ^5.0.0 - inherits: ^2.0.1 - pbkdf2: ^3.0.3 - public-encrypt: ^4.0.0 - randombytes: ^2.0.0 - randomfill: ^1.0.3 - checksum: c1609af82605474262f3eaa07daa0b2140026bd264ab316d4bf1170272570dbe02f0c49e29407fe0d3634f96c507c27a19a6765fb856fed854a625f9d15618e2 - languageName: node - linkType: hard - -"cz-conventional-changelog@npm:3.3.0, cz-conventional-changelog@npm:^3.3.0": - version: 3.3.0 - resolution: "cz-conventional-changelog@npm:3.3.0" - dependencies: - "@commitlint/load": ">6.1.1" - chalk: ^2.4.1 - commitizen: ^4.0.3 - conventional-commit-types: ^3.0.0 - lodash.map: ^4.5.1 - longest: ^2.0.1 - word-wrap: ^1.0.3 - dependenciesMeta: - "@commitlint/load": - optional: true - checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca - languageName: node - linkType: hard - -"d3-array@npm:2, d3-array@npm:^2.2.0, d3-array@npm:^2.3.0": - version: 2.12.1 - resolution: "d3-array@npm:2.12.1" - dependencies: - internmap: ^1.0.0 - checksum: 97853b7b523aded17078f37c67742f45d81e88dda2107ae9994c31b9e36c5fa5556c4c4cf39650436f247813602dfe31bf7ad067ff80f127a16903827f10c6eb - languageName: node - linkType: hard - -"d3-color@npm:1": - version: 1.4.1 - resolution: "d3-color@npm:1.4.1" - checksum: a214b61458b5fcb7ad1a84faed0e02918037bab6be37f2d437bf0e2915cbd854d89fbf93754f17b0781c89e39d46704633d05a2bfae77e6209f0f4b140f9894b - languageName: node - linkType: hard - -"d3-color@npm:1 - 2": - version: 2.0.0 - resolution: "d3-color@npm:2.0.0" - checksum: b887354aa383937abd04fbffed3e26e5d6a788472cd3737fb10735930e427763e69fe93398663bccf88c0b53ee3e638ac6fcf0c02226b00ed9e4327c2dfbf3dc - languageName: node - linkType: hard - -"d3-dispatch@npm:1, d3-dispatch@npm:^1.0.5": - version: 1.0.6 - resolution: "d3-dispatch@npm:1.0.6" - checksum: b4ecb016b6dda8b99aa4263b2d0a0c7b12e7dea93e4b0ce3013c94dca4d360d9ba00f5bdc15dc944cc4543af8e341067bd628f061f7b8deb642257e2ac90d06c - languageName: node - linkType: hard - -"d3-drag@npm:1": - version: 1.2.5 - resolution: "d3-drag@npm:1.2.5" - dependencies: - d3-dispatch: 1 - d3-selection: 1 - checksum: 6e86e89aa8d511979eea1b5326709c05c2a3c2d43a93a82ed6b6f98528b2ab03b2f58f5e4f66582f2f1c0ae44f9c19f6f4f857249eb66aabc46e4942295fa0a7 - languageName: node - linkType: hard - -"d3-ease@npm:1, d3-ease@npm:^1.0.5": - version: 1.0.7 - resolution: "d3-ease@npm:1.0.7" - checksum: 117811d51dfc4a126e8d23d249252df792fbbe30a93615e1d67158c482eff69b900e45a4cc92746fe65b1143287455406a89aae04eb4ca1ba5b1dc2a42af5b85 - languageName: node - linkType: hard - -"d3-fg@npm:^6.14.0": - version: 6.14.0 - resolution: "d3-fg@npm:6.14.0" - dependencies: - d3-array: ^2.2.0 - d3-dispatch: ^1.0.5 - d3-ease: ^1.0.5 - d3-hierarchy: ^1.1.8 - d3-scale: ^3.0.0 - d3-selection: ^1.4.0 - d3-zoom: ^1.7.3 - escape-string-regexp: ^1.0.5 - hsl-to-rgb-for-reals: ^1.1.0 - checksum: f184d4577c23b733ba586ebc656a9d778ed49dbe769e83bbc984cdc22154da48d66f700c86189c4c06b753d90c1a14d9bd8c7236ea7dbb8279c51226194677ee - languageName: node - linkType: hard - -"d3-format@npm:1 - 2": - version: 2.0.0 - resolution: "d3-format@npm:2.0.0" - checksum: c4d3c8f9941d097d514d3986f54f21434e08e5876dc08d1d65226447e8e167600d5b9210235bb03fd45327225f04f32d6e365f08f76d2f4b8bff81594851aaf7 - languageName: node - linkType: hard - -"d3-hierarchy@npm:^1.1.8": - version: 1.1.9 - resolution: "d3-hierarchy@npm:1.1.9" - checksum: 5fd8761c302252cb9abe9ce2a0934fc97104dd0df8d1b5de6472532903416f40e13b4b58d03ce215a0b816d7129c4ed4503bd4fdbc00a130fdcf46a63d734a52 - languageName: node - linkType: hard - -"d3-interpolate@npm:1": - version: 1.4.0 - resolution: "d3-interpolate@npm:1.4.0" - dependencies: - d3-color: 1 - checksum: d98988bd1e2f59d01f100d0a19315ad8f82ef022aa09a65aff76f747a44f9b52f2d64c6578b8f47e01f2b14a8f0ef88f5460d11173c0dd2d58238c217ac0ec03 - languageName: node - linkType: hard - -"d3-interpolate@npm:1.2.0 - 2": - version: 2.0.1 - resolution: "d3-interpolate@npm:2.0.1" - dependencies: - d3-color: 1 - 2 - checksum: 4a2018ac34fbcc3e0e7241e117087ca1b2274b8b33673913658623efacc5db013b8d876586d167b23e3145bdb34ec8e441d301299b082e1a90985b2f18d4299c - languageName: node - linkType: hard - -"d3-scale@npm:^3.0.0": - version: 3.3.0 - resolution: "d3-scale@npm:3.3.0" - dependencies: - d3-array: ^2.3.0 - d3-format: 1 - 2 - d3-interpolate: 1.2.0 - 2 - d3-time: ^2.1.1 - d3-time-format: 2 - 3 - checksum: f77e73f0fb422292211d0687914c30d26e29011a936ad2a535a868ae92f306c3545af1fe7ea5db1b3e67dbce7a6c6cd952e53d02d1d557543e7e5d30e30e52f2 - languageName: node - linkType: hard - -"d3-selection@npm:1, d3-selection@npm:^1.1.0, d3-selection@npm:^1.4.0": - version: 1.4.2 - resolution: "d3-selection@npm:1.4.2" - checksum: 2484b392259b087a98f546f2610e6a11c90f38dae6b6b20a3fc85171038fcab4c72e702788b1960a4fece88bed2e36f268096358b5b48d3c7f0d35cfbe305da6 - languageName: node - linkType: hard - -"d3-time-format@npm:2 - 3": - version: 3.0.0 - resolution: "d3-time-format@npm:3.0.0" - dependencies: - d3-time: 1 - 2 - checksum: c20c1667dbea653f81d923e741f84c23e4b966002ba0d6ed94cbc70692105566e55e89d18d175404534a879383fd1123300bd12885a3c924fe924032bb0060db - languageName: node - linkType: hard - -"d3-time@npm:1 - 2, d3-time@npm:^2.1.1": - version: 2.1.1 - resolution: "d3-time@npm:2.1.1" - dependencies: - d3-array: 2 - checksum: d1c7b9658c20646e46c3dd19e11c38e02dec098e8baa7d2cd868af8eb01953668f5da499fa33dc63541cf74a26e788786f8828c4381dbbf475a76b95972979a6 - languageName: node - linkType: hard - -"d3-timer@npm:1": - version: 1.0.10 - resolution: "d3-timer@npm:1.0.10" - checksum: f7040953672deb2dfa03830ace80dbbcb212f80890218eba15dcca6f33f74102d943023ccc2a563295195cd8c63639bb2410ef1691c8fecff4a114fdf5c666f4 - languageName: node - linkType: hard - -"d3-transition@npm:1": - version: 1.3.2 - resolution: "d3-transition@npm:1.3.2" - dependencies: - d3-color: 1 - d3-dispatch: 1 - d3-ease: 1 - d3-interpolate: 1 - d3-selection: ^1.1.0 - d3-timer: 1 - checksum: 1b4a0cfa7aeb4033ab20e26a310488cfac989de44c6c2bf10e9f0808af915a33add6dca23fbafcefe8c08613fd0d6a933e48b4de24c0779163c2852a1c7c16f4 - languageName: node - linkType: hard - -"d3-zoom@npm:^1.7.3": - version: 1.8.3 - resolution: "d3-zoom@npm:1.8.3" - dependencies: - d3-dispatch: 1 - d3-drag: 1 - d3-interpolate: 1 - d3-selection: 1 - d3-transition: 1 - checksum: de408e5dc6df1481ef6854a3d495f8e963dbf5b0de41bcbd35def0602abda55b3f2c1fa751c75c2f0a9bafd3b278f30795c27503fe609b3dbe06a0720d01d5be - languageName: node - linkType: hard - -"dargs@npm:^7.0.0": - version: 7.0.0 - resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 - languageName: node - linkType: hard - -"dash-ast@npm:^1.0.0": - version: 1.0.0 - resolution: "dash-ast@npm:1.0.0" - checksum: db59e5e275d8159fb3b84bcd2936470c3fecb626f6486c179a28afad141cd95a578faaa3695ad6106153ca861da99a3d891fda37757b49afab773b3a46c638e6 - languageName: node - linkType: hard - -"debounce@npm:^1.2.0": - version: 1.2.1 - resolution: "debounce@npm:1.2.1" - checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"decamelize-keys@npm:^1.1.0": - version: 1.1.0 - resolution: "decamelize-keys@npm:1.1.0" - dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: 8bc5d32e035a072f5dffc1f1f3d26ca7ab1fb44a9cade34c97ab6cd1e62c81a87e718101e96de07d78cecda20a3fdb955df958e46671ccad01bb8dcf0de2e298 - languageName: node - linkType: hard - -"decamelize@npm:^1.1.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"dedent@npm:0.7.0, dedent@npm:^0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.3 - resolution: "defaults@npm:1.0.3" - dependencies: - clone: ^1.0.2 - checksum: 96e2112da6553d376afd5265ea7cbdb2a3b45535965d71ab8bb1da10c8126d168fdd5268799625324b368356d21ba2a7b3d4ec50961f11a47b7feb9de3d4413e - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b - languageName: node - linkType: hard - -"defined@npm:^1.0.0": - version: 1.0.0 - resolution: "defined@npm:1.0.0" - checksum: 77672997c5001773371c4dbcce98da0b3dc43089d6da2ad87c4b800adb727633cea8723ea3889fe0c2112a2404e2fd07e3bfd0e55f7426aa6441d8992045dbd5 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"denque@npm:^2.0.1": - version: 2.1.0 - resolution: "denque@npm:2.1.0" - checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 - languageName: node - linkType: hard - -"depd@npm:^1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 - languageName: node - linkType: hard - -"deps-sort@npm:^2.0.1": - version: 2.0.1 - resolution: "deps-sort@npm:2.0.1" - dependencies: - JSONStream: ^1.0.3 - shasum-object: ^1.0.0 - subarg: ^1.0.0 - through2: ^2.0.0 - bin: - deps-sort: bin/cmd.js - checksum: 1cbaad500aa1592d7497321faf39c7bb7b86ed0930b1efd0c54efdf68433fc53d8bc844bb220723c7861b397ba886495ebdab2cb0fbf13262d1342d98a88622b - languageName: node - linkType: hard - -"des.js@npm:^1.0.0": - version: 1.0.1 - resolution: "des.js@npm:1.0.1" - dependencies: - inherits: ^2.0.1 - minimalistic-assert: ^1.0.0 - checksum: 1ec2eedd7ed6bd61dd5e0519fd4c96124e93bb22de8a9d211b02d63e5dd152824853d919bb2090f965cc0e3eb9c515950a9836b332020d810f9c71feb0fd7df4 - languageName: node - linkType: hard - -"detect-file@npm:^1.0.0": - version: 1.0.0 - resolution: "detect-file@npm:1.0.0" - checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a - languageName: node - linkType: hard - -"detect-indent@npm:6.1.0": - version: 6.1.0 - resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.0": - version: 2.0.1 - resolution: "detect-libc@npm:2.0.1" - checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 - languageName: node - linkType: hard - -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 - languageName: node - linkType: hard - -"detective@npm:^5.2.0": - version: 5.2.1 - resolution: "detective@npm:5.2.1" - dependencies: - acorn-node: ^1.8.2 - defined: ^1.0.0 - minimist: ^1.2.6 - bin: - detective: bin/detective.js - checksum: dc4601bbc6be850edb3c2dab7a0eaf5a6169a15ad201679c66d40ea1986df816eeaecd590047f15b0780285f3eeea13b82dca0d4c52a47e744a571e326a72dc9 - languageName: node - linkType: hard - -"diff-sequences@npm:^28.1.1": - version: 28.1.1 - resolution: "diff-sequences@npm:28.1.1" - checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"diff@npm:^5.1.0": - version: 5.1.0 - resolution: "diff@npm:5.1.0" - checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90 - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.0": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: ^4.1.0 - miller-rabin: ^4.0.0 - randombytes: ^2.0.0 - checksum: 0e620f322170c41076e70181dd1c24e23b08b47dbb92a22a644f3b89b6d3834b0f8ee19e37916164e5eb1ee26d2aa836d6129f92723995267250a0b541811065 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"discord-api-types@npm:^0.33.3, discord-api-types@npm:~0.33.5": - version: 0.33.5 - resolution: "discord-api-types@npm:0.33.5" - checksum: 6dcaad640c5693a69c9a4f5e444e739dde11ba835164ae6fd3dd5a1ab7b4d7f96cd022ed653eeaff2c8051ead0d998a5d502a2915cfacdde596364b82d9e3b3f - languageName: node - linkType: hard - -"discord-api-types@npm:^0.36.2": - version: 0.36.3 - resolution: "discord-api-types@npm:0.36.3" - checksum: 3089c0fb37425dc5df03c76d82988d43fcc272699b06a02fc830d0a3bef550009aaebdf6d646529e8a7ccea76ae3f43b099d736ea5ef37a0be143142ab49871d - languageName: node - linkType: hard - -"discord.js@npm:^13.9.1": - version: 13.9.1 - resolution: "discord.js@npm:13.9.1" - dependencies: - "@discordjs/builders": ^0.16.0 - "@discordjs/collection": ^0.7.0 - "@sapphire/async-queue": ^1.3.2 - "@types/node-fetch": ^2.6.2 - "@types/ws": ^8.5.3 - discord-api-types: ^0.33.3 - form-data: ^4.0.0 - node-fetch: ^2.6.7 - ws: ^8.8.1 - checksum: 8c2b5d15d5981b05b55049ae667ec37c870105c6eae784f11e9755affca5299693cffc06b77cf8b2b5ee3c62cecb429179361aedc2e8422bc2c8cf63308b8100 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"domain-browser@npm:^1.2.0": - version: 1.2.0 - resolution: "domain-browser@npm:1.2.0" - checksum: 8f1235c7f49326fb762f4675795246a6295e7dd566b4697abec24afdba2460daa7dfbd1a73d31efbf5606b3b7deadb06ce47cf06f0a476e706153d62a4ff2b90 - languageName: node - linkType: hard - -"dot-prop@npm:^5.1.0": - version: 5.3.0 - resolution: "dot-prop@npm:5.3.0" - dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea - languageName: node - linkType: hard - -"dotenv-cra@npm:^3.0.2": - version: 3.0.2 - resolution: "dotenv-cra@npm:3.0.2" - dependencies: - dotenv: ^10.0.0 - dotenv-expand: ^5.1.0 - checksum: dc33ca4c8751a16390f646513bbdfdf64e0cc6ebf3439e1d3e9fb418005f13d53106792e545824d9c08084a9c4e1bec425d30628f9791dab1f9a97f1e3684a64 - languageName: node - linkType: hard - -"dotenv-expand@npm:^5.1.0": - version: 5.1.0 - resolution: "dotenv-expand@npm:5.1.0" - checksum: 8017675b7f254384915d55f9eb6388e577cf0a1231a28d54b0ca03b782be9501b0ac90ac57338636d395fa59051e6209e9b44b8ddf169ce6076dffb5dea227d3 - languageName: node - linkType: hard - -"dotenv@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv@npm:10.0.0" - checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 - languageName: node - linkType: hard - -"dotenv@npm:^8.2.0": - version: 8.6.0 - resolution: "dotenv@npm:8.6.0" - checksum: 38e902c80b0666ab59e9310a3d24ed237029a7ce34d976796349765ac96b8d769f6df19090f1f471b77a25ca391971efde8a1ea63bb83111bd8bec8e5cc9b2cd - languageName: node - linkType: hard - -"duplexer2@npm:^0.1.2, duplexer2@npm:~0.1.0, duplexer2@npm:~0.1.2": - version: 0.1.4 - resolution: "duplexer2@npm:0.1.4" - dependencies: - readable-stream: ^2.0.2 - checksum: 744961f03c7f54313f90555ac20284a3fb7bf22fdff6538f041a86c22499560eb6eac9d30ab5768054137cb40e6b18b40f621094e0261d7d8c35a37b7a5ad241 - languageName: node - linkType: hard - -"duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - -"duplexify@npm:^4.1.1": - version: 4.1.2 - resolution: "duplexify@npm:4.1.2" - dependencies: - end-of-stream: ^1.4.1 - inherits: ^2.0.3 - readable-stream: ^3.1.1 - stream-shift: ^1.0.0 - checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.188": - version: 1.4.199 - resolution: "electron-to-chromium@npm:1.4.199" - checksum: d029a04cd765400bfa245c17e4895e15fcab3fd5c4dff7bfe1ceae9316a06fb4695b7078a50cfd04e0ca77ae27897520e4a8a332c13f7c2fdb2ee4a4b4593199 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.3": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - dependencies: - bn.js: ^4.11.9 - brorand: ^1.1.0 - hash.js: ^1.0.0 - hmac-drbg: ^1.0.1 - inherits: ^2.0.4 - minimalistic-assert: ^1.0.1 - minimalistic-crypto-utils: ^1.0.1 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 - languageName: node - linkType: hard - -"emittery@npm:^0.10.2": - version: 0.10.2 - resolution: "emittery@npm:0.10.2" - checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"env-string@npm:^1.0.0": - version: 1.0.1 - resolution: "env-string@npm:1.0.1" - checksum: c1a14c70c5276044ee388ad9761b86018b8d8a79d3d606154f1f2504d7b8874d1ae60bf0bf9a89303fa5b1a3bd2cb20815d210db540134f9e1168257da2f9f06 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.0": - version: 1.20.1 - resolution: "es-abstract@npm:1.20.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-weakref: ^1.0.2 - object-inspect: ^1.12.0 - object-keys: ^1.1.1 - object.assign: ^4.1.2 - regexp.prototype.flags: ^1.4.3 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 - unbox-primitive: ^1.0.2 - checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^8.5.0": - version: 8.5.0 - resolution: "eslint-config-prettier@npm:8.5.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 - languageName: node - linkType: hard - -"eslint-plugin-prettier@npm:^4.0.0, eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" - dependencies: - prettier-linter-helpers: ^1.0.0 - peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" - peerDependenciesMeta: - eslint-config-prettier: - optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e - languageName: node - linkType: hard - -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" - dependencies: - eslint-visitor-keys: ^2.0.0 - peerDependencies: - eslint: ">=5" - checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 - languageName: node - linkType: hard - -"eslint@npm:^8.17.0, eslint@npm:^8.20.0": - version: 8.20.0 - resolution: "eslint@npm:8.20.0" - dependencies: - "@eslint/eslintrc": ^1.3.0 - "@humanwhocodes/config-array": ^0.9.2 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.3.2 - esquery: ^1.4.0 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - functional-red-black-tree: ^1.0.1 - glob-parent: ^6.0.1 - globals: ^13.15.0 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.1 - regexpp: ^3.2.0 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 - v8-compile-cache: ^2.0.3 - bin: - eslint: bin/eslint.js - checksum: a31adf390d71d916925586bc8467b48f620e93dd0416bc1e897d99265af88b48d4eba3985b5ff4653ae5cc46311a360d373574002277e159bb38a4363abf9228 - languageName: node - linkType: hard - -"espree@npm:^9.3.2": - version: 9.3.2 - resolution: "espree@npm:9.3.2" - dependencies: - acorn: ^8.7.1 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: 9a790d6779847051e87f70d720a0f6981899a722419e80c92ab6dee01e1ab83b8ce52d11b4dc96c2c490182efb5a4c138b8b0d569205bfe1cd4629e658e58c30 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.0": - version: 1.4.0 - resolution: "esquery@npm:1.4.0" - dependencies: - estraverse: ^5.1.0 - checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"estree-is-member-expression@npm:^1.0.0": - version: 1.0.0 - resolution: "estree-is-member-expression@npm:1.0.0" - checksum: cdb92aa08ac7cec14c79fe30724663e338a4a6ae468ac4ed2bfa7fe02b5c646cbaeac0add5bfa0037418f8cbfba41e79870279869fe9249df37a6a9b08e1e6cd - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: ~0.1.1 - from: ~0 - map-stream: ~0.1.0 - pause-stream: 0.0.11 - split: 0.3 - stream-combiner: ~0.0.4 - through: ~2.3.1 - checksum: 80b467820b6daf824d9fb4345d2daf115a056e5c104463f2e98534e92d196a27f2df5ea2aa085624db26f4c45698905499e881d13bc7c01f7a13eac85be72a22 - languageName: node - linkType: hard - -"events@npm:^3.0.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: ^1.3.4 - node-gyp: latest - safe-buffer: ^5.1.1 - checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"execa@npm:^4.0.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: ^7.0.0 - get-stream: ^5.0.0 - human-signals: ^1.1.1 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.0 - onetime: ^5.1.0 - signal-exit: ^3.0.2 - strip-final-newline: ^2.0.0 - checksum: e30d298934d9c52f90f3847704fd8224e849a081ab2b517bbc02f5f7732c24e56a21f14cb96a08256deffeb2d12b2b7cb7e2b014a12fb36f8d3357e06417ed55 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"execa@npm:^6.1.0": - version: 6.1.0 - resolution: "execa@npm:6.1.0" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.1 - human-signals: ^3.0.1 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^3.0.7 - strip-final-newline: ^3.0.0 - checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e - languageName: node - linkType: hard - -"execspawn@npm:^1.0.1": - version: 1.0.1 - resolution: "execspawn@npm:1.0.1" - dependencies: - util-extend: ^1.0.1 - checksum: fc2be7fb6de7b4c4cd779ca3f6cf4bf19f0fd22e7967194dcec3c379ac7d914587652c933bac774f0b6bba8f15069969921065553f1e19eb58e25ab675f68689 - languageName: node - linkType: hard - -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 - languageName: node - linkType: hard - -"expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": - version: 2.0.2 - resolution: "expand-tilde@npm:2.0.2" - dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a - languageName: node - linkType: hard - -"expect@npm:^28.1.3": - version: 28.1.3 - resolution: "expect@npm:28.1.3" - dependencies: - "@jest/expect-utils": ^28.1.3 - jest-get-type: ^28.0.2 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d - languageName: node - linkType: hard - -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-diff@npm:^1.1.2": - version: 1.2.0 - resolution: "fast-diff@npm:1.2.0" - checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.9": - version: 3.2.11 - resolution: "fast-glob@npm:3.2.11" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fast-safe-stringify@npm:^2.0.7": - version: 2.1.1 - resolution: "fast-safe-stringify@npm:2.1.1" - checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.13.0 - resolution: "fastq@npm:1.13.0" - dependencies: - reusify: ^1.0.4 - checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b - languageName: node - linkType: hard - -"fb-watchman@npm:^2.0.0": - version: 2.0.1 - resolution: "fb-watchman@npm:2.0.1" - dependencies: - bser: 2.1.1 - checksum: 8510230778ab3a51c27dffb1b76ef2c24fab672a42742d3c0a45c2e9d1e5f20210b1fbca33486088da4a9a3958bde96b5aec0a63aac9894b4e9df65c88b2cbd6 - languageName: node - linkType: hard - -"figlet@npm:^1.1.1": - version: 1.5.2 - resolution: "figlet@npm:1.5.2" - checksum: cc860391669b44e119871d589e09a2814aa86351726a5791e0d3e2d098e4fc37171c85fcfed13f4e9000995bd004dc6dbf848da5fe458cf1477e776b7318986f - languageName: node - linkType: hard - -"figures@npm:^3.0.0": - version: 3.2.0 - resolution: "figures@npm:3.2.0" - dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"file-uri-to-path@npm:1.0.0": - version: 1.0.0 - resolution: "file-uri-to-path@npm:1.0.0" - checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-node-modules@npm:^2.1.2": - version: 2.1.3 - resolution: "find-node-modules@npm:2.1.3" - dependencies: - findup-sync: ^4.0.0 - merge: ^2.1.1 - checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 - languageName: node - linkType: hard - -"find-root@npm:1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"findup-sync@npm:^4.0.0": - version: 4.0.0 - resolution: "findup-sync@npm:4.0.0" - dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.0 - micromatch: ^4.0.2 - resolve-dir: ^1.0.1 - checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" - dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 - languageName: node - linkType: hard - -"flatted@npm:^3.1.0": - version: 3.2.6 - resolution: "flatted@npm:3.2.6" - checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 - languageName: node - linkType: hard - -"form-data@npm:^3.0.0": - version: 3.0.1 - resolution: "form-data@npm:3.0.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 - languageName: node - linkType: hard - -"fs-extra@npm:9.1.0": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0, fs-extra@npm:^10.1.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 - languageName: node - linkType: hard - -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.2": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 - languageName: node - linkType: hard - -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.2 - console-control-strings: ^1.0.0 - has-unicode: ^2.0.1 - object-assign: ^4.1.1 - signal-exit: ^3.0.0 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.2 - checksum: 81296c00c7410cdd48f997800155fbead4f32e4f82109be0719c63edc8560e6579946cc8abd04205297640691ec26d21b578837fd13a4e96288ab4b40b1dc3e9 - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec - languageName: node - linkType: hard - -"get-assigned-identifiers@npm:^1.2.0": - version: 1.2.0 - resolution: "get-assigned-identifiers@npm:1.2.0" - checksum: 5ea831c744a645ebd56fff818c80ffc583995c2ca3958236c7cfaac670242300e4f08498a9bbafd3ecbe30027d58ed50e7fa6268ecfe4b8e5c888ea7275cb56c - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.2 - resolution: "get-intrinsic@npm:1.1.2" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - -"get-stream@npm:^5.0.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 - languageName: node - linkType: hard - -"git-raw-commits@npm:^2.0.0": - version: 2.0.11 - resolution: "git-raw-commits@npm:2.0.11" - dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 - bin: - git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.1": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:7.2.3, glob@npm:^7.1.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"glob@npm:^8.0.1": - version: 8.0.3 - resolution: "glob@npm:8.0.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 - languageName: node - linkType: hard - -"global-dirs@npm:^0.1.1": - version: 0.1.1 - resolution: "global-dirs@npm:0.1.1" - dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a - languageName: node - linkType: hard - -"global-modules@npm:^1.0.0": - version: 1.0.0 - resolution: "global-modules@npm:1.0.0" - dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e - languageName: node - linkType: hard - -"global-prefix@npm:^1.0.1": - version: 1.0.2 - resolution: "global-prefix@npm:1.0.2" - dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globals@npm:^13.15.0": - version: 13.17.0 - resolution: "globals@npm:13.17.0" - dependencies: - type-fest: ^0.20.2 - checksum: fbaf4112e59b92c9f5575e85ce65e9e17c0b82711196ec5f58beb08599bbd92fd72703d6dfc9b080381fd35b644e1b11dcf25b38cc2341ec21df942594cbc8ce - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"graphql@npm:^15.8.0": - version: 15.8.0 - resolution: "graphql@npm:15.8.0" - checksum: 423325271db8858428641b9aca01699283d1fe5b40ef6d4ac622569ecca927019fce8196208b91dd1d8eb8114f00263fe661d241d0eb40c10e5bfd650f86ec5e - languageName: node - linkType: hard - -"hard-rejection@npm:^2.1.0": - version: 2.1.0 - resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: ^2.0.0 - checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"has@npm:^1.0.0, has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"highlight.js@npm:^10.7.1": - version: 10.7.3 - resolution: "highlight.js@npm:10.7.3" - checksum: defeafcd546b535d710d8efb8e650af9e3b369ef53e28c3dc7893eacfe263200bba4c5fcf43524ae66d5c0c296b1af0870523ceae3e3104d24b7abf6374a4fea - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 - languageName: node - linkType: hard - -"homedir-polyfill@npm:^1.0.1": - version: 1.0.3 - resolution: "homedir-polyfill@npm:1.0.3" - dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd - languageName: node - linkType: hard - -"hosted-git-info@npm:^4.0.1": - version: 4.1.0 - resolution: "hosted-git-info@npm:4.1.0" - dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + chardet: ^0.7.0 + iconv-lite: ^0.4.24 + tmp: ^0.0.33 + checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 languageName: node linkType: hard -"hsl-to-rgb-for-reals@npm:^1.1.0": - version: 1.1.1 - resolution: "hsl-to-rgb-for-reals@npm:1.1.1" - checksum: b31452617e6c399509c5b8016999d659f9e347e71290da287bf0f536da031609d51b240535dc8eb3dbd7770a7b367d9896ab6a13794db7d16e4cf86e363e156f +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d languageName: node linkType: hard -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 +"fast-diff@npm:^1.1.2": + version: 1.2.0 + resolution: "fast-diff@npm:1.2.0" + checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae languageName: node linkType: hard -"htmlescape@npm:^1.1.0": - version: 1.1.1 - resolution: "htmlescape@npm:1.1.1" - checksum: c59a915ae6ae076b5720243c8c594fd8c76e927d511ed5f205e4d586f47d521478d7148dc7fbe3d4a0cfc30abcc2dd215b30255903c09ed04eb38bca44367c5d +"fast-glob@npm:^3.2.9": + version: 3.2.11 + resolution: "fast-glob@npm:3.2.11" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"fast-json-stringify@npm:^5.0.0": + version: 5.1.0 + resolution: "fast-json-stringify@npm:5.1.0" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 09b35353e42069fde2435760d13f8a3fb7dd9105e358270e2e225b8a94f811b461edd17cb57594e5f36ec1218f121c160ddceeec6e8be2d55e01dcbbbed8cbae + "@fastify/deepmerge": ^1.0.0 + ajv: ^8.10.0 + ajv-formats: ^2.1.1 + fast-uri: ^2.1.0 + rfdc: ^1.2.0 + checksum: 712e795ecb9d261b4c2c3c5375dbb038434e2bba7eada617d7280c13c7266ab56553f731c5a2a26a71d2d23e485f04949a18374b958aa7cc12773174f86402cb languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c languageName: node linkType: hard -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 +"fast-redact@npm:^3.1.1": + version: 3.1.1 + resolution: "fast-redact@npm:3.1.1" + checksum: e486cc9990b5c9724f39bf4e392c1b250c8fd5e8c0145be80c73de3461fc390babe7b48f35746b50bf3cbcd917e093b5685ae66295162c7d9b686a761d48e989 languageName: node linkType: hard -"human-signals@npm:^2.1.0": +"fast-uri@npm:^2.0.0, fast-uri@npm:^2.1.0": version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + resolution: "fast-uri@npm:2.1.0" + checksum: 60ecece5ab05515729ec04d1732ee68bd4429cab8c06ebf8db512a094a0077ddc5af6a27c75922875bc9e13b58e947832242cdcb2cb23c51dc753412222dca83 languageName: node linkType: hard -"human-signals@npm:^3.0.1": - version: 3.0.1 - resolution: "human-signals@npm:3.0.1" - checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 +"fastify@npm:^4.3.0": + version: 4.3.0 + resolution: "fastify@npm:4.3.0" + dependencies: + "@fastify/ajv-compiler": ^3.1.1 + "@fastify/error": ^3.0.0 + "@fastify/fast-json-stringify-compiler": ^4.0.0 + abstract-logging: ^2.0.1 + avvio: ^8.1.3 + find-my-way: ^7.0.0 + light-my-request: ^5.0.0 + pino: ^8.0.0 + process-warning: ^2.0.0 + proxy-addr: ^2.0.7 + rfdc: ^1.3.0 + secure-json-parse: ^2.4.0 + semver: ^7.3.7 + tiny-lru: ^8.0.2 + checksum: a70abb6552601aecd3315713b86a0bc790bb6d02bc000d75dc83464e20e01cdb09db7a46720072615b2c6e7796ff32f18a4777ab5b8ccb17d1dca7376df94bb4 languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" +"fastq@npm:^1.6.0, fastq@npm:^1.6.1": + version: 1.13.0 + resolution: "fastq@npm:1.13.0" dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + reusify: ^1.0.4 + checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b languageName: node linkType: hard -"husky@npm:^8.0.1": - version: 8.0.1 - resolution: "husky@npm:8.0.1" - bin: - husky: lib/bin.js - checksum: 943a73a13d0201318fd30e83d299bb81d866bd245b69e6277804c3b462638dc1921694cb94c2b8c920a4a187060f7d6058d3365152865406352e934c5fff70dc +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b languageName: node linkType: hard -"hyperscript-attribute-to-property@npm:^1.0.0": - version: 1.0.2 - resolution: "hyperscript-attribute-to-property@npm:1.0.2" - checksum: 3d8347df07aecff392b68f62850c0d15b8560ffe2627f60a7dd40121aa4be05b1b29fad588d80e9c5c94e15362ae31e382ffccd6e008c1e01e30feafb5e0db9e +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 languageName: node linkType: hard -"hyperx@npm:^2.5.0": - version: 2.5.4 - resolution: "hyperx@npm:2.5.4" +"file-type@npm:^17.1.4": + version: 17.1.4 + resolution: "file-type@npm:17.1.4" dependencies: - hyperscript-attribute-to-property: ^1.0.0 - checksum: 0de13c9c8c41fdf1b276821571c41b9fc957e73f20a7d771938f84cef707d3d0dafff1278a8a0a4a6b91bddd4db0ce771b3c2dad44be0be560509174e84f8e23 + readable-web-to-node-stream: ^3.0.2 + strtok3: ^7.0.0-alpha.9 + token-types: ^5.0.0-alpha.2 + checksum: 07ae79cda01a38c2dedec85acfa7d5532c8334d4bc8542e0ab97e27d1bc496d325ea245bb546394f43ac19673fad6ef50fc38a9d70462ae2f5a28ab8721d1037 languageName: node linkType: hard -"i18next@npm:^21.8.13": - version: 21.8.14 - resolution: "i18next@npm:21.8.14" +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" dependencies: - "@babel/runtime": ^7.17.2 - checksum: 83b1a57d761c3d29b90f4e87eb9945902fa13d7750f11bc7f22e8c9999f7e5bf9b2a30c44a9b47569c8ea704573b02a562c2678cf2281073197ace07657d21be + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 languageName: node linkType: hard -"iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" +"find-my-way@npm:^7.0.0": + version: 7.0.1 + resolution: "find-my-way@npm:7.0.1" dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + fast-deep-equal: ^3.1.3 + safe-regex2: ^2.0.0 + checksum: ffadbab35c75cb6dc7d9f81a94c4c305713d01b676d684069d751b2d8525d5c84e4fe4f439345b0aed80b7da18ca4fc13579d3c497488ab06976ee30ed78eb33 languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" +"find-node-modules@npm:^2.1.2": + version: 2.1.3 + resolution: "find-node-modules@npm:2.1.3" dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + findup-sync: ^4.0.0 + merge: ^2.1.1 + checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 languageName: node linkType: hard -"ieee754@npm:^1.1.13, ieee754@npm:^1.1.4": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e +"find-root@npm:1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.2.0": - version: 5.2.0 - resolution: "ignore@npm:5.2.0" - checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 +"find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 languageName: node linkType: hard -"immediate@npm:~3.0.5": - version: 3.0.6 - resolution: "immediate@npm:3.0.6" - checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" +"findup-sync@npm:^4.0.0": + version: 4.0.0 + resolution: "findup-sync@npm:4.0.0" dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + detect-file: ^1.0.0 + is-glob: ^4.0.0 + micromatch: ^4.0.2 + resolve-dir: ^1.0.1 + checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 languageName: node linkType: hard -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" dependencies: - pkg-dir: ^4.2.0 - resolve-cwd: ^3.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 languageName: node linkType: hard -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 +"flatted@npm:^3.1.0": + version: 3.2.6 + resolution: "flatted@npm:3.2.6" + checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e languageName: node linkType: hard -"indent-string@npm:^4.0.0": +"form-data@npm:^4.0.0": version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c languageName: node linkType: hard -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" +"fs-extra@npm:9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + at-least-node: ^1.0.0 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 languageName: node linkType: hard -"inherits@npm:2.0.1": - version: 2.0.1 - resolution: "inherits@npm:2.0.1" - checksum: 6536b9377296d4ce8ee89c5c543cb75030934e61af42dba98a428e7d026938c5985ea4d1e3b87743a5b834f40ed1187f89c2d7479e9d59e41d2d1051aefba07b +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 languageName: node linkType: hard -"ini@npm:^1.3.4": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 languageName: node linkType: hard -"inline-source-map@npm:~0.6.0": - version: 0.6.2 - resolution: "inline-source-map@npm:0.6.2" - dependencies: - source-map: ~0.5.3 - checksum: 1f7fa2ad1764d03a0a525d5c47993f9e3d0445f29c2e2413d2878deecb6ecb1e6f9137a6207e3db8dc129565bde15de88c1ba2665407e753e7f3ec768ca29262 +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 languageName: node linkType: hard -"inquirer@npm:8.2.4": - version: 8.2.4 - resolution: "inquirer@npm:8.2.4" +"fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin languageName: node linkType: hard -"insert-module-globals@npm:^7.2.1": - version: 7.2.1 - resolution: "insert-module-globals@npm:7.2.1" +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" dependencies: - JSONStream: ^1.0.3 - acorn-node: ^1.5.2 - combine-source-map: ^0.8.0 - concat-stream: ^1.6.1 - is-buffer: ^1.1.0 - path-is-absolute: ^1.0.1 - process: ~0.11.0 - through2: ^2.0.0 - undeclared-identifiers: ^1.1.2 - xtend: ^4.0.0 - bin: - insert-module-globals: bin/cmd.js - checksum: c44de7e802186e3207e24beadd71a5bb834700456a9e6f5c8fbb415b6f8356aff44df806e32bf9131143c53348d873fb050ea2b8f3c4cac762922e191b6bef15 + node-gyp: latest + conditions: os=darwin languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" - dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a languageName: node linkType: hard -"internmap@npm:^1.0.0": +"functional-red-black-tree@npm:^1.0.1": version: 1.0.1 - resolution: "internmap@npm:1.0.1" - checksum: 9d00f8c0cf873a24a53a5a937120dab634c41f383105e066bb318a61864e6292d24eb9516e8e7dccfb4420ec42ca474a0f28ac9a6cc82536898fa09bbbe53813 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f languageName: node linkType: hard -"ioredis@npm:^5.2.2": - version: 5.2.2 - resolution: "ioredis@npm:5.2.2" +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" dependencies: - "@ioredis/commands": ^1.1.1 - cluster-key-slot: ^1.1.0 - debug: ^4.3.4 - denque: ^2.0.1 - lodash.defaults: ^4.2.0 - lodash.isarguments: ^3.1.0 - redis-errors: ^1.2.0 - redis-parser: ^3.0.0 - standard-as-callback: ^2.1.0 - checksum: 8d650326063de4e37ec7ab38f00dde555284d9fc99fcbe698a4b0d65214920b8cb0f9483c0390fef8d81e9ee26e65380c93113cdedee184206815787bf88cec7 + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 languageName: node linkType: hard -"is-arguments@npm:^1.0.4": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 +"get-func-name@npm:^2.0.0": + version: 2.0.0 + resolution: "get-func-name@npm:2.0.0" + checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 languageName: node linkType: hard -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f +"get-stream@npm:^5.0.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" +"git-raw-commits@npm:^2.0.0": + version: 2.0.11 + resolution: "git-raw-commits@npm:2.0.11" dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + dargs: ^7.0.0 + lodash: ^4.17.15 + meow: ^8.0.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + git-raw-commits: cli.js + checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 languageName: node linkType: hard -"is-boolean-attribute@npm:0.0.1": - version: 0.0.1 - resolution: "is-boolean-attribute@npm:0.0.1" - checksum: bfc3db85d9d8bc8dd208fcfa2bfdc07ec3c64d59a21ef02770b8c10c4785833ebc572e38e3f2e09516e16068f2ef3f7b171d765df104f5ef78c71d69ff29bbcf +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"glob-parent@npm:^6.0.1": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 languageName: node linkType: hard -"is-buffer@npm:^1.1.0": - version: 1.1.6 - resolution: "is-buffer@npm:1.1.6" - checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 +"glob@npm:7.2.3, glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 +"glob@npm:^8.0.1": + version: 8.0.3 + resolution: "glob@npm:8.0.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f +"global-dirs@npm:^0.1.1": + version: 0.1.1 + resolution: "global-dirs@npm:0.1.1" + dependencies: + ini: ^1.3.4 + checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a languageName: node linkType: hard -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": - version: 2.9.0 - resolution: "is-core-module@npm:2.9.0" +"global-modules@npm:^1.0.0": + version: 1.0.0 + resolution: "global-modules@npm:1.0.0" dependencies: - has: ^1.0.3 - checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce + global-prefix: ^1.0.1 + is-windows: ^1.0.1 + resolve-dir: ^1.0.0 + checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"global-prefix@npm:^1.0.1": + version: 1.0.2 + resolution: "global-prefix@npm:1.0.2" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + expand-tilde: ^2.0.2 + homedir-polyfill: ^1.0.1 + ini: ^1.3.4 + is-windows: ^1.0.1 + which: ^1.2.14 + checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 +"globals@npm:^13.15.0": + version: 13.17.0 + resolution: "globals@npm:13.17.0" + dependencies: + type-fest: ^0.20.2 + checksum: fbaf4112e59b92c9f5575e85ce65e9e17c0b82711196ec5f58beb08599bbd92fd72703d6dfc9b080381fd35b644e1b11dcf25b38cc2341ec21df942594cbc8ce languageName: node linkType: hard -"is-fullwidth-code-point@npm:^1.0.0": - version: 1.0.0 - resolution: "is-fullwidth-code-point@npm:1.0.0" +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" dependencies: - number-is-nan: ^1.0.0 - checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 languageName: node linkType: hard -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da languageName: node linkType: hard -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d +"gradient-string@npm:^2.0.1": + version: 2.0.1 + resolution: "gradient-string@npm:2.0.1" + dependencies: + chalk: ^4.1.2 + tinygradient: ^1.1.5 + checksum: 889b099ed8f9fe50d3622ec5dcbceb2d5f9d48cd51ec91cadd10d4a4bd407cabcce88ee3cce8761961a2bd37f56991c3c94124771add0683e0b341c09455a1b1 languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b languageName: node linkType: hard -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"homedir-polyfill@npm:^1.0.1": + version: 1.0.3 + resolution: "homedir-polyfill@npm:1.0.3" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + parse-passwd: ^1.0.0 + checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 languageName: node linkType: hard -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd languageName: node linkType: hard -"is-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 languageName: node linkType: hard -"is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 +"http-cache-semantics@npm:^4.1.0": + version: 4.1.0 + resolution: "http-cache-semantics@npm:4.1.0" + checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 languageName: node linkType: hard -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 +"human-signals@npm:^1.1.1": + version: 1.1.1 + resolution: "human-signals@npm:1.1.1" + checksum: d587647c9e8ec24e02821b6be7de5a0fc37f591f6c4e319b3054b43fd4c35a70a94c46fc74d8c1a43c47fde157d23acd7421f375e1c1365b09a16835b8300205 languageName: node linkType: hard -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 +"human-signals@npm:^3.0.1": + version: 3.0.1 + resolution: "human-signals@npm:3.0.1" + checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 languageName: node linkType: hard -"is-text-path@npm:^1.0.1": - version: 1.0.1 - resolution: "is-text-path@npm:1.0.1" - dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 +"husky@npm:^8.0.1": + version: 8.0.1 + resolution: "husky@npm:8.0.1" + bin: + husky: lib/bin.js + checksum: 943a73a13d0201318fd30e83d299bb81d866bd245b69e6277804c3b462638dc1921694cb94c2b8c920a4a187060f7d6058d3365152865406352e934c5fff70dc languageName: node linkType: hard -"is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "is-typed-array@npm:1.1.9" +"i18next@npm:^21.8.16": + version: 21.8.16 + resolution: "i18next@npm:21.8.16" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.20.0 - for-each: ^0.3.3 - has-tostringtag: ^1.0.0 - checksum: 11910f1e58755fef43bf0074e52fa5b932bf101ec65d613e0a83d40e8e4c6e3f2ee142d624ebc7624c091d3bbe921131f8db7d36ecbbb71909f2fe310c1faa65 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.1": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 + "@babel/runtime": ^7.17.2 + checksum: b29d0cfd3e69edb01ba55fac7f642cde921a47880bfb0552756dffdd2aaa866da17ae0825e47b6972b2c1249aa22a6e9f8813ce18a5072975a0dc720c408a4e5 languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + safer-buffer: ">= 2.1.2 < 3" + checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 languageName: node linkType: hard -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf languageName: node linkType: hard -"is-wsl@npm:^1.1.0": - version: 1.1.0 - resolution: "is-wsl@npm:1.1.0" - checksum: ea157d232351e68c92bd62fc541771096942fe72f69dff452dd26dcc31466258c570a3b04b8cda2e01cd2968255b02951b8670d08ea4ed76d6b1a646061ac4fe +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab +"ignore@npm:^5.1.4, ignore@npm:^5.2.0": + version: 5.2.0 + resolution: "ignore@npm:5.2.0" + checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 languageName: node linkType: hard -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa languageName: node linkType: hard -"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": - version: 5.2.0 - resolution: "istanbul-lib-instrument@npm:5.2.0" - dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-coverage: ^3.2.0 - semver: ^6.3.0 - checksum: 7c242ed782b6bf7b655656576afae8b6bd23dcc020e5fdc1472cca3dfb6ddb196a478385206d0df5219b9babf46ac4f21fea5d8ea9a431848b6cca6007012353 +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" - dependencies: - istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 - supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: ^4.1.1 - istanbul-lib-coverage: ^3.0.0 - source-map: ^0.6.1 - checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" dependencies: - html-escaper: ^2.0.0 - istanbul-lib-report: ^3.0.0 - checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd languageName: node linkType: hard -"jest-changed-files@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-changed-files@npm:28.1.3" - dependencies: - execa: ^5.0.0 - p-limit: ^3.1.0 - checksum: c78af14a68b9b19101623ae7fde15a2488f9b3dbe8cca12a05c4a223bc9bfd3bf41ee06830f20fb560c52434435d6153c9cc6cf450b1f7b03e5e7f96a953a6a6 +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 languageName: node linkType: hard -"jest-circus@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-circus@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - co: ^4.6.0 - dedent: ^0.7.0 - is-generator-fn: ^2.0.0 - jest-each: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - p-limit: ^3.1.0 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: b635e60a9c92adaefc3f24def8eba691e7c2fdcf6c9fa640cddf2eb8c8b26ee62eab73ebb88798fd7c52a74c1495a984e39b748429b610426f02e9d3d56e09b2 +"ini@npm:^1.3.4": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 languageName: node linkType: hard -"jest-cli@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-cli@npm:28.1.3" +"inquirer@npm:8.2.4": + version: 8.2.4 + resolution: "inquirer@npm:8.2.4" dependencies: - "@jest/core": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - import-local: ^3.0.2 - jest-config: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - prompts: ^2.0.1 - yargs: ^17.3.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: fb424576bf38346318daddee3fcc597cd78cb8dda1759d09c529d8ba1a748f2765c17b00671072a838826e59465a810ff8a232bc6ba2395c131bf3504425a363 + ansi-escapes: ^4.2.1 + chalk: ^4.1.1 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + external-editor: ^3.0.3 + figures: ^3.0.0 + lodash: ^4.17.21 + mute-stream: 0.0.8 + ora: ^5.4.1 + run-async: ^2.4.0 + rxjs: ^7.5.5 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + wrap-ansi: ^7.0.0 + checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 languageName: node linkType: hard -"jest-config@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-config@npm:28.1.3" +"ioredis@npm:^5.2.2": + version: 5.2.2 + resolution: "ioredis@npm:5.2.2" dependencies: - "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^28.1.3 - "@jest/types": ^28.1.3 - babel-jest: ^28.1.3 - chalk: ^4.0.0 - ci-info: ^3.2.0 - deepmerge: ^4.2.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-circus: ^28.1.3 - jest-environment-node: ^28.1.3 - jest-get-type: ^28.0.2 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-runner: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - micromatch: ^4.0.4 - parse-json: ^5.2.0 - pretty-format: ^28.1.3 - slash: ^3.0.0 - strip-json-comments: ^3.1.1 - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: ddabffd3a3a8cb6c2f58f06cdf3535157dbf8c70bcde3e5c3de7bee6a8d617840ffc8cffb0083e38c6814f2a08c225ca19f58898efaf4f351af94679f22ce6bc + "@ioredis/commands": ^1.1.1 + cluster-key-slot: ^1.1.0 + debug: ^4.3.4 + denque: ^2.0.1 + lodash.defaults: ^4.2.0 + lodash.isarguments: ^3.1.0 + redis-errors: ^1.2.0 + redis-parser: ^3.0.0 + standard-as-callback: ^2.1.0 + checksum: 8d650326063de4e37ec7ab38f00dde555284d9fc99fcbe698a4b0d65214920b8cb0f9483c0390fef8d81e9ee26e65380c93113cdedee184206815787bf88cec7 languageName: node linkType: hard -"jest-diff@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-diff@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^28.1.1 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 languageName: node linkType: hard -"jest-docblock@npm:^28.1.1": - version: 28.1.1 - resolution: "jest-docblock@npm:28.1.1" - dependencies: - detect-newline: ^3.0.0 - checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 languageName: node linkType: hard -"jest-each@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-each@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - jest-get-type: ^28.0.2 - jest-util: ^28.1.3 - pretty-format: ^28.1.3 - checksum: 5c5b8ccb1484e58b027bea682cfa020a45e5bf5379cc7c23bdec972576c1dc3c3bf03df2b78416cefc1a58859dd33b7cf5fff54c370bc3c0f14a3e509eb87282 +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f languageName: node linkType: hard -"jest-environment-node@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-environment-node@npm:28.1.3" +"is-core-module@npm:^2.5.0, is-core-module@npm:^2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: 1048fe306a6a8b0880a4c66278ebb57479f29c12cff89aab3aa79ab77a8859cf17ab8aa9919fd21c329a7db90e35581b43664e694ad453d5b04e00f3c6420469 + has: ^1.0.3 + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce languageName: node linkType: hard -"jest-get-type@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-get-type@npm:28.0.2" - checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 languageName: node linkType: hard -"jest-haste-map@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-haste-map@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/graceful-fs": ^4.1.3 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 - micromatch: ^4.0.4 - walker: ^1.0.8 - dependenciesMeta: - fsevents: - optional: true - checksum: d05fdc108645fc2b39fcd4001952cc7a8cb550e93494e98c1e9ab1fc542686f6ac67177c132e564cf94fe8f81503f3f8db8b825b9b713dc8c5748aec63ba4688 +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 languageName: node linkType: hard -"jest-leak-detector@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-leak-detector@npm:28.1.3" - dependencies: - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d languageName: node linkType: hard -"jest-matcher-utils@npm:^28.0.0, jest-matcher-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-matcher-utils@npm:28.1.3" +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" dependencies: - chalk: ^4.0.0 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 6b34f0cf66f6781e92e3bec97bf27796bd2ba31121e5c5997218d9adba6deea38a30df5203937d6785b68023ed95cbad73663cc9aad6fb0cb59aeb5813a58daf + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 languageName: node linkType: hard -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^28.1.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 languageName: node linkType: hard -"jest-mock-random@npm:^1.1.1": - version: 1.1.1 - resolution: "jest-mock-random@npm:1.1.1" - checksum: f2c68cce558bda4d94de32aa312201c2ce1daaa7c4a7452012bfe1307467deefe0f1b1e55a8f81dad8d3c488a779b0b20ef7af29b588c7f5eb6794e45a845f59 +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 languageName: node linkType: hard -"jest-mock@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-mock@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - checksum: a573bf8e5f12f4c29c661266c31b5c6b69a28d3195b83049983bce025b2b1a0152351567e89e63b102ef817034c2a3aa97eda4e776f3bae2aee54c5765573aa7 +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a languageName: node linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.2 - resolution: "jest-pnp-resolver@npm:1.2.2" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: bd85dcc0e76e0eb0c3d56382ec140f08d25ff4068cda9d0e360bb78fb176cb726d0beab82dc0e8694cafd09f55fee7622b8bcb240afa5fad301f4ed3eebb4f47 + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 languageName: node linkType: hard -"jest-regex-util@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-regex-util@npm:28.0.2" - checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 languageName: node linkType: hard -"jest-resolve-dependencies@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve-dependencies@npm:28.1.3" - dependencies: - jest-regex-util: ^28.0.2 - jest-snapshot: ^28.1.3 - checksum: 4eea9ec33aefc1c71dc5956391efbcc7be76bda986b366ab3931d99c5f7ed01c9ebd7520e405ea2c76e1bb2c7ce504be6eca2b9831df16564d1e625500f3bfe7 +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 languageName: node linkType: hard -"jest-resolve@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-pnp-resolver: ^1.2.2 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - resolve: ^1.20.0 - resolve.exports: ^1.1.0 - slash: ^3.0.0 - checksum: df61a490c93f4f4cf52135e43d6a4fcacb07b0b7d4acc6319e9289529c1d14f2d8e1638e095dbf96f156834802755e38db68caca69dba21a3261ee711d4426b6 +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 languageName: node linkType: hard -"jest-runner@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runner@npm:28.1.3" +"is-text-path@npm:^1.0.1": + version: 1.0.1 + resolution: "is-text-path@npm:1.0.1" dependencies: - "@jest/console": ^28.1.3 - "@jest/environment": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - emittery: ^0.10.2 - graceful-fs: ^4.2.9 - jest-docblock: ^28.1.1 - jest-environment-node: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-leak-detector: ^28.1.3 - jest-message-util: ^28.1.3 - jest-resolve: ^28.1.3 - jest-runtime: ^28.1.3 - jest-util: ^28.1.3 - jest-watcher: ^28.1.3 - jest-worker: ^28.1.3 - p-limit: ^3.1.0 - source-map-support: 0.5.13 - checksum: 32405cd970fa6b11e039192dae699fd1bcc6f61f67d50605af81d193f24dd4373b25f5fcc1c571a028ec1b02174e8a4b6d0d608772063fb06f08a5105693533b - languageName: node - linkType: hard - -"jest-runtime@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runtime@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/globals": ^28.1.3 - "@jest/source-map": ^28.1.2 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - cjs-module-lexer: ^1.0.0 - collect-v8-coverage: ^1.0.0 - execa: ^5.0.0 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - slash: ^3.0.0 - strip-bom: ^4.0.0 - checksum: b17c40af858e74dafa4f515ef3711c1e9ef3d4ad7d74534ee0745422534bc04fd166d4eceb62a3aa7dc951505d6f6d2a81d16e90bebb032be409ec0500974a36 - languageName: node - linkType: hard - -"jest-snapshot@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-snapshot@npm:28.1.3" - dependencies: - "@babel/core": ^7.11.6 - "@babel/generator": ^7.7.2 - "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/traverse": ^7.7.2 - "@babel/types": ^7.3.3 - "@jest/expect-utils": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/babel__traverse": ^7.0.6 - "@types/prettier": ^2.1.5 - babel-preset-current-node-syntax: ^1.0.0 - chalk: ^4.0.0 - expect: ^28.1.3 - graceful-fs: ^4.2.9 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - jest-haste-map: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - natural-compare: ^1.4.0 - pretty-format: ^28.1.3 - semver: ^7.3.5 - checksum: 2a46a5493f1fb50b0a236a21f25045e7f46a244f9f3ae37ef4fbcd40249d0d68bb20c950ce77439e4e2cac985b05c3061c90b34739bf6069913a1199c8c716e1 + text-extensions: ^1.0.0 + checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 languageName: node linkType: hard -"jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 languageName: node linkType: hard -"jest-validate@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-validate@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^28.0.2 - leven: ^3.1.0 - pretty-format: ^28.1.3 - checksum: 95e0513b3803c3372a145cda86edbdb33d9dfeaa18818176f2d581e821548ceac9a179f065b6d4671a941de211354efd67f1fff8789a4fb89962565c85f646db +"is-utf8@npm:^0.2.1": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 languageName: node linkType: hard -"jest-watcher@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-watcher@npm:28.1.3" - dependencies: - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.10.2 - jest-util: ^28.1.3 - string-length: ^4.0.1 - checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 +"is-windows@npm:^1.0.1": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 languageName: node linkType: hard -"jest-worker@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-worker@npm:28.1.3" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 languageName: node linkType: hard -"jest@npm:^28.1.3": - version: 28.1.3 - resolution: "jest@npm:28.1.3" +"ix@npm:^5.0.0": + version: 5.0.0 + resolution: "ix@npm:5.0.0" dependencies: - "@jest/core": ^28.1.3 - "@jest/types": ^28.1.3 - import-local: ^3.0.2 - jest-cli: ^28.1.3 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: b9dcb542eb7c16261c281cdc2bf37155dbb3f1205bae0b567f05051db362c85ddd4b765f126591efb88f6d298eb10336d0aa6c7d5373b4d53f918137a9a70182 + "@types/node": ^13.7.4 + tslib: ^2.3.0 + checksum: b8c2f622b8af5bec0c401c32571bade8f5bbfe15a50ee08cda5428027b609959147278c403b1695955b276495a68eea65a7a33333692f924737f31dcb7a42d57 languageName: node linkType: hard @@ -7321,18 +3581,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - "js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" @@ -7344,24 +3592,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -7390,22 +3620,6 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" - bin: - json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b - languageName: node - linkType: hard - "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -7419,26 +3633,13 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:1.3.1, jsonparse@npm:^1.2.0": +"jsonparse@npm:^1.2.0": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d languageName: node linkType: hard -"jsonstream2@npm:^3.0.0": - version: 3.0.0 - resolution: "jsonstream2@npm:3.0.0" - dependencies: - jsonparse: 1.3.1 - through2: ^3.0.1 - type-component: 0.0.1 - bin: - jsonstream: bin/jsonstream.js - checksum: b72e7c3bf954c2a79cb070eb4c6742ec488e3a93a803172e9a6b37681c968cc060b2b56042acd0dc1f6ed664d3f591adab7f0fac51ab7363cca958ab0adcbb1a - languageName: node - linkType: hard - "kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -7446,30 +3647,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 - languageName: node - linkType: hard - -"labeled-stream-splicer@npm:^2.0.0": - version: 2.0.2 - resolution: "labeled-stream-splicer@npm:2.0.2" - dependencies: - inherits: ^2.0.1 - stream-splicer: ^2.0.0 - checksum: 4f7097b7666cd6d110f2a700f2905f703aa2a6d21c76fb390fcf441f436b269f5b1ad813178af4406cf6ddf01f3ac24435b3ff8fe2d9678664c147bf92f056b3 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 - languageName: node - linkType: hard - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -7480,13 +3657,6 @@ __metadata: languageName: node linkType: hard -"lexure@npm:^0.17.0": - version: 0.17.0 - resolution: "lexure@npm:0.17.0" - checksum: 95797b0ada9452bcdfdd30997572ab1673de1b2583a5af2fa309aa3587ec3b95ba361880b333ed446a6b0f07764b6d8d2cf1d72083c61fa9f96c06181f194453 - languageName: node - linkType: hard - "lie@npm:3.1.1": version: 3.1.1 resolution: "lie@npm:3.1.1" @@ -7496,6 +3666,17 @@ __metadata: languageName: node linkType: hard +"light-my-request@npm:^5.0.0": + version: 5.3.0 + resolution: "light-my-request@npm:5.3.0" + dependencies: + cookie: ^0.5.0 + process-warning: ^2.0.0 + set-cookie-parser: ^2.4.1 + checksum: 10bd862c8f08534c1b276266bf4bbef5397a0b94047b127a94b946e777e804b6f99118cacb1f63cd1d9017624cabb2ede8497d957df6d8dd891cd6aad95b0031 + languageName: node + linkType: hard + "lilconfig@npm:2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" @@ -7554,6 +3735,13 @@ __metadata: languageName: node linkType: hard +"local-pkg@npm:^0.4.2": + version: 0.4.2 + resolution: "local-pkg@npm:0.4.2" + checksum: 22be451353c25c4411b552bf01880ebc9e995b93574b2facc7757968d888356df59199cacada14162ab53bbc9da055bb692c907b4171f008dbce45a2afc777c1 + languageName: node + linkType: hard + "localforage@npm:^1.8.1": version: 1.10.0 resolution: "localforage@npm:1.10.0" @@ -7581,13 +3769,6 @@ __metadata: languageName: node linkType: hard -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 - languageName: node - linkType: hard - "lodash.defaults@npm:^4.2.0": version: 4.2.0 resolution: "lodash.defaults@npm:4.2.0" @@ -7609,13 +3790,6 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:~3.0.3": - version: 3.0.4 - resolution: "lodash.memoize@npm:3.0.4" - checksum: fc52e0916b896fa79d6b85fbeaa0e44a381b70f1fcab7acab10188aaeeb2107e21b9b992bff560f405696e0a6e3bb5c08af18955d628a1e8ab6b11df14ff6172 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -7666,10 +3840,12 @@ __metadata: languageName: node linkType: hard -"lower-case@npm:^1.1.1": - version: 1.1.4 - resolution: "lower-case@npm:1.1.4" - checksum: 1ca9393b5eaef94a64e3f89e38b63d15bc7182a91171e6ad1550f51d710ec941540a065b274188f2e6b4576110cc2d11b50bc4bb7c603a040ddeb1db4ca95197 +"loupe@npm:^2.3.1": + version: 2.3.4 + resolution: "loupe@npm:2.3.4" + dependencies: + get-func-name: ^2.0.0 + checksum: 5af91db61aa18530f1749a64735ee194ac263e65e9f4d1562bf3036c591f1baa948289c193e0e34c7b5e2c1b75d3c1dc4fce87f5edb3cee10b0c0df46bc9ffb3 languageName: node linkType: hard @@ -7696,24 +3872,6 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.23.2": - version: 0.23.2 - resolution: "magic-string@npm:0.23.2" - dependencies: - sourcemap-codec: ^1.4.1 - checksum: 05167ff554f6a61d87080f34757339b503669fffe12a7cbe7f79c08283b7e33a497a24ea26b8cea5b36d7d6a737ad483e0599431ae443225f6e46b99e0332ba5 - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0, make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - "make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" @@ -7745,15 +3903,6 @@ __metadata: languageName: node linkType: hard -"makeerror@npm:1.0.12": - version: 1.0.12 - resolution: "makeerror@npm:1.0.12" - dependencies: - tmpl: 1.0.5 - checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 - languageName: node - linkType: hard - "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -7768,24 +3917,6 @@ __metadata: languageName: node linkType: hard -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 38abbe4eb883888031e6b2fc0630bc583c99396be16b8ace5794b937b682a8a081f03e8b15bfd4914d1bc88318f0e9ac73ba3512ae65955cd449f63256ddb31d - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - "meow@npm:^8.0.0": version: 8.1.2 resolution: "meow@npm:8.1.2" @@ -7805,15 +3936,6 @@ __metadata: languageName: node linkType: hard -"merge-source-map@npm:1.0.4": - version: 1.0.4 - resolution: "merge-source-map@npm:1.0.4" - dependencies: - source-map: ^0.5.6 - checksum: 86a4e60d83980393e61f069c7ae33e7899c4c012c3cd2cf50e01482e7a284bbe9c8cd08d37adbf241fc9eacfa4425241432e7461cf6559f7e9902587889660de - languageName: node - linkType: hard - "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -7845,18 +3967,6 @@ __metadata: languageName: node linkType: hard -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: ^4.0.0 - brorand: ^1.0.1 - bin: - miller-rabin: bin/miller-rabin - checksum: 00cd1ab838ac49b03f236cc32a14d29d7d28637a53096bf5c6246a032a37749c9bd9ce7360cbf55b41b89b7d649824949ff12bc8eee29ac77c6b38eada619ece - languageName: node - linkType: hard - "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -7894,20 +4004,6 @@ __metadata: languageName: node linkType: hard -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -7996,11 +4092,11 @@ __metadata: linkType: hard "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": - version: 3.3.4 - resolution: "minipass@npm:3.3.4" + version: 3.3.5 + resolution: "minipass@npm:3.3.5" dependencies: yallist: ^4.0.0 - checksum: 5d95a7738c54852ba78d484141e850c792e062666a2d0c681a5ac1021275beb7e1acb077e59f9523ff1defb80901aea4e30fac10ded9a20a25d819a42916ef1b + checksum: f89f02bcaa0e0e4bb4c44ec796008e69fbca62db0aba6ead1bc57d25bdaefdf42102130f4f9ecb7d9c6b6cd35ff7b0c7b97d001d3435da8e629fb68af3aea57e languageName: node linkType: hard @@ -8014,13 +4110,6 @@ __metadata: languageName: node linkType: hard -"mkdirp-classic@npm:^0.5.2": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac - languageName: node - linkType: hard - "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -8030,38 +4119,6 @@ __metadata: languageName: node linkType: hard -"module-deps@npm:^6.2.3": - version: 6.2.3 - resolution: "module-deps@npm:6.2.3" - dependencies: - JSONStream: ^1.0.3 - browser-resolve: ^2.0.0 - cached-path-relative: ^1.0.2 - concat-stream: ~1.6.0 - defined: ^1.0.0 - detective: ^5.2.0 - duplexer2: ^0.1.2 - inherits: ^2.0.1 - parents: ^1.0.0 - readable-stream: ^2.0.2 - resolve: ^1.4.0 - stream-combiner2: ^1.1.1 - subarg: ^1.0.0 - through2: ^2.0.0 - xtend: ^4.0.0 - bin: - module-deps: bin/cmd.js - checksum: cccead8f81b77ec621c29c4407978ce50de6f15c7152b54e81b65ff043d4254fd40071e53a3989a36066ff0d3ce9ae9e65f81aed79b3b5397024dbc8be5d68c7 - languageName: node - linkType: hard - -"morphdom@npm:^2.3.3": - version: 2.6.1 - resolution: "morphdom@npm:2.6.1" - checksum: 8930281b27df2c918a168872a650931d92ac728b9177ed6d74779acf40a4bf6a1c62482a267496a1007f9658d0c6a4125e7080ec1194c6b937ff55f903235ad0 - languageName: node - linkType: hard - "mri@npm:^1.1.5": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -8086,166 +4143,43 @@ __metadata: "multimatch@npm:^4.0.0": version: 4.0.0 resolution: "multimatch@npm:4.0.0" - dependencies: - "@types/minimatch": ^3.0.3 - array-differ: ^3.0.0 - array-union: ^2.1.0 - arrify: ^2.0.1 - minimatch: ^3.0.4 - checksum: bdb6a98dad4e919d9a1a2a0db872f44fa2337315f2fd5827d91ae005cf22f4425782bdfa97c10b80d567f0cb3c226c31f4e85f8f6a4a4be4facf9af0de1bb0c2 - languageName: node - linkType: hard - -"mute-stream@npm:0.0.8": - version: 0.0.8 - resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 - languageName: node - linkType: hard - -"mutexify@npm:^1.1.0": - version: 1.4.0 - resolution: "mutexify@npm:1.4.0" - dependencies: - queue-tick: ^1.0.0 - checksum: 2ad9712d4f2e75551a2dbfb1dc274dfa6c1dea7418ee48468a9bf252014d3480adc70c264bd93775b034d29b7dbfcfd26ecb2a4d83aa8d137456e617a01d3f76 - languageName: node - linkType: hard - -"mz@npm:^2.4.0": - version: 2.7.0 - resolution: "mz@npm:2.7.0" - dependencies: - any-promise: ^1.0.0 - object-assign: ^4.0.1 - thenify-all: ^1.0.0 - checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 - languageName: node - linkType: hard - -"nan@npm:^2.14.0, nan@npm:^2.15.0": - version: 2.16.0 - resolution: "nan@npm:2.16.0" - dependencies: - node-gyp: latest - checksum: cb16937273ea55b01ea47df244094c12297ce6b29b36e845d349f1f7c268b8d7c5abd126a102c5678a1e1afd0d36bba35ea0cc959e364928ce60561c9306064a - languageName: node - linkType: hard - -"nanoassert@npm:^1.1.0": - version: 1.1.0 - resolution: "nanoassert@npm:1.1.0" - checksum: f360fe639db8edc422de9f5a8a7d384ba9c11e9c6fac149f7ad3b0a94e4ec9d5aa44ce55b3e4c7682658efad792604fc96c336b0e80a3590744104ba58af80c7 - languageName: node - linkType: hard - -"nanobench@npm:^2.1.0, nanobench@npm:^2.1.1": - version: 2.1.1 - resolution: "nanobench@npm:2.1.1" - dependencies: - browser-process-hrtime: ^0.1.2 - chalk: ^1.1.3 - mutexify: ^1.1.0 - pretty-hrtime: ^1.0.2 - bin: - nanobench: ./run.js - nanobench-compare: ./compare.js - checksum: ebae5d4a2fb5f6762abc981018b4099a7d3577ed74311a2e33b1bca8eb6a0d3c8cc20763c3aace7942455cebbf116500a1b28a7f7861b2edcb3bf3d1483a0ee0 - languageName: node - linkType: hard - -"nanohtml@npm:^1.4.0": - version: 1.10.0 - resolution: "nanohtml@npm:1.10.0" - dependencies: - acorn-node: ^1.8.2 - camel-case: ^3.0.0 - convert-source-map: ^1.5.1 - estree-is-member-expression: ^1.0.0 - hyperx: ^2.5.0 - is-boolean-attribute: 0.0.1 - nanoassert: ^1.1.0 - nanobench: ^2.1.0 - normalize-html-whitespace: ^0.2.0 - through2: ^2.0.3 - transform-ast: ^2.4.0 - checksum: 27f2fd770cf3156182ae08468a95a34521b06c5644877a8f5fd7e14437e47d47b3b77569c421b0b4b45e95b70791822898069cae429222af588b36a4fe25deda - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"no-case@npm:^2.2.0": - version: 2.3.2 - resolution: "no-case@npm:2.3.2" - dependencies: - lower-case: ^1.1.1 - checksum: 856487731936fef44377ca74fdc5076464aba2e0734b56a4aa2b2a23d5b154806b591b9b2465faa59bb982e2b5c9391e3685400957fb4eeb38f480525adcf3dd - languageName: node - linkType: hard - -"nock@npm:^13.2.9": - version: 13.2.9 - resolution: "nock@npm:13.2.9" - dependencies: - debug: ^4.1.0 - json-stringify-safe: ^5.0.1 - lodash: ^4.17.21 - propagate: ^2.0.0 - checksum: 04a2dc60b4b55fd1240f28fe34865bbc744088a4570db3781fcf66021644cc3cc9178fd86a0cb0c1f28ea77b83e8f1c9288535f6b39a6d07100059f156ccc23b + dependencies: + "@types/minimatch": ^3.0.3 + array-differ: ^3.0.0 + array-union: ^2.1.0 + arrify: ^2.0.1 + minimatch: ^3.0.4 + checksum: bdb6a98dad4e919d9a1a2a0db872f44fa2337315f2fd5827d91ae005cf22f4425782bdfa97c10b80d567f0cb3c226c31f4e85f8f6a4a4be4facf9af0de1bb0c2 languageName: node linkType: hard -"node-addon-api@npm:*": - version: 5.0.0 - resolution: "node-addon-api@npm:5.0.0" - dependencies: - node-gyp: latest - checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334 +"mute-stream@npm:0.0.8": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 languageName: node linkType: hard -"node-cleanup@npm:^2.1.2": - version: 2.1.2 - resolution: "node-cleanup@npm:2.1.2" - checksum: 584cdc3e42560a998b4579f91ed8f936b27011628f3102e5a1093205f0691cdf8d899287d1f2e4d2071ea4ab1d615810bad6dbe2b988ef173a1cbaa76d8165b3 +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" + bin: + nanoid: bin/nanoid.cjs + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c languageName: node linkType: hard -"node-fetch@npm:2.6.7, node-fetch@npm:^2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d languageName: node linkType: hard -"node-gyp-build@npm:^4.3.0": - version: 4.5.0 - resolution: "node-gyp-build@npm:4.5.0" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: d888bae0fb88335f69af1b57a2294a931c5042f36e413d8d364c992c9ebfa0b96ffe773179a5a2c8f04b73856e8634e09cce108dbb9804396d3cc8c5455ff2db +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 languageName: node linkType: hard @@ -8269,20 +4203,6 @@ __metadata: languageName: node linkType: hard -"node-int64@npm:^0.4.0": - version: 0.4.0 - resolution: "node-int64@npm:0.4.0" - checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e - languageName: node - linkType: hard - -"node-releases@npm:^2.0.6": - version: 2.0.6 - resolution: "node-releases@npm:2.0.6" - checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf - languageName: node - linkType: hard - "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -8294,13 +4214,6 @@ __metadata: languageName: node linkType: hard -"normalize-html-whitespace@npm:^0.2.0": - version: 0.2.0 - resolution: "normalize-html-whitespace@npm:0.2.0" - checksum: b777e7228bf0cd93664bf44df0c5b9eec3b15de622f79a6c79561b008c1d09d208e8a55100dd786f95fc21ba08aed7f87fe049a4cfaae26941324cfe6e323b49 - languageName: node - linkType: hard - "normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -8325,7 +4238,7 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 @@ -8350,18 +4263,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: ^2.0.0 - console-control-strings: ^1.1.0 - gauge: ^3.0.0 - set-blocking: ^2.0.0 - checksum: 516b2663028761f062d13e8beb3f00069c5664925871a9b57989642ebe09f23ab02145bf3ab88da7866c4e112cafff72401f61a672c7c8a20edc585a7016ef5f - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -8374,50 +4275,17 @@ __metadata: languageName: node linkType: hard -"number-is-nan@npm:^1.0.0": - version: 1.0.1 - resolution: "number-is-nan@npm:1.0.1" - checksum: 13656bc9aa771b96cef209ffca31c31a03b507ca6862ba7c3f638a283560620d723d52e626d57892c7fff475f4c36ac07f0600f14544692ff595abff214b9ffb - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.12.2": version: 1.12.2 resolution: "object-inspect@npm:1.12.2" checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 languageName: node linkType: hard -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 - languageName: node - linkType: hard - -"on-net-listen@npm:^1.1.0": - version: 1.1.2 - resolution: "on-net-listen@npm:1.1.2" - checksum: 8d51d658c6a7d0b0256710a85540515142e98df177eb054244c906e177e874e3dab5d04376e199fb11bf7cd2d90d309fc5322337ca9106d30b9bbdcf2da467fc +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.0 + resolution: "on-exit-leak-free@npm:2.1.0" + checksum: 7334d98b87b0c89c9b69c747760b21196ff35afdedc4eaf1a0a3a02964463d7f6802481b120e4c8298967c74773ca7b914ab2eb3d9b279010eb7f67ac4960eed languageName: node linkType: hard @@ -8448,15 +4316,6 @@ __metadata: languageName: node linkType: hard -"opn@npm:^5.4.0": - version: 5.5.0 - resolution: "opn@npm:5.5.0" - dependencies: - is-wsl: ^1.1.0 - checksum: 35b677b5a1fd6c8cb1996b0607671ba79f7ce9fa029217d54eafaf6bee13eb7e700691c6a415009140fd02a435fffdfd143875f3b233b60f3f9d631c6f6b81a0 - languageName: node - linkType: hard - "optionator@npm:^0.9.1": version: 0.9.1 resolution: "optionator@npm:0.9.1" @@ -8488,13 +4347,6 @@ __metadata: languageName: node linkType: hard -"os-browserify@npm:~0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf - languageName: node - linkType: hard - "os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" @@ -8511,7 +4363,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -8554,20 +4406,6 @@ __metadata: languageName: node linkType: hard -"packet-reader@npm:1.0.0": - version: 1.0.0 - resolution: "packet-reader@npm:1.0.0" - checksum: 0b7516f0cbf3e322aad591bed29ba544220088c53943145c0d9121a6f59182ad811f7fd6785a8979a34356aca69d97653689029964c5998dc02645633d88ffd7 - languageName: node - linkType: hard - -"pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16 - languageName: node - linkType: hard - "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -8577,36 +4415,7 @@ __metadata: languageName: node linkType: hard -"parent-require@npm:^1.0.0": - version: 1.0.0 - resolution: "parent-require@npm:1.0.0" - checksum: 91ecef2c8e0ecc06a7d68ebdfccec9cb8b34a7144cccda0141273c8871d4dd05856fe13b17ae1e1a32bfd769143671a6dbd2ad7ee72f55d1cb8e588dc60a8f4c - languageName: node - linkType: hard - -"parents@npm:^1.0.0, parents@npm:^1.0.1": - version: 1.0.1 - resolution: "parents@npm:1.0.1" - dependencies: - path-platform: ~0.11.15 - checksum: 094fc817d5e8d94e9f9d38c2618a2822f2960b7a268183a36326c5d1cf6ff32f97b1158b0f9b32ab126573996dfe6db104feda6d26e8531d762d178ef4488fc8 - languageName: node - linkType: hard - -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": - version: 5.1.6 - resolution: "parse-asn1@npm:5.1.6" - dependencies: - asn1.js: ^5.2.0 - browserify-aes: ^1.0.0 - evp_bytestokey: ^1.0.0 - pbkdf2: ^3.0.3 - safe-buffer: ^5.1.1 - checksum: 9243311d1f88089bc9f2158972aa38d1abd5452f7b7cabf84954ed766048fe574d434d82c6f5a39b988683e96fb84cd933071dda38927e03469dc8c8d14463c7 - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.0.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -8625,36 +4434,6 @@ __metadata: languageName: node linkType: hard -"parse5-htmlparser2-tree-adapter@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" - dependencies: - parse5: ^6.0.1 - checksum: 1848378b355d027915645c13f13f982e60502d201f53bc2067a508bf2dba4aac08219fc781dcd160167f5f50f0c73f58d20fa4fb3d90ee46762c20234fa90a6d - languageName: node - linkType: hard - -"parse5@npm:^5.1.1": - version: 5.1.1 - resolution: "parse5@npm:5.1.1" - checksum: 613a714af4c1101d1cb9f7cece2558e35b9ae8a0c03518223a4a1e35494624d9a9ad5fad4c13eab66a0e0adccd9aa3d522fc8f5f9cc19789e0579f3fa0bdfc65 - languageName: node - linkType: hard - -"parse5@npm:^6.0.1": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd - languageName: node - linkType: hard - -"path-browserify@npm:^1.0.0": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -8662,7 +4441,7 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": +"path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 @@ -8690,13 +4469,6 @@ __metadata: languageName: node linkType: hard -"path-platform@npm:~0.11.15": - version: 0.11.15 - resolution: "path-platform@npm:0.11.15" - checksum: 239f2eae720531ff5a48837de68f94ebd7cf6cd2bf295b39beb97c5bafc34a34a683b62f9f5ad5ca5e78d71d7d44c29e7c56373c1c8473ab128a4e648bb898f0 - languageName: node - linkType: hard - "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -8704,97 +4476,17 @@ __metadata: languageName: node linkType: hard -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: ~2.3 - checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c - languageName: node - linkType: hard - -"pbkdf2@npm:^3.0.3": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: ^1.1.2 - create-hmac: ^1.1.4 - ripemd160: ^2.0.1 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 - languageName: node - linkType: hard - -"pg-connection-string@npm:^2.5.0": - version: 2.5.0 - resolution: "pg-connection-string@npm:2.5.0" - checksum: a6f3a068f7c9416a5b33a326811caf0dfaaee045c225b7c628b4c9b4e9a2b25bdd12a21e4c48940e1000ea223a4e608ca122d2ff3dd08c8b1db0fc9f5705133a - languageName: node - linkType: hard - -"pg-int8@npm:1.0.1": - version: 1.0.1 - resolution: "pg-int8@npm:1.0.1" - checksum: a1e3a05a69005ddb73e5f324b6b4e689868a447c5fa280b44cd4d04e6916a344ac289e0b8d2695d66e8e89a7fba023affb9e0e94778770ada5df43f003d664c9 - languageName: node - linkType: hard - -"pg-pool@npm:^3.5.1": - version: 3.5.1 - resolution: "pg-pool@npm:3.5.1" - peerDependencies: - pg: ">=8.0" - checksum: 42833c25f18fee41a1b2d955978f1403e93164762a7e57d3a870429103d302f1899b393ab021bb8144272037eb3f13bdb9f16a4c4afaa3efd3d2c3689738038f - languageName: node - linkType: hard - -"pg-protocol@npm:*, pg-protocol@npm:^1.5.0": - version: 1.5.0 - resolution: "pg-protocol@npm:1.5.0" - checksum: b839d12cafe942ef9cbc5b13c174eb2356804fb4fe8ead8279f46a36be90722d19a91409955beb8a3d5301639c44854e49749de4aef02dc361fee3e2a61fb1e4 - languageName: node - linkType: hard - -"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": - version: 2.2.0 - resolution: "pg-types@npm:2.2.0" - dependencies: - pg-int8: 1.0.1 - postgres-array: ~2.0.0 - postgres-bytea: ~1.0.0 - postgres-date: ~1.0.4 - postgres-interval: ^1.1.0 - checksum: bf4ec3f594743442857fb3a8dfe5d2478a04c98f96a0a47365014557cbc0b4b0cee01462c79adca863b93befbf88f876299b75b72c665b5fb84a2c94fbd10316 - languageName: node - linkType: hard - -"pg@npm:^8.7.3": - version: 8.7.3 - resolution: "pg@npm:8.7.3" - dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: ^2.5.0 - pg-pool: ^3.5.1 - pg-protocol: ^1.5.0 - pg-types: ^2.1.0 - pgpass: 1.x - peerDependencies: - pg-native: ">=2.0.0" - peerDependenciesMeta: - pg-native: - optional: true - checksum: d0e7040967779b9ccea16897f099510bcaf6bc86f77a6d8fa7e293c24d8bd2fd2ec46d99d6d1adc9be4cc8f254aa909361346b693088c1ba4501414f7afb2fe3 +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 languageName: node linkType: hard -"pgpass@npm:1.x": - version: 1.0.5 - resolution: "pgpass@npm:1.0.5" - dependencies: - split2: ^4.1.0 - checksum: 947ac096c031eebdf08d989de2e9f6f156b8133d6858c7c2c06c041e1e71dda6f5f3bad3c0ec1e96a09497bbc6ef89e762eefe703b5ef9cb2804392ec52ec400 +"peek-readable@npm:^5.0.0-alpha.5": + version: 5.0.0-alpha.5 + resolution: "peek-readable@npm:5.0.0-alpha.5" + checksum: cab949ed457dac95ae191dd412c6a0ba05e8db4842fd51704ccf2c8c16d6f3ceeefc997e8caea584a0395f229e468c0203a38a8d0ec68cfef8bacc157a006dcb languageName: node linkType: hard @@ -8805,7 +4497,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -8821,49 +4513,52 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.4": - version: 4.0.5 - resolution: "pirates@npm:4.0.5" - checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"postgres-array@npm:~2.0.0": - version: 2.0.0 - resolution: "postgres-array@npm:2.0.0" - checksum: 0e1e659888147c5de579d229a2d95c0d83ebdbffc2b9396d890a123557708c3b758a0a97ed305ce7f58edfa961fa9f0bbcd1ea9f08b6e5df73322e683883c464 - languageName: node - linkType: hard - -"postgres-bytea@npm:~1.0.0": +"pino-abstract-transport@npm:v1.0.0": version: 1.0.0 - resolution: "postgres-bytea@npm:1.0.0" - checksum: d844ae4ca7a941b70e45cac1261a73ee8ed39d72d3d74ab1d645248185a1b7f0ac91a3c63d6159441020f4e1f7fe64689ac56536a307b31cef361e5187335090 + resolution: "pino-abstract-transport@npm:1.0.0" + dependencies: + readable-stream: ^4.0.0 + split2: ^4.0.0 + checksum: 05dd0eda52dd99fd204b39fe7b62656744b63e863bc052cdd5105d25f226a236966d0a46e39a1ace4838f6e988c608837ff946d2d0bc92835ca7baa0a3bff8d8 languageName: node linkType: hard -"postgres-date@npm:~1.0.4": - version: 1.0.7 - resolution: "postgres-date@npm:1.0.7" - checksum: 5745001d47e51cd767e46bcb1710649cd705d91a24d42fa661c454b6dcbb7353c066a5047983c90a626cd3bbfea9e626cc6fa84a35ec57e5bbb28b49f78e13ed +"pino-std-serializers@npm:^6.0.0": + version: 6.0.0 + resolution: "pino-std-serializers@npm:6.0.0" + checksum: d9dc1779b3870cdbe00dc2dff15e3931eb126bb144bc9f746d83a2c1174a28e366ed0abe63379dee2fee474e6018a088bfbb2c4b57c1e206601918f5a61e276f + languageName: node + linkType: hard + +"pino@npm:^8.0.0": + version: 8.3.1 + resolution: "pino@npm:8.3.1" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.1.1 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: v1.0.0 + pino-std-serializers: ^6.0.0 + process-warning: ^2.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.2.0 + safe-stable-stringify: ^2.3.1 + sonic-boom: ^3.1.0 + thread-stream: ^2.0.0 + bin: + pino: bin.js + checksum: 4871cf02fdc62ce27042a98797d343e381375486bd9e88a2a4ee72259e12227f040c76a6050707dfe76f3cacfcec0c049c28b53eb9a82074ddf2913cce9473ee languageName: node linkType: hard -"postgres-interval@npm:^1.1.0": - version: 1.2.0 - resolution: "postgres-interval@npm:1.2.0" +"postcss@npm:^8.4.14": + version: 8.4.14 + resolution: "postcss@npm:8.4.14" dependencies: - xtend: ^4.0.0 - checksum: 746b71f93805ae33b03528e429dc624706d1f9b20ee81bf743263efb6a0cd79ae02a642a8a480dbc0f09547b4315ab7df6ce5ec0be77ed700bac42730f5c76b2 + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 languageName: node linkType: hard @@ -8892,25 +4587,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^28.0.0, pretty-format@npm:^28.1.3": - version: 28.1.3 - resolution: "pretty-format@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f - languageName: node - linkType: hard - -"pretty-hrtime@npm:^1.0.2": - version: 1.0.3 - resolution: "pretty-hrtime@npm:1.0.3" - checksum: bae0e6832fe13c3de43d1a3d43df52bf6090499d74dc65a17f5552cb1a94f1f8019a23284ddf988c3c408a09678d743901e1d8f5b7a71bec31eeeac445bef371 - languageName: node - linkType: hard - "pretty-quick@npm:^3.1.3": version: 3.1.3 resolution: "pretty-quick@npm:3.1.3" @@ -8929,17 +4605,22 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf +"prisma@npm:^4.1.1": + version: 4.1.1 + resolution: "prisma@npm:4.1.1" + dependencies: + "@prisma/engines": 4.1.1 + bin: + prisma: build/index.js + prisma2: build/index.js + checksum: fdaa0cb464e00700539eced334f743fbc669336076cbe12c3a7bbd043c546baa9792064a216ae2ca061c5cb05d720b8fc6e2c6f7e434ab3d1d63ec9f25fa525f languageName: node linkType: hard -"process@npm:~0.11.0": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 +"process-warning@npm:^2.0.0": + version: 2.0.0 + resolution: "process-warning@npm:2.0.0" + checksum: a2bb299835bced58e63cbe06a8fd6e048a648d3649e81b62c442b63112a3f0a86912e7b1a9c557daca30652232d3b0a7f1972fb87c36334e2a5a6f3d5c4a76c9 languageName: node linkType: hard @@ -8960,52 +4641,13 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: ^3.0.3 - sisteransi: ^1.0.5 - checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d - languageName: node - linkType: hard - -"propagate@npm:^2.0.0": - version: 2.0.1 - resolution: "propagate@npm:2.0.1" - checksum: c4febaee2be0979e82fb6b3727878fd122a98d64a7fa3c9d09b0576751b88514a9e9275b1b92e76b364d488f508e223bd7e1dcdc616be4cdda876072fbc2a96c - languageName: node - linkType: hard - -"ps-tree@npm:^1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: =3.3.4 - bin: - ps-tree: ./bin/ps-tree.js - checksum: e635dd00f53d30d31696cf5f95b3a8dbdf9b1aeb36d4391578ce8e8cd22949b7c5536c73b0dc18c78615ea3ddd4be96101166be59ca2e3e3cb1e2f79ba3c7f98 - languageName: node - linkType: hard - -"psl@npm:^1.9.0": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d - languageName: node - linkType: hard - -"public-encrypt@npm:^4.0.0": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" dependencies: - bn.js: ^4.1.0 - browserify-rsa: ^4.0.0 - create-hash: ^1.1.0 - parse-asn1: ^5.0.0 - randombytes: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 215d446e43cef021a20b67c1df455e5eea134af0b1f9b8a35f9e850abf32991b0c307327bc5b9bc07162c288d5cdb3d4a783ea6c6640979ed7b5017e3e0c9935 + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 languageName: node linkType: hard @@ -9019,31 +4661,6 @@ __metadata: languageName: node linkType: hard -"pumpify@npm:^2.0.1": - version: 2.0.1 - resolution: "pumpify@npm:2.0.1" - dependencies: - duplexify: ^4.1.1 - inherits: ^2.0.3 - pump: ^3.0.0 - checksum: cfc96f5307ee828ef8e6eca9fe9e1ae1de0a23ca55688bfe71ea376bc126418073dab870f02b433617f421c4545726b39e31295fce9a99b78bda5f0e527a7c11 - languageName: node - linkType: hard - -"punycode@npm:1.3.2": - version: 1.3.2 - resolution: "punycode@npm:1.3.2" - checksum: b8807fd594b1db33335692d1f03e8beeddde6fda7fbb4a2e32925d88d20a3aa4cd8dcc0c109ccaccbd2ba761c208dfaaada83007087ea8bfb0129c9ef1b99ed6 - languageName: node - linkType: hard - -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 - languageName: node - linkType: hard - "punycode@npm:^2.1.0": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -9058,73 +4675,24 @@ __metadata: languageName: node linkType: hard -"querystring-es3@npm:~0.2.0": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61 - languageName: node - linkType: hard - -"querystring@npm:0.2.0": - version: 0.2.0 - resolution: "querystring@npm:0.2.0" - checksum: 8258d6734f19be27e93f601758858c299bdebe71147909e367101ba459b95446fbe5b975bf9beb76390156a592b6f4ac3a68b6087cea165c259705b8b4e56a69 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"queue-tick@npm:^1.0.0": - version: 1.0.0 - resolution: "queue-tick@npm:1.0.0" - checksum: 2310194a79e5e51ce2be71242e09edc0e0aebc7746a9c0714921c0360319258560fe7db48d9d095e56aa3dfc9a76b740c120f5d265f5543bb08f52e2e4dfe47c - languageName: node - linkType: hard - -"quick-lru@npm:^4.0.1": - version: 4.0.1 - resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"randomfill@npm:^1.0.3": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: ^2.0.5 - safe-buffer: ^5.1.0 - checksum: 33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7 + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd languageName: node linkType: hard -"read-only-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "read-only-stream@npm:2.0.0" - dependencies: - readable-stream: ^2.0.2 - checksum: aa48979d1f0e8a83522e60698cf3375dca7b284dd066758ded7c3539613ac08275f94dfe0503d2bdfe964ef3cb65facb87a4b3a8250e5a7e89d07af4451019d8 +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 languageName: node linkType: hard @@ -9151,7 +4719,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" dependencies: @@ -9162,27 +4730,35 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": - version: 2.3.7 - resolution: "readable-stream@npm:2.3.7" +"readable-stream@npm:^4.0.0": + version: 4.1.0 + resolution: "readable-stream@npm:4.1.0" dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: e4920cf7549a60f8aaf694d483a0e61b2a878b969d224f89b3bc788b8d920075132c4b55a7494ee944c7b6a9a0eada28a7f6220d80b0312ece70bbf08eeca755 + abort-controller: ^3.0.0 + checksum: ff2bb513af6fb43618c8360211b5b9052e25a59e6626d3669c7ba060d021dfffa43c43832e11b18acd6aac15b057c6deae1c41004c1731688c95c455ad02f982 languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" +"readable-web-to-node-stream@npm:^3.0.2": + version: 3.0.2 + resolution: "readable-web-to-node-stream@npm:3.0.2" dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + readable-stream: ^3.6.0 + checksum: 8c56cc62c68513425ddfa721954875b382768f83fa20e6b31e365ee00cbe7a3d6296f66f7f1107b16cd3416d33aa9f1680475376400d62a081a88f81f0ea7f9c + languageName: node + linkType: hard + +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 96745583ed4f82cd5c6a6af012fd1d3c6fc2f13ae1bcff1a3c4f8094696013a1a07c82c5aa66a403d7d4f84949fc2203bc927c7ad120caad125941ca2d7e5e8e + languageName: node + linkType: hard + +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: fa060f19f2f447adf678d1376928c76379dce5f72bd334da301685ca6cdcb7b11356813332cc243c88470796bc2e2b1e2917fc10df9143dd93c2ea608694971d languageName: node linkType: hard @@ -9212,29 +4788,6 @@ __metadata: languageName: node linkType: hard -"reflect-metadata@npm:^0.1.13": - version: 0.1.13 - resolution: "reflect-metadata@npm:0.1.13" - checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4 - languageName: node - linkType: hard - -"regenerate-unicode-properties@npm:^10.0.1": - version: 10.0.1 - resolution: "regenerate-unicode-properties@npm:10.0.1" - dependencies: - regenerate: ^1.4.2 - checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754 - languageName: node - linkType: hard - -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 3317a09b2f802da8db09aa276e469b57a6c0dd818347e05b8862959c6193408242f150db5de83c12c3fa99091ad95fb42a6db2c3329bfaa12a0ea4cbbeb30cb0 - languageName: node - linkType: hard - "regenerator-runtime@npm:^0.13.4": version: 0.13.9 resolution: "regenerator-runtime@npm:0.13.9" @@ -9242,26 +4795,6 @@ __metadata: languageName: node linkType: hard -"regenerator-transform@npm:^0.15.0": - version: 0.15.0 - resolution: "regenerator-transform@npm:0.15.0" - dependencies: - "@babel/runtime": ^7.8.4 - checksum: 86e54849ab1167618d28bb56d214c52a983daf29b0d115c976d79840511420049b6b42c9ebdf187defa8e7129bdd74b6dd266420d0d3868c9fa7f793b5d15d49 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - "regexpp@npm:^3.2.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -9269,38 +4802,6 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^5.1.0": - version: 5.1.0 - resolution: "regexpu-core@npm:5.1.0" - dependencies: - regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.0.1 - regjsgen: ^0.6.0 - regjsparser: ^0.8.2 - unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.0.0 - checksum: 7b4eb8d182d9d10537a220a93138df5bc7eaf4ed53e36b95e8427d33ed8a2b081468f1a15d3e5fcee66517e1df7f5ca180b999e046d060badd97150f2ffe87b2 - languageName: node - linkType: hard - -"regjsgen@npm:^0.6.0": - version: 0.6.0 - resolution: "regjsgen@npm:0.6.0" - checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348 - languageName: node - linkType: hard - -"regjsparser@npm:^0.8.2": - version: 0.8.4 - resolution: "regjsparser@npm:0.8.4" - dependencies: - jsesc: ~0.5.0 - bin: - regjsparser: bin/parser - checksum: d069b932491761cda127ce11f6bd2729c3b1b394a35200ec33f1199e937423db28ceb86cf33f0a97c76ecd7c0f8db996476579eaf0d80a1f74c1934f4ca8b27a - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -9315,15 +4816,6 @@ __metadata: languageName: node linkType: hard -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - "resolve-dir@npm:^1.0.0, resolve-dir@npm:^1.0.1": version: 1.0.1 resolution: "resolve-dir@npm:1.0.1" @@ -9357,14 +4849,7 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^1.1.0": - version: 1.1.0 - resolution: "resolve.exports@npm:1.1.0" - checksum: 52865af8edb088f6c7759a328584a5de6b226754f004b742523adcfe398cfbc4559515104bc2ae87b8e78b1e4de46c9baec400b3fb1f7d517b86d2d48a098a2d - languageName: node - linkType: hard - -"resolve@npm:^1.1.4, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.4.0": +"resolve@npm:^1.10.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -9377,7 +4862,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.4.0#~builtin": +"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" dependencies: @@ -9400,6 +4885,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -9414,14 +4906,14 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.3.0": +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.0": version: 1.3.0 resolution: "rfdc@npm:1.3.0" checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -9432,13 +4924,17 @@ __metadata: languageName: node linkType: hard -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" +"rollup@npm:^2.75.6": + version: 2.77.2 + resolution: "rollup@npm:2.77.2" dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 5a84fb98a6f858906bceba091430442f6c1f362b07c5fa9123b708f87e39f52640e34a189cd9a1776ceae61300055c78ba648205fa03188451539ebeb19797df languageName: node linkType: hard @@ -9467,31 +4963,40 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 languageName: node linkType: hard -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c +"safe-regex2@npm:^2.0.0": + version: 2.0.0 + resolution: "safe-regex2@npm:2.0.0" + dependencies: + ret: ~0.2.0 + checksum: f5e182fca040dedd50ae052ea0eb035d9903b2db71243d5d8b43299735857288ef2ab52546a368d9c6fd1333b2a0d039297925e78ffc14845354f3f6158af7c2 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.3.1 + resolution: "safe-stable-stringify@npm:2.3.1" + checksum: a0a0bad0294c3e2a9d1bf3cf2b1096dfb83c162d09a5e4891e488cce082120bd69161d2a92aae7fc48255290f17700decae9c89a07fe139794e61b5c8b411377 languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 languageName: node linkType: hard -"sax@npm:>=0.6.0": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe +"secure-json-parse@npm:^2.4.0": + version: 2.4.0 + resolution: "secure-json-parse@npm:2.4.0" + checksum: efaafcaa08a4646ca829b29168474f57fb289a0ca7a1d77b66b55a0292785bc6eb9143b21cfc50b37dd12a823c25b12aa1771f18314ed5a616a1f8f12a318533 languageName: node linkType: hard @@ -9504,15 +5009,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.0.0": - version: 7.0.0 - resolution: "semver@npm:7.0.0" - bin: - semver: bin/semver.js - checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778 - languageName: node - linkType: hard - "semver@npm:7.3.7, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.7 resolution: "semver@npm:7.3.7" @@ -9524,15 +5020,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -9540,24 +5027,10 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - bin: - sha.js: ./bin.js - checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 - languageName: node - linkType: hard - -"shasum-object@npm:^1.0.0": - version: 1.0.0 - resolution: "shasum-object@npm:1.0.0" - dependencies: - fast-safe-stringify: ^2.0.7 - checksum: fc3531b7ae6ca1cc76138bec54896ee61ff4e7cc62e37ebd47963c8c92f867c6232332e21437dbca60c9109e077b38ece631b59b045e10e0502949363e337895 +"set-cookie-parser@npm:^2.4.1": + version: 2.5.1 + resolution: "set-cookie-parser@npm:2.5.1" + checksum: b99c37f976e68ae6eb7c758bf2bbce1e60bb54e3eccedaa25f2da45b77b9cab58d90674cf9edd7aead6fbeac6308f2eb48713320a47ca120d0e838d0194513b6 languageName: node linkType: hard @@ -9577,141 +5050,95 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1": - version: 1.7.3 - resolution: "shell-quote@npm:1.7.3" - checksum: aca58e73a3a5d933d02e0bdddedc53ee14f7c2ec264f97ac915b9d4482d077a38e422aa664631d60a672cd3cdb4054eb2e6c0303f54882453dacb6483e482d34 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard -"simple-concat@npm:^1.0.0": - version: 1.0.1 - resolution: "simple-concat@npm:1.0.1" - checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a - languageName: node - linkType: hard - -"single-line-log@npm:^1.0.1": - version: 1.1.2 - resolution: "single-line-log@npm:1.1.2" +"skyra-gateway@workspace:projects/gateway": + version: 0.0.0-use.local + resolution: "skyra-gateway@workspace:projects/gateway" dependencies: - string-width: ^1.0.1 - checksum: 059824dcf984184c023acab0e4d7e2154751afa253d8a239fe46bc22f6cfc0de75d356672755325e24109257c809b5996b21439c8d06ce8825aa224e62780236 - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 - languageName: node - linkType: hard + "@discordjs/rest": ^1.0.1 + "@discordjs/ws": ^0.2.0 + "@sapphire/utilities": ^3.8.0 + "@skyra/env-utilities": ^1.0.2 + "@skyra/start-banner": ^1.0.2 + discord-api-types: ^0.37.0 + gradient-string: ^2.0.1 + skyra-shared: "workspace:^" + typescript: ^4.7.4 + languageName: unknown + linkType: soft -"skyra@workspace:.": +"skyra-root@workspace:.": version: 0.0.0-use.local - resolution: "skyra@workspace:." - dependencies: - 0x: ^5.4.0 - "@babel/core": ^7.18.9 - "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-decorators": ^7.18.9 - "@babel/preset-env": ^7.18.9 - "@babel/preset-typescript": ^7.18.6 + resolution: "skyra-root@workspace:." + dependencies: "@commitlint/cli": ^17.0.3 "@commitlint/config-conventional": ^17.0.3 - "@discordjs/builders": ^1.0.0 - "@discordjs/collection": ^1.0.0 - "@influxdata/influxdb-client": ^1.27.0 - "@influxdata/influxdb-client-apis": ^1.27.0 - "@napi-rs/canvas": ^0.1.25 - "@sapphire/async-queue": ^1.3.2 - "@sapphire/decorators": ^4.3.8 - "@sapphire/discord.js-utilities": ^4.11.3 "@sapphire/eslint-config": ^4.3.7 - "@sapphire/fetch": ^2.4.1 - "@sapphire/framework": ^2.5.1 - "@sapphire/plugin-api": ^3.2.4 - "@sapphire/plugin-editable-commands": ^1.2.2 - "@sapphire/plugin-i18next": ^2.5.4 - "@sapphire/plugin-logger": ^2.2.3 - "@sapphire/plugin-subcommands": ^2.2.2 "@sapphire/prettier-config": ^1.4.3 - "@sapphire/ratelimits": ^2.4.4 - "@sapphire/snowflake": ^3.2.2 - "@sapphire/stopwatch": ^1.4.1 - "@sapphire/time-utilities": ^1.7.5 "@sapphire/ts-config": ^3.3.4 - "@sapphire/type": ^2.2.4 - "@sapphire/utilities": ^3.7.0 - "@sentry/integrations": ^7.7.0 - "@sentry/node": ^7.7.0 - "@skyra/ai": ^1.2.0 - "@skyra/char": ^1.0.2 - "@skyra/env-utilities": ^1.0.2 - "@skyra/gifenc": ^1.0.0 - "@skyra/jaro-winkler": ^1.1.0 - "@skyra/saelem": ^3.0.34 - "@skyra/star-wars-api": ^2.0.30 - "@skyra/tags": ^1.1.3 - "@types/backoff": ^2.5.2 - "@types/diff": ^5.0.2 - "@types/he": ^1.1.2 - "@types/jest": ^28.1.6 - "@types/node": ^18.0.6 - "@types/pg": ^8.6.5 - "@types/ws": ^8.5.3 - "@typescript-eslint/eslint-plugin": ^5.30.7 - "@typescript-eslint/parser": ^5.30.7 - async-rwlock: ^1.1.1 - babel-plugin-const-enum: ^1.2.0 - bufferutil: ^4.0.6 - canvas-constructor: ^6.0.2 - colorette: ^2.0.19 - confusables: ^1.1.1 + "@types/gradient-string": ^1.1.2 + "@types/node": ^18.6.3 + "@typescript-eslint/eslint-plugin": ^5.32.0 + "@typescript-eslint/parser": ^5.32.0 cz-conventional-changelog: ^3.3.0 - diff: ^5.1.0 - discord-api-types: ~0.33.5 - discord.js: ^13.9.1 - eslint: ^8.20.0 + eslint: ^8.21.0 eslint-config-prettier: ^8.5.0 eslint-plugin-prettier: ^4.2.1 - he: ^1.2.0 husky: ^8.0.1 - ioredis: ^5.2.2 - jest: ^28.1.3 - jest-mock-random: ^1.1.1 lint-staged: ^13.0.3 - nock: ^13.2.9 - pg: ^8.7.3 prettier: ^2.7.1 pretty-quick: ^3.1.3 - ts-node: ^10.9.1 - tsc-watch: ^5.0.3 - tslib: 1.11.2 - typeorm: 0.2.28 - typeorm-naming-strategies: ^2.0.0 + prisma: ^4.1.1 + typescript: ^4.7.4 + vitest: ^0.20.2 + languageName: unknown + linkType: soft + +"skyra-shared@workspace:^, skyra-shared@workspace:projects/shared": + version: 0.0.0-use.local + resolution: "skyra-shared@workspace:projects/shared" + dependencies: + "@discordjs/collection": ^1.0.1 + "@sapphire/pieces": ^3.3.5 + "@sapphire/result": ^2.1.1 + "@sapphire/utilities": ^3.8.0 + "@vladfrangu/async_event_emitter": ^2.0.1 + discord-api-types: ^0.37.0 + ioredis: ^5.2.2 + ix: ^5.0.0 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + +"skyra@workspace:projects/bot": + version: 0.0.0-use.local + resolution: "skyra@workspace:projects/bot" + dependencies: + "@discordjs/builders": ^1.1.0 + "@discordjs/collection": ^1.0.1 + "@prisma/client": ^4.1.1 + "@sapphire/async-queue": ^1.3.2 + "@sapphire/result": ^2.1.1 + "@sapphire/utilities": ^3.8.0 + "@sentry/integrations": ^7.8.0 + "@sentry/node": ^7.8.0 + "@skyra/env-utilities": ^1.0.2 + "@skyra/http-framework": ^0.7.0 + "@skyra/http-framework-i18n": ^0.2.0 + "@skyra/shared-http-pieces": ^0.0.40 + "@skyra/start-banner": ^1.0.2 + colorette: ^2.0.19 + discord-api-types: ^0.37.0 + gradient-string: ^2.0.1 + skyra-shared: "workspace:^" + tslib: ^2.4.0 typescript: ^4.7.4 - utf-8-validate: ^5.0.9 - ws: ^8.8.1 - zlib-sync: ^0.1.7 languageName: unknown linkType: soft @@ -9782,34 +5209,19 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" +"sonic-boom@npm:^3.1.0": + version: 3.2.0 + resolution: "sonic-boom@npm:3.2.0" dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + atomic-sleep: ^1.0.0 + checksum: 526669b78e0ac3bcbe2a53e5ac8960d3b25e61d8e6a46eaed5a0c46d7212c5f638bb136236870babedfcb626063711ba8f81e538f88b79e6a90a5b2ff71943b4 languageName: node linkType: hard -"source-map@npm:^0.5.6, source-map@npm:~0.5.3": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"sourcemap-codec@npm:^1.4.1": - version: 1.4.8 - resolution: "sourcemap-codec@npm:1.4.8" - checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c languageName: node linkType: hard @@ -9856,29 +5268,13 @@ __metadata: languageName: node linkType: hard -"split2@npm:^4.0.0, split2@npm:^4.1.0": +"split2@npm:^4.0.0": version: 4.1.0 resolution: "split2@npm:4.1.0" checksum: ec581597cb74c13cdfb5e2047543dd40cb1e8e9803c7b1e0c29ede05f2b4f049b2d6e7f2788a225d544549375719658b8f38e9366364dec35dc7a12edfda5ee5 languageName: node linkType: hard -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: 2 - checksum: 2e076634c9637cfdc54ab4387b6a243b8c33b360874a25adf6f327a5647f07cb3bf1c755d515248eb3afee4e382278d01f62c62d87263c118f28065b86f74f02 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - "ssri@npm:^9.0.0": version: 9.0.1 resolution: "ssri@npm:9.0.1" @@ -9888,15 +5284,6 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": - version: 2.0.5 - resolution: "stack-utils@npm:2.0.5" - dependencies: - escape-string-regexp: ^2.0.0 - checksum: 76b69da0f5b48a34a0f93c98ee2a96544d2c4ca2557f7eef5ddb961d3bdc33870b46f498a84a7c4f4ffb781df639840e7ebf6639164ed4da5e1aeb659615b9c7 - languageName: node - linkType: hard - "standard-as-callback@npm:^2.1.0": version: 2.1.0 resolution: "standard-as-callback@npm:2.1.0" @@ -9904,71 +5291,6 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: ~2.0.4 - readable-stream: ^3.5.0 - checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 - languageName: node - linkType: hard - -"stream-combiner2@npm:^1.1.1": - version: 1.1.1 - resolution: "stream-combiner2@npm:1.1.1" - dependencies: - duplexer2: ~0.1.0 - readable-stream: ^2.0.2 - checksum: dd32d179fa8926619c65471a7396fc638ec8866616c0b8747c4e05563ccdb0b694dd4e83cd799f1c52789c965a40a88195942b82b8cea2ee7a5536f1954060f9 - languageName: node - linkType: hard - -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: ~0.1.1 - checksum: 844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d - languageName: node - linkType: hard - -"stream-http@npm:^3.0.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" - dependencies: - builtin-status-codes: ^3.0.0 - inherits: ^2.0.4 - readable-stream: ^3.6.0 - xtend: ^4.0.2 - checksum: c9b78453aeb0c84fcc59555518ac62bacab9fa98e323e7b7666e5f9f58af8f3155e34481078509b02929bd1268427f664d186604cdccee95abc446099b339f83 - languageName: node - linkType: hard - -"stream-shift@npm:^1.0.0": - version: 1.0.1 - resolution: "stream-shift@npm:1.0.1" - checksum: 59b82b44b29ec3699b5519a49b3cedcc6db58c72fb40c04e005525dfdcab1c75c4e0c180b923c380f204bed78211b9bad8faecc7b93dece4d004c3f6ec75737b - languageName: node - linkType: hard - -"stream-splicer@npm:^2.0.0": - version: 2.0.1 - resolution: "stream-splicer@npm:2.0.1" - dependencies: - inherits: ^2.0.1 - readable-stream: ^2.0.2 - checksum: 7bb3563961450e69183baa04272e042bdd7df44f6d75bf1cce0d6a628efd2d4b0a0d2a290bed0674ea7719c87e6cf6bf7406ca1d17413abf1484430d36d65580 - languageName: node - linkType: hard - -"string-argv@npm:^0.1.1": - version: 0.1.2 - resolution: "string-argv@npm:0.1.2" - checksum: 6877bd72af145f6e6eafa932818014a57b2f39225c924562b7fccb50f1fcee73717bbcd5e528fd4d86cec32835c14749c32a9d35f06e0bf96637d1e73158203f - languageName: node - linkType: hard - "string-argv@npm:^0.3.1": version: 0.3.1 resolution: "string-argv@npm:0.3.1" @@ -9976,27 +5298,6 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: ^1.0.2 - strip-ansi: ^6.0.0 - checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 - languageName: node - linkType: hard - -"string-width@npm:^1.0.1": - version: 1.0.2 - resolution: "string-width@npm:1.0.2" - dependencies: - code-point-at: ^1.0.0 - is-fullwidth-code-point: ^1.0.0 - strip-ansi: ^3.0.0 - checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e - languageName: node - linkType: hard - "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -10019,28 +5320,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 - languageName: node - linkType: hard - "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -10050,24 +5329,6 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: ^2.0.0 - checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 - languageName: node - linkType: hard - "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -10086,7 +5347,7 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:4.0.0, strip-bom@npm:^4.0.0": +"strip-bom@npm:4.0.0": version: 4.0.0 resolution: "strip-bom@npm:4.0.0" checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 @@ -10123,19 +5384,13 @@ __metadata: languageName: node linkType: hard -"subarg@npm:^1.0.0": - version: 1.0.0 - resolution: "subarg@npm:1.0.0" +"strtok3@npm:^7.0.0-alpha.9": + version: 7.0.0-alpha.9 + resolution: "strtok3@npm:7.0.0-alpha.9" dependencies: - minimist: ^1.1.0 - checksum: 8359df72e9a2d03c35702ba58e49cac04daae8f27dff26837e12687c7d10cb800a036fd33fdc5eb0e8c24fb25d804f657fe8bde18dd3dd6ec7dab8eff7aac27e - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0 + "@tokenizer/token": ^0.3.0 + peek-readable: ^5.0.0-alpha.5 + checksum: 30639f4f57685617eb3f7c6345249f2795d2d6ba820965fc0bc314eb08183931c6beb38dbbbbadb233eda0499f090e80894f4e356b95492e611d7d0ff4f29ea5 languageName: node linkType: hard @@ -10143,36 +5398,17 @@ __metadata: version: 5.5.0 resolution: "supports-color@npm:5.5.0" dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac languageName: node linkType: hard -"supports-hyperlinks@npm:^2.0.0": - version: 2.2.0 - resolution: "supports-hyperlinks@npm:2.2.0" +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" dependencies: has-flag: ^4.0.0 - supports-color: ^7.0.0 - checksum: aef04fb41f4a67f1bc128f7c3e88a81b6cf2794c800fccf137006efe5bafde281da3e42e72bf9206c2fcf42e6438f37e3a820a389214d0a88613ca1f2d36076a + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a languageName: node linkType: hard @@ -10183,22 +5419,6 @@ __metadata: languageName: node linkType: hard -"syntax-error@npm:^1.1.1": - version: 1.4.0 - resolution: "syntax-error@npm:1.4.0" - dependencies: - acorn-node: ^1.2.0 - checksum: c1c3f048fed1948865fda5e79e11b02addb32da323c9c9fb214d3a933f9fda668e55c848f7c4082514ea4f1cf3dcfab0c7b9c762bfad1306271753c0fcc4b14f - languageName: node - linkType: hard - -"tachyons@npm:^4.9.1": - version: 4.12.0 - resolution: "tachyons@npm:4.12.0" - checksum: 7f31c80eaf5109c1cf4ccf1073b9b9aed8fcae21cd7558101171bbb939256a5a258a04cba8b745d6ba6713ed9328304041dcc666f7eef44950d2bc2fd3c55cbc - languageName: node - linkType: hard - "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.11 resolution: "tar@npm:6.1.11" @@ -10213,27 +5433,6 @@ __metadata: languageName: node linkType: hard -"terminal-link@npm:^2.0.0": - version: 2.1.1 - resolution: "terminal-link@npm:2.1.1" - dependencies: - ansi-escapes: ^4.2.1 - supports-hyperlinks: ^2.0.0 - checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f - languageName: node - linkType: hard - -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": ^0.1.2 - glob: ^7.1.4 - minimatch: ^3.0.4 - checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 - languageName: node - linkType: hard - "text-extensions@npm:^1.0.0": version: 1.9.0 resolution: "text-extensions@npm:1.9.0" @@ -10248,41 +5447,12 @@ __metadata: languageName: node linkType: hard -"thenify-all@npm:^1.0.0": - version: 1.6.0 - resolution: "thenify-all@npm:1.6.0" - dependencies: - thenify: ">= 3.1.0 < 4" - checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e - languageName: node - linkType: hard - -"thenify@npm:>= 3.1.0 < 4": - version: 3.3.1 - resolution: "thenify@npm:3.3.1" - dependencies: - any-promise: ^1.0.0 - checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e - languageName: node - linkType: hard - -"through2@npm:^2.0.0, through2@npm:^2.0.3": - version: 2.0.5 - resolution: "through2@npm:2.0.5" - dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 - languageName: node - linkType: hard - -"through2@npm:^3.0.1": - version: 3.0.2 - resolution: "through2@npm:3.0.2" +"thread-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "thread-stream@npm:2.0.0" dependencies: - inherits: ^2.0.4 - readable-stream: 2 || 3 - checksum: 47c9586c735e7d9cbbc1029f3ff422108212f7cc42e06d5cc9fff7901e659c948143c790e0d0d41b1b5f89f1d1200bdd200c7b72ad34f42f9edbeb32ea49e8b7 + real-require: ^0.1.0 + checksum: 5156f2bda7dace42acf7ac93de801ac13c15247a28e62c28d92c3e91f78fdbcc423047d14cbcfaa1e35ad2c119a256cf6c2da5ed5eec69c6481dee3a798c7d56 languageName: node linkType: hard @@ -10295,42 +5465,57 @@ __metadata: languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8, through@npm:~2.3, through@npm:~2.3.1": +"through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd languageName: node linkType: hard -"timers-browserify@npm:^1.0.1": +"tiny-lru@npm:^8.0.2": + version: 8.0.2 + resolution: "tiny-lru@npm:8.0.2" + checksum: ec4d884914626760eef05cd57850f21a153adeeb7c4242eb8d44a031f1bd8489f18c1bf5d6f10f0a11c5dcfe03b302f26b00f2b879b38853599486bf0dca8c97 + languageName: node + linkType: hard + +"tinycolor2@npm:^1.0.0": version: 1.4.2 - resolution: "timers-browserify@npm:1.4.2" - dependencies: - process: ~0.11.0 - checksum: b7437e228684d8e6e193580d363ffdcd752396c0d1013503f50e412aa86e920248a8627450ad40557443e07ef6b9b602ffc940b3ba06db23774a7ab507e1911d + resolution: "tinycolor2@npm:1.4.2" + checksum: 57ed262e08815a4ab0ed933edafdbc6555a17081781766149813b44a080ecbe58b3ee281e81c0e75b42e4d41679f138cfa98eabf043f829e0683c04adb12c031 languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" +"tinygradient@npm:^1.1.5": + version: 1.1.5 + resolution: "tinygradient@npm:1.1.5" dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + "@types/tinycolor2": ^1.4.0 + tinycolor2: ^1.0.0 + checksum: d41771d553fff884830f60029ba32163066221f1c6ea28ddf9751b10d54015fa47597bdefa164e20434ba3018e499dbd17b465fd43a095c587cac28bb7de5a0e languageName: node linkType: hard -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 +"tinypool@npm:^0.2.4": + version: 0.2.4 + resolution: "tinypool@npm:0.2.4" + checksum: f050bd36c89529a2a0d3f9c1fdbba3f317114e3ee6eb5d5ba72c51e887d45ef3ef8d8533fb2ca2eba7189d19d2231712b81b3a75e099248532f5563369929c33 languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 +"tinyspy@npm:^1.0.0": + version: 1.0.0 + resolution: "tinyspy@npm:1.0.0" + checksum: f9a7cea406db9b0f99a4ef162eb0a45d88fc36facbc309702c8d568283baa363ab3c4138d8402fbfdef7a8d3157ff7cfae3e99ec6c75d8f684bd7b23485b5ec5 + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: ~1.0.2 + checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 languageName: node linkType: hard @@ -10343,25 +5528,13 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - -"transform-ast@npm:^2.4.0": - version: 2.4.4 - resolution: "transform-ast@npm:2.4.4" +"token-types@npm:^5.0.0-alpha.2": + version: 5.0.0-alpha.2 + resolution: "token-types@npm:5.0.0-alpha.2" dependencies: - acorn-node: ^1.3.0 - convert-source-map: ^1.5.1 - dash-ast: ^1.0.0 - is-buffer: ^2.0.0 - magic-string: ^0.23.2 - merge-source-map: 1.0.4 - nanobench: ^2.1.1 - checksum: 4ac71140073a7200af781f4d0b66e2ae6cdce50c1b604047eb30cad3a0cf9a3c784bb621e9eac2fa9c95ee0f440a5523b4e4dee3bc244c84ce9b891b17dd6fd9 + "@tokenizer/token": ^0.3.0 + ieee754: ^1.2.1 + checksum: ee23eeed6f383b1072d99781d62fc7840f1296a96d47e636e36fca757debd7eb4274d31fcd2d56997606eede00b12b1e61a64610fe0ed7807d6b1c4dcf5ccc6b languageName: node linkType: hard @@ -10379,7 +5552,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.8.1, ts-node@npm:^10.9.1": +"ts-node@npm:^10.8.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -10417,38 +5590,14 @@ __metadata: languageName: node linkType: hard -"tsc-watch@npm:^5.0.3": - version: 5.0.3 - resolution: "tsc-watch@npm:5.0.3" - dependencies: - cross-spawn: ^7.0.3 - node-cleanup: ^2.1.2 - ps-tree: ^1.2.0 - string-argv: ^0.1.1 - strip-ansi: ^6.0.0 - peerDependencies: - typescript: "*" - bin: - tsc-watch: index.js - checksum: abd63295dd5fda098a45d27912031e6c35a95f1aa20d7a86d6ad1469580400069e6476f2ffd4b88e37886d016443e60b1ae2dbcaf756e324efc67d0fa713fb15 - languageName: node - linkType: hard - -"tslib@npm:1.11.2": - version: 1.11.2 - resolution: "tslib@npm:1.11.2" - checksum: f5d6d740a775fc130a96edf96735e81ecd27f41d81b2d40ed1aa4220a39b4dbb24c1b754cf43ddcb9fb82197f0fbe3bb58613bd7cb2b584a5b1dc668467c6945 - languageName: node - linkType: hard - -"tslib@npm:^1.13.0, tslib@npm:^1.8.1, tslib@npm:^1.9.3": +"tslib@npm:^1.8.1, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 @@ -10466,10 +5615,10 @@ __metadata: languageName: node linkType: hard -"tty-browserify@npm:0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 +"tweetnacl@npm:^1.0.3": + version: 1.0.3 + resolution: "tweetnacl@npm:1.0.3" + checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c languageName: node linkType: hard @@ -10482,14 +5631,7 @@ __metadata: languageName: node linkType: hard -"type-component@npm:0.0.1": - version: 0.0.1 - resolution: "type-component@npm:0.0.1" - checksum: d16f84abafe6bfa3d9f921848bb9fb0f512328bbc1b616d86ecfc878b847c2c22a96501ac64f78279a34553e809c988bfcc363fbd1ff11cf2f604c281d7c30d3 - languageName: node - linkType: hard - -"type-detect@npm:4.0.8": +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -10531,48 +5673,6 @@ __metadata: languageName: node linkType: hard -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 - languageName: node - linkType: hard - -"typeorm-naming-strategies@npm:^2.0.0": - version: 2.0.0 - resolution: "typeorm-naming-strategies@npm:2.0.0" - peerDependencies: - typeorm: ^0.2.0 - checksum: c75a1529bb3c1dfde40530a398e77396fe69a25cbeed70e7aa49d67ab0348e61c129f7b181ee9469901036f81a9493d027d00cd536215953b233f691480368f0 - languageName: node - linkType: hard - -"typeorm@npm:0.2.28": - version: 0.2.28 - resolution: "typeorm@npm:0.2.28" - dependencies: - "@sqltools/formatter": 1.2.2 - app-root-path: ^3.0.0 - buffer: ^5.5.0 - chalk: ^4.1.0 - cli-highlight: ^2.1.4 - debug: ^4.1.1 - dotenv: ^8.2.0 - glob: ^7.1.6 - js-yaml: ^3.14.0 - mkdirp: ^1.0.4 - reflect-metadata: ^0.1.13 - sha.js: ^2.4.11 - tslib: ^1.13.0 - xml2js: ^0.4.23 - yargonaut: ^1.1.2 - yargs: ^16.0.3 - bin: - typeorm: cli.js - checksum: 1c58cbb3fcac85ffdf24da2b5271f48779363bbdd18cb5f50702bc84dffad6607aa33dc6144aed6b18974ddc0419256f84084496c42485746a74cd2941264704 - languageName: node - linkType: hard - "typescript@npm:^4.6.3, typescript@npm:^4.6.4, typescript@npm:^4.7.3, typescript@npm:^4.7.4": version: 4.7.4 resolution: "typescript@npm:4.7.4" @@ -10593,70 +5693,10 @@ __metadata: languageName: node linkType: hard -"umd@npm:^3.0.0": - version: 3.0.3 - resolution: "umd@npm:3.0.3" - bin: - umd: ./bin/cli.js - checksum: 264302acabbc71ef279cfb832d6bb53096a12618e9ef8465b274c5a3fffa5f4da6cf7b8d024fec53a7114742c132bba9f6a6d4d4b5eca2bb55d556d0c57a9f15 - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 - languageName: node - linkType: hard - -"undeclared-identifiers@npm:^1.1.2": - version: 1.1.3 - resolution: "undeclared-identifiers@npm:1.1.3" - dependencies: - acorn-node: ^1.3.0 - dash-ast: ^1.0.0 - get-assigned-identifiers: ^1.2.0 - simple-concat: ^1.0.0 - xtend: ^4.0.1 - bin: - undeclared-identifiers: bin.js - checksum: e1f2a18d7bf735ec2b9ee464a621d8db72768e75e59334d34d1f7085e21558c621cc105dfd4cc7a0a219b91c43b71fbdea0508cdbe3b3396ed96902c6d5d590e - languageName: node - linkType: hard - -"unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-ecmascript@npm:2.0.0" - dependencies: - unicode-canonical-property-names-ecmascript: ^2.0.0 - unicode-property-aliases-ecmascript: ^2.0.0 - checksum: 1f34a7434a23df4885b5890ac36c5b2161a809887000be560f56ad4b11126d433c0c1c39baf1016bdabed4ec54829a6190ee37aa24919aa116dc1a5a8a62965a - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.0.0" - checksum: 8fe6a09d9085a625cabcead5d95bdbc1a2d5d481712856092ce0347231e81a60b93a68f1b69e82b3076a07e415a72c708044efa2aa40ae23e2e7b5c99ed4a9ea - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" - checksum: dda4d39128cbbede2ac60fbb85493d979ec65913b8a486bf7cb7a375a2346fa48cbf9dc6f1ae23376e7e8e684c2b411434891e151e865a661b40a85407db51d0 +"undici@npm:^5.8.0": + version: 5.8.0 + resolution: "undici@npm:5.8.0" + checksum: 7b486ad064da00628d3906e140b86223023cd3494c811da8d7aa1375c2392fe6a6ac421af236c056fd3d3136bba3a91b99e0505dde071dd946070946eb0718b8 languageName: node linkType: hard @@ -10685,27 +5725,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.4": - version: 1.0.5 - resolution: "update-browserslist-db@npm:1.0.5" - dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - browserslist-lint: cli.js - checksum: 7e425fe5dbbebdccf72a84ce70ec47fc74dce561d28f47bc2b84a1c2b84179a862c2261b18ab66a5e73e261c7e2ef9e11c6129112989d4d52e8f75a56bb923f8 - languageName: node - linkType: hard - -"upper-case@npm:^1.1.1": - version: 1.1.3 - resolution: "upper-case@npm:1.1.3" - checksum: 991c845de75fa56e5ad983f15e58494dd77b77cadd79d273cc11e8da400067e9881ae1a52b312aed79b3d754496e2e0712e08d22eae799e35c7f9ba6f3d8a85d - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -10715,63 +5734,13 @@ __metadata: languageName: node linkType: hard -"url@npm:~0.11.0": - version: 0.11.0 - resolution: "url@npm:0.11.0" - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - checksum: 50d100d3dd2d98b9fe3ada48cadb0b08aa6be6d3ac64112b867b56b19be4bfcba03c2a9a0d7922bfd7ac17d4834e88537749fe182430dfd9b68e520175900d90 - languageName: node - linkType: hard - -"utf-8-validate@npm:^5.0.9": - version: 5.0.9 - resolution: "utf-8-validate@npm:5.0.9" - dependencies: - node-gyp: latest - node-gyp-build: ^4.3.0 - checksum: 90117f1b65e0a1256c83dfad529983617263b622f2379745311d0438c7ea31db0d134ebd0dca84c3f5847a3560a3d249644e478a9109c616f63c7ea19cac53dc - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 languageName: node linkType: hard -"util-extend@npm:^1.0.1": - version: 1.0.3 - resolution: "util-extend@npm:1.0.3" - checksum: da57f399b331f40fe2cea5409b1f4939231433db9b52dac5593e4390a98b7b0d1318a0daefbcc48123fffe5026ef49f418b3e4df7a4cd7649a2583e559c608a5 - languageName: node - linkType: hard - -"util@npm:0.10.3": - version: 0.10.3 - resolution: "util@npm:0.10.3" - dependencies: - inherits: 2.0.1 - checksum: bd800f5d237a82caddb61723a6cbe45297d25dd258651a31335a4d5d981fd033cb4771f82db3d5d59b582b187cb69cfe727dc6f4d8d7826f686ee6c07ce611e0 - languageName: node - linkType: hard - -"util@npm:~0.12.0": - version: 0.12.4 - resolution: "util@npm:0.12.4" - dependencies: - inherits: ^2.0.3 - is-arguments: ^1.0.4 - is-generator-function: ^1.0.7 - is-typed-array: ^1.1.3 - safe-buffer: ^5.1.2 - which-typed-array: ^1.1.2 - checksum: 8eac7a6e6b341c0f1b3eb73bbe5dfcae31a7e9699c8fc3266789f3e95f7637946a7700dcf1904dbd3749a58a36760ebf7acf4bb5b717f7468532a8a79f44eff0 - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -10786,17 +5755,6 @@ __metadata: languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.1": - version: 9.0.1 - resolution: "v8-to-istanbul@npm:9.0.1" - dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 - languageName: node - linkType: hard - "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -10807,19 +5765,74 @@ __metadata: languageName: node linkType: hard -"vm-browserify@npm:^1.0.0": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10a1c50aab54ff8b4c9042c15fc64aefccce8d2fb90c0640403242db0ee7fb269f9b102bdb69cfb435d7ef3180d61fd4fb004a043a12709abaf9056cfd7e039d +"vite@npm:^2.9.12 || ^3.0.0-0": + version: 3.0.3 + resolution: "vite@npm:3.0.3" + dependencies: + esbuild: ^0.14.47 + fsevents: ~2.3.2 + postcss: ^8.4.14 + resolve: ^1.22.1 + rollup: ^2.75.6 + peerDependencies: + less: "*" + sass: "*" + stylus: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 0b15d6bb062ab56dd8a0d47262344dcb48423d658c153c88a8a41f9301a70f32dd0fa2c037fa39a0a7888be1005cb763aad94235f82439441a13cef5103c29c4 languageName: node linkType: hard -"walker@npm:^1.0.8": - version: 1.0.8 - resolution: "walker@npm:1.0.8" +"vitest@npm:^0.20.2": + version: 0.20.2 + resolution: "vitest@npm:0.20.2" dependencies: - makeerror: 1.0.12 - checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + "@types/chai": ^4.3.1 + "@types/chai-subset": ^1.3.3 + "@types/node": "*" + chai: ^4.3.6 + debug: ^4.3.4 + local-pkg: ^0.4.2 + tinypool: ^0.2.4 + tinyspy: ^1.0.0 + vite: ^2.9.12 || ^3.0.0-0 + peerDependencies: + "@edge-runtime/vm": "*" + "@vitest/browser": "*" + "@vitest/ui": "*" + c8: "*" + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + c8: + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: eea156689f119bd45cf3cfaa2d0af42f3c86e3952fd4cec0e8b6ee67da9b4ad4266180573f6750293285324f40535b698795eff520da535419fff076d1e3bc3a languageName: node linkType: hard @@ -10832,50 +5845,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.2": - version: 1.1.8 - resolution: "which-typed-array@npm:1.1.8" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.20.0 - for-each: ^0.3.3 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.9 - checksum: bedf4d30a738e848404fe67fe0ace33433a7298cf3f5a4d4b2c624ba99c4d25f06a7fd6f3566c3d16af5f8a54f0c6293cbfded5b1208ce11812753990223b45a - languageName: node - linkType: hard - "which@npm:^1.2.14": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -10898,7 +5867,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -10943,16 +5912,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.1": - version: 4.0.1 - resolution: "write-file-atomic@npm:4.0.1" - dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 8f780232533ca6223c63c9b9c01c4386ca8c625ebe5017a9ed17d037aec19462ae17109e0aa155bff5966ee4ae7a27b67a99f55caf3f32ffd84155e9da3929fc - languageName: node - linkType: hard - "ws@npm:^8.8.1": version: 8.8.1 resolution: "ws@npm:8.8.1" @@ -10968,30 +5927,6 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:^0.4.23": - version: 0.4.23 - resolution: "xml2js@npm:0.4.23" - dependencies: - sax: ">=0.6.0" - xmlbuilder: ~11.0.0 - checksum: ca0cf2dfbf6deeaae878a891c8fbc0db6fd04398087084edf143cdc83d0509ad0fe199b890f62f39c4415cf60268a27a6aed0d343f0658f8779bd7add690fa98 - languageName: node - linkType: hard - -"xmlbuilder@npm:~11.0.0": - version: 11.0.1 - resolution: "xmlbuilder@npm:11.0.1" - checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 - languageName: node - linkType: hard - -"xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:^4.0.2, xtend@npm:~4.0.1": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a - languageName: node - linkType: hard - "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -11020,18 +5955,7 @@ __metadata: languageName: node linkType: hard -"yargonaut@npm:^1.1.2": - version: 1.1.4 - resolution: "yargonaut@npm:1.1.4" - dependencies: - chalk: ^1.1.1 - figlet: ^1.1.1 - parent-require: ^1.0.0 - checksum: d0ffc310a761782ae38022d88e13e84486080b2be2c43e8d5cbb987e40c3d2dd18274c39ce34e05d6bc312a4e768cd4c469d338ed60409adf6f4d870017c63a3 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 @@ -11045,22 +5969,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.0.0, yargs@npm:^16.0.3": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.0.0, yargs@npm:^17.3.1": +"yargs@npm:^17.0.0": version: 17.5.1 resolution: "yargs@npm:17.5.1" dependencies: @@ -11088,13 +5997,3 @@ __metadata: checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard - -"zlib-sync@npm:^0.1.7": - version: 0.1.7 - resolution: "zlib-sync@npm:0.1.7" - dependencies: - nan: ^2.14.0 - node-gyp: latest - checksum: 8f6ef7bf5726b41fefffa4509f5679872b425ef47227a59d8c787b32518db6220961262f78b0f6eb1dcd9b52cd71bc8213d4f061b8b56a9b7e82c345a548e6f4 - languageName: node - linkType: hard

Antonio Román

️️️️♿️ 🔊 🐛 💻 🎨 📖 🤔 🚇 🚧 📦 📆 💬 👀 🛡️ ⚠️ 🌍

Aura Román

️️️️♿️ 🔊 🐛 💻 🎨 📖 🤔 🚇 🚧 📦 📆 💬 👀 🛡️ ⚠️ 🌍

Jeroen Claassens

️️️️♿️ 🔊 🐛 💻 🎨 📖 🤔 🚇 🚧 📦 📆 💬 👀 🛡️ ⚠️ 🌍

Stitch07

🐛 💻 🎨 📖 🤔 👀 ⚠️ 🌍 📓

Adrian Castro

💻